效果图
浏览
{点击 浏览}
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;
这段代码的逻辑主要分为几个部分,处理用户通过文件对话框选择图片文件、遍历指定文件夹中的所有图片文件、以及找到用户选择的图片文件在遍历结果中的索引。
-
设置文件过滤器并显示打开对话框:
- 首先,设置
OpenDialog
的文件过滤器,以便用户只能选择图像文件(如.bmp
、.jpg
、.jpeg
)。 - 显示打开文件对话框,并等待用户选择文件。
- 首先,设置
-
处理用户选择的文件:
- 如果用户选择了文件,则获取该文件的路径(
PicturePath
)。 - 使用该路径加载图片到
img1
控件中。 - 显示所选文件的文件名在
edt1
编辑框中。 - 提取文件所在的文件夹路径(
FDir
)。
- 如果用户选择了文件,则获取该文件的路径(
-
遍历文件夹以获取所有图片文件(这一步主要是为了实现“上、下一张”图片功能):
- 创建一个
TStringList
实例(FImages
),用于存储遍历到的图片文件名。 - 使用
FindFirst
函数开始遍历指定文件夹(FDir
)中的所有文件。 - 遍历过程中,忽略目录项,只关注具有指定扩展名(
.jpg
、.png
、.jpeg
)的文件。 - 将符合条件的文件名添加到
FImages
列表中。 - 使用
FindNext
继续遍历,直到没有更多文件。 - 遍历结束后,使用
FindClose
关闭搜索句柄。
- 创建一个
-
查找用户选择的图片在列表中的索引:
- 遍历
FImages
列表,检查每个文件名是否与edt1
中的文件名(即用户选择的文件名)相匹配。 - 如果找到匹配项,记录其在列表中的索引(
FCurrentIndex
),并跳出循环。
- 遍历
-
异常处理:
- 整个过程中使用
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
)点击事件。它主要用于在图片浏览功能中切换到上一张图片。
-
检查当前索引:首先,代码检查
FCurrentIndex
(一个用于跟踪当前图片在图片列表中的索引的变量)是否大于0。这是因为索引通常从0开始,如果FCurrentIndex
已经是0或更小,那么就没有“上一张”图片可以显示了。 -
更新当前索引:如果
FCurrentIndex
大于0,说明有上一张图片可以显示,那么通过Dec(FCurrentIndex);
语句将FCurrentIndex
减1,以指向列表中的上一张图片。 -
加载并显示图片:接着,使用
img1.Picture.LoadFromFile(FImages[FCurrentIndex]);
语句根据更新后的索引从FImages
(一个TStringList
,存储了图片文件的路径或名称)中加载对应的图片文件,并将其显示在img1
(一个图片控件)上。 -
更新文件名显示:同时,将
edt1.Text
(一个编辑框控件,用于显示当前图片的文件名或路径)更新为当前加载的图片的文件名或路径,这里直接使用了FImages[FCurrentIndex]
。 -
处理无“上一张”图片的情况:如果
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;
完整源码
代码在这