![]() |
OnDrawTab korrekt ausführen
Hi,
ich habe ein TPageControl, dynamisch erzeugte TTabSheets, die wiederrum dynamisch erzeugte TMemos haben. Dem TPageControl, habe ich ein OnDrawTab hinzugefügt. Dieses Ereignis soll jedesmal ausgeführt sofern sich ein Inhalt einer Datei ändert, um die Beschriftung des jeweiligen Tabs farblich hervorzurufen. Zur Zeit passiert fast alles so wie es soll, nur bezweckt mein folgendes Gemurckse, dass meine darin befindlichen Memos immer wieder ganz nach oben scrollen. Ich möchte gerne dass meine Memoscrollbalken da bleiben wo sie sind und dennoch die Tabschrift neu einfärben. Das hier ist der Übeltäter:
Delphi-Quellcode:
Wie rufe ich denn die Funktion besser auf?
pControl.OwnerDraw := False;
pControl.OwnerDraw := True;
Code:
Oder kann man die Child Elemente so konfigurieren, dass sie nicht vom OwnerDraw betroffen werden.?
procedure TFormM.pControlDrawTab(Control: TCustomTabControl;
TabIndex: Integer; const [Ref] Rect: TRect; Active: Boolean); |
AW: OnDrawTab korrekt ausführen
Hast du schon mal ein simples
Delphi-Quellcode:
versucht?
pControl.Repaint
|
AW: OnDrawTab korrekt ausführen
Delphi-Quellcode:
Alle internen Windows-Controls werden neu erzeugt und da das VCL-TMemo nicht die Scrollbarpositionen speichert, geht das natürlich verloren.
procedure TCustomTabControl.SetOwnerDraw(Value: Boolean);
begin if FOwnerDraw <> Value then begin FOwnerDraw := Value; RecreateWnd; end; end; |
AW: OnDrawTab korrekt ausführen
@ Uwe
Das hatte ich auch schon probiert; leider ohne Erfolg. Das Fenster wird zwar neu erzeugt aber nur die im pagecontrol enthaltenen TMemos verlieren ihre Scrollbar Position. Die Jedi-Kompontenten behandeln das leider genauso (TJvPageControl, TJvMemo). Da bleibt wohl nur der Weg des Auslesen des Caret jedes einzelnen TMemo innerhalb jeden pageControl vor der OwnerDraw aktualisierung
Delphi-Quellcode:
und ein auslesen wieder bei OnDraw:
MemoV2.Hint := IntToStr(MemoV2.CaretPos.Y);
pControl.OwnerDraw := False; pControl.OwnerDraw := True;
Delphi-Quellcode:
procedure TFormMessenger.pcMessengerDrawTab(Control: TCustomTabControl;
TabIndex: Integer; const [Ref] Rect: TRect; Active: Boolean); var sCaption : String; i, ii, iTop, iLeft, important : Integer; Farbe : TColor; ThisControl : TControl; ThisMemo : TMemo; begin ... for i := 0 to pcMessenger.PageCount - 1 do begin for ii := 0 to pcMessenger.Pages[i].ControlCount-1 do begin ThisControl := pcMessenger.Pages[i].Controls[ii]; if ThisControl is TMemo then begin ThisMemo := ThisControl as TMemo; if RightStr(ThisMemo.Name, 5) <> '_temp' then begin if Farbe = clBlue then UnitUsefullTools.MemoScrollDown(ThisMemo) //Sofern die var Farbe = clBlue (ein neuer Eintrag), dann scrolle bis ganz unten... else if ThisMemo.Hint <> '' then UnitUsefullTools.MemoScrollTo(ThisMemo, StrToInt(ThisMemo.Hint)) //Sofern die var Farbe <> clBlue (KEIN neuer Eintrag), dann scrolle bis zur letzten Position (die im Hint zuvor aufenommen wurde)... end; end; end; end; ... end; |
AW: OnDrawTab korrekt ausführen
Kannst du mal ein compilierbares Beispiel anhängen, bei dem das Repaint nicht funktioniert? Meine kläglichen Versuche zeigen nämlich nicht dieses Verhalten.
|
AW: OnDrawTab korrekt ausführen
@Uwe: Ich habe versucht ein neues Delphi Projekt aufzubauen um es dir zeigen zu können.
Leider funktioniert es bei diesem example wunderbar. Natürlich ist der code nicht 1:1 der selbe wie aus meinem eigentlichen projekt. Ich habe jetzt über 3 Stunden versucht den Fehler zu finden und habe noch immer keine Lösung. Mir ist nur ein neuer sehr abstrakter Fehler aufgefallen. Auf meinem Delphi-PC habe ich 100% DPI und auf meinem testnotebook 125% DPI. Alle Memos die zur Laufzeit erstellt wurden verhalten sich anders als das was bereits zur Laufzeit Existierende. Es werden lediglich der erste Buchstabe (hier 'D') von meinem String der Line hinzugefügt (hier: Memo.Lines.Add('Dies ist ein String'); In der nächsten Line kommt der 2.te Buchstabe... usw. usw. bis der komplette String untereinander steht. Wenn ich nun auf dem Test-Notebook die DPI wieder auf 100% umstelle, wird der String korrekt in der Memo angezeigt. (Ich habe auch auf einem anderen Test-PC das auch mit DPI 125% ausprobiert. Da wird der String auch untereinander hingeschossen.) Nur wenn ich die DPI im Windows umstelle?! (natürlich mit abmeldung) Also langsam verzweifel ich... |
AW: OnDrawTab korrekt ausführen
Ok, Problem gelöst.
Ich weiß nicht warum aber beim testen von Repaint wird doch on...DrawTab aufgerufen. Irgendwie war ich der Annahme dass Repaint nicht ging (auch mit Tests... eigenartig) und deshalb hatte ich
Delphi-Quellcode:
verwendet. Dies funktionierte auch, JEDOCH hatte es Nebenwirkungen!
pControl.OwnerDraw := False;
pControl.OwnerDraw := True; Und zwar auf zb folgendes: - auf die Scrollbarposition: Diese wurde immer wieder resettet - auf den Text innerhalb des Memos: Es wurde pro Zeile immer nur der jeweils folgende Char angezeigt Lösung: Das löschen:
Delphi-Quellcode:
Das stattdessen verwenden:
pControl.OwnerDraw := False;
pControl.OwnerDraw := True;
Delphi-Quellcode:
VG
pControl.Repaint
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 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