所以这是我的情况。我有一个Form(MainMenu)和一个Frame(TestFrame)。 TestFrame显示在MainMenu上的TPanel上。使用此代码:
frTestFrame := TfrTestFrame.Create(nil);
frTestFrame.Parent := plMain;
frTestFrame.Align := alClient;
frTestFrame.Visible := true;
TestFrame显示正常,没有错误。 TestFrame上有几个TEdit框。 MainMenu上的TButton调用位于TestFrame中的过程来检查TEdit框文本属性是否为空。
procedure TfmMainMenu.tbCheckClick(Sender: TObject);
begin
frTestFrame.Check;
end;
TestFrame上的这个函数应该遍历所有“TEdit”组件,并使用函数GetErrorData,如果TEdit的text属性为null,则返回一个字符串。如果任何TEdit框为空,则将该字符串添加到TStringList并显示。
function TfrTestFrame.Check: Boolean;
var
ErrorList: TStringList;
ErrorString: string;
I: Integer;
begin
ErrorList := TStringList.Create;
for I := 0 to (frTestFrame.ComponentCount - 1) do
begin
if (frTestFrame.Components[I] is TEdit) then
begin
ErrorString := GetErrorData(frTestFrame.Components[I]);
if (ErrorString <> '') then
begin
ErrorList.Add(ErrorString);
end;
end;
end;
if (ErrorList.Count > 0) then
begin
ShowMessage('Please Add The Following Information: ' + #13#10 + ErrorList.Text);
result := false;
end;
result := true;
end;
function TfrTestFrame.GetErrorData(Sender: TObject): string;
var
Editbox: TEdit;
ErrorString: string;
begin
if (Sender is TEdit) then
begin
Editbox := TEdit(Sender);
if (Editbox.Text <> '') then
begin
Editbox.Color := clWindow;
result := '';
end
else
begin
Editbox.Color := clRed;
ErrorString := Editbox.Hint;
result := ErrorString;
end;
end;
end;
问题在于当它遇到“对于我:= 0到(frTestFrame.ComponentCount - 1)”的行时 “它爆炸了,我得到错误”0x00458访问冲突...读取地址0x000 ......“ 我不知道为什么会发生这种错误。我只能假设Frame可能没有创建。任何帮助都会很棒。提前谢谢。
答案 0 :(得分:3)
根据你的问题,行
for I := 0 to (frTestFrame.ComponentCount - 1) do
会导致地址0x000....
发生访问冲突。现在,首先,为什么不告诉我们具有完整细节的确切错误消息?隐藏地址会让事情变得更难!
无论如何,看起来地址的值将非常接近于零。在任何情况下,访问冲突的唯一解释是frTestFrame
无效。最有可能的是nil
。
我注意到有问题的代码位于TfrTestFrame
方法中。那你为什么要用frTestFrame
来引用这个对象呢?您已经在对象的实例中。您有多个名为frTestFrame
的全局变量吗?也许是主要单位中的一个和框架单位中的一个?
您应该停止为GUI对象使用全局变量。我知道IDE会以这种方式引导您。抵制以这种方式编程的诱惑。滥用全局变量会导致痛苦和痛苦。
由于代码位于TfrTestFrame
方法内,您可以使用Self
。在您的所有TfrTestFrame
方法中删除对frTestFrame
的所有引用。你的循环应该是这样的:
for I := 0 to ComponentCount - 1 do
并且该类中的其他方法需要类似的处理。请注意,您不需要显式地编写Self
,并且它不是惯用的。
最后,我建议您学习如何使用调试器。这是一个很棒的工具,如果你想使用它,它会告诉你问题是什么。不要无助,让工具帮助你。