Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi UxTheme-Funktion "vernichtet" TRect (https://www.delphipraxis.net/182337-uxtheme-funktion-vernichtet-trect.html)

BadenPower 17. Okt 2014 15:59

Delphi-Version: 2007

UxTheme-Funktion "vernichtet" TRect
 
Hallo zusammen,

kann bitte irgendjemand einmal diesen Codeschnipsel in einer Paintmethode ausprobieren?

Delphi-Quellcode:
procedure TNewComponent.Paint;
var
  lRect: TRect;
  lLogFont: LOGFONT;
begin

   lRect := Rect(10,0,100,20);
   UxTheme.GetThemeSysFont(0, TMT_CAPTIONFONT, lLogFont);
   DrawText(Canvas.Handle,PChar('Titel1'),Length(PChar('Titel1')) ,
          lRect,DT_LEFT or DT_SINGLELINE or DT_END_ELLIPSIS or DT_VCENTER);

   lRect := Rect(10,30,100,50);
   DrawText(Canvas.Handle,PChar('Titel2'),Length(PChar('Titel2')) ,
          lRect,DT_LEFT or DT_SINGLELINE or DT_END_ELLIPSIS or DT_VCENTER);

end;
Bei mir wird nur der 2. Text ausgegeben.
Delphi 2007 auf Windows XP.

TiGü 17. Okt 2014 16:13

AW: UxTheme-Funktion "vernichtet" TRect
 
Ohne den Code in eine Paint-Methode geschrieben zu haben, aber ist das gewollt, das lRect := Rect(10,30,100,20); ein leeres Rechteck (Bottom < Top) erzeugt?

BadenPower 17. Okt 2014 16:19

AW: UxTheme-Funktion "vernichtet" TRect
 
Hallo zusammen,
Zitat:

Zitat von TiGü (Beitrag 1276441)
Ohne den Code in eine Paint-Methode geschrieben zu haben, aber ist das gewollt, das lRect := Rect(10,30,100,20); ein leeres Rechteck (Bottom < Top) erzeugt?

Ist mir noch gar nicht aufgefallen.

Aber das würde das 2. Rect betreffen und nicht das 1.

Und trotz des Fehlers zeigt er nur den Text im 2. Rect an.


EDIT: Hab den Code oben berichtigt.

Der schöne Günther 17. Okt 2014 16:38

AW: UxTheme-Funktion "vernichtet" TRect
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich "uxTheme" in die uses aufnehme und das als OnPaint-Ereignis einfüge (ist doch richtig, oder?) erhalte ich das Bild im Anhang.

Ich habe zwar keine Ahnung was vor sich geht, aber ich hoffe das konnte dir weiterhelfen :P

XE7 auf Win8.1

BadenPower 17. Okt 2014 19:30

AW: UxTheme-Funktion "vernichtet" TRect
 
Hallo zusammen,
Zitat:

Zitat von Der schöne Günther (Beitrag 1276444)
Ich habe zwar keine Ahnung was vor sich geht, aber ich hoffe das konnte dir weiterhelfen :P

Bedingt, denn jetzt weiss ich, dass etwas bei mir nicht stimmt.

Vielleicht ist noch jemand mit Win XP und D2007 hier, welcher das testen könnte.


Zitat:

Zitat von Der schöne Günther (Beitrag 1276444)
Wenn ich "uxTheme" in die uses aufnehme und das als OnPaint-Ereignis einfüge (ist doch richtig, oder?) erhalte ich das Bild im Anhang.

Eigentlich dachte ich der Paint-Procedure direkt, wenn man eine Komponente erstellt.

Wenn ich den Code wie Du in den OnPaint-Event einfüge, dann bekomme ich bei mir eine Fehlermeldung: "Zugriffverletzung bei Adresse 00000000. Lesen von Adresse 00000000".



Dein Vorgehen hat mich aber auf die Idee des folgenden Codes gebracht, welchen ich in das OnClick-Ereignis eines Button eingefügt habe:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  lRect: TRect;
  lLogFont: LOGFONT;
  lhThemeData: HTHEME;
begin

  lhThemeData := OpenThemeData(0, 'window');

  lRect := Rect(10,20,100,200);
  UxTheme.GetThemeSysFont(lhThemeData, TMT_CAPTIONFONT, lLogFont);

  ShowMessage(IntToStr(lRect.Left) + ' / ' +
              IntToStr(lRect.Top) + ' / ' +
              IntToStr(lRect.Right) + ' / ' +
              IntToStr(lRect.Bottom));

end;

Man sollte annehmen, dass dann >10 / 20 / 100 / 200< ausgegeben würde.

Bei mir kommt allerdings : 0 / 0 / 0 / 0


Hat jemand eine Idee?

jbg 18. Okt 2014 10:59

AW: UxTheme-Funktion "vernichtet" TRect
 
UxTheme.GetThemeSysFont ist falsch deklariert. Der letzte Parameter muss ein LOGFONTW (Unicode) sein. In Delphi 2007 ist er aber als LOGFONTA (ANSI) deklariert. Dadurch schreibt die Funktion GetThemeSysFont über das Ende von lLogFont hinaus und trifft dabei auf lRect.


Hier eine korrigierte Version:
Delphi-Quellcode:
var
  GetThemeSysFont: function(hTheme: HTHEME; iFontId: Integer;
    var plf: LOGFONTW): HRESULT; stdcall; // << Änderung
  lRect: TRect;
  lLogFont: TLogFontW; // << Änderung
begin
   @GetThemeSysFont := @UxTheme.GetThemeSysFont; // << Änderung

   lRect := Rect(10,0,100,20);
   GetThemeSysFont(0, TMT_CAPTIONFONT, lLogFont); // << Änderung
   DrawText(Canvas.Handle,PChar('Titel1'),Length(PChar('Titel1')) ,
          lRect,DT_LEFT or DT_SINGLELINE or DT_END_ELLIPSIS or DT_VCENTER);

   lRect := Rect(10,30,100,50);
   DrawText(Canvas.Handle,PChar('Titel2'),Length(PChar('Titel2')) ,
          lRect,DT_LEFT or DT_SINGLELINE or DT_END_ELLIPSIS or DT_VCENTER);
end;

BadenPower 18. Okt 2014 20:52

AW: UxTheme-Funktion "vernichtet" TRect
 
Hallo zusammen,

Zitat:

Zitat von jbg (Beitrag 1276511)
UxTheme.GetThemeSysFont ist falsch deklariert. Der letzte Parameter muss ein LOGFONTW (Unicode) sein. In Delphi 2007 ist er aber als LOGFONTA (ANSI) deklariert. Dadurch schreibt die Funktion GetThemeSysFont über das Ende von lLogFont hinaus und trifft dabei auf lRect.

Herzlichen Dank!

Die Lösung fünktioniert perfekt und beide Zeilen werden ausgegeben.

Auch im eigentlichen Kompo-Code funktionert es jetzt perfekt.


Ich glaube ich muss mir jetzt noch die anderen UxTheme-Funktionen anschauen, denn das UxTheme.DrawThemeTextEx gibt bei mir auch keinen Text aus.


Ist das ein Delphi-Fehler, der immer noch exisiert, oder ab welcher Version wurde er behoben?

jbg 18. Okt 2014 22:08

AW: UxTheme-Funktion "vernichtet" TRect
 
Zitat:

Zitat von BadenPower (Beitrag 1276566)
Ist das ein Delphi-Fehler, der immer noch exisiert, oder ab welcher Version wurde er behoben?

Der Fehler hat sich mit Delphi 2009 automatisch behoben, da LOGFONT nun auf LOGFONTW gemappt wird.


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