Autor Beitrag
Ares
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Mi 30.11.05 20:14 
user profile iconBenBE 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 :-D 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 777

(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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



BeitragVerfasst: Mi 30.11.05 21:43 
user profile iconAres 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Do 01.12.05 13:17 
user profile iconLossy 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...

user profile iconLossy 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Do 01.12.05 14:08 
user profile iconLossy 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 :-)


user profile iconLossy 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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 :arrow:
Hab mal den ganzen Thread durchgelesen;
eine Zusammenfassung deiner Anforderungen an die Komponente:
  1. automatischer Zeilenumbruch
  2. funktioniert wie ein Memo
  3. Text darf nicht ausgegraut werden
  4. Text formatierbar
  5. Text notfalls auch mitten im Wort trennen
  6. mehr als 255 Zeichen
  7. 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:
ausblenden 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 :gruebel:

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Do 01.12.05 16:19 
user profile iconLannes 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Do 01.12.05 20:38 
Hallo,
user profile iconalzaimar hat folgendes geschrieben:
...Wie kommt ihr denn auf die Begrenzung mit 255 Zeichen?...

vermutlich durch den Beitrag:
user profile iconAres 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 :wink:

Ps.: Zur Info:
Eigene Komponente: Problem mit Property Lines: TStrings...

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )