AGB  ·  Datenschutz  ·  Impressum  







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

WordWrap bei ListBoxen

Offene Frage von "Marvel"
Ein Thema von Marvel · begonnen am 31. Mai 2005 · letzter Beitrag vom 17. Aug 2009
Antwort Antwort
Marvel

Registriert seit: 12. Nov 2004
Ort: Bad Düben
64 Beiträge
 
#1

WordWrap bei ListBoxen

  Alt 31. Mai 2005, 18:30
Hi Leutschers, ich wollt mal fragen, ob wer von euch für folgendes Problem hat:
Ich will in ner ListBox einfach nur Strings ausgeben lassen... ganze Sätze. Dadurch sind die aber oft zu breit für meine ListBox und man müsste dumm hin und her scrollen, damit man die sieht. Nun is meine Frage, wie ich es schaffe, dass der automatisch nen Zeilenumbruch macht, ohne dass ICH jedesmal abzählen muss, nach wie vielen Wörtern denn der Zeilenumbruch kommen muss...

danke im Voraus... und falls es was nützt... ich bin n bissel unter Zeitdruck... wär also nich schlecht, wenn ihr da schnell drauf antworten könnt..

schön Tag noch.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: WordWrap bei ListBoxen

  Alt 31. Mai 2005, 18:32
mt einer listbox wird das nicht gehen.
du kannst aber in den hint über getitemat(mouseposition) o.ä. den aktuellen text reinschreiben und damit den satz komplett sichtbar machen.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: WordWrap bei ListBoxen

  Alt 31. Mai 2005, 19:04
Hallo Marvel,

schau dir mal den Style lbOwnerDrawVariable deiner Listbox in der Online-Hilfe an. Das müsste dich glücklich machen.

Grüße vom marabu
  Mit Zitat antworten Zitat
Marvel

Registriert seit: 12. Nov 2004
Ort: Bad Düben
64 Beiträge
 
#4

Re: WordWrap bei ListBoxen

  Alt 31. Mai 2005, 20:07
naja... das hab ich auch schon gefunden, aber so recht raffen tu ich das nich...
Muss ich da über das OnMeasureItem-Ereignis gehen und dann dort die Variable Height ändern oder wie?
  Mit Zitat antworten Zitat
Marvel

Registriert seit: 12. Nov 2004
Ort: Bad Düben
64 Beiträge
 
#5

Re: WordWrap bei ListBoxen

  Alt 31. Mai 2005, 20:08
@ DGL-luke:
naja... an sich ne gute Idee, aber das is nich das, was ich brauch.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: WordWrap bei ListBoxen

  Alt 31. Mai 2005, 21:20
Hallo Marvel,

Zitat von Marvel:
naja... das hab ich auch schon gefunden, aber so recht raffen tu ich das nich...
Muss ich da über das OnMeasureItem-Ereignis gehen und dann dort die Variable Height ändern oder wie?
das klingt, als bräuchtest du noch etwas Hilfe. Ich habe dir eine kleine Demo angefertigt. Nicht schön aber selten.

Grüße vom marabu
Angehängte Dateien
Dateityp: zip marvel_166.zip (3,6 KB, 140x aufgerufen)
  Mit Zitat antworten Zitat
Marvel

Registriert seit: 12. Nov 2004
Ort: Bad Düben
64 Beiträge
 
#7

Re: WordWrap bei ListBoxen

  Alt 1. Jun 2005, 16:55
Erstmal dick fett danke... das is echt krass, was fürn Service es hier im Forum gibt...

Das Problem is aber, dass ich jeztt auch weiß, warum ich das vorher nich verstanden hab... weiß nich... falls es möglich is, dass ohne umfanssende Delphi-Grundlagen zu verstehen, würd mich das schon mal interessieren, was genau du wo machst und was das bedeutet...
Wenn nich habsch halt Pech gehabt...

Nomal danke und Tschö.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: WordWrap bei ListBoxen

  Alt 1. Jun 2005, 20:36
Hallo Marvel,

