![]() |
Stringlänge parsen
Wie kann ich am schnellsten die länge von Strings parsen
so das ich dann den längsten verwenden kann um mein Window in der Weite dementsprechend anzupassen. Ja ich weis Length(string) aber ich suche eine schnelle Methode ;) Habe mein Grund Menu soweit fertig.. und ich benötige die Berechnung um die Sub Menus (weite) auf den längsten String hin anzupassen. Anbei ein shot.! 1 ganzer Tag nur für das Grundmenu. LOL gruss |
AW: Stringlänge parsen
Length(string)
|
AW: Stringlänge parsen
Du suchst doch nicht die Länge des Strings sondern den benötigten Platz zur Darstellung des Strings auf einem Canvas, oder?
Dazu nimmt man ![]() |
AW: Stringlänge parsen
![]() Wenn Canvas oder HDC schon vorhanden sind, dann natürlich das direkt verwenden. Zitat:
Man kann noch über Pointer schneller sein, wenn der String nie leer ist, indem man diese Prüfung überpringt. :stupid: |
AW: Stringlänge parsen
Zitat:
verwenden um mein Sub Menu auf die weite auszurichten. DT_CALCRECT hilft mir nicht ist aber auch nicht wichtig da ich es mit meiner Funktion GDIP_GetTextBound nachher in Pixeln exakt ermittle wenn ich den längsten string habe. Zitat:
gruss |
AW: Stringlänge parsen
Zitat:
Delphi-Quellcode:
function getTextWidth(aForm: TForm; const aString: string): Integer;
begin if aString <> '' then Result := aForm.Canvas.TextWidth(aString) else Result := 0; end; |
AW: Stringlänge parsen
Zitat:
Verschiedene Zeichen sind ja unterschiedlich breit. Zitat:
// EDIT: Die beim Zeichnen längste Zeile wirst du wohl am einfachsten bekommen, wenn du alle Strings in mehreren Zeilen nimmst und gesammelt an die Funktion zur Größenermittlung gibst. Das ist vermutlich nicht besonders schnell, aber zuverlässig und schneller als jeden Text einzeln anzufragen. |
AW: Stringlänge parsen
Zitat:
Da ich den Text mit GDI+ zeichne und ein mix mit der Winapi ist da nicht das wahre. Denke werde es dann wohl doch mit Length(string) in einer schleife machen müssen. Zitat:
Ich mache es hier mit aber erst dann wenn ich den längsten String ermittelt habe. (einmalig..)
Delphi-Quellcode:
gruss
function GetTextBound(UseText: WideString; UseFont: WideString; UseSize: single; var bW: integer;
var bH: integer; UseStrFormat: integer): GPSTATUS; stdcall; var Graphics: cardinal; Fam: GpFontFamily; TempFont: GpFont; DC: HDC; begin result := GenericError; strFormat := nil; Fam := nil; // Create matching font try GdipCheck(GdipCreateFontFamilyFromName(UseFont, nil, Fam)); 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)); 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); ReleaseDc(GetDesktopWindow, DC); end; end; finally if Graphics <> 0 then 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:
Delphi-Quellcode:
Schneller wirds nicht.
test eax, eax
jz +$03 mov eax, [eax-$04] ret Außerdem in extremen Fällen können kürzere Strings (Anzahl der Zeichen) länger (in Pixeln) sein als andere längere Strings (Anzahl der Zeichen) (<-- Verwirrender Satz aber ich hoffe du weißt was ich meine :mrgreen: ) z.B. WWWW (Length = 4) iiiiiiiiiiii (Length = 12) |
AW: Stringlänge parsen
Zitat:
Zitat:
Meine oben genannte Funktion gibt die Länge eines Strings in Pixeln zurück. Mit QuickSort kannst du dann sehr einfach den längsten String raussuchen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 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