![]() |
Flackern / Verzögerungen bei Update eigener Komponente
Hallo zusammen,
habe hier ein paar Problemchen mit einer selbst erstellten Komponente. Die Komponente ist auf Basis von TCustomControl erstellt. Die Initialisierung "Create" ist wie folgt:
Delphi-Quellcode:
Die Darstellen findet in "Paint" statt. Der gekürzte Code sieht aus wie folgt:
constructor TPlanGrid.Create(AOwner: TComponent);
begin inherited; ControlStyle := [csCaptureMouse, csDoubleClicks, csOpaque, csFramed, csNeedsBorderPaint];
Delphi-Quellcode:
Das "DrawHeader" zeichnet einen Kopfbereich, das "DrawLines" zeichnet unterhalb des Kopfbereich. Das Problem ist nun, dass die Komponente jedesmal bei einer Größenveränderung ihren kompletten Inhalt mit der Hintergrundfarbe überpinselt, ehe ich mit Paint zum Zug komme. Das flackert natürlich sehr unschön. Ok, mit "DoubleBuffer" lässt sich das zwar abschalten aber ist auch nicht die schöne Lösung. Hat jemand eine Idee, wie ich TCustomControl davon abbringen kann den Hintergrund bei "Resize" immer neu zu zeichnen? Das Ganze wird ja mit wachsender Funktionalität nicht besser.
begin
Canvas.Font.Assign(Font); if FShowHeader then DrawHeader; DrawLines; end; Nun habe ich mich entschlossen dem Teil noch einen ScrollBar zu spendieren. Erstellt wird dieser in "Create" mit folgendem Code:
Delphi-Quellcode:
Ob das so eine gute Lösung ist sei dahin gestellt. Wenn jemand eine elegantere Lösung hat, dann her damit. Auf jeden Fall wurde "Paint", zur Berücksichtigung des ScrollBars wie folgt angepasst:
FVertScrollBar := TScrollBar.Create(Self);
with FVertScrollBar do begin Kind := sbVertical; ParentDoubleBuffered := False; DoubleBuffered := False; Align := alRight; AlignWithMargins := True; end; InsertControl(FVertScrollBar);
Delphi-Quellcode:
Der Code soll nur verhindern, dass die Bereiche, die ich zeichne nicht über den ScrollBar drüberpinseln. Richtig unschön wird es wieder bei "Resize". Da wandert der ScrollBar dem Rahmen hinterher. Schiebe ich das Fenster kleiner, dann verschwindet der ScrollBar währen der Größenveränderung teilweise unter dem Rahmen. Beim Größerziehen löst er sich davon ab. Sobald die Größe sich nicht mehr verändert stimmt wieder alles. Der Scrollbar selbst reagiert recht eigenartig auf "DoubleBufferd" oder manuelles Neuzeichnen vor meinen Aktionen (DrawHeader und DrawLines)...
var
Region: HRGN; begin Canvas.Font.Assign(Font); if FShowHeader then begin FVertScrollBar.Margins.SetBounds(0, FCellHeight * 4, 0, 0); DrawHeader; end else FVertScrollBar.Margins.SetBounds(0, 0, 0, 0); Region := CreateRectRgn(0, 0, ClientWidth - FVertScrollBar.Width, ClientHeight); SelectClipRgn(Canvas.Handle, Region); DrawLines; SelectClipRgn(Canvas.Handle, HRGN(nil)); DeleteObject(Region); end; Ich hoffe man kann ungefähr nachvollziehen wo meine Problematik ist. Wäre für jede Hilfe, Tipps und Anregungen dankbar... Alex |
Re: Flackern / Verzögerungen bei Update eigener Komponente
Hallo Leute,
falls es jemanden interesiert :gruebel: : Eins der Probleme habe ich mittlerweile gelöst. Den Scrollbar kennt die Komponente ja schon. Der muss nur noch angezeigt werden:
Delphi-Quellcode:
Vielleicht komme ich ja auch noch hinter das andere Problem...... var ScrollInfo: tagSCROLLINFO; begin ScrollInfo.fMask := SIF_PAGE or SIF_RANGE ; ScrollInfo.nPage := 40; ScrollInfo.nMin := 1; ScrollInfo.nMax := 100; SetScrollInfo(Handle,SB_VERT,ScrollInfo,true); ... Regards Alex |
Re: Flackern / Verzögerungen bei Update eigener Komponente
Heute läuft's wieder... :lol:
Zweites Problem gelöst:
Delphi-Quellcode:
Alex
type
TMyComponent = class(TCustomControl) private procedure WMEraseBkGnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; ... end; ... implementation procedure TPlanGrid.WMEraseBkGnd(var Message: TWMEraseBkgnd); begin Message.Result := 0 // Verhindern dass der Hintergrund gelöscht wird um Flacker zu vermeiden... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 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