![]() |
AW: Stringlänge parsen
Zitat:
gruss |
AW: Stringlänge parsen
Zitat:
Zitat:
|
AW: Stringlänge parsen
Zitat:
mit meiner Funktion bekomme ich die exakte länge über boundingBox noch genauer geht's nicht. Wenn es nicht mit einmalig geht dann muss ich wohl oder übel alle Strings da durchlaufen lassen. Danke. PS: Mit DPI ist kein Problem da habe ich auch eine Funktion die ich schon in meinem C++ Example verwende. Spielt aber keine rolle es passiert gar nichts solange wie ich DPI Aware nicht zulasse. Denn dann wird auch nichts vergrößert. gruss |
AW: Stringlänge parsen
Zitat:
|
AW: Stringlänge parsen
Zitat:
Und ich arbeite mit der Win32API.. aber ich mixe nicht den Font der in GDI+ erstellt wurde mit dem von der Winapi.. denn das sind 2 paar Schuhe. Trotzdem Danke. gruss |
AW: Stringlänge parsen
Liste der Anhänge anzeigen (Anzahl: 1)
Macht WINDOWS das nicht automatisch?
|
AW: Stringlänge parsen
Zitat:
Auch kein Ownerdraw. gruss |
AW: Stringlänge parsen
Zitat:
Weil so kompiliert es zumindest in höheren Versionen (Berlin, Tokyo) nicht. Ggf. unterscheidet sich der dort mitgelieferte übersetzte Header Winapi.GDIAPI.pas (von ![]() Ist die selbstgemacht oder irgendwoher kopiert? Außerdem sind da einige Fehler drin, die ein funktionieren unmöglich gemacht haben. Hier eine entsprechende korrigierte Version:
Delphi-Quellcode:
function GetTextBound(UseText: WideString; UseFont: WideString; UseSize: single; var bW: integer;
var bH: integer; UseStrFormat: integer): GPSTATUS; stdcall; var Graphics: GPGRAPHICS; // Tigü: Hier war ein falscher Typ (Cardinal) Fam: GpFontFamily; TempFont: GpFont; DC: HDC; strFormat: GPSTRINGFORMAT; // Tigü: war nicht definiert boundingBox, layoutRect: TGPRectF; // Tigü: war nicht definiert begin Result := GPSTATUS.GenericError; // Tigü: Result ist immer GenericError?? Wird nirgens auf GPStatus.ok gesetzt strFormat := nil; Fam := nil; TempFont := nil; // Tigü: war nicht initialisiert! // Create matching font try GdipCheck(GdipCreateFontFamilyFromName(PWideChar(UseFont), nil, Fam)); // Tigü: PWideChar fehlte if Assigned(Fam) then begin GdipCheck(GdipCreateFont(Fam, UseSize, 0, 2, TempFont)); if Assigned(TempFont) then begin DC := GetDC(GetDesktopWindow); GdipCheck(GdipCreateStringFormat(0, 0, strFormat)); GdipCheck(GdipCreateFromHDC(DC, Graphics)); FillChar(boundingBox, SizeOf(boundingBox), 0); // Tigü: waren nicht initialisiert, Werte waren "unendlich" klein oder groß FillChar(layoutRect, SizeOf(layoutRect), 0); // Tigü: waren nicht initialisiert, Werte waren "unendlich" klein oder groß // GdipCheck(GdipMeasureString(Graphics, PWideChar(UseText), Length(UseText), TempFont, @layoutRect, strFormat, @boundingBox, nil, nil)); if Assigned(strFormat) then GdipCheck(GdipDeleteStringFormat(strFormat)); bW := round(boundingBox.Width - boundingBox.x); bH := round(boundingBox.Height - boundingBox.y); if UseStrFormat <> 0 then Swap(bW, bH); if (bW <> 0) or (bH <> 0) then Result := GPSTATUS.Ok; // Tigü: Wenns klappt, sollte das so auch per Result mitgeteilt werden!! ReleaseDc(GetDesktopWindow, DC); end; end; finally if Assigned(Graphics) then // Tigü: entsprechend des neuen Typs anpassen GdipCheck(GdipDeleteGraphics(Graphics)); if Assigned(TempFont) then GdipCheck(GdipDeleteFont(TempFont)); // Lösche das Font Object if Assigned(Fam) then GdipCheck(GdipDeleteFontFamily(Fam)); // Lösche das Font Family Object end; end; |
AW: Stringlänge parsen
Zitat:
Suche dir dafür in Zukunft jemand anderen... und ja es funktioniert auch ohne deine Verschlimmbesserungen. Nur mal so zum Mitschreiben..
Delphi-Quellcode:
Quatsch!
Result := GPSTATUS.Ok; // Tigü: Wenns klappt, sollte das so auch per Result mitgeteilt werden!!
GdipCheck liefert die Rückgabe..
Delphi-Quellcode:
Was für ein PWideChar?
function GdipCreateFontFamilyFromName(
name: WideString; fontCollection: Pointer; out FontFamily: GpFontFamily ): GPSTATUS; stdcall; external LibGdiPlus; und so könnte ich weiter machen... aber lassen wir das. gruss |
AW: Stringlänge parsen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Sind wir heute wieder besonderes dünnhäutig? Anbei noch ein Screenshot des Line Timer von der Nexus Quality Suite ( ![]() Die Funktion habe ich 100 mal aufgerufen und in der linken Spalte siehst du die Zeiten in Millisekunden. Alles größer 0,5 habe ich mal farblich markiert. Du könntest also am meisten Zeit sparen, wenn du - insofern die Schrifteinstellungen für alle Einträge im Menü gleich sind - Das Erstellen der FontFamily, der GDIPlus-Font und das Graphics-Objekt nur einmalig machst und dann über deine Strings iterierst und dir entsprechend die Objekte übergibst.
Delphi-Quellcode:
//Pseudocode:
GdipCheck(GdipCreateFontFamilyFromName(PWideChar(UseFont), nil, Fam)); // PWideChar if Assigned(Fam) then begin GdipCheck(GdipCreateFont(Fam, UseSize, 0, 2, TempFont)); if Assigned(TempFont) then begin DC := GetDC(GetDesktopWindow); GdipCheck(GdipCreateStringFormat(0, 0, strFormat)); GdipCheck(GdipCreateFromHDC(DC, Graphics)); DoFindLongestStringWidth(strFormat, TempFont, Graphics, UseTexts {hier natürlich dann eine Liste oder Array mit den Strings übergeben}, bW, bH, UseStrFormat); ReleaseDc(GetDesktopWindow, DC); ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 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 by Thomas Breitkreuz