Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi mehrzeilige listbox-einträge (https://www.delphipraxis.net/89945-mehrzeilige-listbox-eintraege.html)

Sunlight7 10. Apr 2007 00:27

Re: mehrzeilige listbox-einträge
 
Moin!

@maddins: Weil Du per PN anfragtest, jo, da muß man etwas Tricksen.

Wir basteln uns einen Record
Delphi-Quellcode:
type
  PItem=^TItem;
  TItem packed record
     FileName:String;
     FileSize:Int64;
     Comment:String;
     UndWasHaltSonstNoch:TIrgendwas;
  end;
Hinzufügen eines Items
Delphi-Quellcode:
   var Item:PItem;
...
   New(Item);
   If Item=nil then ... // Fehlerabfrage

   Item^.FileName:=...;
   Item^.FileSize:=...;
   Item^.Comment:=...;

   ListBox1.Items.AddObject(Item^.FileName, TObject(Item));
Anwendungsbeispiel
Delphi-Quellcode:
   var Item:PItem;
...
   Item:=PItem(ListBox1.Items.Objects[ListBox1.ItemIndex]);
   Canvas.TextOut(0, 0, Item^.FileName);
   Canvas.TextOut(0, 20, IntToStr(Item^.FileSize));
   Canvas.TextOut(0, 40, Item^.Comment);
Und net vergessen, den Speicher mit Dispose wieder frei zu geben ;)


Zitat:

Zitat von LAWn-M0W3R
und was die Benutzerfreundlichkeit angeht, so mach es wie Sunlight7 und bau nen Farbverlauf in die Paint-Prozedur!

Nicht in die Paint, in die OnDrawItem ;)

EDatabaseError 10. Apr 2007 00:32

Re: mehrzeilige listbox-einträge
 
Zitat:

Zitat von LAWn-M0W3R
Hier noch eine Möglichkeit:

Du willst einfach nur mehrere Zeilen? Dann unterteile den jeweiligen String doch einfach in eine Art stringlist.
Also, wenn du da so ein neues item.Caption oder so einfügst, dann sagst du ihm einfach:
Delphi-Quellcode:
Caption := 'string1' + chr($0D) {Zeichen für Zeilenumbruch} + 'string2' + chr($0D) + 'string3';
Das sieht dann so aus:
Zitat:

string1
string2
string3
...und was die Benutzerfreundlichkeit angeht, so mach es wie Sunlight7 und bau nen Farbverlauf in die Paint-Prozedur!
Hoffe geholfen zu haben!
Schönen Abend noch und Grüße vom Max

Das zeichen für Zeilenumbruch ist aber $0D + $0A!

Daraus folgt:

Caption := 's1' + #13+#10 + 's2';

