![]() |
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 |
AW: OnCalcFields zur Laufzeit zuweisen
Suchst Du sowas in der Art?
Delphi-Quellcode:
Die Zuweisung auf ClientDataSet1.OnCalcFields kann aber auch in (fast) jedem beliebigen Ereignis erfolgen, ebenso das Zurücksetzen auf Nil.
// 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; Kontextabhängig ließen sich aber auch mehrere Ereignisroutinen für OnCalcFields erstellen, die dann jeweils passend zugewiesen werden könnten. |
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: |
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.
|
AW: OnCalcFields zur Laufzeit zuweisen
Zitat:
|
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; |
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 :( |
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; |
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 11:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz