Results 1 to 15 of 15

Thread: gebruik van class procedure.

  1. #1
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747

    gebruik van class procedure.

    Ik heb niet zoveel / tot geen ervaring met het gebruik van een class procedure. Nu heb ik d,m,v, verschillende documentaties dit gemaakt:
    Delphi Code:
    1. type TVulVerzend = class
    2.   strict private
    3.     class var fBatchnr  : integer;
    4.   public
    5.     class procedure Execute(aMyConn : TMyConnection; aAlle : boolean; aGebruiker : integer);
    6.  
    7.     class function  BatchID : integer;
    8. end;
    9.  
    10. implementation
    11.  
    12. { TVulVerzend }
    13.  
    14. class function TVulVerzend.BatchID: integer;
    15. begin
    16.   result := fBatchnr;
    17. end;
    18.  
    19. class procedure TVulVerzend.Execute(aMyConn: TMyConnection; aAlle: boolean; aGebruiker: integer);
    20. var MyQuery : TMyQuery;
    21.     MyCmd   : TMyCommand;
    22. begin
    23.   MyQuery := TMyQuery.Create(nil);
    24.   MyCmd   := TMyCommand.Create(nil);
    25.   try
    26.     MyCMD.Connection := aMyConn;
    27.     with MyCMD.SQL do
    28.     begin
    29.       Add('INSERT INTO verzendinstructies');
    30.       .......
    31.     end;
    32.     MyQuery.Connection := aMyConn;
    33.     with MyQuery.SQL do
    34.     begin
    35.       add('SELECT f.snr, f.factuurdatum, f.verzendinstructie,');
    36.       ......
    37.     end;
    38.     if not aAlle then
    39.     begin
    40.       MyQuery.AddWhere('f.usernr_update = :id');
    41.       MyQuery.ParamCheck;
    42.       MyQuery.Params[0].AsInteger := aGebruiker;
    43.     end;
    44.     fBatchnr := uDBBolfuncties.GetNextnumNw('batchvzID');
    45.     MyQuery.Active := true;
    46.     while not MyQuery.Eof do
    47.     begin
    48.       .....
    49.       MyQuery.Next;
    50.     end;
    51.     MyQuery.Active := false;
    52.   finally
    53.     MyQuery.Free;
    54.     MyCMD.Free;
    55.   end;
    56. end;
    Als ik deze aanroep met dit stukje code, werkt het prima:
    Delphi Code:
    1. TVulVerzend.Execute(datamodule.DBConnection, uGlobal.GetVarBool('VZ_Alle'), uGlobal.GetVarInt('VZ_gebruiker'));
    2.   showmessage(inttostr(TVulVerzend.BatchID));
    Heb ik de class procedure goed geïmplementeerd, schort er een of ander nog wat aan voor verbetering?

    Waarom doe ik dit. Omdat er op twee plekken deze gegevens gevuld kunnen worden. Dan hoef ik maar 1 procedure te gebruiken en toch mijn info krijgen.
    Delphi is great. Lazarus is more powerfull

  2. #2
    Zoals je het nu gebruikt zal het goed werken zolang je het na elkaar gebruikt. In de praktijk werkt het hetzelfde als globale variabelen. Persoonlijk zou ik er geen class variabele/functies van maken maar op die 2 plekken een instantie maken en gebruiken.
    Maker van Picto-Selector (met Delphi natuurlijk) - http://www.pictoselector.eu
    Gratis visualisaties voor uw kind - Meer dan 28000 plaatjes / 1800 emoji / webfonts / QR codes

  3. #3
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Oke. Er zitten dus 'haken en ogen' van die manier van werken. Of de combinatie van tabel vullen is niet handig voor deze methode.
    Delphi is great. Lazarus is more powerfull

  4. #4
    Wat is het voordeel over een losstaande functie (met BatchID als resultaat) in dit geval ??
    (Ook gebruik je een uDBBolfuncties die buiten je functie staat maar dat zal bij de class-procedure niet anders zijn)

    Ook zie ik het voordeel van de "interne" fBatchnr in dit geval ook niet want zelfs als je er geen return-functie van maakt zou het hetzelfde zijn als een globale variabele.

  5. #5
    Ik gebruik class procedures alleen als er geen data nodig is, of deze data in een class variabele kan. Dus bijvoorbeeld een ExecuteSQL(command: string) waarvan ik zeker weet dat iedereen dezelfde connectie kan gebruiken die ik als class var kan definiëren. Kan dat laatste niet, dan zou het een ExecuteSQL(Connection: TConnection: command: string) worden.

    Het voordeel van een class procedure is dat ik in één oogopslag kan zien welke procedures er al dan niet bij de data van een instance kunnen.
    Marcel

  6. #6
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Ik ook niet. Daarom heb ik de structuur omgegooid en een gewoon object aangemaakt. Door het te benaderen op een andere manier heb ik het maar 1 keer nodig.
    Maar het was leuk om mee te spelen.
    Delphi is great. Lazarus is more powerfull

  7. #7
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Meestal dan direct class static; pure class functies gebruik ik zelden.

  8. #8
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ik gebruik class methods regelmatig voor (eenmalige) dialoogschermpjes, zodat het tijdelijk
    aanmaken niet in een aanroepende klasse hoeft te gebeuren:

    Delphi Code:
    1. class procedure TMyDialog.Execute(var AMedewerker: string): Boolean;
    2. begin
    3.   with Create(nil) do
    4.     try
    5.       SetMedewerker(AMedewerker);
    6.       Result := ShowModal = mrOk;
    7.       if Result then
    8.         AMedewerker := GetMedewerker;
    9.     finally
    10.       Free;
    11.     end;
    12. end;
    TMemoryLeak.Create(Nil);

  9. #9
    Quote Originally Posted by VideoRipper View Post
    Ik gebruik class methods regelmatig voor (eenmalige) dialoogschermpjes, zodat het tijdelijk
    aanmaken niet in een aanroepende klasse hoeft te gebeuren:
    Mmmm, er zullen waarschijnlijk echt wel voorbeelden zijn waarbij dit een voordeel geeft maar zou bovenstaand ook niet gewoon zo kunnen?

    Delphi Code:
    1. function GetMedewerkerDialog(var AMedewerker: string): Boolean;
    2. begin
    3.   with TMyDialog.Create(nil) do
    4.     try
    5.       SetMedewerker(AMedewerker);
    6.       Result := ShowModal = mrOk;
    7.       if Result then
    8.         AMedewerker := GetMedewerker;
    9.     finally
    10.       Free;
    11.     end;
    12. end;

    Het enige waar ik het wel eens heb toegepast is
    Delphi Code:
    1. type
    2.   TCallbackDummy = class
    3.     class procedure callback(Sender: TObject; Reason: THookSocketReason; const Value: string);
    4.   end;
    daar waar het nodig is dat callback dus een class procedure moet zijn.
    Delphi Code:
    1. HTTPx.Sock.OnStatus := TCallbackDummy.callback;

  10. #10
    [QUOTE=rvk;353583]Mmmm, er zullen waarschijnlijk echt wel voorbeelden zijn waarbij dit een voordeel geeft maar zou bovenstaand ook niet gewoon zo kunnen?

    Delphi Code:
    1. function GetMedewerkerDialog(var AMedewerker: string): Boolean;.....

    Natuurlijk kan dat op die manier, maar dan heb je dus een globale functie terwijl je met een class functie een veel sterkere koppeling met het dialoog houd (wat dus ook juiste een argument tegen kan zijn :-) ) Of wel, heeft vooral te maken met voorkeur en programmeer stijl.
    Maker van Picto-Selector (met Delphi natuurlijk) - http://www.pictoselector.eu
    Gratis visualisaties voor uw kind - Meer dan 28000 plaatjes / 1800 emoji / webfonts / QR codes

  11. #11
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Wat Gabberkooij zegt is helemaal mijn gedachte.

    Door deze opzet (en het niet benoemen van het klasse type in de execute) is het dan ook mogelijk om
    een afgeleide te maken van deze klasse, zonder Execute opnieuw te hoeven declareren/implementeren.

    Je kunt dus gewoon zeggen:
    Delphi Code:
    1. if TMyOtherDialog.Execute(S) then
    en de Execute uit de parent-class wordt gebruikt (heeft uiteraard alleen zin wanneer de parameterlijsten
    in implementatie hetzelfde blijft).
    TMemoryLeak.Create(Nil);

  12. #12
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    wordt de classprocedure dan ook weer netjes opgeruimd?
    Delphi is great. Lazarus is more powerfull

  13. #13
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Een class-procedure wordt niet eens aangemaakt, dus dan hoeft hij ook niet te worden opgeruimd.

    Let wel: in een class method bestaat "Self" niet; da's logisch want die verwijst normaal naar de instantie
    van de klasse zelf en in een class method kun je die niet weten.
    TMemoryLeak.Create(Nil);

  14. #14
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Dat is mooi. Het enige wat de procedure nu doet, is het tonen van een form met een dbgrid met een aantal parameters als dataset. Daar zal deze class procedure zich prima in verlenen.
    Delphi is great. Lazarus is more powerfull

  15. #15
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Quote Originally Posted by VideoRipper View Post
    Een class-procedure wordt niet eens aangemaakt, dus dan hoeft hij ook niet te worden opgeruimd.

    Let wel: in een class method bestaat "Self" niet; da's logisch want die verwijst normaal naar de instantie
    van de klasse zelf en in een class method kun je die niet weten.
    De self wordt voor een class procedure geloof ik gebruik voor een referentie naar het class type.

    Dat gebruik je ook, want je roept in jouw TMyDialog.Execute voorbeeld create aan zonder type referentie

    Static class functies hebben zelfs dat niet, en dus iets optimaler qua parameter overdracht.

Thread Information

Users Browsing this Thread

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

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
  •