AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi OnCalcFields zur Laufzeit zuweisen
Thema durchsuchen
Ansicht
Themen-Optionen

OnCalcFields zur Laufzeit zuweisen

Ein Thema von JoPa55 · begonnen am 11. Apr 2017 · letzter Beitrag vom 12. Apr 2017
Antwort Antwort
JoPa55

Registriert seit: 24. Okt 2016
4 Beiträge
 
#1

OnCalcFields zur Laufzeit zuweisen

  Alt 11. Apr 2017, 11:28
Datenbank: MyBase • Version: XE6 • Zugriff über: nn
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
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: OnCalcFields zur Laufzeit zuweisen

  Alt 11. Apr 2017, 12:08
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

AW: OnCalcFields zur Laufzeit zuweisen

  Alt 11. Apr 2017, 12:54
Du schreibst eine Eventmethode, so wie Delphi sie immer automatisch erzeugt, wenn man im IO doppelklickt, und dann DeinDataSet.OnCalcFields := DeineMethode .


[edit] ich hätte vor dem Mittag auf Speichern klicken sollen
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (11. Apr 2017 um 13:08 Uhr)
  Mit Zitat antworten Zitat
JoPa55

Registriert seit: 24. Okt 2016
4 Beiträge
 
#4

AW: OnCalcFields zur Laufzeit zuweisen

  Alt 11. Apr 2017, 13:19
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#5

AW: OnCalcFields zur Laufzeit zuweisen

  Alt 11. Apr 2017, 13:22
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: OnCalcFields zur Laufzeit zuweisen

  Alt 11. Apr 2017, 13:39
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;
  Mit Zitat antworten Zitat
JoPa55

Registriert seit: 24. Okt 2016
4 Beiträge
 
#7

AW: OnCalcFields zur Laufzeit zuweisen

  Alt 12. Apr 2017, 09:03
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#8

AW: OnCalcFields zur Laufzeit zuweisen

  Alt 12. Apr 2017, 09:12
Hallöle...
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;

Geändert von haentschman (12. Apr 2017 um 09:15 Uhr)
  Mit Zitat antworten Zitat
JoPa55

Registriert seit: 24. Okt 2016
4 Beiträge
 
#9

AW: OnCalcFields zur Laufzeit zuweisen

  Alt 12. Apr 2017, 09:26
Danke,

die Fehlermeldung kommt nicht mehr - leider wird TWzgMgrF.DoCDSWzgCalcFlds aber nicht aufgerufen ...
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:55 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