Delphi5实现图片查看器

效果图

在这里插入图片描述

浏览

{点击 浏览}
procedure TForm1.Button1Click(Sender: TObject);  
var
  PicturePath: string;
  SearchRec: TSearchRec;
  i: Integer;
  ResultCode: Integer;
begin
  try  
    // 设置文件过滤器  
    OpenDialog.Filter := 'Image Files (*.bmp;*.jpg;*.jpeg)|*.bmp;*.jpg;*.jpeg|All Files (*.*)|*.*';  
    // 显示打开对话框  
    if OpenDialog.Execute then  
    begin
      // 获取选择的文件路径
      PicturePath := OpenDialog.FileName;
      // 加载图片到 Image 控件  
      img1.Picture.LoadFromFile(PicturePath);
      // 显示文件名
      edt1.Text := ExtractFileName(PicturePath);
      //文件夹路径
      FDir:=ExtractFilePath(PicturePath);
    end;

    {以下是用于图片遍历}
    FImages := TStringList.Create;  // 创建用于存储图片文件名的字符串列表
    //遍历文件夹FDir,获取所有图片路径

    ResultCode:=FindFirst(FDir + '*.*', faAnyFile , SearchRec);
    // 打开搜索
    if ResultCode = 0 then
    begin
      try
        repeat
          // 忽略目录项
          if (SearchRec.Attr and faDirectory <> faDirectory) and
          ((AnsiCompareText(ExtractFileExt(SearchRec.Name), '.jpg') = 0) or
          (AnsiCompareText(ExtractFileExt(SearchRec.Name), '.png') = 0) or
          (AnsiCompareText(ExtractFileExt(SearchRec.Name), '.jpeg') = 0))
          then
          begin
            // 添加文件名到列表
            FImages.Add(SearchRec.Name);
          end;
        until FindNext(SearchRec) <> 0;
      finally
        // 关闭搜索句柄
        FindClose(SearchRec.FindHandle);
      end;
    end;

    // 此时 FImages 中包含了所有图片文件的文件名
    // 可以遍历 FImages 来处理这些文件名
    for i := 0 to FImages.Count - 1 do
    begin
      if FImages[i]=edt1.Text then
      begin
        //当前图片在图片的列表的索引
        FCurrentIndex:=i; 
        break;
      end;
    end;
    
  except
    on E: Exception do
    begin
      // 处理异常,例如显示错误消息
      ShowMessage('Error: ' + E.Message);
    end;
  end;
end;

这段代码的逻辑主要分为几个部分,处理用户通过文件对话框选择图片文件、遍历指定文件夹中的所有图片文件、以及找到用户选择的图片文件在遍历结果中的索引。

  1. 设置文件过滤器并显示打开对话框

    • 首先,设置OpenDialog的文件过滤器,以便用户只能选择图像文件(如.bmp.jpg.jpeg)。
    • 显示打开文件对话框,并等待用户选择文件。
  2. 处理用户选择的文件

    • 如果用户选择了文件,则获取该文件的路径(PicturePath)。
    • 使用该路径加载图片到img1控件中。
    • 显示所选文件的文件名在edt1编辑框中。
    • 提取文件所在的文件夹路径(FDir)。
  3. 遍历文件夹以获取所有图片文件(这一步主要是为了实现“上、下一张”图片功能)

    • 创建一个TStringList实例(FImages),用于存储遍历到的图片文件名。
    • 使用FindFirst函数开始遍历指定文件夹(FDir)中的所有文件。
    • 遍历过程中,忽略目录项,只关注具有指定扩展名(.jpg.png.jpeg)的文件。
    • 将符合条件的文件名添加到FImages列表中。
    • 使用FindNext继续遍历,直到没有更多文件。
    • 遍历结束后,使用FindClose关闭搜索句柄。
  4. 查找用户选择的图片在列表中的索引

    • 遍历FImages列表,检查每个文件名是否与edt1中的文件名(即用户选择的文件名)相匹配。
    • 如果找到匹配项,记录其在列表中的索引(FCurrentIndex),并跳出循环。
  5. 异常处理

    • 整个过程中使用try-except结构来捕获并处理可能发生的异常。
    • 如果发生异常,则通过ShowMessage显示错误信息。
{以下两个procedure是为了能继续打开新的图片}
// 在窗体的某个地方(如构造函数或 OnCreate 事件)
procedure TForm1.FormCreate(Sender: TObject);
begin
  // 创建 OpenDialog
  OpenDialog := TOpenDialog.Create(Self);
  // 可以在这里设置 OpenDialog 的其他属性,如标题等
  OpenDialog.Title := '选中一张图片';
end;

// 确保在窗体销毁时释放 OpenDialog
procedure TForm1.FormDestroy(Sender: TObject);
begin
  OpenDialog.Free;
  FImages.Free;
end;

关闭

{点击 关闭}
procedure TForm1.Button2Click(Sender: TObject);
begin
  close;
end;

上一张

{点击 《《 }
procedure TForm1.btnPreviousClick(Sender: TObject);
begin
  if FCurrentIndex > 0 then
  begin
    //向下减一
    Dec(FCurrentIndex);
    //加载图片
    img1.Picture.LoadFromFile(FImages[FCurrentIndex]);
    edt1.Text := FImages[FCurrentIndex];
  end
  else
    showmessage('前面没有啦~往后看吧');
end;

这段代码的逻辑是处理一个表单(TForm1)上的“上一张”按钮(btnPrevious)点击事件。它主要用于在图片浏览功能中切换到上一张图片。

  1. 检查当前索引:首先,代码检查FCurrentIndex(一个用于跟踪当前图片在图片列表中的索引的变量)是否大于0。这是因为索引通常从0开始,如果FCurrentIndex已经是0或更小,那么就没有“上一张”图片可以显示了。

  2. 更新当前索引:如果FCurrentIndex大于0,说明有上一张图片可以显示,那么通过Dec(FCurrentIndex);语句将FCurrentIndex减1,以指向列表中的上一张图片。

  3. 加载并显示图片:接着,使用img1.Picture.LoadFromFile(FImages[FCurrentIndex]);语句根据更新后的索引从FImages(一个TStringList,存储了图片文件的路径或名称)中加载对应的图片文件,并将其显示在img1(一个图片控件)上。

  4. 更新文件名显示:同时,将edt1.Text(一个编辑框控件,用于显示当前图片的文件名或路径)更新为当前加载的图片的文件名或路径,这里直接使用了FImages[FCurrentIndex]

  5. 处理无“上一张”图片的情况:如果FCurrentIndex不大于0(即已经是第一张图片或没有图片),则通过showmessage('前面没有啦~往后看吧');显示一个消息框,告知用户没有上一张图片可以显示。

下一张

{点击 》》}
procedure TForm1.btnNextClick(Sender: TObject);
begin
  if FCurrentIndex < FImages.Count-1 then
  begin
    Inc(FCurrentIndex);
    img1.Picture.LoadFromFile(FImages[FCurrentIndex]);
    edt1.Text := FImages[FCurrentIndex];
  end
  else
    showmessage('到尽头啦~往前看吧');
end;

完整源码

代码在这

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值