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 zur Laufzeit erzeugte ComboBox zeigt keine Bitmaps an (https://www.delphipraxis.net/91095-zur-laufzeit-erzeugte-combobox-zeigt-keine-bitmaps.html)

Helmi 29. Apr 2007 12:22


zur Laufzeit erzeugte ComboBox zeigt keine Bitmaps an
 
Hallo,

ich erzeuge zur Laufzeit eine ComboBox und weis der 2 Bitmaps als Objects zu:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  Bitmap1, Bitmap2: TBitmap;

begin
  //Bitmaps erzeugen
  Bitmap1 := TBitmap.Create;
  Bitmap2 := TBitmap.Create;

  try
    //Bilder in Bitmaps laden
    Bitmap1.LoadFromFile('d:\Original.bmp');
    Bitmap2.LoadFromFile('d:\modified.bmp');

    //ComboBox auferzeugen und beschreiben
    ComboBox_SG := TComboBox.Create(StringGrid1);
    with ComboBox_SG do
      begin
        Parent     := StringGrid1;
        Visible    := false;
        Enabled    := true;
        Style      := csOwnerDrawVariable;

        ItemHeight := 14;

        //Bitmaps in ComboBox aufnehmen
        Items.AddObject('', Bitmap1);
        Items.AddObject('', Bitmap2);

        //Properties:
        OnChange   := OnChangeComboBox_SG;
        OnDrawItem := OnDrawItemComboBox_SG;
        OnExit     := OnExitComboBox_SG;
      end;

    StringGrid_aufbauen;
  finally
    FreeAndNil(Bitmap1);
    FreeAndNil(Bitmap2);
  end;
end;
Im DrawItem der ComboBox hab ich das drin:
Delphi-Quellcode:
var
  Bitmap: TBitmap;
  Offset: Integer;
begin
  offset := 0;
  with ComboBox1.Canvas do
  begin
    FillRect(Rect);
    Bitmap := TBitmap(ComboBox1.Items.Objects[Index]);
    if Bitmap <> nil then
    begin
      //copy bitmap to combobox coordinate
      BrushCopy(Bounds(Rect.Left + 2, Rect.Top + 2, Bitmap.Width,
        Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width,
        Bitmap.Height), clred);
      Offset := Bitmap.Width + 8;
    end;
    //Set a caption to each item
    TextOut(Rect.Left + Offset, Rect.Top, Combobox1.Items[Index]);
  end;
Ich kann es compilieren, nur werden die Bitmaps nicht angezeigt.
Wenn ich das ganze mit nicht-zur-Laufzeit-erzeugten ComboBox mache, funktioniert es.

Irgendwas überseh ich - nur was?

DGL-luke 29. Apr 2007 12:27

Re: zur Laufzeit erzeugte ComboBox zeigt keine Bitmaps an
 
Hallo,

wenn du die Bitmaps gkleich wieder zerstörst, wundert esm ich, dass es überhaupt funktioniert. Das "FreeAndNil" muss auf jeden fall raus.

Helmi 29. Apr 2007 12:35

Re: zur Laufzeit erzeugte ComboBox zeigt keine Bitmaps an
 
hallo,

das FreeAndNil kann bleiben, denn es funktioniert auch ohne dem nicht!
(war auch mein erster Gedanke)

mkinzler 29. Apr 2007 12:44

Re: zur Laufzeit erzeugte ComboBox zeigt keine Bitmaps an
 
Warum legst du die Bilder nicht in einer Imageliste ab und direkt in der Combobox?
Die Bitmaps dürfen aber definitiv nicht gleich wieder Freigegeben werden.

Helmi 29. Apr 2007 12:47

Re: zur Laufzeit erzeugte ComboBox zeigt keine Bitmaps an
 
Die ComboBox wird in Zellen eines StringGrid dargestellt.
Und bei auswahl eines Eintrages der ComboBox wird das Object übertragen zur der Zelle des StringGrids.

Ich hab jetzt aber den Fehler gefunden:
der Parent der ComboBox darf nicht die StringGrid sein.

Ich werde aber die Bitmaps nicht gleich wieder freigeben.


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