(#13 = $0D und #10 = $0A)

Mfg

mkinzler 10. Apr 2007 07:19

Re: mehrzeilige listbox-einträge
 
Oder die Konstante sLineBreak verwenden.

maddins 12. Apr 2007 22:56

Re: mehrzeilige listbox-einträge
 
hallo,

danke für die hilfe.
zwar hab ich solch eine art der implementation noch nie gesehen :? , werds aber ausprobieren und gucken, was ich damit alles anstellen kann. :thumb:

bis dann
maddins

maddins 12. Apr 2007 23:26

Re: mehrzeilige listbox-einträge
 
also ich hab jetzt mal testweise folgendes gemacht:

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
 var eintrag:pitem;
begin
  new(eintrag);
  eintrag^.zeile1:='test1';
  eintrag^.zeile2:='test2';
  eintrag^.zeile3:='test3';

  ListBox1.Items.AddObject(eintrag^.zeile1, TObject(eintrag));

  eintrag:=PItem(ListBox1.Items.Objects[ListBox1.ItemIndex]);
  listbox1.Canvas.TextOut(0, 0, eintrag^.zeile1);
  listbox1.Canvas.TextOut(0, 20, eintrag^.zeile2);
  listbox1.Canvas.TextOut(0, 40, eintrag^.zeile3);
 end;
lieder bleibt er bei der zeile
Delphi-Quellcode:
eintrag:=PItem(......);
mit folgender fehlermeldung stehen:

"List index out of bounds (-1)"

wenn ich fortsetze ist zwar der eintrag da mit dem inhalt aus "zeile1" aber mehr auch nicht. die restlichen zeilen fehlen.

btw: was bewirken die ^ ??

maddins

Sunlight7 12. Apr 2007 23:39

Re: mehrzeilige listbox-einträge
 
Abend!

Die ^ sagen dem Compiler, das es sich bei der Variable um einem dynamischen Zeiger auf ein Object o.ä. handelt (besser kann ichs um diese Zeit net ausdrücken ^^)

Der Fehler liegt daren, das Du ListBox1.ItemIndex als Index verwendest Und ich mich zu wetten traue, das nicht in der ListBox markiert ist :zwinker:

Abgesehen, das es keinen Sinn macht, es in dem ButtonClick Ereignis Zu zeichnen, das wäre besser im OnDrawItem der ListBox aufgehoben, da hast Du dann auch den Index, welcher gerade zu Zeichnen ist und die Variable Rect, damit Du auch weist wohin es gezeichnet werden soll ;)

Sieh mal in die OH zum Thema Delphi-Referenz durchsuchenOnDrawItem, Da findest Du auch ein Beispiel dazu ;)

maddins 13. Apr 2007 10:45

Re: mehrzeilige listbox-einträge
 
Liste der Anhänge anzeigen (Anzahl: 1)
aha, jetz versteh ich langsam...

so sieht das jetz aus:

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
 var eintrag:pitem;
begin
  new(eintrag);
  eintrag^.zeile1:='test1';
  eintrag^.zeile2:='test2';
  eintrag^.zeile3:='test3';

  ListBox1.Items.AddObject(eintrag^.zeile1, TObject(eintrag));

end;


procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
  var item:pitem;
begin
   Item:=PItem(ListBox1.Items.Objects[Index]);
   listbox1.Canvas.TextOut(0, index*40+0, Item^.zeile1);
   listbox1.Canvas.TextOut(0, index*40+12, Item^.zeile2);
   listbox1.Canvas.TextOut(0, index*40+24, Item^.zeile3);

end;
gibts egtl auch nen mittel gegen diese etwas "komische" darstellung, wenn man auf die einträge klickt??

Sunlight7 13. Apr 2007 15:42

Re: mehrzeilige listbox-einträge
 
Jo gibt es, Du hast net das Beispiel der OH geguckt?

Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
   var Item:PItem;
begin
   // Die Variable Rect zeigt Dir den Bereich, wohin gezeichnet werden soll

   Item:=PItem(ListBox1.Items.Objects[Index]);
   Listbox1.Canvas.FillRect(Rect); // ! Bereich vorher löschen
   Listbox1.Canvas.TextOut(Rect.Left+1, Rect.Top+ 1, Item^.Zeile1);
   Listbox1.Canvas.TextOut(Rect.Left+1, Rect.Top+13, Item^.Zeile2);
   Listbox1.Canvas.TextOut(Rect.Left+1, Rect.Top+25, Item^.Zeile3);
end;

maddins 16. Apr 2007 23:49

Re: mehrzeilige listbox-einträge
 
Liste der Anhänge anzeigen (Anzahl: 1)
jo! das funktioniert soweit ganz gut...

allerdings scheint er immer noch beim scrollen durcheinander zu kommen!? :wall:

grüße
maddins

Sunlight7 17. Apr 2007 01:22

Re: mehrzeilige listbox-einträge
 
Moin!

Ja, der Screenshot is schön anzusehen, aber ohne zu wissen wie Dein Quellcode aussieht kann ich da nur schwer Fehler finden ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 Uhr.
Seite 2 von 3     12 3      

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