他の人が述べているように、あなたが示したコードでうまくいかないことは非常に多くあります。
1) にTMenuItem.Tag
間違った値が含まれている可能性があります。
2)有効なポインターTempResultFile
が割り当てられていない可能性があります。TEdit
他の人が言ったことにもかかわらず、変数を初期化しないままにしておくと、アクセス違反が発生する可能性はありますが、発生することは保証されません。がTEdit
正しく作成されていない場合、または解放されている場合、割り当てられているポインターが nil になる可能性もあります。使用しようとすると、AV が発生します。
3) SaveDialog1.Execute()
False を返している可能性があります。これは、ダイアログをキャンセルした場合に発生しますが、ダイアログに内部エラーがある場合にも発生する可能性があります。状況によっては、 を使用CommDlgExtendedError()
してその状態を確認できます。
4)SaveDialog1.FileName
が空ですSaveDialog1.Execute()
。true が返された場合は発生しませんが、かなり最新の Delphi バージョンを使用し、Windows Vista 以降でアプリを実行し、ファイルシステム以外のファイルを選択した場合に発生する可能性があります。
デバッグ中に、これらすべての条件を確認していることを確認してください。
var
Item: TMenuItem;
TempResultFile : TEdit;
S: String;
begin
Item := Sender as TMenuItem;
case Item.Tag of
1: TempResultFile := ResultTFile1;
2: TempResultFile := ResultTFile2;
3: TempResultFile := ResultTFile3;
else
raise Exception.CreateFmt('%s.Tag (%d) is not an expected value!', [Item.Name, Item.Tag]);
end;
if TempResultFile = nil then
raise Exception.Create('TempResultFile is nil!');
if not SaveDialog1.Execute then
raise Exception.CreateFmt('SaveDialog1.Execute returned false! Possible CommDlg error? (%d)', [CommDlgExtendedError()]);
S := SaveDialog1.FileName;
if S = '' then
raise Exception.Create('SaveDialog1.FileName is empty!');
TempResultFile.Text := S;
end;
を使用する代わりにTMenuItem.Tag
、TPopupMenu.PopupComponent
プロパティはどのボタンが PopupMenu を表示したかを示します。そのボタンに対応するコンポーネントTButton.Tag
を指すようにプロパティを設定すると、コンポーネントを探すためにプロパティを使用する必要がなくなります。TEdit
TMenuItem.Tag
TEdit
procedure TForm1.FormCreate(Sender: TObject);
begin
ResultTButton1.Tag := NativeInt(ResultTFile1);
ResultTButton2.Tag := NativeInt(ResultTFile2);
ResultTButton3.Tag := NativeInt(ResultTFile3);
end;
procedure TForm1.MenuItemClick(Sender: TObject);
var
ResultTButton : TButton;
TempResultFile : TEdit;
begin
ResultTButton := PopupMenu.PopupComponent as TButton;
TempResultFile := TEdit(ResultTButton.Tag);
if TempResultFile <> nil then begin
if SaveDialog1.Execute then
TempResultFile.Text := SaveDialog1.FileName;
end;
end;