Autor |
Beitrag |
Ares
      
Beiträge: 128
|
Verfasst: Mi 30.11.05 12:20
Hallo!
Ich bin schon länger auf der Suche nach einer Label-Komponente, die einen automatischen Zeilenumbruch bietet. Ich habe schon etliche Komponentensammlungen durchsucht, aber nichts passendes gefunden. Bei den Multilinelabel die ich gefunden habe, kann man zwar über den Objektinspektor mehrzeiligen Text eingeben, der Zeilenumbruch geschieht aber nicht automatisch...
Im Prinzip suche ich ein Label, dass so funktioniert wie ein Memo. Wenn die Größe geändert wird, wird der Text automatisch umgebrochen. Bei einem Memo (readOnly = true) stört mich, dass man den Text immer noch markieren kann und ein Cursor darin blinkt (kann man das irgendwie ausstellen?). Ein Memo mit Enabled = false kommt der Sache schon sehr nah, nur ist der Text dann natürlich ausgegraut und die Komponente reagiert nicht mehr auf Klicks, etc.
Die Superlösung wäre natürlich, wenn der Text auch noch formatiert werden könnte, das ware aber nur ein Bonus.
Kennt jemand so eine Label-Komponente? Für Tipps wäre ich wirklich dankbar!
Besten Dank
Ares
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 30.11.05 14:17
Man nehme TLabel der VCL und setze WordWrap auf True ... AutoSize muss in diesem Fall False sein ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Ares 
      
Beiträge: 128
|
Verfasst: Mi 30.11.05 20:14
BenBE hat folgendes geschrieben: | Man nehme TLabel der VCL und setze WordWrap auf True ... AutoSize muss in diesem Fall False sein ... |
Klar, das geht natürlich  Eine wichtige Eigenschaft habe ich allerdings noch vergessen: Der Zeilenumbruch soll nicht nur bei Leerzeichen geschehen, sondern notfalls auch mitten im Wort. Das Macht TLabel von alleine nicht, oder?
Gruß
Ares
|
|
Amateur
      
