Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   OnDrawTab korrekt ausführen (https://www.delphipraxis.net/190497-ondrawtab-korrekt-ausfuehren.html)

whiteF 10. Okt 2016 03:49

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:
pControl.OwnerDraw := False;
pControl.OwnerDraw := True;
Wie rufe ich denn die Funktion besser auf?
Code:
procedure TFormM.pControlDrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const [Ref] Rect: TRect; Active: Boolean);
Oder kann man die Child Elemente so konfigurieren, dass sie nicht vom OwnerDraw betroffen werden.?

Uwe Raabe 10. Okt 2016 08:00

AW: OnDrawTab korrekt ausführen
 
Hast du schon mal ein simples
Delphi-Quellcode:
pControl.Repaint
versucht?

himitsu 10. Okt 2016 09:43

AW: OnDrawTab korrekt ausführen
 
Delphi-Quellcode:
procedure TCustomTabControl.SetOwnerDraw(Value: Boolean);
begin
  if FOwnerDraw <> Value then
  begin
    FOwnerDraw := Value;
    RecreateWnd;
  end;
end;
Alle internen Windows-Controls werden neu erzeugt und da das VCL-TMemo nicht die Scrollbarpositionen speichert, geht das natürlich verloren.

whiteF 10. Okt 2016 10:25

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:
MemoV2.Hint := IntToStr(MemoV2.CaretPos.Y);
pControl.OwnerDraw := False;
pControl.OwnerDraw := True;
und ein auslesen wieder bei OnDraw:
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;

Uwe Raabe 10. Okt 2016 12:13

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.

whiteF 12. Okt 2016 22:19

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...

whiteF 14. Okt 2016 23:01

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:
pControl.OwnerDraw := False;
pControl.OwnerDraw := True;
verwendet. Dies funktionierte auch, JEDOCH hatte es Nebenwirkungen!
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:
pControl.OwnerDraw := False;
pControl.OwnerDraw := True;
Das stattdessen verwenden:
Delphi-Quellcode:
pControl.Repaint
VG


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:13 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