複数ユニットでの関数スコープ

解決


NEO  2002-01-11 07:11:57  No: 458

画像を表示するプログラムを作っているのですが、
通常に表示するだけなら問題なくできました。(仮にunit1)

しかし今度は全画面に拡大表示する機能を付けたいと思い、
全画面を覆うような新フォームを作って(Imageも配置)
キー操作ですぐに切り替えることまではできました。(仮にunit2)

すでにファイルを読み込ませるためのprocedure(仮にLoadPicFile)は
つくっておいたので、unit2のusesにunit1と書いて、
さっそくLoadPicFileを呼び出したんですが、未定義の識別子として
エラーになってしまいます。試しにunit1のグローバル変数を参照したら
ちゃんとデータが入っていたので、変数は大丈夫なのに、なぜ?
と思ったのです。

むろんすべてをform1だけで終わらせれば良いのですが、
拡大表示を別ルーチンとして分けたら効率がよさそうだと思ったので、なんとかしたいのですが…、ご教授お願いします。


にしの  2002-01-11 07:26:59  No: 459

ちょっと想像しにくいのですが、LoadPicFileは、unit1のどこに定義してありますか?

Form1のメンバプロシージャとして定義しているのであれば、Publicで定義していますか?
クラスのメンバプロシージャでないのなら、implementationより前に定義してありますか?
エラーからして違うとは思いますが、名前空間は解決していますか?


NEO  2002-01-11 10:37:39  No: 460

すみません解決しました。

通常の呼び出しでは「procedure TForm1.LoadPicFile()」とあったので、
TFormという呼び方にしないといけないのかと思って「TForm1.LoadPicFile()」
と別ユニットから呼んでいました。

「Form1.LoadPicFile()」で問題なく呼び出せました。
お騒がせしてすみませんでした。

ちなみに同ユニット内ではTFormですが、
これにはどんな意味があるのでしょうか?


にしの  2002-01-11 18:15:46  No: 461

implementation以下に定義してある、
procedure TForm1.LoadPicFile;
begin
...
end;
というものは、TForm1クラスのメンバプロシージャ、LoadPicFileの実体です。
定義は、implementationより上の、Type節に定義してある、
TForm1 = class(TForm)
...
end;
で、この中は、TForm1クラスであることが自明ですので、TForm1.はつけずに、
procedure LoadPicFile;
と定義します。
implementation以下で、なぜTForm1.が必要かというと、たとえばunit1の中で、TForm1クラスのメンバープロシージャLoadFromPicと、unit1のグローバルプロシージャLoadFromPicがあった場合、それぞれを区別できないからだと思います。
# C++だと、クラス定義に関数の実体も含ませられますが、Delphi(Pascal)ではどうかわかりません。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加