Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Position von text im Label bestimmen(Auf dem Bildschirm). (https://www.delphipraxis.net/141713-position-von-text-im-label-bestimmen-auf-dem-bildschirm.html)

stiftII 14. Okt 2009 15:42


Position von text im Label bestimmen(Auf dem Bildschirm).
 
Hallo.
Gibt es eine Möglichkeit die Stelle in einem Label an dem ein bestimmter Text steht zu bestimmen ?

Beispiel:
Label-Caption: "Dies ist ein relativ kurzer Text";

Jetz möchte ich die x,y Koordinaten von "kurzer" auf dem Bildschirm haben. Ich möchte die Koordinaten auf dem Bildschirm, oder relativ zur Haupt-Form haben.

Ist sowas möglich ?

~stift

Namenloser 14. Okt 2009 15:51

Re: Position von text im Label bestimmen(Auf dem Bildschirm)
 
Ich würde etwas mogeln, indem ich temporär die Schriftart irgendeines Canvas (das ich ggf. vorher erzeuge) auf die Schriftart des Labels setze, und dann mit GetTextExtent die Ausmaße des zurechtgestutzten Strings ermittle. (Oder kurzzeitig die Caption zurechtstutzen und Autosize aktivieren, das wäre aber sehr unsauber). Würde allerdings nur mit einzeiligem Text funktionieren.

marius0702 14. Okt 2009 15:59

Re: Position von text im Label bestimmen(Auf dem Bildschirm)
 
fensterposition: form1.top/form1.left
labelposition: label1.top/label1.left
textbreite :label1.Canvas.TextWidth(label1.Caption);
texthöhe: label1.Canvas.TextHeight(label1.Caption);

und wenn du nur bis zu einem bestimmten wort die breite vom text haben willst dann müsste das glaub ich so gehen.
label1.Canvas.TextWidth( copy( label1.Caption,0,pos('kurzer',label1.Caption) ) );

stiftII 14. Okt 2009 17:00

Re: Position von text im Label bestimmen(Auf dem Bildschirm)
 
Zitat:

Zitat von marius0702
fensterposition: form1.top/form1.left
labelposition: label1.top/label1.left
textbreite :label1.Canvas.TextWidth(label1.Caption);
texthöhe: label1.Canvas.TextHeight(label1.Caption);

und wenn du nur bis zu einem bestimmten wort die breite vom text haben willst dann müsste das glaub ich so gehen.
label1.Canvas.TextWidth( copy( label1.Caption,0,pos('kurzer',label1.Caption) ) );

Das funktioniert aber nicht, wenn das Label mehrere Zeilen Lang ist ( Wordwrap ). ;/

Zitat:

Würde allerdings nur mit einzeiligem Text funktionieren.
Das ist das Problem. Ich bräuchte eine Lösung die auch funktioniert wenn das Label mehrere Zeilen lang ist ;/.

~stift

shmia 14. Okt 2009 17:15

Re: Position von text im Label bestimmen(Auf dem Bildschirm)
 
Die Frage ist doch: Wozu brauchst du das?
Ich habe das Gefühl du zäumst das Pferd von hinten auf.

stiftII 14. Okt 2009 17:30

Re: Position von text im Label bestimmen(Auf dem Bildschirm)
 
Hi shmia.

Ich habe einen Text, dieser beinhaltet Smilies.
Diese möchte ich im Text umwandeln(in Grafiken).

Somit muss ich erkennen an welcher Stelle die Smilies im Text sind und wo sie auf dem Bildschirm sind, um sie beim onpaint meiner hauptform über den text zeichnen zu können.

Ich gestehen. Das hört sich alles andere als optimal an. Aber es wäre eine Lösung.

~stift

shmia 14. Okt 2009 18:14

Re: Position von text im Label bestimmen(Auf dem Bildschirm)
 
Zitat:

Zitat von stiftII
Ich habe einen Text, dieser beinhaltet Smilies.
Diese möchte ich im Text umwandeln(in Grafiken).
Somit muss ich erkennen an welcher Stelle die Smilies im Text sind und wo sie auf dem Bildschirm sind, um sie beim onpaint meiner hauptform über den text zeichnen zu können.

Ahh - jetzt gibt das mehr Sinn.

Input ist eine StringListe mit ein oder mehr Zeilen.
In den Zeilen sind bestimmte Smilie in Textdarstellung.
Output ist ein Canvas.
Zusätzlich braucht man noch eine Imagelist für die Smilies.

Dann wäre die Vorgehensweise so:
Es gibt einen Startpunkt im Canvas, der mit der Text mitgeführt wird.
Das ist der "Cursor".
Zuerst die aktuelle Zeile (in Stringliste) untersuchen und den Text bis zum 1. Smilie ausschneiden.
Länge des Textes in Pixel bestimmen, z.B. so
Delphi-Quellcode:
function TrueFontWidth(fnt: TFont; const text:string): Integer;
var
   dc: hdc;
   tsize : Windows.TSize;
begin
   dc := GetDC(0);
   SelectObject(DC, fnt.Handle);
   GetTextExtentPoint32(dc, PChar(text), Length(text), tsize);
   ReleaseDC(0, DC);
   Result := tsize.cx;
end;
Die Text mit Canvas.TextRect() ausgeben.
"Cursor" entsprechend nach rechts verschieben.
Smilietext aus Zeile ausschneiden, Bitmap dazu besorgen, auf Canvas ausgeben.
"Cursor" über Breite des Bitmaps (+ etwas Zwischenraum) nach rechts schieben.
Solange wiederholen, bis ganze Zeile aufgebraucht.

Wenn es noch mehr Zeilen gibt, den "Cursor" an den linken Rand setzen und um Texthöhe nach unten
verschieben.

Ich kann mich dunkel erinnern, dass es hier in der DP einen Betrag gab, der zeigt
wie man Bitmaps in ein TRichEdit einbaut.
Es ging sogar um Smilies, aber ich finde den Beitrag nicht mehr... :?

stiftII 14. Okt 2009 18:34

Re: Position von text im Label bestimmen(Auf dem Bildschirm)
 
Zitat:

Ich kann mich dunkel erinnern, dass es hier in der DP einen Betrag gab, der zeigt
wie man Bitmaps in ein TRichEdit einbaut.
Es ging sogar um Smilies, aber ich finde den Beitrag nicht mehr... Confused
:( Schade, das wäre auch klasse.

Hab das System verstanden. Wenns Probleme geben sollte melde ich mich nochmal, danke für die ausführliche Beschreibung! :)

~stift

himitsu 14. Okt 2009 18:53

Re: Position von text im Label bestimmen(Auf dem Bildschirm)
 
man könnte auch seinen Text in den TWebBrowser oder eine andere Komponente reinladen, welche mit HTML umgehn kann.

ansonsten kannst du auch den gesamten Text selber auf das Canvas ausgeben, dann solltest du auch die aktuelle Position kennen, da du ja den Text selber zeichnest :roll:


Und wegen dem RichEdit und den Smilies ... vor einer ganzen Weile gab es mal einen ShoutBox-Programmierwettbewerb hier im Forum ... da haben einige Programme diese Variante genutzt und ich glaub der entsprechende (vorhin erwähnte) Artikel wurde auch daraufhin geschrieben ... vielleicht dindest du ja etwas, wenn du dir mal die Hier im Forum suchenShoutBox-Programme und die zugehörigen Threads ansiehst.


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