関数等を外部ファイル化にあたり

解決


もん  2022-01-15 13:31:20  No: 149962  IP: 192.*.*.*

お世話になります。

現在、関数を外部ファイル化し,外部でtmemoを更新しようと思い下記のようにしてみたのですが
コントロールによっては可能な物もありましたがtmemoでは更新されません。

外部経由でmainフォームのtmemoに内容を代入するには
どのような方法になりますでしょうか?

------------------------------------------------
implementation
 uses outer_pas;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowM();
end;
------------------------------------------------

outer_pas.pas
------------------------------------------------
unit outer_pas;
interface
uses Dialogs,StdCtrls,Forms;

procedure ShowM();

implementation

procedure ShowM();
var
tm:tmemo;
frm1:tform;
begin
tm:=  TMemo(frm1.FindComponent('memo1'));
showmessage(tm.text);
tm.text:='xxxxxxxxx';
end;
end.

編集 削除
HFUKUSHI  2022-01-15 17:39:55  No: 149963  IP: 192.*.*.*

ShowMのローカル変数frm1は初期化されないまま使われてますが、これが原因でエラーが発生してたりしませんか?
普通はShowMのパラメータとして対象のフォームを渡すと思います。
ShowMを
procedure ShowM(Form: TForm);
var
  Memo: TMemo;
begin
  Memo := Form.FindComponent('memo1') as TMemo;
  Memo.Text := '...';
end;
としておいて、TForm1側では
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowM(Self);
end; 
ってな感じで。あるいはMemo1そのものを渡すようにすればFindComponentもいりませんね。
procedure ShowM(Memo: TMemo);
begin
  Memo.Text := '...';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowM(Memo1);
end; 

あと『外部ファイル化』は『ユニット分割』『ユニットを分ける』という表現のほうが一般的ですね、

編集 削除
もん  2022-01-15 20:49:30  No: 149964  IP: 192.*.*.*

HFUKUSHI様、ありがとうございます。
無事目的の動作になりました。

>frm1は初期化されないまま使われてますが、これが原因でエラーが発生してたりしませんか? 

初期化の際にselfを付けエラーになったり、advstringgridだと初期化なしでも代入できたりで
ベースが理解できていなかったので試行錯誤しまくりでした。

selfで投げる件、他にも活用できそうで助かりました。

いつもはTMemo(from1.FindComponent('memo1'));のような使い方しかしらなかったので
frm1にするとどこで認識するのかと思い。 謎だらけでした。

>あと『外部ファイル化』は『ユニット分割』『ユニットを分ける』という表現のほうが一般的ですね、

了解です。
フォームのある物をユニットと呼ぶと思っていました(^_^;)

今回はどうもありがとうございました。

編集 削除