gpt4 book ai didi

delphi - 我不断收到 "Invalid class typecast"错误,我不知道为什么

转载 作者:行者123 更新时间:2023-12-03 07:38:35 27 4
gpt4 key购买 nike

我试图在关闭表单时释放一个组件,但是当我运行这段代码时,我不断收到“无效的类类型转换”错误,我不知道为什么。

procedure TfrmMenu.FormHide(Sender: TObject);
var
I: Integer;
sID: String;
begin
I := 0;
repeat
Inc(I);
with dmMenu.qryMcDonalds do
begin
SQL.Text := 'Select ItemID FROM tblMenu WHERE ItemID LIKE "' + IntToStr
(I) + '%"';
Open;
end;
sID := dmMenu.qryMcDonalds.Fields[0].AsString;

if (Components[I] as TImage).Name = 'imgd' + sID then
begin (Components[I] as TImage)
.Free;
end;

if (Components[I] as TLabel).Name = 'lbld' + sID then
begin (Components[I] as TLabel)
.Free;
end;
until I = ComponentCount - 1;
end;

最佳答案

您的问题出在这部分:

    if (Components[I] as TImage).Name = 'imgd' + sID then
begin (Components[I] as TImage)
.Free;
end;

if (Components[I] as TLabel).Name = 'lbld' + sID then
begin (Components[I] as TLabel)
.Free;
end;

Delphi 中的 as 强制转换基本上是一个断言强制转换:您是说您确定它将是该类型,如果不是,则引发无效强制转换异常。现在,您断言每个组件都将是 TImageTLabel,这显然永远不会是真的。

您可能真正想做的是:

    if (Components[I] is TImage) and (Components[I].Name = 'imgd' + sID) then
begin
Components[I].Free;
end;

if (Components[I] is TLabel) and (Components[I].Name = 'lbld' + sID) then
begin
Components[I].Free;
end;

您实际上并不需要其中的强制转换,因为 Namea property on the TComponent base class.

编辑: Andreas 在评论中指出的几点:

首先,如果您要遍历一个集合并从中删除项目,您需要向后工作。为了说明原因,让我们从此列表中删除所有偶数:

[1, 3, 5, 2, 4, 6]

所以如果我们这样做:

for i := 0 to list.Length - 1 do
begin
if list[i] mod 2 = 0 then
begin
list.Remove(i);
end;
end;

在前三个迭代中,我们发现数字不是偶数。到目前为止,一切都很好。但是在#4 (i = 3) 上,我们有一个偶数。我们将其从列表中删除。该列表现在是 [1, 3, 5, 4, 6]。现在我们将 i 增加到 4。这个新列表中的元素 #4 是 6; 我们已经跳过了 4!这仅在您倒数时才有效,因为删除内容只会重新排列您已经完成的工作,而不是您仍未完成的工作。

此外,表单上的 Components 集合将包含所有组件,无论它们在表单设计器中的设置顺序如何。您调用 imgd1 的任何图像都不太可能成为该集合中的组件 #1。如果您正在寻找名称以 imgdlbld 后跟数字开头的这些类型的任何组件,您可能需要编写一个自定义名称验证函数检查那个。但是检查数字是否与 I 相同或多或少没有用,因为 I 在这里完全是任意的。

关于delphi - 我不断收到 "Invalid class typecast"错误,我不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62521608/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com