Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Lookupfeld zur Laufzeit (https://www.delphipraxis.net/148011-lookupfeld-zur-laufzeit.html)

needatip 20. Feb 2010 16:12

Datenbank: SQLServer • Version: 2008 • Zugriff über: ADO

Lookupfeld zur Laufzeit
 
Hallo,

ich erstelle zusätzlich zu meinen bestehenden Feldern ein Lookup-Feld zur Laufzeit.
Dies mache ich im AfterOpen Event des Datasets, da ich überprüfe ob das Feld bereits existiert.
Dazu muss ich aber erst das Dataset schließen und dann wieder öffnen, so daß dann wieder das AfterOpen Event aufgerufen würde.
Delphi-Quellcode:
procedure DSetBieterAfterOpen(DataSet: TDataSet);
var
  i: integer;
  f: TField;
begin
  // Feld Flagge für Land hinzufügen
  with DSetBieter do
    if FindField('Flagge') = nil then
    begin
      FieldDefList.Update;
      Close; // hier muss ich das Dataset schließen, damit ich ein neues Feld hinzufügen kann.
      for i := 0 to FieldDefList.Count - 1 do
        if FindField(FieldDefList[i].Name) = nil then
          FieldDefList.FieldDefs[i].CreateField(DSetBieter);
      f := TStringField.Create(DSetBieter);
      f.Size := 10;
      f.Name := 'Flagge';
      f.FieldName := 'Flagge';
      f.DisplayLabel := 'Flagge';
      f.FieldKind := fkLookUp;
      f.DataSet := DSetBieter;
      f.LookupDataSet := DSetLaender;
      f.KeyFields := 'LAND';
      f.LookupKeyFields := 'ID';
      f.LookupResultField := 'ID';
      f.LookupCache := true;
    end;
end;
Im BeforOpen Event kann ich ja das nicht machen, da ich dann noch nicht weiß ob die übrigen Felder vorhanden sind.
Wie kann man das elegant lösen?

rollstuhlfahrer 20. Feb 2010 17:20

Re: Lookupfeld zur Laufzeit
 
nimm doch QueryPerformanceCounter/QueryPerformanceFrequency und mache ne Funktion für das Ausführen des Querys. Dann sagst du dem Programm immer da, wo du die Laufzeit gerne hättest, dass es diese Funktion nehmen soll und lass Windows/Delphi die Laufzeit berechnen. Ist meiner Meinung nach einfacher.

Bernhard

needatip 27. Feb 2010 07:02

Re: Lookupfeld zur Laufzeit
 
Was soll denn das mit der Performance?
Ich möchte doch nur, daß das AfterOpent Event nicht nochmal aufgerufen wird.

rollstuhlfahrer 27. Feb 2010 10:19

Re: Lookupfeld zur Laufzeit
 
MSDN-Library durchsuchenQueryPerformanceCounter hat rein gar nichts mit der Performance zu tun. Es ist nur ein sehr schnell tickender Zähler, ähnlich GetTickCount, bloß dass dieser nicht nur wesentlich schneller tickt (bei mir sind es rund 3 Mio Ticks / s), sondern auch nicht so schnell überläuft.

Bernhard

needatip 1. Mär 2010 07:23

Re: Lookupfeld zur Laufzeit
 
Ok, aber was hat das mit meiner Frage zu tun ?????

DeddyH 1. Mär 2010 10:05

Re: Lookupfeld zur Laufzeit
 
Wie wäre es mit einer Bool' schen Variablen? Wenn Du das Feld einfügst, setzt Du diese auf true und wertest sie am Prozeduranfang aus. Ist sie true, wird sie nur auf false gesetzt, ansonsten Dein jetziger Code ausgeführt. Falls das jetzt zu kompliziert ausgedrückt war:
Delphi-Quellcode:
procedure ...;
begin
  if ReOpened then        //Variable (oder privates Feld) auswerten
    ReOpened := false
  else
    begin
      //Dein jetziger Code
      ReOpened := true;
    end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 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