Autor |
Beitrag |
OliverN_26
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Fr 14.01.11 03:45
Ich habe ein Grid mit 10 Spalten und 12 sichtbaren Zeilen.
1 Spalte nennt sich Restzeit in der die Restzeit zu einem eingegebenem Alarm angezeigt wird.
Diese wird mittels einem Timer jede Sekunde neu berechnet.
Mein Rechner scheint etwas Leistungsstärker zu sein, denn da flackert gar nichts. Starte ich das Programm
allerdings auf einem anderen Rechner flackert das Programm (sogar 2 meiner BitBtn's aus der Menuzeile).
Ich dachte zuerst dass es an der DRAW-Methode aus dem StringGrid liegt, wo auch einiges drin steht, aber das kann nich sein,
denn 1. steht da mittlerweile (Testweise) "nichts" mehr drin und zum anderen hab ich versucht den Timer nur alle 10 Sekunden auslösen
zu lassen. Es flackert trotzdem .. nun halt alle 10 Sekunden.
Gibt es da einen Trick oder ist meine Timer-Rechenfunktion einfach zu gross, aber das kann ich mir nicht vorstellen, denn es wird nur die Zeit geprüft.
Es passiert erst was wenn die Zeit abgelaufen ist.
Bei TForm1.FormCreate setze ich Form1.DoubbleBuffered := true aber das hilft auch nichts.
Bin dankbar für jeden Tip
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 14.01.11 04:24
Probier mal ein stringgrid.beginupdate; davor und ein stringgrid.endupdate; danach einzufügen. Hat den sinn das nicht immer nach jedem aktualisiertem item gezeichnet wird sondern erst nach dem endupdate.
Lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 14.01.11 07:09
OliverN_26 hat folgendes geschrieben : | Bei TForm1.FormCreate setze ich Form1.DoubbleBuffered := true aber das hilft auch nichts. |
Hast du denn auch DoubleBuffered des StringGrids (und falls das auf einem Panel oder so liegt auch dessen DoubleBuffered) ebenfalls auf True gesetzt?
Ansonsten: Warum muss es denn ein TStringGrid sein? Leicht flackern tut das eben manchmal, es sei denn du fängst WM_ERASEBKGND oder so ab, aber das macht ggf. auch andere Probleme. 
|
|
OliverN_26 
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Fr 14.01.11 18:54
@elundril
Das hatte ich bereits probiert hat aber leider nichts gebracht.
@jaenicke
Das mit dem DoubbleBuffered hatte ich mal in einem Forum gelesen, aber ich wusste ehrlich nicht dass anscheinend jede Komponente diese Eigenschaft hat
Ich habe jetzt diese Eigenschaft bei den entsprechenden 4/5 Komponenten bei TFORM1.FORMCREATE auf TRUE gesetzt und es geht.
Hat das denn irgendwelche Nebenwirkungen? Im Ressourcenbereich meine ich.
Und schaltet sich (wodurch auch immer) DoubbleBuffer irgendwann mal wieder auf FALSE so das man dass im Programm überprüfen müsste?
Danke
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 14.01.11 20:31
OliverN_26 hat folgendes geschrieben : | Hat das denn irgendwelche Nebenwirkungen? Im Ressourcenbereich meine ich. |
Ja, sicher, es wird der gesamte Bereich zusätzlich im Speicher gehalten. Windows Vista und 7 machen das noch einmal zusätzlich, was man bei Vista am Speicherbedarf des DWM sehen konnte.
Letztlich kann man es aber nur vermeiden, wenn man das Neuzeichnen des Hintergrunds usw. abfängt, was wiederum schwerwiegende Auswirkungen auf die graphische Darstellung hat, wenn man nicht aufpasst (Grafikfehler). Leider ist das bei manchen Komponenten wiederum die einzige Möglichkeit dem Flackern bei Größenänderungen zu begegnen.
Deshalb muss man damit leben und allzuviel ist das nicht.
OliverN_26 hat folgendes geschrieben : | Und schaltet sich (wodurch auch immer) DoubbleBuffer irgendwann mal wieder auf FALSE so das man dass im Programm überprüfen müsste? |
Solange du es nicht anders setzt, bleibt der Wert wie er ist.
|
|
OliverN_26 
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Fr 14.01.11 21:08
Wie gesagt .. ich habe alles (Testweise) um die Problem-Komponenten herum mal auf TRUE gesetzt.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.FormCreate(Sender: TObject); begin try Form1.DoubleBuffered := true; StringGrid1.DoubleBuffered := true; Panel4.DoubleBuffered := true; Panel5.DoubleBuffered := true; BitBtn12.DoubleBuffered := true; BitBtn15.DoubleBuffered := true; |
Ich habe jetzt das Phänomen dass die beiden "BitBtn's" weiterhin flackern.
Wie kann das sein?
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 14.01.11 21:19
Dann benutzt du vermutlich noch eine ältere Delphiversion. Bei neueren Versionen habe ich das Problem nicht mehr, weiß aber auch nicht so genau was da anders ist (habe nie weiter nachgeschaut).
Dort kannst du nur WM_ERASEBKGND der Buttons abfangen, musst aber dann aufpassen, dass du dadurch keine Grafikfehler bekommst.
|
|
OliverN_26 
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Sa 15.01.11 05:47
Ok .. habs hinbekommen.
Dass es an der Delphi Version liegt kann ich mir nicht vorstellen, da ich nicht zum ersten Mal BitBtn's nutze und noch nie ein solches Problem hatte.
Ich nutze übrigens Delphi 7 Enterprise.
Ich habe viel rum probiert und bin letztendlich zu der Erkenntnis gekommen dass es an den Bildern, die auf dem Button gezeichnet werden, liegt.
Hab versucht sie kleiner zu machen und was weiss ich nich alles .. Fehler war dass ich sie mit bitbtn12.Glyph.LoadFromFile(); lade und im
Programm auch so veränder (also ein anderes Bild zeichne).
Habe jetzt NumGlyphs auf 2 erhöht, ein entsprechendes Bitmap erstellt und änder die Bilder mit ENABLE:=TRUE/FALSE und siehe da .. alles so wie es sein soll.
Hätte ich den sch.... Fehler mit dem Laden des Bildes nicht gemacht hätte ich mir zum einen 1 Tag meines kostbaren Lebens gespart und zum anderen hätte
DoubbleBuffer := true seine Pflicht getan. Den hab ich nämlich nur noch für die Form und das StringGrid auf TRUE gesetzt.
Danke noch mal für die Unterstützung
bye
|
|