![]() |
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! |
Re: Datensatz laden - ComboBox bleibt beim Ladevorgang offen
Zeig mal den zugehörigen Code
|
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; |
Re: Datensatz laden - ComboBox bleibt beim Ladevorgang offen
Laß mal .BeginUpdate()/.EndUpdate() wg.
|
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; |
Re: Datensatz laden - ComboBox bleibt beim Ladevorgang offen
Zitat:
Das eigentliche Problem ist aber noch da, auch wenn ich BeginUpdate() und EndUpdate() ganz rauslasse...dann ist es sogar noch schlimmer. |
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:
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.
procedure TDemoForm.ComboBoxChange(Sender: TObject);
begin with Sender as TComboBox do begin if DroppedDown then ShowMessage('ick bin all zu'); end; end; Grüße vom marabu |
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? |
Re: Datensatz laden - ComboBox bleibt beim Ladevorgang offen
Moin Christian,
Zitat:
Zitat:
|
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 19:59 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-2025 by Thomas Breitkreuz