![]() |
Update des Fensters für eine Zeit unterbinden
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo liebe Delphi-PRAXIS'ler,
ich möchte einen Kalender programmieren. Für die einzelnen Tage nutze ich Listboxen in einer Stringgrid integriert. Nun mein Problem: Beim Erzeugen bzw. Wechseln der Monate flackert das Formular sehr! Wie könnte ich das beheben? Meine Idee: Update des Fensters für eine Zeit unterbinden. Wie geht das? Liebe Grüße loirad |
AW: Update des Fensters für eine Zeit unterbinden
Ohne jetzt erst das Archiv runterladen zu müssen: TListBox.BeginUpdate und .EndUpdate benutzt?
MfG Dalai |
AW: Update des Fensters für eine Zeit unterbinden
Bei der Listbox gibt es kein .BeginUpdate oder .EndUpdate!
Oder habe ich etwas übersehen :oops:? |
AW: Update des Fensters für eine Zeit unterbinden
Sorry, hab ich vertan. TListItems.BeginUpdate ist richtig. Aber selbst mit dem Hinweis hättest du etwas gefunden. TListItems ist übrigens eine Eigenschaft von TListBox.
MfG Dalai |
AW: Update des Fensters für eine Zeit unterbinden
Die Eigenschaft TListItems wäre mir jetzt nicht bekannt und aufgrund des vorranstehenden "T"s, handelt es sich hierbei auch eher um eine Klasse. Zum Hinzufügen mehrerer Items in einer ListBox geht man normalerweise wie folgt vor:
Delphi-Quellcode:
begin
ListBox1.Items.BeginUpdate; try for i := 0 to 100000 do begin ListBox1.Items.Add('Ich bin Item Nummer ' + IntToStr(i)); end; finally ListBox1.Items.EndUpdate; end; |
AW: Update des Fensters für eine Zeit unterbinden
Liste der Anhänge anzeigen (Anzahl: 1)
Da fliegt mir ne Exception um die Ohren, wenn ich es so mache:
Delphi-Quellcode:
Tage ist ein array of TListBox!
for i:=0 to length(Tage)-1 do
begin [B]Tage[i].Items.BeginUpdate;[/B] Tage[i]:=TListbox.Create(Kalender); Tage[i].Parent:=Kalender; Tage[i].Width:=Kalender.DefaultColWidth; Tage[i].Height:=Kalender.DefaultRowHeight; Tage[i].Left:=((i+Wochentag-1) mod 7)*(Kalender.DefaultColWidth+1); Tage[i].Top:=((i+Wochentag-1) div 7)*(Kalender.DefaultRowHeight+1)+40; Tage[i].Style:=lbOwnerDrawFixed; Tage[i].Font.Size:=10; Tage[i].Items.Add(Zentriere(inttostr(i+1)+'.'+inttostr(m)+'.'+inttostr(y),Tage[i].ClientWidth, Tage[i].Font)); [B]Tage[i].Items.EndUpdate;[/B] end; Vielen Dank für weitere und gegebene Lösungen:thumb: PS.: Bei der Lösung von Zacherl fliegt die gleiche Exception! |
AW: Update des Fensters für eine Zeit unterbinden
Du rufst BeginUpdate auf, bevor du die ListBox mit Create erstellt hast.
Aber in dem Falle ist BeginUpdate und EndUpdate wohl auch nicht das Problem, da du jeweils nur ein Item hinzufügst. Dafür erstellst du halt einen Haufen von ListBoxen. Eventuell solltest du dich mal nach einer anderen Komponente umschauen, die für eine Kalenderdarstellung eventuell besser geeignet ist. Ansonsten probier mal die DoubleBuffered Eigenschaft des Formulars zu aktivieren. |
AW: Update des Fensters für eine Zeit unterbinden
Vielen Dank für den Tip - hätte ich auch selbst drauf kommen können :oops:!
Es flackert aber immernoch, wie du schon meintest. Doublebuffered ist schon an! Ich müsste das Formular bzw. die Anzeige künstlich für diese Zeit einfrieren. Geht das irgendwie? |
AW: Update des Fensters für eine Zeit unterbinden
Du kannst WM_SETREDRAW nutzen. Beispiel findest Du dort:
![]() |
AW: Update des Fensters für eine Zeit unterbinden
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo, Danke für deine Idee daywalker9, aber es funktioniert immmernoch nicht.
Es flackert zwar nicht, aber es erzeugt auch nichts (siehe Bild im Anhang).
Delphi-Quellcode:
Eigentlich sieht es wie auf dem 2. Bild aus!
for i:=0 to length(Tage)-1 do
begin Tage[i]:=TListbox.Create(Kalender); Tage[i].Parent:=Kalender; SendMessage(Handle, WM_SETREDRAW, WPARAM(False), 0); try Tage[i].Width:=Kalender.DefaultColWidth; Tage[i].Height:=Kalender.DefaultRowHeight; Tage[i].Left:=((i+Wochentag-1) mod 7)*(Kalender.DefaultColWidth+1); Tage[i].Top:=((i+Wochentag-1) div 7)*(Kalender.DefaultRowHeight+1)+40; Tage[i].Style:=lbOwnerDrawFixed; Tage[i].Font.Size:=10; Tage[i].Items.Add(Zentriere(inttostr(i+1)+'.'+inttostr(m)+'.'+inttostr(y),Tage[i].ClientWidth,Tage[i].Font)); finally SendMessage(Handle, WM_SETREDRAW, WPARAM(True), 0); end; end; Hat noch jemand eine weitere Idee oder habe ich etwas übersehen? Danke für weitere Antworten:thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 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 by Thomas Breitkreuz