ich habe noch nie vorher eine Listbox mit dem Style lbOwnerDrawVariable gebraucht, aber deine Frage hatte mich dazu gebracht es einmal zu versuchen. Offensichtlich geht es nicht durch simples Klicken im Object Inspector, sonst hättest du ja nicht gefragt.

Durch die Online-Hilfe war mir schnell klar, dass ich diesen speziellen Style benötige, damit das Ereignis OnMeasureItem getriggert wird. Da war schon das erste Problem. Bei meinem Delphi 7 kann man zwar den Style im OI setzen, aber es bringt nichts. Erst durch das Setzen von Style im Ereignis OnCreate meiner DemoForm konnte ich sicher stellen, dass OnMeasureItem ausgeführt wird.

OnDrawItem ist ja einfach, also habe ich nur noch überlegt, wie ich die Höhe des Eintrags feststellen kann. Da DrawText() diese Höhe berechnet, brauchte ich nur noch ein Stück Schmierpapier (tempCanvas) um darauf vorzuschreiben. Die ermittelte Höhe übergebe ich dann an Height und intern wird das Rect ermittelt, welches an OnDrawItem() übermittelt wird - für das Schreiben in Reinschrift.

Alles klar?

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: WordWrap bei ListBoxen

  Alt 14. Aug 2009, 06:23
Eine Verbesserung des Codes von marabu.

Ich habe das Projekt in Delphi 6 Personal geöffnet und war über das Ergebnis nicht sonderlich erfreut. Jedesmal, wenn ich das Form in der Größe geändert habe, waren im weißen noch Reste des vorherigen Textes. Auch ist nur die oberste Zeile eingerückt. Die zweite Zeile ist beispielsweise visuell so geblieben und wurde erst mehrzeilig sichtbar, wenn man sie anklickte.

Die Lösung: Man füge ein Invalidate ein:

Delphi-Quellcode:
// Originalcode: marabu

procedure TDemoForm.ListBoxMeasureItem(Control: TWinControl;
  Index: Integer; var Height: Integer);
var
  tempCanvas: TCanvas;
  notUsed: HWND;
  destRect: TRect;
begin
  tempCanvas := TCanvas.Create;
  try
    tempCanvas.Handle := GetDeviceContext(notUsed);
    destRect := ListBox.ClientRect;
    Height := DrawText(tempCanvas.Handle, PChar(ListBox.Items[Index]), -1, destRect, DT_WORDBREAK);
  finally
    tempCanvas.Free;
  end;
end;

procedure TDemoForm.ListBoxDrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with Listbox.Canvas do begin
    FillRect(Rect);
    DrawText(Handle, PChar(ListBox.Items[Index]), -1, Rect, DT_LEFT or DT_TOP or DT_WORDBREAK);
    Invalidate; // Hinzugefügt
  end;
end;

procedure TDemoForm.FormCreate(Sender: TObject);
begin
  Listbox.Style := lbOwnerDrawVariable;
end;
(Vorgeschlagen für die CodeLib)

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#10

Re: WordWrap bei ListBoxen

  Alt 17. Aug 2009, 20:06
Ich habe einen weiteren Bugfix. Wenn eine Zeile leer war, dann sind die Zeilen ineinandergerutscht.

Delphi-Quellcode:
procedure TMDIEditor.CheckListBox1MeasureItem(Control: TWinControl;
  Index: Integer; var Height: Integer);
var
  tempCanvas: TCanvas;
  notUsed: HWND;
  destRect: TRect;
  txt: PChar;
begin
  tempCanvas := TCanvas.Create;
  try
    tempCanvas.Handle := GetDeviceContext(notUsed);
    destRect := CheckListBox1.ClientRect;
    if CheckListBox1.Items[Index] = 'then
      txt := ' '
    else
      txt := PChar(CheckListBox1.Items[Index]);
    Height := DrawText(tempCanvas.Handle, txt, -1, destRect, DT_WORDBREAK);
  finally
    tempCanvas.Free;
  end;
end;
PS: Bitte interpretiert das nicht als "gemecker" am Code. Ich freue mich sehr über diesen Code und wäre selbst nicht darauf gekommen und habe den Code jetzt ein wenig korrigiert, damit die Gemeinschaft ihn fehlerfrei nutzen kann.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz