Code Bug driving me crazy - Assistance needed

Hi Experts,

I have tried fixing this myself for many hours now and I just cannot get it to work!

I have 2 TImages...This code basically creates a screenshot of both images together and saves it.

I of the Images is the frame and the other changes in a loop with the contents of the FilelistBox.

All this works BUT it's not saving the images to their original filename it's skipping 1 and this all the
original filenames are wrong :o/

Can you guys please check the code and see if anyone can spot the problem please???

Hope you can help

ST3VO



procedure TForm1.sButton1Click(Sender: TObject);
var i: integer;
    bmp: TBitmap;
   jpg: TJPegImage;
   TheFileName: String;
begin
   for i:=0 to FileListBox1.Items.Count-1 do
 
 
begin
 
 
 
  Image2.Picture.LoadFromFile(FileListBox1.Items[i]);
   bmp := TBitmap.Create;
  jpg := TJPegImage.Create;
  bmp.Width := Image1.Width;
  bmp.height := Image1.height;
  bmp.PixelFormat := pf24bit;
  BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,Form1.Canvas.Handle,Image1.Left,Image1.Top,SRCCOPY);
  
  jpg.Assign(bmp);
  
  
  jpg.Compress;
 
 
 
TheFileName:=('C:\dwnld\new\'+ExtractFileName(FileListBox1.Items[i]));
jpg.SaveToFile(TheFileName);
 
 
 bmp.Free;
  jpg.Free;
 
  Application.ProcessMessages;
 
end;
 
....

Open in new window

ST3VOAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
imitchieConnect With a Mentor Commented:
okay, please try this
procedure TForm1.sButton1Click(Sender: TObject);
var i: integer;
  bmp: TBitmap;
  jpg: TJPegImage;
  TheFileName: String;
begin
  for i:=0 to FileListBox1.Items.Count-1 do
  begin
    Image2.Picture.LoadFromFile(FileListBox1.Items[i]);
    Image2.invalidate;
    form1.Invalidate;
    Application.ProcessMessages;
 
   bmp := TBitmap.Create;
  jpg := TJPegImage.Create;
  bmp.Width := Image1.Width;
  bmp.height := Image1.height;
  bmp.PixelFormat := pf24bit;
  BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,Form1.Canvas.Handle,Image1.Left,Image1.Top,SRCCOPY);
 
  jpg.Assign(bmp);
  jpg.CompressionQuality:=StrToInt(sComboBox1.Text);
  //jpg.Performance :=jpbestspeed;
  jpg.Compress;
 
 
 
TheFileName:=('C:\dwnld\new\'+(FileListBox1.Items[i]));
 
jpg.SaveToFile(TheFileName);
 
 
 bmp.Free;
  jpg.Free;
 
 
  Application.ProcessMessages;
 
 
  end;
 
 
 
end;

Open in new window

0
 
ST3VOAuthor Commented:
A bit of extra information that might help:

If I select one by one whithout looping it works fine as when selecting the list item the TImage
is populated with the picture and it takes the screenshot and saves it fine.

But the I put the code in the loop filenames get all mixed!

Hope this helps!
0
 
rfwoolfCommented:
Hmm...

You say "All this works BUT it's not saving the images to their original filename it's skipping 1 and this all the original filenames are wrong :o/"
Can you explain that a bit more?
Also check your begin ... ends -- in your code sample pasted above you are missing an end (there is an end for the loop, but not for the procedure -- so in other words check that your loop is working properly)

Everything else looks fine.
Can you give an example of the filenames listed in your filelistbox.
Are the filnames like this:
C:\Program Files\Somewhere\Else\MyPicture.jpg
OR like this:
MyPicture.jpg
0
Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
imitchieCommented:
put   Application.ProcessMessages;
after   Image2.Load
to force the image to be drawn on the form before you try to snapshot the form
0
 
imitchieCommented:
i suspect you had img1 appearing in the file saved as img2, etc. all 1 off because of a missing application.processmessages
if that doesn't help, try Image2.invalidate as well
0
 
ST3VOAuthor Commented:
The filenames are like this: MyPicture.jpg

About the Begin...end....

That's my fault ...I cleaned up the comments and old code before pasting here...but It compiles fine!

The code needs to

Select each filename in the filelistbox so that the image is loaded and the screenshot is taken.
then save the screenshot

When I do it manually...

I click on the Filelistbox item....the image is loaded into the TImage and then I hit save and it saves
to the original filename BUT it doesn't do that inside the loop!


 
0
 
ST3VOAuthor Commented:
The First Image is saving as blank...but takes the name of the first image and then all image filenames are wrong :o/
0
 
ST3VOAuthor Commented:
imitchie: Didn't fix the problem :o/

0
 
imitchieCommented:
st3vo, try my suggestion yet?
0
 
imitchieCommented:
okay, add all these after
  Image2.Picture.LoadFromFile(FileListBox1.Items[i]);

then if it works, take them out one at a time
  Image2.Invalidate();
  Form1.Invalidate();
  Application.ProcessMessages;
0
 
ST3VOAuthor Commented:
Yep...I still got the problem :o/

I'm sure it's something really simple that's happening there...I just cannot see it :o(
0
 
ST3VOAuthor Commented:
Here is a code update:
procedure TForm1.sButton1Click(Sender: TObject);
var i: integer;
    bmp: TBitmap;
   jpg: TJPegImage;
   TheFileName: String;
begin
   for i:=0 to FileListBox1.Items.Count-1 do
 
 
begin
 
 
  Image2.Picture.LoadFromFile(FileListBox1.Items[i]);
 
   bmp := TBitmap.Create;
  jpg := TJPegImage.Create;
  bmp.Width := Image1.Width;
  bmp.height := Image1.height;
  bmp.PixelFormat := pf24bit;
  BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,Form1.Canvas.Handle,Image1.Left,Image1.Top,SRCCOPY);
 
  jpg.Assign(bmp);
  jpg.CompressionQuality:=StrToInt(sComboBox1.Text);
  //jpg.Performance :=jpbestspeed;
  jpg.Compress;
 
 
 
TheFileName:=('C:\dwnld\new\'+ExtractFileName(FileListBox1.Items[i]));
jpg.SaveToFile(TheFileName);
 
 
 bmp.Free;
  jpg.Free;
 
  Application.ProcessMessages;
  Image2.invalidate
 
  end;
 
end;

Open in new window

0
 
imitchieCommented:
You need to add the invalidate immediately after the Image2.Load, not that far down!
0
 
ST3VOAuthor Commented:
Still same problem :o(
0
 
imitchieCommented:
can you please list the current code again?
0
 
ST3VOAuthor Commented:
Sure:

Here it is!
procedure TForm1.sButton1Click(Sender: TObject);
var i: integer;
    bmp: TBitmap;
   jpg: TJPegImage;
   TheFileName: String;
begin
 
   for i:=0 to FileListBox1.Items.Count-1 do
 
 
begin
 
   Image2.Picture.LoadFromFile(FileListBox1.Items[i]);
   Image2.invalidate;
 
 
 
 
   bmp := TBitmap.Create;
  jpg := TJPegImage.Create;
  bmp.Width := Image1.Width;
  bmp.height := Image1.height;
  bmp.PixelFormat := pf24bit;
  BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,Form1.Canvas.Handle,Image1.Left,Image1.Top,SRCCOPY);
 
  jpg.Assign(bmp);
  jpg.CompressionQuality:=StrToInt(sComboBox1.Text);
  //jpg.Performance :=jpbestspeed;
  jpg.Compress;
 
 
 
TheFileName:=('C:\dwnld\new\'+(FileListBox1.Items[i]));
 
jpg.SaveToFile(TheFileName);
 
 
 bmp.Free;
  jpg.Free;
 
 
  Application.ProcessMessages;
 
 
  end;
 
 
 
end;

Open in new window

0
 
ST3VOAuthor Commented:
YESSSSS!!!!

It works perfectly now!!!!!

Thanks a million :o)

I can finally go to sleep ...hehehehe!!!!!

Thanks again!!!
0
 
ST3VOAuthor Commented:
Perfect!!!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.