Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Datensatz laden - ComboBox bleibt beim Ladevorgang offen (https://www.delphipraxis.net/85210-datensatz-laden-combobox-bleibt-beim-ladevorgang-offen.html)

Yheeky 27. Jan 2007 13:04


Datensatz laden - ComboBox bleibt beim Ladevorgang offen
 
Hi,

ich lasse über eine ComboBox einen Datensatz in eine ListView laden. Bei größeren Datenmengen kommt es zu dem unschönen Effekt, dass die ComboBox erst zugeht, wenn der Datensatz geladen wurde (bei kleinen vermutlich auch, aber da sehe ich es nicht). Wie kann ich die ComboBox schließen und erst im Anschluss die Daten laden lassen? Mit BeginUpdate und EndUpdate habe ich es schon verbessert, doch ganz weg wird es (vor allem auf langsameren Rechnern) nicht sein. Muss ich hier Application.ProcessMessages verwenden (und wenn ja, wo muss es platziert werden?)

Danke schonmal im Voraus!

mkinzler 27. Jan 2007 13:22

Re: Datensatz laden - ComboBox bleibt beim Ladevorgang offen
 
Zeig mal den zugehörigen Code

Yheeky 27. Jan 2007 14:16

Re: Datensatz laden - ComboBox bleibt beim Ladevorgang offen
 
Okay, hier ist der Code.

Delphi-Quellcode:
procedure TfrmMain.cZeitChange(Sender: TObject);
var
  I : Integer;
  Dateiname: string;
  Eintrag: TListItem;

begin
ListView.Items.Clear;

if FileExists(Dateiname) then
    begin
    try
     JVSimpleXML.LoadFromFile(Dateiname);
    finally
    ListView.BeginUpdate();

    for I := 1 to JVSimpleXML.Root.Items.Count-1 do
       begin
       Eintrag := ListView.Items.Add;

       if JVSimpleXML.Root.Items[I].Items.ItemNamed[XMLType].Value = '0' then
       Eintrag.Caption := 0;

       if JVSimpleXML.Root.Items[I].Items.ItemNamed[XMLKuerzel].Value = 'Ja' then
       Eintrag.SubItems.Add('1')
       else
       Eintrag.SubItems.Add('2');

       Eintrag.SubItems.Add(JVSimpleXML.Root.Items[I].Items.ItemNamed[XMLText].Value);
       Eintrag.SubItems.Add(JVSimpleXML.Root.Items[I].Items.ItemNamed[XMLUhrzeit].Value);
       end;

    ListView.EndUpdate();

    end;
    end;

  end;

end;

mkinzler 27. Jan 2007 14:18

Re: Datensatz laden - ComboBox bleibt beim Ladevorgang offen
 
Laß mal .BeginUpdate()/.EndUpdate() wg.

Christian Seehase 27. Jan 2007 14:25

Re: Datensatz laden - ComboBox bleibt beim Ladevorgang offen
 
Moin Christian,

das hat zwar mit Deinem Problem nichts zu tun, aber:

So wie Du das try/finally angewendet hast, ist es relativ sinnlos.
Egal ob die Datei erfolgreich geladen werden konnte oder nicht: Sie wird verarbeitet... ;-)

Besser, Du schreibst das try hinter das BeginUpdate, und kapselst das EndUpdate in finally/end, um sicherzustellen, dass der Listview auch dann wieder etwas anzeigt, wenn bei der Verarbeitung der Datei etwas schiefgegangen ist.

Eigentlich handelt es ich bei try/finally um den, sogenannten, Resourcenschutzblock, der dafür sorgen soll, dass belegte Resourcen auch dann wieder freigegeben werden, wenn bei deren Verarbeitung ein Fehler aufgetreten ist.

Delphi-Quellcode:
// Resource belegen
sl := TStringList.Create;
try
  // mit der Resource arbeiten
finally
  // Resource freigeben
  sl.free;
end;

// oder auch

dwHandle := CreateFile(....);
if dwHandle <> INVALID_HANDLE_VALUE then begin
  try
    // mit der Datei arbeiten
  finally
    CloseHandle(dwHandle);
  end;
end;

Yheeky 27. Jan 2007 15:28

Re: Datensatz laden - ComboBox bleibt beim Ladevorgang offen
 
Zitat:

Zitat von Christian Seehase
So wie Du das try/finally angewendet hast, ist es relativ sinnlos.
Egal ob die Datei erfolgreich geladen werden konnte oder nicht: Sie wird verarbeitet... ;-)

Stimmt :-) habe das try...finally nun so angepasst, wie du geschrieben hast.

Das eigentliche Problem ist aber noch da, auch wenn ich BeginUpdate() und EndUpdate() ganz rauslasse...dann ist es sogar noch schlimmer.

marabu 27. Jan 2007 15:41

Re: Datensatz laden - ComboBox bleibt beim Ladevorgang offen
 
Hi Christian,

bei Eintritt in den event handler der ComboBox für OnChange() ist die DropDown-Liste bereits wieder geschlossen:

Delphi-Quellcode:
procedure TDemoForm.ComboBoxChange(Sender: TObject);
begin
  with Sender as TComboBox do
  begin
    if DroppedDown then
      ShowMessage('ick bin all zu');
  end;
end;
Vielleicht ist Windows aus irgendeinem Grund zwischenzeitlich nicht in der Lage gewesen den betreffenden Ausschnitt der Form neu zu zeichnen. Das notwendige Application.ProcessMessages würde ich noch vor der Zähl-Schleife einbringen.

Grüße vom marabu

Yheeky 27. Jan 2007 17:45

Re: Datensatz laden - ComboBox bleibt beim Ladevorgang offen
 
Okay, mit der Standard-Combobox funktioniert es. Ich hatte es mit einer erweiterten Komponente versucht und die hat das Problem verursacht.
Nun möchte ich aber noch den Fortschritt anzeigen lassen, aber es wird lediglich die volle ProgressBar angezeigt, wenn der Vorgang beendet wird. Wieso das?

Christian Seehase 27. Jan 2007 17:54

Re: Datensatz laden - ComboBox bleibt beim Ladevorgang offen
 
Moin Christian,

Zitat:

Zitat von Yheeky
aber es wird lediglich die volle ProgressBar angezeigt, wenn der Vorgang beendet wird. Wieso das?

Zitat:

Zitat von marabu
Das notwendige Application.ProcessMessages


Yheeky 27. Jan 2007 18:02

Re: Datensatz laden - ComboBox bleibt beim Ladevorgang offen
 
Okay danke, es funktioniert natürlich, allerdings wieder nicht mit der erweiterten Kompo. Werde nun die normale ComboBox verwenden. Danke nochmal!


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