Solved

Array of Bitmaps

Posted on 2000-04-10
10
395 Views
Last Modified: 2010-04-04
I have a form with a listbox on the left and an image control on the right.
When you click something in the listbox, it needs to display the image to go with it. The only way I could think to do this was to declare an array of tbitmap and when you click the listbox, the array with the listbox's itemindex shows in the image control. When I try to clear the whole thing, the array, the image and the listbox, it appears to clear. When you reload every thing new, the listitems that contained images before, still do. I have been having alot of access errors trying to free the whole array eachtime.
The array needs to hold at least 75 images. Any Ideas?

Thanks in advance,
Cando
0
Comment
Question by:cando
  • 2
  • 2
  • 2
  • +4
10 Comments
 
LVL 4

Expert Comment

by:StevenB
Comment Utility
 I'm in a hurry here, but one word springs to mind: TImageList.

  (Sorry if I've misinterpreted things and stated the bleedin' obvious)

  Gotta dash,

  Steven
0
 
LVL 13

Expert Comment

by:Epsylon
Comment Utility
Maintain a TObjectList next to the ListBox and store the bitmaps in this list. TObjectList frees the bitmaps automatically when necessary...
0
 
LVL 13

Expert Comment

by:Epsylon
Comment Utility
TImageList can only hold images of equal size. Maybe this is case here... don't know.
0
 

Author Comment

by:cando
Comment Utility
Sorry,

All the images could be very different, loaded from files or pasted form the clipboard.
0
 
LVL 12

Expert Comment

by:rwilson032697
Comment Utility
Can you post the relevant code?

Cheers,

Raymond.


0
Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

 

Author Comment

by:cando
Comment Utility
FImage: array[1..75] of TBitmap;

procedure TForm1.LoadFromFile1Click(Sender: TObject);
begin
 if OpenPictureDialog1.Execute then
 begin
   FImage[ListBox2.ItemIndex + 1] := TBitmap.Create;
   FImage[ListBox2.ItemIndex + 1].LoadFromFile(openPictureDialog1.FIleName);
   Image1.Picture.Bitmap := FImage[ListBox2.ItemIndex + 1];
 end;
end;

procedure TForm1.ListBox2Click(Sender: TObject);
begin
  try Image1.Picture.Bitmap := FImage[ListBox2.ItemIndex + 1] except end;
end;


This all seems to work alright When I try to clear it all so it can be refilled, it clears but when the listbox is filled again, it has pictures for the items that had them last time. I dont know how to clear the array.

Here is the code I use to clear everything.



procedure TForm1.ClearAll;
var
  i: integer;
begin
  Image1.Picture := nil;
  ListBox2.Clear;

  try
    for I := 1 to 75 do FImage[i].free;
  except end;
end;
0
 
LVL 2

Expert Comment

by:mullet_attack
Comment Utility
When you add the items to the listbox, use addobject

a sample (form with button1, listbox1, image1 and openpicturedialog1)

procedure TForm1.Button1Click(Sender: TObject);
var
  mybitmap : tbitmap;
begin
  if openpicturedialog1.execute then
    begin
      mybitmap := tbitmap.create;
      mybitmap.loadfromfile(openpicturedialog1.filename);
      listbox1.items.addobject ('item', TObject(mybitmap));
    end;

When you delete an item from the list box, don't forget to call TBitmap(listbox1.items.object[x]).free first.

Mark


end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  image1.picture.bitmap.assign(TBitmap(listbox1.items.objects[listbox1.itemindex]));
end;
0
 
LVL 6

Expert Comment

by:DrDelphi
Comment Utility
Actually, if you are working in Delphi 4 or higher, you could use a dynamic array of Bitmaps, incrementing it as you poplulate it:

Var BMPArray:array of Tbitmap;

Begin
  BmpArray[length(bmpArray)-1]:=Tbitmap.create;
  BmpArray[length(bmpArray)-1].LoadFromfile('yada.bmp');
end;


and then scaling that array down to
nothing again by using Copy:


bmpArray:=Copy(BmpArray,0,0);


0
 
LVL 2

Expert Comment

by:mullet_attack
Comment Utility
Oops, my last comment about delete is in the middle of my sample, sorry 'bout that...  below is a better example, button2 is a delete item button (no error checking..)


procedure TForm1.Button1Click(Sender: TObject);
var
  mybitmap : tbitmap;
begin
  if openpicturedialog1.execute then
    begin
      mybitmap := tbitmap.create;
      mybitmap.loadfromfile(openpicturedialog1.filename);
      listbox1.items.addobject ('item', TObject(mybitmap));
    end;

end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
if assigned(listbox1.items.objects[listbox1.itemindex]) then
  image1.picture.bitmap.assign(TBitmap(listbox1.items.objects[listbox1.itemindex]));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 TBitmap(listbox1.items.objects[listbox1.itemindex]).free;
 TBitmap(listbox1.items.objects[listbox1.itemindex]).Assign(nil);
end;
0
 
LVL 10

Accepted Solution

by:
Lischke earned 150 total points
Comment Utility
Hi all,

I'm currently writing on an image database browser which shows all images as thumbnails. For performance reasons I cache 300 (adjustable) TBitmaps in a normal TList. mulllet_attack has already mentioned to use the listbox's ability to store objects. This is also a good solution. Take care that you free the objects correctly.

If you still want to use your extra list then make sure you reset the references in it:

procedure TForm1.ClearAll;
var
  i: integer;
begin
  Image1.Picture := nil;
  ListBox2.Clear;

  try
    for I := 1 to 75 do
    begin
      FImage[i].free;
      FImage[i] := nil;
    end;
  except end;
end;

otherwise you will access invalid memory!

DrDelphi, just a hint for your dynamic array approach which is something I also like (and use quite often).

Allocation:

  SetLength(BMPArray, Length(BMPArray) + 1);
  BMPArray[High(BMPArray)] := TBitmap.Create;
  :

Do not rely on automatic memory allocation, this will not happen (as in Java)!

Deallocation:

for I := 0 to High(BMPArray) do
  BMPArray[I].Free;
BMPArray := nil;

Ciao, Mike
0

Featured Post

6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

Join & Write a Comment

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
It is a freely distributed piece of software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages.
Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…

728 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now