1つのFormに対しての2つの処理

解決


JUN  2010-03-03 15:28:50  No: 37894  IP: [192.*.*.*]

わかりづらいかもしれませんがお願いします。

一つのForm(Class : TAll(Unit All_Hoge))に対して二つのClassで使用したいと考えています。
TALLを使用するのは
THoge1(unit Hoge1)とTHoge2(unit Hoge2)で使用します。

THoge1でTAllを開きたいので、
unit Hoge1のusesでALL_Hogeを使用します。

またTHoge2でもTAllを開きたいので、
unit Hoge2のusesでALL_Hogeを使用します。


ALL_Hogeの中でTHoge1、THoge2の中身を使用したいためALL_HogeでもUsesにHoge1,Hoge2を使用します。

ここでわからないのですが、Hoge1.DprをコンパイルするとHoge2が見つかりませんと当然でます。(All_HogeでHoge2を使用するため)
Hoge1.Dprの中身にHoge2のUsesを加えてあげればいいのですが、Hoge2.dprの全ての中身をUsesに加えなければいけなくなりますよね...。

ちょっとどのようにするのが良いのかわかりません。

アドバイスいただけますか?

編集 削除
アドバイス  2010-03-03 15:34:10  No: 37895  IP: [192.*.*.*]

まずは人に物事をきちんと伝える方法を学んではいかがでしょうか。
何を言ってるかさっぱり分かりません。

編集 削除
manbon  2010-03-03 16:38:34  No: 37896  IP: [192.*.*.*]

Hoge1,Hoge2に共通の部分だけ用のAll_Hogeと、
Hoge1用のFor_Hoge1、
Hoge2用のFor_Hoge2、
に分離するのがいいかと思いますが・・・

編集 削除
KHE00221  2010-03-03 17:01:46  No: 37897  IP: [192.*.*.*]

コンポーネント作って AがBとC をuese BとCが A を Usesして
循環参照エラーが起きるってことじゃないのか????

Hoge1.dpr Hoge2.dpr の 

Use 
  ALL_Hoge を 

implementation の下に移動

編集 削除
KHE00221  2010-03-03 17:03:54  No: 37898  IP: [192.*.*.*]

>ここでわからないのですが、Hoge1.DprをコンパイルするとHoge2が見つかりませんと当然でます

見つからない意味がわからない・・・・・当然じゃないぞ

編集 削除
D  2010-03-03 17:46:02  No: 37899  IP: [192.*.*.*]

1.一つのフォームTAllを二つのプロジェクトProject1、Project2から使いたい。
2.TAllは完全な汎用ではなく、Project1のフォームTHoge1とProject2のフォームTHoge2に依存するコードがある。
3.Project1とProject2は別ディレクトリにある。

という状況なのかな。

もしそういうことであるならば、Project1でTHoge2を「プロジェクトに追加」すれば良いのでは。
Project1でTHoge2を使わないのであればプロジェクトオプションでTHoge2を自動生成の対象から外せば良いでしょうし。

編集 削除
JUN  2010-03-04 09:18:12  No: 37900  IP: [192.*.*.*]

わかりにくい説明ですいませんでした。

Dさんの言うとおりです。
ただProject1、Project2でそれぞれたくさんのものを使用しているので、それぞれにお互いの「プロジェクト追加」を行わなければいけません。

そもそも
Hoge(Project1)→Allの操作はいいのですが
All→Hoge(Project1)の操作は不具合の原因になりそうなのでそういう使い方をやめました。

自動生成の対象から外すと具体的になにがちがうのでしょうか?

編集 削除
どう考えても  2010-03-04 13:01:34  No: 37901  IP: [192.*.*.*]

設計が悪い
依存関係を見直して作り直せ

編集 削除
D  2010-03-05 12:42:31  No: 37902  IP: [192.*.*.*]

>自動生成の対象から外すと具体的になにがちがうのでしょうか?

  THoge2が自動で生成されなくなるだけです。
Project1がTHoge2を使わない(TAllのTHoge2に依存するコードも実行されない)のであれば、THoge2を生成するのは無駄であろう…ということです。
この場合THoge2をPreject1のプロジェクトに加えるのはコンパイルエラーを回避するためだけの対症療法ということになります。

なので、Project1がTHoge2を使う(あるいいはTAllのTHoge2に依存するコードが実行されうる)のであれば自動生成の対象に入れておいたままの方が楽だと思います。


>All→Hoge(Project1)の操作は不具合の原因になりそうなのでそういう使い方をやめました。

  ということで解決されたのだと思いますが、一つの案というこで。

TAllからは直接THoge1とTHoge2を操作せず、間にクッション役の関数を加えます。

例えばsub.pasというユニットをProject1、Project2にそれぞれ作り、GetCaptionという関数を書きます。
Project1のsubユニットのGetCaptionはTHoge1のCaptionを返すようにし、Project2のsubユニットのGetCaptionはTHoge2のCaptionを返すようにします。

TAllのusesにはTHoge1やTHoge2のユニットを加えず、subユニットだけを加えます。
こうしておけばTAllでGetCaptionを呼ぶ場合、Project1ならProject1のsubユニットのGetCaptionが呼ばれますしProject2ならProject2のsubユニットのGetCaptionが呼ばれるようになります。

編集 削除
JUN  2010-03-05 16:38:23  No: 37903  IP: [192.*.*.*]

Dさん

自己解決はしていましたが、確かにSub.pasを作ってDさんの言っている通りやれば確かに問題ありませんね。
思いつきませんで、悩んでいましたが、勉強になります!

ありがとうございました。

編集 削除