检查TEdit的文本属性是否在帧上为空

时间:2013-02-09 21:57:26

标签: delphi delphi-xe2

所以这是我的情况。我有一个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可能没有创建。任何帮助都会很棒。提前谢谢。

1 个答案:

答案 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,并且它不是惯用的。

最后,我建议您学习如何使用调试器。这是一个很棒的工具,如果你想使用它,它会告诉你问题是什么。不要无助,让工具帮助你。