Delphiでコンパイルできない

解決


忍野  2025-05-19 07:56:41  No: 151996  IP: [192.*.*.*]

Delphiで謎のコンパイルエラーが発生してしまい、どなたか原因を究明していただきたいです...。

元々大昔に作られたプログラムで、そのプログラムにエクセル出力機能を追加したのですが
何故か変更していない箇所でコンパイルエラーが起きてしまいました。
以下の箇所でエラーが起こるのですが、どなたかわかる方いますでしょうか?

procedure Form1.Button1Click(Sender: TObject);
begin
  with clienttoscreen(point(Button1.Left ,Button1.top+Button1.Height)) do begin
    PopupMenu.Popup(x,y);
  end;
  Botton2.Enabled := true;
end;

エラーメッセージは
')'が必要な場所に','があります
'DO'が必要な場所に')'があります
と表示されます。

どうかご助力のほど、よろしくお願いしますm(_ _)m

編集    削除
igy  2025-05-19 08:25:00  No: 151997  IP: [192.*.*.*]

> プログラムにエクセル出力機能を追加した

追加した箇所をコメントアウトして、コンパイルしてエラーが出なければ、
この追加した箇所に問題がありそうですが、いかがでしょうか?

編集    削除
忍野  2025-05-19 09:11:30  No: 151998  IP: [192.*.*.*]

igy  様
ご回答ありがとうございます。

こちらですが、確かに追加した部分をコメントアウトしたらコンパイルできることを確認しました。
ですが、追加した部分に変わったところなどは見受けられず...。
新規にプログラムを作成し、今回追加したコードでコンパイルを試したところ
特にエラーなどは出ずにコンパイルできたので、余計にわからず(;_;)

コンパイルエラーが発生するのはusesの部分にexcel97(エクセル出力に必要なため)と記述してから起こります。
ここに原因があると思うのですが他のプログラムでは普通に動くので
プログラム同士で食い合わせ?みたいなのが悪いのでしょうか....。

編集    削除
igy  2025-05-19 09:33:03  No: 151999  IP: [192.*.*.*]

> usesの部分にexcel97(エクセル出力に必要なため)と記述してから

追加しただけで起きますか?

そうでない場合、

> 追加した部分に変わったところなどは見受けられず...。 

私がよくやるのは、そのコメントアウトの箇所を少しずつ、範囲を狭めていき、
コンパイルエラーが出たときに、その変更した範囲の箇所に
問題がある記述をあるのでは?とコードをみていき、問題を特定していました。

編集    削除
忍野  2025-05-19 09:39:14  No: 152000  IP: [192.*.*.*]

igy  様

厳密にはEXCELファイルを成型するために以下の記述をしているのですが
Application.Selection.HorizontalAlignment := xlCenter;

xlCenterの部分でエラーが発生してしまい、
usesの部分にexcel97を追加してエラーを解消しようとすると
全く触っていないところでエラーが発生するといって感じでして...。

もう少し、エラーの原因を探ってみます...。

編集    削除
igy  2025-05-19 09:49:55  No: 152001  IP: [192.*.*.*]

> usesの部分にexcel97を追加してエラー

関係ないかもしれないですが、

もし、excel97をusesの最後に追加しているのであれば、先頭に追加してみるのは、
いかがですか?
(以前、何かが原因でエラーになった記憶があるので、先頭に追加するようにしています。)

uses
  Windows, Messages・・・
 ↑
先頭に追加

編集    削除
忍野  2025-05-19 09:56:58  No: 152002  IP: [192.*.*.*]

igy  様
ご回答ありがとうございます。
回答頂いた内容を試したところ、無事にコンパイルできました!!

なぜだかわからないですけど解決できて良かったです!
迅速に回答していただき非常に助かりました、本当にありがとうございました!

編集    削除
HFUKUSHI  2025-05-19 19:40:01  No: 152003  IP: [192.*.*.*]

解決済とのことなので蛇足ですが。
> なぜだかわからないですけど
あてずっぽうなのですが、例えばexcel97.pasに、引数が一つのPointという関数が定義されていて、提示されたコードのPoint関数の呼び出しが
System.Classes.pasにあるPointではなくexcel97.pasにあるPointになってしまった、というような感じではないでしょうか。
同名でユニット名の修飾のない関数名(やそのほかの名前)は、uses部に書かれている順番で最後のものから探索されるため、
excel97が先、System.Classesが後だとSystem.Classesのものが、逆にSystem.Classesが先、excel97が後だとexcel97のものが使われることになり、
このようなコンパイルエラーになります。
解決方法は、usesの順番を変える他に、関数名を完全修飾名にしてSystem.Classes.Point(...と記述する、という方法があります。

編集    削除
忍野  2025-05-21 09:27:00  No: 152004  IP: [192.*.*.*]

HFUKUSHI  様
詳しい解説ありがとうございます、勉強になります。
あまり[Point]という関数を使ったことがなく、他の環境で検証めいたこともできなかったので解説助かりました。

HFUKUSHI  様の回答にあるように、完全修飾名で[Classes.point]と記述したところ
usesの順番を変えなくてもコンパイルできました。

これで似たようなエラーが出てもきちんと対処できそうです!
ご教授頂きありがとうございました!

編集    削除