1

所以这是我的情况。我有一个表单(MainMenu)和一个框架(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 属性为空,则该函数返回一个字符串。该字符串被添加到 TStringList 并在任何 TEdit 框为空时显示。

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;

问题是,当它到达“for I := 0 to (frTestFrame.ComponentCount - 1) do”行时,它会爆炸,我收到错误“0x00458 处的访问冲突......读取地址 0x000......”我不知道为什么会发生这个错误。我只能假设框架可能没有被创建。任何帮助都会很棒。提前致谢。

4

1 回答 1

3

根据你的问题,这条线

for I := 0 to (frTestFrame.ComponentCount - 1) do

导致 address 的访问冲突0x000....。现在,首先,您为什么不告诉我们带有完整详细信息的准确错误消息?隐藏地址会更难!

无论如何,看起来地址将是一个非常接近于零的值。无论如何,对访问冲突的唯一解释frTestFrame是无效的。很可能是nil

我注意到有问题的代码在一个TfrTestFrame方法中。那么为什么要使用frTestFrame来指代对象呢?您已经在对象的实例中。你有多个名为的全局变量frTestFrame吗?也许一个在主窗体单元中,一个在框架单元中?

您应该停止为您的 GUI 对象使用全局变量。我知道 IDE 会以这种方式引导您。抵制以这种方式编程的诱惑。滥用全局变量会导致痛苦和痛苦。

由于代码位于TfrTestFrame您可以使用的方法中Self。在您的所有TfrTestFrame方法中,删除所有对frTestFrame. 你的循环应该是这样的:

for I := 0 to ComponentCount - 1 do

并且该类中的其余方法需要类似的处理。请注意,您不需要显式编写Self,而且习惯上不要这样做。

最后,我敦促您学习如何使用调试器。这是一个很棒的工具,如果您使用它,它会告诉您问题所在。不要束手无策,让工具来帮助你。

于 2013-02-09T22:11:52.240 回答