【发布时间】:2019-07-11 10:27:33
【问题描述】:
我想在VerticleScrollBar 中创建 PreviewList。预览项目将具有 TRectangle、TImage 和 TLabel。
我的表单包含三个按钮 btnLoad btnAdd 和 btnClear。
在btnLoad点击我正在加载Image1中的图片:
procedure TForm3.btnLoadClick(Sender: TObject);
begin
if OpenDialog1.Execute then
Image1.Bitmap.LoadFromFile(OpenDialog1.FileName);
end;
在btnAdd 上单击我将PreviewItem 添加到VertScroll 并将字符串添加到将用于打印图像的StringList(尚未实现):
procedure TForm3.btnAddClick(Sender: TObject);
var
mRect: TRectangle;
mbit: TBitmap;
mImage: TImage;
mTitle: TLabel;
mDeleteBtn: TButton;
begin
SL:= TStringList.Create;
mRect:= TRectangle.Create(VertScroll);
mRect.Height:= 60 ;
mRect.Align:= TAlignLayout.Top;
mRect.Margins.Bottom:= 2;
mRect.Position.Y:= I * mRect.Height;
mRect.Parent:=VertScroll;
mBit:= TBitmap.Create;
mBit.Height:= Image1.Bitmap.Height;
mBit.Width:= Image1.Bitmap.Width;
mBit.CopyFromBitmap(Image1.Bitmap);
mImage:= TImage.Create(mRect);
mImage.Parent:= mRect;
mImage.Align:= TAlignLayout.Top;
mImage.Height:= 50;
mImage.Bitmap.Assign(mBit);
mImage.WrapMode:= TImageWrapMode.Tile;
mImage.OnClick:= mImageClick;
mTitle:= Tlabel.Create(mRect);
mTitle.Parent:= mRect;
mTitle.Align:= TAlignLayout.Bottom;
mTitle.Text:= 'Image'+ IntToStr(i);
mTitle.Height:=10;
mDeleteBtn:= TButton.Create(mImage);
mDeleteBtn.Parent:= mImage;
mDeleteBtn.Width:= 20;
mDeleteBtn.Height:=20;
mDeleteBtn.Text:= 'X';
mDeleteBtn.OnClick:= btnDeleteClick;
I:= I + 1;
SL.Add(mTitle.Text);
ListBox1.Items.AddStrings(SL);
Sl.Free;
end;
btnClear 我正在清理一切以恢复新鲜感:
procedure TForm3.btnClearClick(Sender: TObject);
var
j: integer;
begin
SL:= TStringList.Create;
Sl.Clear;
SL.Free;
for j := VertScroll.ComponentCount - 1 downto 0 do
begin
if (VertScroll.Components[j] is TRectangle) then
begin
(VertScroll.Components[j] as TRectangle).Free;
end;
end;
ListBox1.Clear;
I:= 0;
end;
在mDeleteButton点击我正在尝试从滚动条中删除组件并从StringList中删除字符串:
procedure TForm3.btnDeleteClick(Sender: TObject);
var
j: integer;
begin
VertScroll.BeginUpdate;
SL:=TStringList.Create;
j:= TButton(Sender).Parent.Parent.Index;
sl.Delete(j);
ListBox1.Items.AddStrings(SL);
TButton(Sender).Parent.Parent.Destroy;
VertScroll.EndUpdate;
end;
更新
预览项目的创建工作正常,但是当我尝试使用 btnDelete 从 ScrollBar 中删除项目时,它会在 Sl.Delete(j) 上引发 Index Out of bound 错误
为什么它没有从该索引中删除 StringList 字符串?
我怎样才能正确处理这个操作?
更新 1
如何在 VertScroll 的 PreviewItems 中从 TRectangle 访问 TImage
这是我正在尝试的当前代码:
for k := 0 to TRectangle(VertScroll.Components[j]).ChildrenCount - 1 do
begin
if TRectangle(VertScroll.Components[j]).Children[k] is TImage then
begin
img.Bitmap.Assign(TImage(TRectangle(VertScroll.Components[j]).Children[k]).Bitmap);
end;
end;
【问题讨论】:
-
为什么要创建一个 TStringList 并在使用后立即释放它?好像你根本不需要 TStringList
-
@GuidoG Hii 这是人为错误。但将使用字符串列表打印在 vertscroll 的 previewitems 中的图像,因为我说打印部分尚未实现。我已经更新了我的问题,请看一下。
标签: delphi firemonkey delphi-10.3-rio