AGB  ·  Datenschutz  ·  Impressum  







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

Lookupfeld zur Laufzeit

Ein Thema von needatip · begonnen am 20. Feb 2010 · letzter Beitrag vom 1. Mär 2010
Antwort Antwort
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#1

Lookupfeld zur Laufzeit

  Alt 20. Feb 2010, 17:12
Datenbank: SQLServer • Version: 2008 • Zugriff über: ADO
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?
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#2

Re: Lookupfeld zur Laufzeit

  Alt 20. Feb 2010, 18:20
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Lookupfeld zur Laufzeit

  Alt 27. Feb 2010, 08:02
Was soll denn das mit der Performance?
Ich möchte doch nur, daß das AfterOpent Event nicht nochmal aufgerufen wird.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#4

Re: Lookupfeld zur Laufzeit

  Alt 27. Feb 2010, 11:19
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Lookupfeld zur Laufzeit

  Alt 1. Mär 2010, 08:23
Ok, aber was hat das mit meiner Frage zu tun ?????
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

Re: Lookupfeld zur Laufzeit

  Alt 1. Mär 2010, 11:05
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  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 04:06 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