ほかのユニットにデータを渡すときに、コンポーネント以外にわたしたいのですが?


march  2005-06-02 20:48:29  No: 15302  IP: 192.*.*.*

はじめまして  フォーム2のEDITにフォーム1のEDITの値を渡したいのですが
そのさいに
Form2.Edit.Text := Edit1.Text
ではなく、フォーム2のコンポーネント以外(グローバル以外)に値を
わたしたいのです。いろいろ探してみたのですが見つからず四苦八苦です。
どなたかご教授くださいませ。

編集 削除
にしの  2005-06-02 21:57:28  No: 15303  IP: 192.*.*.*

Form2にプロパティを持たせたいと言うことでしょうか。

{Form2の定義に追加}
private
  function GetEditText: String;
  procedure SetEditText(Value: String);
public
  property EditText: String read GetEditText write SetEditText;

{上に定義した2関数の実体}
function TForm2.GetEditText: String;
begin
  Result := Edit1.Text;
end;

procedure TForm2.SetEditText(Value: String);
begin
  Edit1.Text := Value;
end;

編集 削除
deldel  2005-06-03 08:34:32  No: 15304  IP: 192.*.*.*

なぜ Form2.Edit.Text := Edit1.Text がだめなのか
理解するのに四苦八苦です。

編集 削除
にしの  2005-06-03 09:19:07  No: 15305  IP: 192.*.*.*

> なぜ Form2.Edit.Text := Edit1.Text がだめなのか

たまにありますよ。
だめ、というのでなく、入力が面倒なときによくやります。
毎度、
frmDebug.Memo1.Lines.Add('デバッグ表示用文字列');

とやるよりも、
frmDebug.PutLog('デバッグ表示用文字列');
としたほうがすっきりしますし。

私の場合は、わざわざプロパティにするのでなく、Get関数、Set関数を用意します。

編集 削除
deldel  2005-06-03 10:35:59  No: 15306  IP: 192.*.*.*

なるほど〜。人それぞれですね。
私はなるべくコードの見通しのいい方を選んでいます。
他人に引き継ぐ場合のことも考えると、そのほうがいいですし。

例えば
  frmDebug.Memo1.Lines.Add('デバッグ表示用文字列');
なら、
  「frmDebug.Memo1 に文字列を追加するんだな」
とすぐ分かりますが、
  frmDebug.PutLog('デバッグ表示用文字列');
なら、
  「PutLog ってなんだったっけ?」
と、1段階余分な思考が必要になりますから。

編集 削除
form;  2005-06-03 20:42:58  No: 15307  IP: 192.*.*.*

似たような質問かもしれませんがフォーム1からフォーム2へいく時に
フォーム名.Show  以外の方法はないおですか?
フォーム名はグローバルなので変更したいのですがわかりませぬ。
お願いいたします。

編集 削除
また・・・  2005-06-03 22:23:05  No: 15308  IP: 192.*.*.*

インスタンスの変数名とフォーム名を間違っている人がまた一人いる・・・

グローバルにしない方法はちょっと前のスレにたくさん提案があったでしょ。
インスタンスは参照なんだからimpelementation のしたにでも変数を確保しておけば無問題。

> 似たような質問かもしれませんが

全然似ていません。ユニットと TForm などのクラス宣言は全然別の概念。
そもそもこのスレの質問自体が意味をなしていない。厳密に言うと。

編集 削除
通りすがり  2005-06-04 11:25:13  No: 15309  IP: 192.*.*.*

Delphiが簡単に出来すぎていて、オブジェクトの概念を理解しないでやってる人が多いんでしょ。困ったものだが、、、

別にフォーム名なんてインスタンスに過ぎませんから、、、
普通の変数でなんら問題ないんですよ。
var
  F : TMyForm;
begin
  F := TMyForm.Create(Self);
  F.Show;
end;
だって、MyFormが出せますよ。ただ、メモリの開放に注意しなければなりませんが、実行時に作成するフォーム一覧から外して、そのFormのOnCloseで、
Action := caFree;
とかにしてればなんら問題なさげなわけで、、、

編集 削除
march  2005-06-06 13:22:46  No: 15310  IP: 192.*.*.*

お返事ありがとうございます
var
  F : TMyForm;
begin
  F := TMyForm.Create(Self);
  F.Show;
end;
でフォームは表示されたのですが、他のフォームにデータ(文字列)を渡す際に
F.SetData(Edit1.Text);
ではエラーになります。
迷い込んでいるのでどなたかお願いいたします

編集 削除
ななし  2005-06-06 13:55:41  No: 15311  IP: 192.*.*.*

SetDataをprivateで宣言しているのでは?
TMyFormは上から2番目のにしのさんのコードを使って

var
  F : TMyForm;
begin
  F := TMyForm.Create(Self);
  F.Show;
  F.EditText := Edit1.Text;
end;

編集 削除
にしの  2005-06-06 13:57:21  No: 15312  IP: 192.*.*.*

どのようなエラーが起きるのか、SetDataというものがどういう定義になっているのかが解らないと、答えようがないですよ。
もう少し、第3者が読んでも解るように書いてみてください。

これだけの情報で書くならば、
・SetDataプロシージャが定義されていない。
・SetDataプロシージャがpublicに定義されていない。
・SetDataプロシージャの引数が文字列ではない。
・Fのオブジェクトが破棄されているor生成されていない。
・記述する場所を間違っている(beginとendの間ではないなど)。
などなど。

編集 削除
ん?  2005-06-06 15:11:55  No: 15313  IP: 192.*.*.*

にしの氏が、記述して欲しい内容について細かく書いておるのだが、これ嫁
http://www.hyuki.com/writing/techask.html

編集 削除