AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OnDrawTab korrekt ausführen

Ein Thema von whiteF · begonnen am 10. Okt 2016 · letzter Beitrag vom 14. Okt 2016
Antwort Antwort
whiteF

Registriert seit: 14. Okt 2008
45 Beiträge
 
#1

OnDrawTab korrekt ausführen

  Alt 10. Okt 2016, 03:49
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.?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#2

AW: OnDrawTab korrekt ausführen

  Alt 10. Okt 2016, 08:00
Hast du schon mal ein simples pControl.Repaint versucht?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#3

AW: OnDrawTab korrekt ausführen

  Alt 10. Okt 2016, 09:43
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
whiteF

Registriert seit: 14. Okt 2008
45 Beiträge
 
#4

AW: OnDrawTab korrekt ausführen

  Alt 10. Okt 2016, 10:25
@ 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) <> '_tempthen
                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;

Geändert von whiteF (10. Okt 2016 um 10:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#5

AW: OnDrawTab korrekt ausführen

  Alt 10. Okt 2016, 12:13
Kannst du mal ein compilierbares Beispiel anhängen, bei dem das Repaint nicht funktioniert? Meine kläglichen Versuche zeigen nämlich nicht dieses Verhalten.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
whiteF

Registriert seit: 14. Okt 2008
45 Beiträge
 
#6

AW: OnDrawTab korrekt ausführen

  Alt 12. Okt 2016, 22:19
@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...

Geändert von whiteF (12. Okt 2016 um 22:21 Uhr)
  Mit Zitat antworten Zitat
whiteF

Registriert seit: 14. Okt 2008
45 Beiträge
 
#7

AW: OnDrawTab korrekt ausführen

  Alt 14. Okt 2016, 23:01
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:
pControl.Repaint VG
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:14 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