Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi OnCalcFields zur Laufzeit zuweisen (https://www.delphipraxis.net/192350-oncalcfields-zur-laufzeit-zuweisen.html)

JoPa55 11. Apr 2017 11:28

Datenbank: MyBase • Version: XE6 • Zugriff über: nn

OnCalcFields zur Laufzeit zuweisen
 
Guten Tag,

ich erzeuge zur Laufzeit ein ClientDataSet mit berechneten Feldern. Wie kann ich dem Dataset die Behandlung des OnCalcFields-Events zur Berechnung diese Felder zuweisen?

Besten Dank im Voraus!
JoPa

nahpets 11. Apr 2017 12:08

AW: OnCalcFields zur Laufzeit zuweisen
 
Suchst Du sowas in der Art?
Delphi-Quellcode:
// Ereignisroutine für OnCalcFields
procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
  // Die von Dir gewünschte Programmlogik.
end;

// Ereignisroutine für AfterOpen
procedure TForm1.ClientDataSet1AfterOpen(DataSet: TDataSet);
begin
  ClientDataSet1.OnCalcFields := ClientDataSet1CalcFields;
end;

// Ereignisroutine für BeforeClose
procedure TForm1.ClientDataSet1BeforeClose(DataSet: TDataSet);
begin
  ClientDataSet1.OnCalcFields := Nil;
end;
Die Zuweisung auf ClientDataSet1.OnCalcFields kann aber auch in (fast) jedem beliebigen Ereignis erfolgen, ebenso das Zurücksetzen auf Nil.

Kontextabhängig ließen sich aber auch mehrere Ereignisroutinen für OnCalcFields erstellen, die dann jeweils passend zugewiesen werden könnten.

himitsu 11. Apr 2017 12:54

AW: OnCalcFields zur Laufzeit zuweisen
 
Du schreibst eine Eventmethode, so wie Delphi sie immer automatisch erzeugt, wenn man im IO doppelklickt, und dann
Delphi-Quellcode:
DeinDataSet.OnCalcFields := DeineMethode
.


[edit] ich hätte vor dem Mittag auf Speichern klicken sollen :oops:

JoPa55 11. Apr 2017 13:19

AW: OnCalcFields zur Laufzeit zuweisen
 
Da hab' ich das wohl nicht präzise genug beschrieben: Ich benutze nicht die ClientDataSet-Komponente, sondern habe mir von TClientDataSet eine eigene Klasse abgeleitet. Dem davon erzeugten Objekt möchte ich jetzt die Eventbehandlung zuweisen.

Uwe Raabe 11. Apr 2017 13:22

AW: OnCalcFields zur Laufzeit zuweisen
 
Zitat:

Zitat von JoPa55 (Beitrag 1367128)
Da hab' ich das wohl nicht präzise genug beschrieben: Ich benutze nicht die ClientDataSet-Komponente, sondern habe mir von TClientDataSet eine eigene Klasse abgeleitet. Dem davon erzeugten Objekt möchte ich jetzt die Eventbehandlung zuweisen.

Wenn es wirklich eine Ableitung von TClientDataSet ist, sollten die Anleitungen auch dafür passen.

nahpets 11. Apr 2017 13:39

AW: OnCalcFields zur Laufzeit zuweisen
 
Sowas?
Delphi-Quellcode:
uses
  Unit_Mit_TDeinClienDataSetNachfolgerTyp;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    function CreateClientDataSet(AOwner : TComponent) : TDeinClienDataSetNachfolgerTyp;
  public
    { Public-Deklarationen }
    MyClienDataSet : TDeinClienDataSetNachfolgerTyp;
  end;

...

function TForm1.CreateClientDataSet(AOwner : TComponent) : TDeinClienDataSetNachfolgerTyp;
begin
  Result := TDeinClienDataSetNachfolgerTyp.Create(Sender);
  Result.OnCalcFields := DeineEreignisRoutineFuerCalcFields;
end;

procedure TForm1.Create(Sender: TObject);
begin
  MyClienDataSet := CreateClientDataSet(Self);
end;

JoPa55 12. Apr 2017 09:03

AW: OnCalcFields zur Laufzeit zuweisen
 
Vielen Dank für die schnellen Antworten, leider komme ich damit aber nicht zurecht. Hier kommt mal ein Auszug aus meinem Code (ich hoffe, dass der Kontext reicht):

Delphi-Quellcode:
unit MyDBUnit

type
  TMyCDS = class (TClientDataSet)
  ...
  public
    constructor Create(AOwner : TComponent); override;
    ...
  end;

 
  TWzg = class (TMyCDS)
  const
    CDSFileName : string = 'Wzg.cds';
   
  public
    constructor Create(AOwner : TComponent): override
    ...
  end;

 
constructor TMyCDS.Create(AOwner : TComponent);
begin
  inherited;
    ...
end;
 
 
constructor TWzg.Create(AOwner: TComponent);
begin
  inherited;

  FileName := ProgInstPath + 'data\' + CDSFileName;

  if FileExists(FileName) then
    Open
  else
    CreateNewCDSFile;

  with IndexDefs do begin
    with AddIndexDef do begin
      Name := 'IdxMain';
      Fields := 'ArtNr;Farbe;Dicke';
      Options := [ixCaseInsensitive];
    end;
  end;

  IndexName := 'IdxMain';

end;


unit WzgMgrFU

interface

uses MyDBUnit ...;

type
  TWzgMgrF = class(TForm)
  ...
    procedure FormCreate(Sender: TObject);
  ...
  public
    procedure CDSWzgCalcFlds;
 
end;


implementation

var
  CDSWzg : TWzg;
 
 
procedure TWzgMgrF.FormCreate(Sender: TObject);
begin
  ...
  CDSWzg := TWzg.Create(Self);

// -> CDSWzg.OnCalcFields := CDSWzgCalcFlds;
 
end;


procedure TWzgMgrF.CDSWzgCalcFlds;
begin
  ...
 
end;

Leider führt die Zuweisung an OnCalcFields zum Fehler: E2009 Inkompatible Typen: 'Liste der Parameter ist unterschiedlich', was ja auch klar ist, da OnCalcFields einen Parameter vom Typ TDataSet erwartet. Jetzt weiß ich nicht mehr weiter :(

haentschman 12. Apr 2017 09:12

AW: OnCalcFields zur Laufzeit zuweisen
 
Hallöle...:P
Delphi-Quellcode:
unit WzgMgrFU

interface

uses MyDBUnit ...;

type
  TWzgMgrF = class(TForm)
  ...
    procedure FormCreate(Sender: TObject);
  ...
  private // besser
    procedure DoCDSWzgCalcFlds(DataSet: TDataSet); // Mit Do als Präfix kann man die Eventhander besser auseinanderhalten.
  public
 
  end;

implementation

var
  CDSWzg : TWzg;
 
procedure TWzgMgrF.FormCreate(Sender: TObject);
begin
  ...
  CDSWzg := TWzg.Create(Self);
  CDSWzg.OnCalcFields := DoCDSWzgCalcFlds;
end;


procedure TWzgMgrF.DoCDSWzgCalcFlds(DataSet: TDataSet);
begin
  ...
 
end;

JoPa55 12. Apr 2017 09:26

AW: OnCalcFields zur Laufzeit zuweisen
 
Danke,

die Fehlermeldung kommt nicht mehr - leider wird TWzgMgrF.DoCDSWzgCalcFlds aber nicht aufgerufen ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz