Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 Uhr.
Seite 1 von 2  1 2      

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