Page 1 of 2 1 2 LastLast
Results 1 to 15 of 18

Thread: Stringlist met class methods

  1. #1
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833

    Question Stringlist met class methods

    Beste Delphialisten,

    Hoe maak ik een TStringList met Class Methods?
    En hoe voer ik deze methods dan uit?

    De bedoeling is een lijstje te hebben met strings en bijhorende methods.
    Bijvoorbeeld twee methods, Voeruit1 en Voeruit2, van dezelfde vorm, maar in verschillende klassen.
    Ik wil nu een lijstje hebben van de vorm
    'OP', Voeruit1
    'AF', Voeruit2

    Delphi Code:
    1. type
    2.   TIntegerFunctie = function ( a, b: integer ): integer of object ;
    3.  
    4.   TTelopKlasse = class
    5.   Public
    6.     function Voeruit1 ( a, b: integer) : integer ;
    7.   end ;
    8.  
    9.   TTrekafKlasse = class
    10.   Public
    11.     function Voeruit2 ( a, b: integer) : integer ;
    12.   end ;
    13.  
    14.   TForm1 = class(TForm)
    15.     Button1: TButton;
    16.     procedure Button1Click(Sender: TObject);
    17.   private
    18.     { Private declarations }
    19.     Lijstje: TStringList ;
    20.     TelOp : TTelOpKlasse  ;
    21.     TrekAf: TTrekAfKlasse ;
    22.   public
    23.     { Public declarations }
    24.   end;
    25.  
    26.  
    27. var
    28.   Form1: TForm1;
    29.  
    30. implementation
    31.  
    32. {$R *.dfm}
    33.  
    34.  
    35. procedure TForm1.Button1Click(Sender: TObject);
    36. begin
    37. TelOp := TTelOpKlasse.Create;
    38. TrekAf:= TTrekAfKlasse.Create ;
    39.  
    40. Lijstje:= TStringList.Create ;
    41. Lijstje.AddObject('OP', Telop.Voeruit1 ) ; <-- Dit gaat niet
    42. Lijstje.AddObject('AF', Trekaf.Voeruit2 ) ;
    43.  
    44. end;
    45.  
    46. { TTelopKlasse }
    47.  
    48. function TTelopKlasse.Voeruit1(a, b: integer): integer;
    49. begin
    50.   result := a + b
    51. end;
    52.  
    53. { TTrekafKlasse }
    54.  
    55. function TTrekafKlasse.Voeruit2(a, b: integer): integer;
    56. begin
    57.   result := a - b
    58. end;

    Dit lukt niet omdat Lijstje.AddObject een object verwacht, en geen class method.
    Let op, in mijn lijstje moeten de methods komen, en niet de klassen (of objecten van die klassen), omdat de methodnamen verschillend zijn (Voeruit1 en Voeruit2).

    Hoe voer ik verder Lijstje.objects[0] uit met de waarden 7 en 13 (moet 20 geven)?

    Help en Google maken mij niet wijzer.
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  2. #2
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Je moet een constructor laten uitvoeren en niet de functie van de claas. Nu is het object nog niet geïnitialiseerd.
    delphi Code:
    1. procedure TForm1.Button1Click(Sender: TObject);
    2. begin
    3. Lijstje:= TStringList.Create ;
    4. Lijstje.AddObject('OP', Telop.Create(a,b) ) ;
    5. Lijstje.AddObject('AF', Trekaf.Create(a,b)) ;
    6. end;
    In de create roep je dan je functie met de parameters op.

    AddObject krijgt de pointer terug van het aangemaakte object. Zo kan je dus meerdere keren dezelfde class gebruiken in je TStringlist.

    [edit]
    Twee aparte classes hebben hier geen nut. Geef de waarde in de create mee en roep dan je functie op met:
    TTellijst(TStringlist.Objects[i]).Optellen of TTellen(TStringlist.Objects[i]).Aftrekken.
    delphi Code:
    1. TTellijst = class
    2.   Public
    3.     constructor Create(a,b, : integer); virtual;
    4.     function Optellen : integer;
    5.     function Aftrekken : integer;
    6.   end ;
    [/edit]
    Last edited by jkuiper; 07-Apr-11 at 17:00.
    Delphi is great. Lazarus is more powerfull

  3. #3
    Misschien is de netste oplossing om beide classes dezelfde method te geven. Natuurlijk zouden ze dan ook op een gezamelijk basisclass gebaseerd moeten zijn waarin die method al wordt geïntroduceerd. Een andere oplossing is gebruikmaken van een interface.

    En tot slot kun je methods wel weer koppelen als event. Je zou dus een class kunnen maken met een property waaraan je de execute koppelt:

    Delphi Code:
    1. type
    2.   TVoerUitMethod = function(a, b: Integer): Integer of object;
    3.   TUitvoer = class
    4.     FVoerUit: TVoerUitMethod;
    5.     // Of gewoon alleen het field...
    6.     property VoerUit: TVoerUitMethod read FVoerUit write FVoerUit;
    7.   end;
    Je kunt dan zo'n class instantieren, de method van de andere class eraan koppelen, en via die class de method aanroepen.
    1+1=b

  4. #4
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Quote Originally Posted by SamWitse View Post
    Hoe maak ik een TStringList met Class Methods?
    Je voorbeeld gebruikt geen class methods maar instance methods.
    Wil je class methods of instance methods?

    Met instance methods: gebruik een aangepaste datastructuur, bijvoorbeeld een TDictionary<string, TIntegerFunctie> :

    delphi Code:
    1. TelOp := TTelOpKlasse.Create;
    2. TrekAf:= TTrekAfKlasse.Create ;
    3. Lijstje:= TDictionary<string, TIntegerFunctie>.Create;
    4. Lijstje.Add('OP', Telop.Voeruit1 ) ;
    5. Lijstje.Add('AF', Trekaf.Voeruit2 ) ;

    Quote Originally Posted by SamWitse View Post
    En hoe voer ik deze methods dan uit?
    delphi Code:
    1. procedure TMijnForm.Test;
    2. var
    3.   op, af: integer;
    4. begin
    5.   op := Lijstje.Items['OP'](5,3);
    6.   af := Lijstje['AF'](5,3);
    7.   Caption := Format('%d en %d', [op, af]);
    8. end;

    Kijk ook eens naar events en naar het command design pattern.
    All methodologies are based on fear. -- Kent Beck.

  5. #5
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Er zijn ook nog wat eenvoudige hacks om het alsnog in een TObjectList te proppen (ben ik geen voorstander van).
    Staat hier wel ergens op het forum voor zover ik het me goed herinner.
    Last edited by Dirk Andries; 07-Apr-11 at 17:44. Reason: kromme zin
    All methodologies are based on fear. -- Kent Beck.

  6. #6
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    TStringList.AddObject verwacht een TObject. Maar die kun je misbruiken voor alles wat naar een integer gecast kan worden. Een verwijzing naar een (class) method van een klasse is twee integers groot (zie TMethod in system.pas), dus dat past niet, maar misschien kun je dat dat wel weer eerst naar een PMethod casten en voeg je die aan je stringlist toe.

    Volgens mij ben je op zoek naar een standaard pattern, maar helaas weet of herken ik die hier niet. Sam, waar heb je dit voor nodig?

    Wat eventueel ook goed mogelijk is, is dat je niet met methods werkt, maar met één objecttype in verschillende afgeleide implementaties, als volgt:

    Delphi Code:
    1. type
    2.   TCalc = class(TObject)
    3.     function Perform(A, B: Integer): Integer; abstract;
    4.   end;
    5.  
    6.   TAdd = class(TCalc)
    7.     function Perform(A, B: Integer): Integer; override;
    8.   end;
    9.  
    10. function TAdd.Perform(A, B: Integer): Integer;
    11. begin
    12.   Result := A + B;
    13. end;
    14.  
    15. function TForm1.Test: Integer;
    16. var
    17.   Calc: TCalc;
    18. begin
    19.   Calc := TAdd.Create;
    20.   StringList1.AddObject('OP', Calc);
    21.   Result := TCalc(StringList1.Objects[0]).Perform(3, 4);
    22.   Calc.Free;
    23.   Calc := TSubstract.Create;
    24.   StringList1.AddObject('AF', Calc);
    25.   Result := TCalc(StringList1.Objects[0]).Perform(Result, Result);
    26.   Calc.Free;
    27. end;

    //Edit:
    Zie ook GolezTrol en Dirk Andries
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  7. #7
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Albert, dat vertelde ik toch ook?
    Waarom maak je eerst het object aan, voeg het toe aan stringlist, geef het resultaat en geeft het weer vrij? Dan heeft stringlist toch geen waarde meer?
    Delphi is great. Lazarus is more powerfull

  8. #8
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Quote Originally Posted by Dirk Andries View Post
    Met instance methods: gebruik een aangepaste datastructuur, bijvoorbeeld een TDictionary<string, TIntegerFunctie> :
    Dat werkt uiteraard ook met class methods (hier in 1 klasse, maar dat hoeft niet):


    delphi Code:
    1. TRekenKlasse = class
    2.     class function TelOp(a, b: Int32): Int32;
    3.     class function TrekAf(a, b: Int32) : Int32;
    4. end;
    5.  
    6. // ...
    7.  
    8. { TRekenKlasse }
    9.  
    10. class function TRekenKlasse.TelOp(a, b: Int32): Int32;
    11. begin
    12.   Result := a + b;
    13. end;
    14.  
    15. class function TRekenKlasse.TrekAf(a, b: Int32): Int32;
    16. begin
    17.   Result := a - b;
    18. end;
    19.  
    20.  
    21. procedure TMijnForm.Test;
    22. var
    23.   op, af: integer;
    24. begin
    25.   op := Lijstje.Items['OP'](5,3);
    26.   af := Lijstje['AF'](5,3);
    27.   Caption := Format('%d en %d', [op, af]);
    28.   op := Lijstje.Items['op'](5,3);
    29.   af := Lijstje['af'](5,3);
    30.   Caption := Caption + ' en ook: '  + Format('%d en %d', [op, af]);
    31. end;
    All methodologies are based on fear. -- Kent Beck.

  9. #9
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Dat werkt niet of ik mis een aantal dingen.
    Delphi is great. Lazarus is more powerfull

  10. #10
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Dat zou wel moeten werken, dus je mist een aantal dingen.
    Je zal die code moeten mergen met mijn vorige post en de originele post van SamWitse.

    delphi Code:
    1. unit MijnFormUnit;
    2.  
    3. interface
    4.  
    5. uses
    6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    7.   Dialogs, Generics.Collections, StdCtrls;
    8.  
    9. type
    10. TIntegerFunctie = function ( a, b: integer ): integer of object ;
    11.  
    12.   TRekenKlasse = class
    13.     class function TelOp(a, b: Int32): Int32;
    14.     class function TrekAf(a, b: Int32) : Int32;
    15.   end;
    16.  
    17.   TTelopKlasse = class
    18.   Public
    19.     function Voeruit1 ( a, b: integer) : integer ;
    20.   end ;
    21.   TTrekafKlasse = class
    22.   Public
    23.     function Voeruit2 ( a, b: integer) : integer ;
    24.   end ;
    25.  
    26.   TMijnForm = class(TForm)
    27.     procedure FormCreate(Sender: TObject);
    28.     procedure Test;
    29.   private
    30.     { Private declarations }
    31.     Lijstje: TDictionary<string, TIntegerFunctie>;
    32.     TelOp : TTelOpKlasse  ;
    33.     TrekAf: TTrekAfKlasse ;
    34.   public
    35.     { Public declarations }
    36.   end;
    37.  
    38. var
    39.   MijnForm: TMijnForm;
    40.  
    41. implementation
    42. {$R *.dfm}
    43.  
    44. { TTelopKlasse }
    45. function TTelopKlasse.Voeruit1(a, b: integer): integer;
    46. begin
    47.   result := a + b
    48. end;
    49.  
    50. { TTrekafKlasse }
    51. function TTrekafKlasse.Voeruit2(a, b: integer): integer;
    52. begin
    53.   result := a - b
    54. end;
    55.  
    56. procedure TMijnForm.Test;
    57. var
    58.   op, af: integer;
    59. begin
    60.   op := Lijstje.Items['OP'](5,3);
    61.   af := Lijstje['AF'](5,3);
    62.   Caption := Format('%d en %d', [op, af]);
    63.   op := Lijstje.Items['op'](5,3);
    64.   af := Lijstje['af'](5,3);
    65.   Caption := Caption + ' en ook: '  + Format('%d en %d', [op, af]);
    66. end;
    67.  
    68. procedure TMijnForm.FormCreate(Sender: TObject);
    69. begin
    70. TelOp := TTelOpKlasse.Create;
    71. TrekAf:= TTrekAfKlasse.Create ;
    72. Lijstje:= TDictionary<string, TIntegerFunctie>.Create;
    73. Lijstje.Add('OP', Telop.Voeruit1 ) ;
    74. Lijstje.Add('AF', Trekaf.Voeruit2 ) ;
    75. Lijstje.Add('af', TRekenKlasse.TrekAf);
    76. Lijstje.Add('op', TrekenKlasse.TelOp);
    77. Test;
    78. end;
    79.  
    80. { TRekenKlasse }
    81. class function TRekenKlasse.TelOp(a, b: Int32): Int32;
    82. begin
    83.   Result := a + b;
    84. end;
    85.  
    86. class function TRekenKlasse.TrekAf(a, b: Int32): Int32;
    87. begin
    88.   Result := a - b;
    89. end;
    90.  
    91. end.
    All methodologies are based on fear. -- Kent Beck.

  11. #11
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    Allen, dank je voor het mee-denken, maar ik moet de methods in een lijstje krijgen, en geen objecten.

    Het ware verhaal is zoals gewoonlijk wat complexer: ik wens methods te maken voor OnSetText van verschillende fields. Deze methods wil ik in een lijstje bijhouden, samen met de naam van elk field.
    Vb
    Geboortejaar method SetGeboorteJaar
    Inkomen method SetInkomen
    Postcode method SetPostCode

    Op het moment dat ik de Fields dynamisch creëer, wil ik OnSetText van elke field koppelen aan de juiste method uit mijn lijstje.
    Maar mijn voorbeeldje met TelOp en TrekAf leek mij wat eenvoudiger om uit te leggen.

    Alle methods hebben dezelfde vorm, namelijk een TFieldSetTextEvent, of procedure(Sender: TField; const Text: String).
    Alle methods hebben een andere naam.

    Misschien heb ik in mijn voorbeeld door te werken met verschillende klassen, het onnodig moeilijk gemaakt.
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  12. #12
    Volgens mij gaat m'n uitleg nog steeds op; je hebt placeholders nodig om die methods te kunnen koppelen. Dat kan een object, een record of een stukje geheugen zijn, maar je redt het niet alleen met die pointer. Zoals Albert al uitlegde, is een methodpointer een dubbele pointer. Je hebt het adres van het object én het adres van de method nodig om 'm goed aan te kunnen roepen.
    Je kunt best ver gaan in het automatiseren ervan. Je zou die objecten automatisch kunnen laten maken door jouw eventhandler-object. Je zou dan zelfs m.b.v. de RTTI op zoek kunnen gaan naar methods die matchen met de naam van je field.
    Hoe ver wil je gaan?
    1+1=b

  13. #13
    Delphi & OO in Vlaanderen SamWitse's Avatar
    Join Date
    Sep 2007
    Location
    Brussel
    Posts
    833
    Quote Originally Posted by GolezTrol View Post
    Hoe ver wil je gaan?
    Als het even kan, gewoon tot op de hoek en terug.

    Dat van die dubbele pointers had ik al begrepen.

    Ik wil het dus eenvoudig houden, en een lijstje bijhouden met FieldNames en bijhorenden methods die op het juiste moment aan het OnSetTextEvent gekoppeld moeten worden.

    Mijn idee was: ik maak een afgeleide klasse van een dataset, en steek daar alle logica in die specifiek is voor een bepaalde tabel. Zo?Âok de SetText methods die toegepast moeten worden, op voorwaarde dat de Field in de dataset komt. En die Field komt er bij de dataset.open als de kolom in de SELECT staat.
    En dan, *PATS*, wil ik de juiste OnSetText aan de juiste Field koppelen.

    Maar daarvoor heb ik een lijstje nodig met FieldNames (strings) en Methods.
    En liefst zo eenvoudig mogelijk.
    Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.

    Sam Witse.
    Delphi & OO in Vlaanderen

  14. #14
    Goeie leer voor de volgende keer. Gewoon die vraag stellen, je voorkomt ermee dat mensen moeilijke oplossingen gaan bedenken voor iets wat eigenlijk helemaal je probleem niet is. Kun je het altijd achteraf nog makkelijker maken als dat nodig blijkt te zijn.

    Een dynamische koppeling op basis van de naam van het veld kan bijvoorbeeld zo: Door een generieke class te maken die methods implementeert die te vinden zijn aan de hand van de naam van het veld, hoe je maar één bonk magie te schrijven en is het daarna een eitje.

    Een handler class kan de events van een dataset afhandelen. De event handler zelf wordt via een extra object gekoppeld aan de dataset. Die objecten (components) reageren volgens mij ook netjes op elkaar: als het field wordt vrijgegeven, wordt ook de koppeling losgekoppeld. Dito voor de handler.
    Delphi Code:
    1. type
    2.   // Basisclass voor de handler
    3.   TDataSetFieldsOnSetTextEventHandler = class(TComponent)
    4.   private
    5.     FHandlers: TList;
    6.     procedure ClearHandlers;
    7.   protected
    8.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
    9.     function GetMethodAddress(Field: TField): Pointer; virtual;
    10.   public
    11.     constructor Create(AOwner: TComponent); overload; override;
    12.     constructor Create(AOwner: TComponent; ADataSet: TDataSet); reintroduce; overload;
    13.     destructor Destroy; override;
    14.     procedure SetDataSet(DataSet: TDataSet);
    15.   end;
    16.  
    17.   // Bevat een verwijzing naar het field en naar de method.
    18.   THandlerContainer = class(TComponent)
    19.   private
    20.     FHandler: TMethod;
    21.     FField: TField;
    22.   protected
    23.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
    24.   public
    25.     constructor Create(AField: TField; AHandler: TMethod); reintroduce;
    26.     destructor Destroy; override;
    27.   end;
    Hierbij de implementatie. Het lijkt te werken, maar misschien zit er nog wel een foutje in. M'n Delphi is wat roestig aan het worden, nu ik tegenwoordig veel meer met PHP bezig ben.
    Delphi Code:
    1. { TDataSetFieldsOnSetTextEventHandler }
    2.  
    3. procedure TDataSetFieldsOnSetTextEventHandler.ClearHandlers;
    4. var
    5.   i: Integer;
    6. begin
    7.   // Bestaande handlers vrijgeven
    8.   for i := 0 to FHandlers.Count - 1 do
    9.   begin
    10.     with THandlerContainer(FHandlers[i]) do
    11.     begin
    12.       RemoveFreeNotification(Self);
    13.       Free;
    14.     end;
    15.   end;
    16.  
    17.   FHandlers.Clear;
    18. end;
    19.  
    20. constructor TDataSetFieldsOnSetTextEventHandler.Create(AOwner: TComponent; ADataSet: TDataSet);
    21. begin
    22.   Create(AOwner);
    23.   SetDataSet(ADataSet);
    24. end;
    25.  
    26. constructor TDataSetFieldsOnSetTextEventHandler.Create(AOwner: TComponent);
    27. begin
    28.   inherited;
    29.   FHandlers := TList.Create;
    30. end;
    31.  
    32. destructor TDataSetFieldsOnSetTextEventHandler.Destroy;
    33. begin
    34.   ClearHandlers;
    35.   FHandlers.Free;
    36.   inherited;
    37. end;
    38.  
    39. function TDataSetFieldsOnSetTextEventHandler.GetMethodAddress(
    40.   Field: TField): Pointer;
    41. begin
    42.   // Default: Zoek een method op basis van de fieldname. Afgeleiden kunnen
    43.   // hier varianten op maken door deze method te overriden;
    44.   Result := MethodAddress('Set' + Field.FieldName + 'Handler');
    45. end;
    46.  
    47. procedure TDataSetFieldsOnSetTextEventHandler.Notification(
    48.   AComponent: TComponent; Operation: TOperation);
    49. var
    50.   n: Integer;
    51. begin
    52.   inherited;
    53.  
    54.   // Als de handler zichzelf vrijgeeft (omdat het field wordt vrijgegeven)
    55.   // geeft hij dit hier door. Verwijder 'm dan uit de lijst.
    56.   if Operation = opRemove then
    57.   begin
    58.     n := FHandlers.IndexOf(AComponent);
    59.     if n > -1 then
    60.       FHandlers.Delete(n);
    61.   end;
    62. end;
    63.  
    64. procedure TDataSetFieldsOnSetTextEventHandler.SetDataSet(DataSet: TDataSet);
    65. var
    66.   i: Integer;
    67.   Method: TMethod;
    68.   Field: TField;
    69.   HandlerContainer: THandlerContainer;
    70. begin
    71.   ClearHandlers;
    72.  
    73.   // Loop door alle velden en kijk of er een matchende method is gevonden.
    74.   for i := 0 to DataSet.Fields.Count - 1 do
    75.   begin
    76.     Field := DataSet.Fields[i];
    77.  
    78.     Method.Code := GetMethodAddress(Field);
    79.  
    80.     if Method.Code <> nil then
    81.     begin
    82.       // Method gevonden. Maak een handlercontainer om de method en het field
    83.       // aan elkaar te koppelen.
    84.       Method.Data := Self;
    85.       HandlerContainer := THandlerContainer.Create(Field, Method);
    86.  
    87.       // Opslag en afhandeling
    88.       HandlerContainer.FreeNotification(Self);
    89.       FHandlers.Add(HandlerContainer);
    90.     end;
    91.   end;
    92. end;
    93.  
    94. { THandlerContainer }
    95.  
    96. constructor THandlerContainer.Create(AField: TField; AHandler: TMethod);
    97. begin
    98.   inherited Create(nil);
    99.   FHandler := AHandler;
    100.   FField := AField;
    101.  
    102.   // Event koppelen
    103.   FField.OnSetText := TFieldSetTextEvent(FHandler);
    104.   FField.FreeNotification(Self);
    105. end;
    106.  
    107. destructor THandlerContainer.Destroy;
    108. begin
    109.   FField.RemoveFreeNotification(Self);
    110.   FField.OnSetText := nil;
    111.   inherited;
    112. end;
    113.  
    114. procedure THandlerContainer.Notification(AComponent: TComponent;
    115.   Operation: TOperation);
    116. begin
    117.   inherited;
    118.   // Veld vrijgegeven = ik vrijgegeven.
    119.   if (AComponent = FField) and (Operation = opRemove) then
    120.     Free;
    121. end;
    Vervolgens maak je dan een afgeleide van de handler, waarin je je methods kunt implementeren. Deze maakt een handler voor de velden 'big' en 'koe', maar je kunt dus eenvoudig methods toevoegen om voor elk gewenst veld een handler te maken. Het gaat vooral fout als je meerdere handlers maakt voor hetzelfde veld. In dat geval zal de tweede de eerste overschrijven, en zal de eerste nooit het SetText event ontvangen.
    Delphi Code:
    1. TMyHandler = class(TDataSetFieldsOnSetTextEventHandler)
    2.   published
    3.     procedure SetKoeHandler(Sender: TField; const Text: string);
    4.     procedure SetBigHandler(Sender: TField; const Text: string);
    5.   end;
    De rest gaat eigenlijk vanzelf. Zo aanroepen:
    Delphi Code:
    1. TMyHandler.Create(Self, ClientDataSet1);

    Demo-projectje zit erbij.


    Maar eh, zeg eens eerlijk, zou het niet handig zijn om gewoon dezelfde method aan de events van alle velden te hangen, en daarin met een ifje controleren om welk veld het gaat?

    [edit]
    Ik geloof bij nader inzien dat die handler methods helemaal niet published hoeven te zijn...
    Attached Files Attached Files
    Last edited by GolezTrol; 07-Apr-11 at 23:08.
    1+1=b

  15. #15
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Ik zou of voor de generics methode gaan (kan je grotere allocaties doen), maar is D2009+, of een array van een record. met daarin de string en de methodvar.

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •