AGB  ·  Datenschutz  ·  Impressum  







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

Stringlänge parsen

Ein Thema von EWeiss · begonnen am 4. Sep 2017 · letzter Beitrag vom 7. Sep 2017
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.222 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Stringlänge parsen

  Alt 4. Sep 2017, 12:37
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 DrawText mit dem Paramter DT_CALCRECT
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Stringlänge parsen

  Alt 4. Sep 2017, 12:44
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 DrawText mit dem Paramter DT_CALCRECT
Ich möchte die gesamte länge eines String parsen\vergleichen bsp. von 30 Einträgen und den längsten davon
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:
Length(string)
Und ich sagte ja schon das ich weis das es mit Length geht aber ich muss etwas schnelles haben vielleicht in einem rutsch

gruss
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.961 Beiträge
 
Delphi 12 Athens
 
#3

AW: Stringlänge parsen

  Alt 4. Sep 2017, 12:47
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.
Der nach Zeichen längste String ist aber nicht unbedingt der, der den meisten Platz beim Zeichnen benötigt...
Verschiedene Zeichen sind ja unterschiedlich breit.

Zitat:
Length(string)
Und ich sagte ja schon das ich weis das es mit Length geht aber ich muss etwas schnelles haben vielleicht in einem rutsch
Bei Delphi-Strings geht es kaum schneller als mit Length, denn das liest ja nur die Längenangabe aus, die vor dem String steht.

// 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.
Sebastian Jänicke
AppCentral

Geändert von jaenicke ( 4. Sep 2017 um 12:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Stringlänge parsen

  Alt 4. Sep 2017, 12:52
Ich möchte die gesamte länge eines String parsen\vergleichen bsp. von 30 Einträgen und den längsten davon
verwenden um mein Sub Menu auf die weite auszurichten.

Und ich sagte ja schon das ich weis das es mit Length geht aber ich muss etwas schnelles haben vielleicht in einem rutsch
Length(string) in Assembler (Delphi 7):
Delphi-Quellcode:
  test eax, eax
  jz +$03
  mov eax, [eax-$04]
  ret
Schneller wirds nicht.
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 )

z.B.

WWWW (Length = 4)
iiiiiiiiiiii (Length = 12)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 4. Sep 2017 um 12:54 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Stringlänge parsen

  Alt 4. Sep 2017, 12:56
Zitat:
(<-- Verwirrender Satz aber ich hoffe du weißt was ich meine )
jo ich weis schon

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Stringlänge parsen

  Alt 4. Sep 2017, 12:58
Zitat:
(<-- Verwirrender Satz aber ich hoffe du weißt was ich meine )
jo ich weis schon

gruss
Gut. Denn das heißt:
Zitat von EWeiss:
Ich mache es hier mit aber erst dann wenn ich den längsten String ermittelt habe. (einmalig..)
wird nicht funktionieren
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Stringlänge parsen

  Alt 4. Sep 2017, 13:03
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.
Ich sagte doch, ich verwende GDI+ und mixe das nicht mit der Winapi.
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

Geändert von EWeiss ( 4. Sep 2017 um 13:06 Uhr)
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#8

AW: Stringlänge parsen

  Alt 4. Sep 2017, 13:14
Zitat:
und mixe das nicht mit der Winapi.
Habe ich mittlerweile schon öfter gehört. Ich verstehe gar nicht, was manche Leute gegen die Winapi haben.
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#9

AW: Stringlänge parsen

  Alt 4. Sep 2017, 12:44
Zitat:
Ich möchte die gesamte länge eines String parsen\vergleichen bsp. von 30 Einträgen und den längsten davon
verwenden um mein Sub Menu auf die weite auszurichten.
QuickSort und dann das hier vielleicht?

Delphi-Quellcode:
function getTextWidth(aForm: TForm; const aString: string): Integer;
begin
 if aString <> 'then
  Result := aForm.Canvas.TextWidth(aString)
 else
  Result := 0;
end;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Stringlänge parsen

  Alt 4. Sep 2017, 12:49
Zitat:
Ich möchte die gesamte länge eines String parsen\vergleichen bsp. von 30 Einträgen und den längsten davon
verwenden um mein Sub Menu auf die weite auszurichten.
QuickSort und dann das hier vielleicht?

Delphi-Quellcode:
function getTextWidth(aForm: TForm; const aString: string): Integer;
begin
 if aString <> 'then
  Result := aForm.Canvas.TextWidth(aString)
 else
  Result := 0;
end;
Sorry irgendwie werde ich nicht verstanden.. das nutzt mir nichts und ist auch nicht wichtig.
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:
Verschiedene Zeichen sind ja unterschiedlich breit.
ja das ist klar

Ich mache es hier mit aber erst dann wenn ich den längsten String ermittelt habe. (einmalig..)

Delphi-Quellcode:
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;
gruss

Geändert von EWeiss ( 4. Sep 2017 um 12:52 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:33 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-2025 by Thomas Breitkreuz