AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Update des Fensters für eine Zeit unterbinden
Thema durchsuchen
Ansicht
Themen-Optionen

Update des Fensters für eine Zeit unterbinden

Ein Thema von loirad · begonnen am 17. Mai 2012 · letzter Beitrag vom 17. Mai 2012
Antwort Antwort
Seite 1 von 3  1 23      
loirad

Registriert seit: 25. Nov 2009
135 Beiträge
 
Delphi 6 Professional
 
#1

Update des Fensters für eine Zeit unterbinden

  Alt 17. Mai 2012, 16:17
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
Angehängte Dateien
Dateityp: zip Kalender.zip (235,4 KB, 6x aufgerufen)
Wer Fehler findet darf sie behalten!
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#2

AW: Update des Fensters für eine Zeit unterbinden

  Alt 17. Mai 2012, 16:24
Ohne jetzt erst das Archiv runterladen zu müssen: TListBox.BeginUpdate und .EndUpdate benutzt?

MfG Dalai
  Mit Zitat antworten Zitat
loirad

Registriert seit: 25. Nov 2009
135 Beiträge
 
Delphi 6 Professional
 
#3

AW: Update des Fensters für eine Zeit unterbinden

  Alt 17. Mai 2012, 16:27
Bei der Listbox gibt es kein .BeginUpdate oder .EndUpdate!
Oder habe ich etwas übersehen ?
Wer Fehler findet darf sie behalten!
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#4

AW: Update des Fensters für eine Zeit unterbinden

  Alt 17. Mai 2012, 16:35
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Update des Fensters für eine Zeit unterbinden

  Alt 17. Mai 2012, 16:39
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;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
loirad

Registriert seit: 25. Nov 2009
135 Beiträge
 
Delphi 6 Professional
 
#6

AW: Update des Fensters für eine Zeit unterbinden

  Alt 17. Mai 2012, 16:43
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

PS.: Bei der Lösung von Zacherl fliegt die gleiche Exception!
Angehängte Grafiken
Dateityp: jpg 2012-05-17_164011.jpg (25,6 KB, 4x aufgerufen)
Wer Fehler findet darf sie behalten!
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: Update des Fensters für eine Zeit unterbinden

  Alt 17. Mai 2012, 16:48
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
loirad

Registriert seit: 25. Nov 2009
135 Beiträge
 
Delphi 6 Professional
 
#8

AW: Update des Fensters für eine Zeit unterbinden

  Alt 17. Mai 2012, 16:53
Vielen Dank für den Tip - hätte ich auch selbst drauf kommen können !
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?
Wer Fehler findet darf sie behalten!
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#9

AW: Update des Fensters für eine Zeit unterbinden

  Alt 17. Mai 2012, 17:03
Du kannst WM_SETREDRAW nutzen. Beispiel findest Du dort: StackOverflow
Lars
  Mit Zitat antworten Zitat
loirad

Registriert seit: 25. Nov 2009
135 Beiträge
 
Delphi 6 Professional
 
#10

AW: Update des Fensters für eine Zeit unterbinden

  Alt 17. Mai 2012, 17:24
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
Angehängte Grafiken
Dateityp: jpg 2012-05-17_172129.jpg (9,2 KB, 4x aufgerufen)
Dateityp: jpg 2012-05-17_172242.jpg (30,5 KB, 4x aufgerufen)
Wer Fehler findet darf sie behalten!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 17:51 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