Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Update des Fensters für eine Zeit unterbinden (https://www.delphipraxis.net/168367-update-des-fensters-fuer-eine-zeit-unterbinden.html)

loirad 17. Mai 2012 15:17

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

Dalai 17. Mai 2012 15:24

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

loirad 17. Mai 2012 15:27

AW: Update des Fensters für eine Zeit unterbinden
 
Bei der Listbox gibt es kein .BeginUpdate oder .EndUpdate!
Oder habe ich etwas übersehen :oops:?

Dalai 17. Mai 2012 15:35

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

Zacherl 17. Mai 2012 15:39

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;

loirad 17. Mai 2012 15:43

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:
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;
Tage ist ein array of TListBox!

Vielen Dank für weitere und gegebene Lösungen:thumb:

PS.: Bei der Lösung von Zacherl fliegt die gleiche Exception!

Zacherl 17. Mai 2012 15:48

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.

loirad 17. Mai 2012 15:53

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?

daywalker9 17. Mai 2012 16:03

AW: Update des Fensters für eine Zeit unterbinden
 
Du kannst WM_SETREDRAW nutzen. Beispiel findest Du dort: StackOverflow

loirad 17. Mai 2012 16:24

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:
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;
Eigentlich sieht es wie auf dem 2. Bild aus!

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 09:36 Uhr.
Seite 1 von 3  1 23      

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