Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Listbox: Bilder dem Text voranstellen (https://www.delphipraxis.net/49868-listbox-bilder-dem-text-voranstellen.html)

hansklok 17. Jul 2005 12:51


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:
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;
Das Laden des jeweiligen Pfades klappt. Ich möchte jedoch auch vor dem jeweiligen Pfad das Bild eingefügt haben. Dies funktioniert aber nicht.
Ich habe die ListBox auf OwnerDrawVariable eingestellt.

so soll es einmal aussehen:

Danke im Vorraus

Keldorn 17. Jul 2005 13:05

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:
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;
Ansonsten zeig mal deine Drawroutine

Mfg Frank

hansklok 17. Jul 2005 13:08

Re: Listbox: Bilder dem Text voranstellen
 
... die Routine habe ich nicht, dachte, dass dies durch diese beiden Routinen ausgeführt wird:

Delphi-Quellcode:
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]);
MfG

hansklok

hansklok 17. Jul 2005 13:14

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!

Keldorn 17. Jul 2005 13:21

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.

Khabarakh 17. Jul 2005 13:29

Re: Listbox: Bilder dem Text voranstellen
 
Zitat:

Zitat von hansklok
Delphi-Quellcode:
Bilder[i].Canvas.Draw(0,0,Bilder[i]);

Was willst du denn damit bezwecken :wink: ?

hansklok 17. Jul 2005 13:32

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:

Manne 17. Jul 2005 13:35

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:
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;
Edit: Fehler korrigiert, s.u.

hansklok 17. Jul 2005 13:41

Re: Listbox: Bilder dem Text voranstellen
 
@ Manne: Bei deiner Version kommt es leider zu einer Zugriffsverletzung!

Khabarakh 17. Jul 2005 13:44

Re: Listbox: Bilder dem Text voranstellen
 
Zitat:

Zitat von hansklok
@ Manne: Bei deiner Version kommt es leider zu einer Zugriffsverletzung!

Und wo genau? Ich sehe nämlich keinen Fehler in Mannes Code.

hansklok 17. Jul 2005 13:47

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!

Manne 17. Jul 2005 13:57

Re: Listbox: Bilder dem Text voranstellen
 
Sorry,
Klar statt
Delphi-Quellcode:
if Bilder[i] <> nil then
        Bilder[i]:= TBitmap.Create;
muss es
Delphi-Quellcode:
if Bilder[i] = nil then
        Bilder[i]:= TBitmap.Create;

hansklok 17. Jul 2005 14:00

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!

Khabarakh 17. Jul 2005 14:06

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.

hansklok 17. Jul 2005 14:09

Re: Listbox: Bilder dem Text voranstellen
 
... ich habe keine OnDrawItem Routine!

Manne 17. Jul 2005 14:09

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.

hansklok 17. Jul 2005 14:14

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

FriFra 18. Jul 2005 11:36

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:
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;
Dabei darfst Du natürlich nicht vergessen, dass die ImageList entspr. Skaliert ist, dass Deine Bilder dort hinein passen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 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