Beiträge: 777
(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
|
Verfasst: Mi 30.11.05 20:20
wie wärs mit selber schreiben??? ging doch auch...
_________________ "Kein dummes Gerede. Kein Rumrätseln. Denkt an nichts anderes mehr, nur noch an das, was vor euch liegt. Das ist die wahre Herausforderung. Ihr müßt euch vor euch selbst schützen, Leute." (Rennes in "Cube")
Beiträge: >700
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 30.11.05 20:38
Eine automatische Silbentrennung ala Word wirst Du in keiner Komponente finden; zumindest ist mir keine bekannt.
Da hilft nur selber coden ... Geht z.B. mit TCanvas.TextWidth, TCanvas.TextHeight und TCanvas.TextExtend ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
mmmichael
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 30.11.05 21:43
Ares hat folgendes geschrieben: |
Im Prinzip suche ich ein Label, dass so funktioniert wie ein Memo. Wenn die Größe geändert wird, wird der Text automatisch umgebrochen. |
Na also das geht doch wirklich mit WordWrap := True! Und für die Editierbarkeit musst du dir halt was einfallen lassen zB ein Memo das an der Stelle des Labels erscheint (und es überdeckt) wenn man auf das Label doppelklickt und auch die Größe des Labels hat!
|
|
Ares 
      
Beiträge: 128
|
Verfasst: Do 01.12.05 12:15
Ich habe leider noch was vergessen (ich weiß schon, warum ich mit TLabel nicht weiter kam  : TLabel ist ja auf max. 255 Zeichen beschränkt. Weiß jemand wie man das "verlängern" kann?
Ich habe mir schon die Definiton von TLabel angesehen aber nicht ganz schlau daraus geworden. Dort ist einfach nur "property Caption;" definiert, also ohne Typ. Wie könnte man das beim ableiten also umschreiben?
Oder kennt jemand eine andere Label-Komponente, die längeren Text zulässt?
Besten Dank
Ares
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 01.12.05 12:54
Die Eigenschaft Caption ist bei dem TLabel lediglich nur sichtbar gemacht worden. Die eigentliche Eigenschaft ist einer Vorfahrenklasse von TLabel implementiert worden.
Aber was anderes. Was willst du denn mit dem Label genau machen? Das ist mir jetzt irgendwie nicht so ganz klar geworden.
Ich sollte mir diese Frage in meine Signatur legen und ständig auf diese verweisen...
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Ares 
      
Beiträge: 128
|
Verfasst: Do 01.12.05 13:17
Lossy eX hat folgendes geschrieben: |
Die Eigenschaft Caption ist bei dem TLabel lediglich nur sichtbar gemacht worden. Die eigentliche Eigenschaft ist einer Vorfahrenklasse von TLabel implementiert worden.
|
Ah ok, jetzt habe ich die Stelle gefunden, wo alles Definiert. Mal sehen ob ich das irgendwie vernünftig abgeleitet bekommen. Damit kenne ich mich nicht sonderlich gut aus. Vielleicht hat in der zwischenzeit ja noch jemand einen Tipp, für ne vorhandenen Komponente...
Lossy eX hat folgendes geschrieben: |
Aber was anderes. Was willst du denn mit dem Label genau machen? Das ist mir jetzt irgendwie nicht so ganz klar geworden. |
Das Label soll unter anderem Pfadangaben anzeigen. Für das Label ist relativ wenig Platz, und Pfade sind meinstens realiv lang. Daher soll der Text im Label automatisch umgebrochen werden. Da nicht jeder Pfad Leerzeilen enthalt, soll der Zeilenumbruch an jedem Zeichen im Text geschehen können. Es ist wichtig, dass der ganze Pfad angezeigt wird, gewisse Teile durch "..." zu ersetzen damit er ganz ins Label passt, macht also keinen Sinn. Es gibt Pfade mit mehr als 255 Zeichen, daher sollte das Label auch mehr als 255 Zeichen anzeigen können.
Ok, mein könnte sich jetzt lange darüber streiten, ob es Sinn macht für so lange Pfadangeben nur ein ziemlich kurzes Label zu verwenden. Das Problem ist aber nun mal so, es ist nicht mehr Platz da...
Gruß
Ares
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 01.12.05 13:57
Da muss ich dir ganz ehrlich gestehen, dass es mich ein wenig verwirrt, dass du lieber 5 zeilige Verzeichnisse anzeigen möchtest als da Teile wegzuschneiden. Fänd ich dann wesentlich übersichtlicher.
Benutz ein TMemo. Stell die Eigenschaften BorderStyle auf bsNone, Color auf clBtnFace, ReadOnly auf True und WordWarp auf True.
Wenn du verhindern möchtest, dass jemand den Text auswählen kann dann musst du noch die Eigenschaft Enabled auf False setzen.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Ares 
      
Beiträge: 128
|
Verfasst: Do 01.12.05 14:08
Lossy eX hat folgendes geschrieben: | Da muss ich dir ganz ehrlich gestehen, dass es mich ein wenig verwirrt, dass du lieber 5 zeilige Verzeichnisse anzeigen möchtest als da Teile wegzuschneiden. Fänd ich dann wesentlich übersichtlicher. |
Kann schon verstehen, dass das verwirrt.  Aber es soll nun mal so gelöst werden und dafür suche ich jetzt ne Lösung. Zu erklären, warum das in diesem Fall sinnvoller ist als ne andere Lösung würden den Rahmen sprengen
Lossy eX hat folgendes geschrieben: |
Benutz ein TMemo. Stell die Eigenschaften BorderStyle auf bsNone, Color auf clBtnFace, ReadOnly auf True und WordWarp auf True.
Wenn du verhindern möchtest, dass jemand den Text auswählen kann dann musst du noch die Eigenschaft Enabled auf False setzen. |
Die Möglichkeit habe ich ja schon in meinem ersten Beitrag erwähnt. Die Nachteile von einem deaktivierten Memo sind: Der Text ist ausgegraut, es reagiert nicht auf Klicks, ein Memo kann nicht transparent sein (schlecht bei mehrfarbigen Hintergrund).
Gruß´
Ares
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 01.12.05 14:08
In dem Fall sollte dann auch TStaticText funzen. Da wäre einzig Enabled:=False nötig 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Do 01.12.05 15:15
Hallo,
ich würde das auch mit Punkten '...' realisieren und zusätzlich den kompletten Pfad in einem Hint mit Zeilenumbrüchen anzeigen.
oder
Hab mal den ganzen Thread durchgelesen;
eine Zusammenfassung deiner Anforderungen an die Komponente:
- automatischer Zeilenumbruch
- funktioniert wie ein Memo
- Text darf nicht ausgegraut werden
- Text formatierbar
- Text notfalls auch mitten im Wort trennen
- mehr als 255 Zeichen
- auf Klicks reagieren
Die Punkte 1. bis 6. erfüllt das RichEdit.
Punkt 7. ist möglich weil bei Enabled:=False Klick-Ereignisse sozusagen durchgelassen werden, z.B. zur Form oder einem Panel, dort kann man dann durch Auswertung der Koordinaten reagieren.
Eine automatische Anpassung der Höhe(wie beim Label) kannst Du im Ereignis OnResizeRequest des RichEdits beeinflussen:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.RichEdit1ResizeRequest(Sender: TObject; Rect: TRect); begin (Sender as TRichEdit).BoundsRect := Rect; end; | Dabei wird nur die Höhe des RichEdits verändert.
Schon wieder eine neue Anforderung:
... transparent sein (schlecht bei mehrfarbigen Hintergrund)
Irgendwo hab ich mal etwas über ein transparentes Richedit gelesen 
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 01.12.05 15:35
Ich glaube du willst da gerade eine eierlegende Wollmilchsau. Und ehrlich gesagt denke ich, dass du das wohl auch ein bisschen selber Programmieren darfst. Alle Lösungen mit irgendwelchen Komponenten sind nicht gut genug. Also musst du selber mal hand anlegen. Das mit dem mehrfarbigen Hintergrund lasse ich jetzt hier mal raus. Das ist reine Geschmacksache und selten meine. Müsste man aber sehen um was sagen zu können.
Das Sinnvollste wäre wohl, dass du dir eine PaintBox schnappst und das dann alles genau so zeichnest wie du es gerne hättest. Den Text kannst du dann selber dort umbrechen wo du ihn gerne hättest. Formatierungen könntest du selber machen. Und im Endeffekt dürfte solch ein simpler Text dann noch schneller gehen als wie wenn du weiter suchst.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Do 01.12.05 16:15
Da muss man noch nicht mal eine Paintbox nehmen:
Einfach selbst die CR#LF einfügen, und zwar so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| Procedure BreakLines (aLabel : TLabel); Const sGoodBreaks = '.,:;-*+!"§$%&/\()= ?#+*'; Var sCaption, sResult : String; w,i,j,iLastGoodBreak, iMaxWidth : Integer;
Begin sCaption := aLabel.caption; sResult := ''; iMaxwidth := aLabel.Width; iLastGoodBreak := 0; j:=1; For i:=1 to Length (sCaption) Do Begin If Pos (Copy (sCaption,i,1), sGoodBreaks)<>0 Then iLastGoodBreak := i+1 Else Begin w := aLabel.Canvas.TextWidth(Copy (sCaption,j,i-j+1)); If w>iMaxWidth Then Begin if iLastGoodBreak = 0 then iLastGoodBreak:=i; sResult := sResult+Trim (Copy (sCaption,j,iLastGoodBreak-j))+#13#10; j := iLastGoodBreak; iLastGoodBreak := 0; End End End; aLabel.caption := sResult; End; |
Kann man bestimmt verbessern, aber als Demo reicht es. Ich messe über die TextWidth-Funktion des Canvas so lange den Teilstring, bis er zu breit wird. Dabei merke ich mir vorher die letzt potentielle gute Trennposition (eins der Sonderzeichen). Wenn der Substring zu lang ist, trenne ich an der letzten guten Trennposition. Falls ich noch keine hatte, weil das Teilwort zu lang ist, trenne ich eben genau an der aktuellen Position.
Vielleicht ist noch irgendwo der Haken, wenn der Teilstring keine gute Trennposition hatte und trotzdem zu lang ist...
_________________ Na denn, dann. Bis dann, denn.
Zuletzt bearbeitet von alzaimar am Fr 02.12.05 00:38, insgesamt 1-mal bearbeitet
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 01.12.05 16:19
Lannes hat folgendes geschrieben: | Hab mal den ganzen Thread durchgelesen;
eine Zusammenfassung deiner Anforderungen an die Komponente:
- Text formatierbar
- mehr als 255 Zeichen
|
Deswegen kein Label.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Do 01.12.05 19:22
In letzter Zeit bin ich ein bischen schusselig, aber ich kann hier 10.000 Zeichen in ein Label reinpacken. Wie kommt ihr denn auf die Begrenzung mit 255 Zeichen?
Wenn man es formatieren will, also Fettdrtuck, Farben etc, dann baut man sich sein eigenes Label oder schaut mal bei torry.net nach. Die haben doch sowas.
_________________ Na denn, dann. Bis dann, denn.
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Do 01.12.05 20:38
Hallo,
alzaimar hat folgendes geschrieben: | ...Wie kommt ihr denn auf die Begrenzung mit 255 Zeichen?... |
vermutlich durch den Beitrag:
Ares hat folgendes geschrieben: | Ich habe leider noch was vergessen (ich weiß schon, warum ich mit TLabel nicht weiter kam : TLabel ist ja auf max. 255 Zeichen beschränkt. Weiß jemand wie man das "verlängern" kann?...Oder kennt jemand eine andere Label-Komponente, die längeren Text zulässt?... |
und etwas zu kurz gedacht, oder bisher noch kein Label für so etwas genutzt
Ps.: Zur Info:
Eigene Komponente: Problem mit Property Lines: TStrings...
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
|