1

これが私の状況です。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 ボックスのテキスト プロパティが null かどうかをチェックします。

procedure TfmMainMenu.tbCheckClick(Sender: TObject);
begin
frTestFrame.Check;
end;

TestFrame のこの関数は、すべての「TEdit」コンポーネントを通過し、TEdit の text プロパティが null の場合に文字列を返す関数 GetErrorData を使用することになっています。その文字列は TStringList に追加され、TEdit ボックスが null の場合に表示されます。

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

アドレス でアクセス違反が発生します0x000....。まず、正確なエラー メッセージと詳細を教えていただけないでしょうか。住所を隠すと大変!

とにかく、アドレスはゼロに非常に近い値になるようです。いずれにせよ、アクセス違反の唯一の説明は、それfrTestFrameが無効であるということです。おそらくそうですnil

問題のコードはメソッド内にあることに注意してくださいTfrTestFrame。では、なぜfrTestFrameオブジェクトを参照するために使用するのでしょうか? あなたはすでにオブジェクトのインスタンスの中にいます。という名前のグローバル変数が複数ありますfrTestFrameか? メインフォームユニットに1つ、フレームユニットに1つということでしょうか。

GUI オブジェクトにグローバル変数を使用するのはやめるべきです。IDEがあなたをそのように導くことを私は知っています。そのようにプログラムする誘惑に抵抗してください。グローバル変数の乱用は、痛みと苦しみにつながります。

コードはTfrTestFrameメソッド内にあるため、使用できますSelf。すべてのTfrTestFrameメソッドで、へのすべての参照を削除しますfrTestFrame。ループは次のようになります。

for I := 0 to ComponentCount - 1 do

そのクラスの残りのメソッドには、同様の処理が必要です。Self明示的に書く必要はなく、そうしないのは慣用的であることに注意してください。

最後に、デバッガーの使用方法を学ぶことをお勧めします。これは素晴らしいツールであり、使用すると問題が何であるかを教えてくれるでしょう。無力にならないでください。ツールに助けてもらいましょう。

于 2013-02-09T22:11:52.240 に答える