AGB  ·  Datenschutz  ·  Impressum  







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

UxTheme-Funktion "vernichtet" TRect

Ein Thema von BadenPower · begonnen am 17. Okt 2014 · letzter Beitrag vom 18. Okt 2014
Antwort Antwort
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#1

UxTheme-Funktion "vernichtet" TRect

  Alt 17. Okt 2014, 15:59
Delphi-Version: 2007
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.

Geändert von BadenPower (17. Okt 2014 um 16:17 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: UxTheme-Funktion "vernichtet" TRect

  Alt 17. Okt 2014, 16:13
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?
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#3

AW: UxTheme-Funktion "vernichtet" TRect

  Alt 17. Okt 2014, 16:19
Hallo zusammen,
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.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: UxTheme-Funktion "vernichtet" TRect

  Alt 17. Okt 2014, 16:38
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

XE7 auf Win8.1
Miniaturansicht angehängter Grafiken
unbenannt.png  
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#5

AW: UxTheme-Funktion "vernichtet" TRect

  Alt 17. Okt 2014, 19:30
Hallo zusammen,
Ich habe zwar keine Ahnung was vor sich geht, aber ich hoffe das konnte dir weiterhelfen
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.


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?
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: UxTheme-Funktion "vernichtet" TRect

  Alt 18. Okt 2014, 10:59
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;
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#7

AW: UxTheme-Funktion "vernichtet" TRect

  Alt 18. Okt 2014, 20:52
Hallo zusammen,

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?
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

AW: UxTheme-Funktion "vernichtet" TRect

  Alt 18. Okt 2014, 22:08
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.
  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 18:36 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