![]() |
Listbox: Bilder dem Text voranstellen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
gleich zu Beginn: Ich weiß, dass diese frage im Forum schon häufig gestellt wurden ist, jedoch konnten mir diese Beiträge nicht weiterhelfen (vermutlich stelle ich mich zu blöd an). Also ich habe ne ListBox (lbBilder), in die der folgende Code die ausgewählten Bilder von OpenPictureDialog1 mit deren Pfad als Items in die ListBox geladen werden sollen.
Delphi-Quellcode:
Das Laden des jeweiligen Pfades klappt. Ich möchte jedoch auch vor dem jeweiligen Pfad das Bild eingefügt haben. Dies funktioniert aber nicht.
Bilder: array[1..99] of TBitmap;
... procedure TfImport.bHinzufuegenClick(Sender: TObject); begin if not OpenPictureDialog1.Execute then exit; with OpenPictureDialog1 do for i := 0 to Files.Count - 1 do begin Bilder[i]:= TBitmap.Create; Bilder[i].PixelFormat:= pf24Bit; Bilder[i].Width:= 50; Bilder[i].Height:= 35; Bilder[i].Canvas.CopyRect(Bilder[i].Canvas.ClipRect, lbBilder.Canvas, Rect(5, 0, 5 + 50, 0 + 35)); Bilder[i].Canvas.Draw(0,0,Bilder[i]); Bilder[i].Free; //lbBilder.Items.add(Files.Strings[i]); lbBilder.Items.AddObject(Files.Strings[i], TBitmap(Bilder[i])); end; end; Ich habe die ListBox auf OwnerDrawVariable eingestellt. so soll es einmal aussehen: Danke im Vorraus |
Re: Listbox: Bilder dem Text voranstellen
Hallo
wenn du Objekte zu Luistbox als Object hinzufügst, darfst du sie nicht wieder freigeben. Die Bilder kannst du erst z.B. im ondestroy der Form freigeben. Ansosnten ist auch ein Beispiel in der OH (da du die 2005 hast, kopier ichs mal lieber)
Delphi-Quellcode:
Ansonsten zeig mal deine Drawroutine
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect:TRect;State: TOwnerDrawState);
var Bitmap: TBitmap; { Temporäre Variable für Bitmap } Offset: Integer; { Text-Offset } begin with (Control as TListBox).Canvas do { Zeichnen in der Liste, nicht im Formular } begin FillRect(Rect); { Rechteck löschen } Offset := 2; { Standard-Offset definieren } Bitmap := TBitmap((Control as TListBox).Items.Objects[Index]); { Bitmap abrufen } if Bitmap <> nilthen begin BrushCopy(Bounds(Rect.Left + Offset, Rect.Top, Bitmap.Width, Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), clRed); { Bitmap darstellen } Offset := Bitmap.width + 6; { Vier Pixel zwischen Bitmap und Text hinzufügen } end; TextOut(Rect.Left + Offset, Rect.Top, (Control as TListBox).Items[Index]) { Text anzeigen } end; end; Mfg Frank |
Re: Listbox: Bilder dem Text voranstellen
... die Routine habe ich nicht, dachte, dass dies durch diese beiden Routinen ausgeführt wird:
Delphi-Quellcode:
MfG
Bilder[i].Canvas.CopyRect(Bilder[i].Canvas.ClipRect, lbBilder.Canvas, Rect(5, 0, 5 + 50, 0 + 35));
Bilder[i].Canvas.Draw(0,0,Bilder[i]); hansklok |
Re: Listbox: Bilder dem Text voranstellen
Wenn ich deinen Code in die OnDrawItem Procedure reinschreibe, dann stürtzt das Programm beim Öffnen eines Bildes ab, übrigens wird auch nichts gezeichnet!
|
Re: Listbox: Bilder dem Text voranstellen
du verwechselst da was. Du fügst einelnen Bilder als Object zu einem Listbox item hinzu und beim erforderlichen Neuzeichnen rufst du die Bilder ab und zeichnest sie in die listbox.
Das bilder.free hast du aber rausgenommen? Ansonsten zeig deinen code. |
Re: Listbox: Bilder dem Text voranstellen
Zitat:
|
Re: Listbox: Bilder dem Text voranstellen
Liste der Anhänge anzeigen (Anzahl: 1)
@ Khabarakh: ... du hast Recht, diese Zeile ist der totale Stuss!
... hier der Code, vielleicht hilft dir das weiter: |
Re: Listbox: Bilder dem Text voranstellen
Servus,
wie schon Keldorn geschrieben hat, gibts du das Bitmap gleich wieder frei. Zudem lädst dunie ein Bitmap in dein Bilder-Array rein. Es sollte ungefähr so aussehen
Delphi-Quellcode:
Edit: Fehler korrigiert, s.u.
procedure TfImport.bHinzufuegenClick(Sender: TObject);
begin if not OpenPictureDialog1.Execute then exit; with OpenPictureDialog1 do for i := 0 to Files.Count - 1 do begin if Bilder[i] = nil then Bilder[i]:= TBitmap.Create; Bilder[i].PixelFormat:= pf24Bit; Bilder[i].Width:= 50; Bilder[i].Height:= 35; Bilder[i].LoadFromFile(Files.Strings[i]); lbBilder.Items.AddObject(Files.Strings[i], TObject(Bilder[i])); end; end; |
Re: Listbox: Bilder dem Text voranstellen
@ Manne: Bei deiner Version kommt es leider zu einer Zugriffsverletzung!
|
Re: Listbox: Bilder dem Text voranstellen
Zitat:
|
Re: Listbox: Bilder dem Text voranstellen
Liste der Anhänge anzeigen (Anzahl: 1)
... der markiert mir die fehlerhafte Zeile beim Absturz in Delphi 2005 nicht im Quellcode, da kam halt nur ne Fehlermeldungs MessageBox und es wurde nichts in die ListBox eingefügt!
|
Re: Listbox: Bilder dem Text voranstellen
Sorry,
Klar statt
Delphi-Quellcode:
muss es
if Bilder[i] <> nil then
Bilder[i]:= TBitmap.Create;
Delphi-Quellcode:
if Bilder[i] = nil then
Bilder[i]:= TBitmap.Create; |
Re: Listbox: Bilder dem Text voranstellen
... probier doch bitte mal den Source aus, nun kommt zwar keine Fehlermeldung mehr, aber es wird wieder nur der Pfad, aber nicht die Bitmap eingefügt!
|
Re: Listbox: Bilder dem Text voranstellen
Wie sieht denn deine DrawItem-Routine aus? Im Anhang ist jedenfalls keine :wink: .
Und zu dem "<>": Mit höchstens 1 Minute Debugging hättest du den Fehler selbst gefunden, anstatt erstmal 16 Minuten warten zu müssen. |
Re: Listbox: Bilder dem Text voranstellen
... ich habe keine OnDrawItem Routine!
|
Re: Listbox: Bilder dem Text voranstellen
Hast du auch ein OnDrawItem- Ereignis für deine Listbox. Wenn ich den Code von Keldorn nehme,
zeigt es bei mir die Bilder einwandfrei in der Listbox an. Habe zusätzlich noch IntegralHeight auf true und die Itemheight erhöht, und den Style "nur" auf lbOwnerDrawVariable gestellt. |
Re: Listbox: Bilder dem Text voranstellen
... ok, funktioniert nun auch bei mir, ich werde den Code noch ein bisschen anpassen und melde mich bestimmt nochmal!
Danke an alle MfG hansklok |
Re: Listbox: Bilder dem Text voranstellen
Als ich das hier gelesen hab, dachte ich so bei mir: "warum einfach, wenns auch kompliziert geht"...
Warum nimmst Du nicht eine ListView?
Delphi-Quellcode:
Dabei darfst Du natürlich nicht vergessen, dass die ImageList entspr. Skaliert ist, dass Deine Bilder dort hinein passen ;)
var
Item: TListItem; bmp: TBitmap; begin ... Item := ListView1.Items.Add; Item.Caption := 'c:\iregendeinbild.bmp'; bmp := TBitmap.Create; try Bmp.LoadFromFile('c:\iregendeinbild.bmp'); Item.ImageIndex := ImageList1.Add(bmp); finally bmp.Free; end; ... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 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