「実パラメータが足りない」というエラーを回避する方法について

解決


AS  2012-09-10 17:38:18  No: 42881  IP: 192.*.*.*

こんにちは。

また、よろしくお願いします。

メインフォームに  
  Calc:=TCalc.Create(Application);
  Calc.ShowModal;
  Calc.Release;
という部分があり、以前は全く問題ありませんでした。

別々に開発してきたプログラムを組み込んでいったら、この3行に
「実パラメータが足りません」というエラーが出るようになりました。

最初は、別のフォームにボタンを1個配置しただけで出ました。

次に、メインフォームの’    ’内の文字を1文字削除したら出ました。

メインフォームのいらない部分を一気に削除したら、このエラーが止まらなくなりました。

このエラーの原因と回避法をご存じの方に、よろしくお願いします。

編集 削除
igy  2012-09-10 20:29:39  No: 42882  IP: 192.*.*.*

> メインフォームに  
>  Calc:=TCalc.Create(Application);
>  Calc.ShowModal;
>  Calc.Release;

別の新規プロジェクトを作成したし、この部分だけのみをコンパイルした場合、どうなりますか?



>別々に開発してきたプログラムを組み込んでいったら、この3行に
>「実パラメータが足りません」というエラーが出るようになりました。

“この3行”と書かれてますが、3行とも、つまり
「実パラメータが足りません」
のエラーメッセージがコンパイル時に3つ表示表示しているのですか?

編集 削除
igy  2012-09-10 20:32:21  No: 42883  IP: 192.*.*.*

訂正です。

×:別の新規プロジェクトを作成したし、この部分だけのみをコンパイルした場合、どうなりますか?
○:別の新規プロジェクトを作成し、この部分だけを追加してコンパイルした場合、どうなりますか?

×:のエラーメッセージがコンパイル時に3つ表示表示しているのですか?
○:のエラーメッセージがコンパイル時に3つ表示しているのですか?

編集 削除
AS  2012-09-10 21:22:02  No: 42884  IP: 192.*.*.*

igyさん、お世話になります。

新規プロジェクトに追加するといっても、複雑にからみあってるプログラムですから、そんなことはできません。
最後の組み込み前の別に保存しているプログラムでは、エラーは出ません。

3つ表示されています。

エラーのでないときにいらない部分を削除して、ボタンも配置してから組み込んでみます。


今後も、よろしくお願いします。

編集 削除
igy  2012-09-10 22:02:43  No: 42885  IP: 192.*.*.*

メインフォームに、Calc という名前を使ったメソッドなどありませんか?

procedure TForm1.Calc(no: Integer);
begin
   ・・・・
end;

のような。

編集 削除
AS  2012-09-10 23:46:30  No: 42886  IP: 192.*.*.*

ないですね。

流れ的には、

A,  Bという同じようなプログラムがあり、この2つを使い分けて使用していました。

これに、さらに同じようなプログラムCも組み込みました。

このAとCのプログラムには、内部で定義されるh1、h2、h3・・・・というような同じ名前の関数があります。

この3つをDというfuntionに組み込んで使い分けていたんだですが、この段階ではエラーは出ません。

そのあと、ボタンを追加したり、1文字削除したりするとエラーが出るようになったのです。

問題はこのプログラムCだと思うんですが、組み込むのが目的ですので、やめるわけにはいきません。

さらに、この3つのプログラムはCALの中では直接は使っていません。

CALの中で使うデータを作るためにDを使っているので、間接的には使っていますが。

編集 削除
igy  2012-09-11 01:42:42  No: 42887  IP: 192.*.*.*

Delphi XE2では、

  Calc:=TCalc.Create(Application);
  Calc.ShowModal;
  Calc.Release;

の 左のCalcの部分にマウスカーソルを移動すると、Calcの情報が自動的にポップアップ表示します。

もし、AS さんが使用しているDelphiにもそれが表示すれば、
その情報から、何か得られませんか?

編集 削除
KHE00221  2012-09-11 02:15:21  No: 42888  IP: 192.*.*.*

ほかのエラーが出ないなら

function Calc(Owner: TComponent): TForm;
begin
    Result := Form1.Create(Owner);
end;

こんな形だと思うんだけど

あと

var
  Calc: TCalc;
begin
  Calc:=TCalc.Create(Application);
  Calc.ShowModal;
  Calc.Release;
end;
 
Calc をローカルにしたらどうなる?


Calc にカーソルもっていって [CTRL] 押しながらクリックしたら
関数に飛ぶと思うけど

編集 削除
通りすがり  2012-09-11 08:51:31  No: 42889  IP: 192.*.*.*

A, B, C 各ユニットに TCalc の名前のフォームが作ってある
calc.pas のユニットが存在する。
TCalcではない変数calcがグローバル変数で宣言されている。

とりあえず、使用している全ユニットで"Calc"が使用されていないか検索してみたらいいんじゃないの?

編集 削除
AS  2012-09-11 15:32:23  No: 42890  IP: 192.*.*.*

皆さん、ありがとうございました。

先にいらない部分を削除して、ボタンも配置してから組み込みました。

結果、エラーは出ていません。

昔からdelphiは訳の分からないエラー表示が出ていましたが、
XEでも同じなんですね。

1文字消したらエラー、消すのをやめるとエラーでないというのは、
本当に訳わかりません。

編集 削除
AS  2012-09-11 15:33:35  No: 42891  IP: 192.*.*.*

解決をクリックしていませんでした。

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

編集 削除
take  2012-09-11 15:49:23  No: 42892  IP: 192.*.*.*

よく文章読み返すと

>この3つをDというfuntionに組み込んで使い分けていたんだですが、この段階ではエラーは出ません。
>そのあと、ボタンを追加したり、1文字削除したりするとエラーが出るようになったのです。

組み込んでエラーじゃなくて
なんらかの編集操作したらエラー出たんだよね?

1文字削除でセミコロンの部分削ったり
{}の片方がどっかいったり

end.

も消したとかじゃないの?

>昔からdelphiは訳の分からないエラー表示が出ていましたが、
そんなわけないし・・・

>このAとCのプログラムには、内部で定義されるh1、h2、h3・・・・というような同じ名前の関数があります。

グローバル関数を定義しているの?
だとしたら同じ名称なのが問題なのでは・・・

編集 削除
というか  2012-09-11 19:43:08  No: 42893  IP: 192.*.*.*

基本がよくわかってない初心者が陥るパターンだね。
どこがおかしいか分かってないからエラーも消せない。
手間を惜しまず少しずつやればすぐにわかるのに。

編集 削除
AS  2012-09-16 05:54:19  No: 42894  IP: 192.*.*.*

takeさんへ

確かに、組み込んだ後、エラーが出たんです。

'  ’内の1文字を消しただけでね。

ボタンは全然関係ないフォームですし。

どうしてエラーが出るんでしょうね。

ホントに、不思議です。

delphiも内部で複雑に絡み合ってると思うんで、エラーが出ても仕方がないとは思うんですが。

私が思ったのは、文字制限にひっかかったのかという疑問です。
8bitPCでは厳しかったですから、すぐそれを思ってしまう癖がついているんです。
64bitPCではそんなことは絶対ないと思いますが。
制限はいくらでしょうか?

編集 削除
take  2012-09-18 08:57:00  No: 42895  IP: 192.*.*.*

8bitの頃からやっているならなおさら
今回の現象解決しやすいと思うのですが
(8bitの頃は文字制限というよりメモリ制限でしょう)

その ' ' 内の文字を消したという
前後のソースがないと助言のしようがありません。

エラーから状況を推測しました。

  Calc.H1(''',','');

ってのを、勝手に「'」を削除して
  Calc.H1(',');

にしたとか?

編集 削除
AS  2012-09-18 17:15:37  No: 42896  IP: 192.*.*.*

なんか、話が通じないような気がしますが、

onFormcreate のところで

if Val='Andante' then

というところがあって、そこの'e'を消しただけですが、
それでどういう理屈でエラー表示が出るんですか?

また、ボタンを1個追加しただけで出たエラーはどう説明できますか?

編集 削除
tor  2012-09-18 22:16:12  No: 42897  IP: 192.*.*.*

例えば次のようなコードを考えてみましょう。

function Calc(a, b: Integer): Integer;
begin
  ...
end;

...
  Calc:=TCalc.Create(Application);
  Calc.ShowModal;
  Calc.Release;
...

このような例だと後ろの3行で「実パラメータが足りません」というエラーが出るはずです。
Calcというのはパラメータを2個とる関数だと定義したのに、何もパラメータを指定していないからです。
当然、前半のCalc(a,b)関数の宣言をなくせばエラーは出ません。

今のは同じファイルの中の例ですが、異なるファイル間でも同じことが起こりえます。
例えばunit1でCalcという名前を使っていて、unit2で同じ名前の関数Calc(a,b)をinterface部に定義してしまったという場合です。

この時、実際にエラーになるかどうかは、unit1がunit2の定義を「知っている」かどうかに依存します。
unit2に新しい関数が追加されても、unit1がそのことを「知らない」うちは名前の衝突が起こらないので問題は起きません。
しかしファイルを編集した結果、unitが再コンパイルされる→Calcの定義がunit1とunit2で共有されるようになる→エラー発生、ということが起こりえます。

igyさんやKHE00221が言っていたのは、Calcという名前がどこかとかぶっているからそれを探そうということなんです。
アドバイスにしたがえば何らかの手がかりは得られると思うのですが、どこまでやりましたか?

編集 削除
THoge  2012-09-18 23:05:44  No: 42898  IP: 192.*.*.*

> 次に、メインフォームの’    ’内の文字を1文字削除したら出ました。

> if Val='Andante' then
>
> というところがあって、そこの'e'を消しただけですが、

では、伝わる内容がまったく違います。
最初の質問だと、空白文字列だと思われても仕方ないですね。

そんなあなたに
http://www.hyuki.com/writing/techask.html

# 話が通じないっていうか、通じさせるだけの説明がないと思いますわ

編集 削除
AS  2012-09-19 07:10:03  No: 42899  IP: 192.*.*.*

○torさんへ

引数はまったくありません。
それだったら、エラーは最初から出ると思いますが?

それから、最初に言っているように、以前はまったく問題のない部分ですから、igyさんたちのいわれていることはすべて確認済みです。


私の質問は、別の関係ないフォームにボタンを配置しただけで、なぜエラーが起こるかということなんです。
私の質問は、なぜ'andante'のeを省いたらエラーが起こるんですかということなんです。

自分では原因が分からないんで、文字数かなと思っていらないところを削除しようとしたんです。
削除してもエラーが起こるんだと知って、解決不能と思ってここで相談したわけです。

分かる人がいたら、よろしくお願いします。


○THogeさんへ

なるほど、空白文字列だと思われましたか。

すみませんでした。


○takeさんへ

昔からおかしいところがあるという例ですよ。

このプログラムをdelphiで初めて作った古いバージョンでは
   RichEdit1.Lines[0]:='';
   RichEdit1.Lines.LoadFromFile(DrtPath+'\Nantara');
   RichEdit1.Lines.LoadFromFile(DrtPath+'\Nantara');
という部分があります。
なぜ、2回同じ文が並んでいると思いますか?
delphi6では2回書かないとデータを読み込まなかったんです。

何か理由あるんでしょうか?


皆さんへ

また、今後も訳の分からない質問をさせていただくと思いますが、

よろしくお願いします。

編集 削除
take  2012-09-19 08:07:00  No: 42900  IP: 192.*.*.*

>if Val='Andante' then
>というところがあって、そこの'e'を消しただけですが、

これで目星をたてると

1.ユニットを読み込んだ直後はエラーが出ない
2.ボタン追加するだけでエラーが出る
3.比較先の文字列を修正しただけでエラーが出る

なら、1の段階ですべてのユニットを再コンパイル
で、エラーがでるんじゃないですか?

読み込んだユニットのソースはエラーがある状態だけど
中間ファイルはエラーが無くてコンパイルは通ったとか
その系統と推測します。

>なぜ、2回同じ文が並んでいると思いますか?
>delphi6では2回書かないとデータを読み込まなかったんです。

当方Delphi5だけどその現象は起きませんね。
まあそちらで起きる現象にしても
「昔から起きる」というより「バージョンアップで起きた」
ということになりますが

>RichEdit1.Lines[0]:='';
LoadFromFileするなら1行目消す意味ってなんだろ?
あれ?
もう初心者にしておこうかな・・・

編集 削除
take  2012-09-19 08:55:38  No: 42901  IP: 192.*.*.*

>if Val='Andante' then
>というところがあって、そこの'e'を消しただけですが、

これ原因かと思って回答したら、関係ないのね・・・
勝手にまとめる。

【実パラメータが足りないというエラーが出る】
エラーが出る箇所は下記の3カ所
  Calc:=TCalc.Create(Application);
  Calc.ShowModal;
  Calc.Release;

まずCreate以外のメソッドでも実パラメータが足りないって出てるのか?
エラーメッセージの行をダブルクリックでとんだ先が本当ここ?

【経緯】
ユニットを読み込んだ最初は問題なかった。
別のフォームにボタンを追加したらエラーが出た。
>次に、メインフォームの’    ’内の文字を1文字削除したら出ました。
>メインフォームのいらない部分を一気に削除したら、このエラーが止まらなくなりました。

エラーが出た後に、さらに触ってエラーが出た箇所言われても困ります。
エラーが出なかった状態から、どこを触ったらエラーが出たのかを明確に
「別のフォームにボタンを追加したらエラーが出た」でOK

【結果】
>先にいらない部分を削除して、ボタンも配置してから組み込みました。
>結果、エラーは出ていません。
いらない部分って何?
そこ消してエラーが出なくなったならそこが原因ですよね?

【疑問点】
>文字制限にひっかかったのかという疑問です。
固定長文字とか使ってるの?
ほか多数

編集 削除
AHO  2012-09-20 17:23:29  No: 42902  IP: 192.*.*.*

どれだけ優れたツールでも使う人間がバ○だとクズ以下に成り下がるという好例ですね…
いや、悪例か(;-;

編集 削除
 2012-09-20 22:44:47  No: 42903  IP: 192.*.*.*

単に再コンパイルしたときにエラーが出たというだけか。
単純なエラーじゃないの。
それと、Delphi6ではそんな怪しげな挙動しないが。
やっぱ質問者が書いたロジックに致命的なエラーがある様子だね。

編集 削除
AS  2012-09-21 12:44:10  No: 42904  IP: 192.*.*.*

takeさんへ

ごめんね。ちょっと来てなかった。

何度も言いますが、ボタンを入れたらエラーが出て、入れる前の状態ではエラーは出ません。
また、eを消したらエラーは出ましたが、元に戻すとエラーは出ません。
原因についてのあなたの解釈は正しいと思います。
そういうことはあると思います。
ボタンを配置して、いらないところを削除してから追加した現在のプログラムは全く問題ありません。

delphi6の件ですが、これは初めて作ったので当時は全くの初心者でした。
これ以前は、delphi4で画面保存のプログラムを(教えてもらって)作ったくらいです。
動いたらいいという考えでしたので、どこにも質問しませんでした。
念の為に言っておきますと、データはおよそ6万行、11955KBとなっています。
当時は、40万行のデータを読み込んだことがあります。
ソートしても時間がかかってできないので、量を減らすようにしたのです。
誰か、これくらいの量のデータを作って6で読み込んでみてください。
当時、2行書かないと読み込めませんでした。
delphi2009では1行で読み込めたと思います。
その時に、RichEditに読み込んでそれをさらにstringListに読み込んでいることに気づいて、
現在は直接StringListに読み込んでいます。

1行目を消すのは、カーソル位置を0にするためです。
clearを知る前に作ったんだと思います。

コンパイルエラー表示に出てるんですよ、引数のないところに実パラメータが足りないと。
とんだ先というのはわかりませんが、行も書いてあるし、ここ以外にありませんしね。
実は、私のXE2では、実行時エラーなどが出た時にエラーが起きたところに飛んで行かないんですが、
どうしたら飛んでいくようになりますか。

いらない部分というのは、本当になくてもいい部分です。
具体的に言いますと、プログラム名でデータの保存先を変えているんですけど、使わなくなったプログラム名の部分です。
これが原因ということは、全くありません。

固定長文字とかではなく、以前言われたメモリーオーバーじゃないかという意味ですよ。
実際、何GBまで可能なんですかね。まだ、100MBにもなってないんで心配はしてませんが。

やっと、原因らしきものが理解できました。
ありがとうございました。

今後もよろしくお願いします。

編集 削除
take  2012-09-21 13:16:45  No: 42905  IP: 192.*.*.*

>何度も言いますが、ボタンを入れたらエラーが出て、入れる前の状態ではエラーは出ません。
>また、eを消したらエラーは出ましたが、元に戻すとエラーは出ません。

時系列が伝わりにくいな・・・

1.最初はエラーは出なかった
2.ボタンを入れたらエラーが出た
3.最初の常態に戻したら正常になった
4.「e」を消したらエラーが出た
5.「e」を元に戻したら正常に戻った

元に戻したってのは「元に戻す」の機能ですかね?

じゃあやっぱり
-----------------------------
追加したユニットのソースには元々エラーがある
しかし中間ファイルごとコピーしたので単なる「F9」による
「実行」ではコンパイルされずエラーが出ない

しかしフォームに部品追加やソースを変更すると
コンパイルされるのでエラーが出る。

「元に戻す」の操作で元に戻すと
コンパイルされないのでエラーが出ない
-----------------------------
じゃないの?ってのを考えるのだけど

ユニット組み込んだときに「すべてのプロジェクトを再構築」は
やってみましたか?

その結果で次の段階へ進めます。

>行も書いてあるし、ここ以外にありませんしね。
それはASさんの操作結果を信じればそうなのですが

コンパイルすると下のメッセージ欄に
「実パラメータが足りません」というエラーが3行表示される

こういうイメージね
------------------------------
[エラー]Formxxx.pas(123):実パラメータが足りません
[エラー]Formxxx.pas(124):実パラメータが足りません
[エラー]Formxxx.pas(125):実パラメータが足りません
------------------------------
今の報告からすると私にはこれすら疑う内容だから
本当にこうなの?
そしてこのエラー表示らしき3行がそれぞれ

  Calc:=TCalc.Create(Application);
  Calc.ShowModal;
  Calc.Release;

の3行の行番号と一致しているの?って聞いてるの

>以前言われたメモリーオーバーじゃないかという意味ですよ。
>6万行、11955KB

それぐらいでメモリオーバーにならないしエラーはでませんよ
先月ぐらいに、ここの勇士が試した結果は2G近くまで問題なしでした

ASさんがプログラムのバグで悩む気持ちは察しますが
ここの人達がせっかく、
「きっと原因は、これですので、こうした場合はどうなりますか?」
とかアドバイスしているのに

8bitの時から経験があるのでこれはきっとメモリーオーバーです。
Delphiは昔からおかしな動作をするので今回もそれです。

って言われると正直良い気持ちがしません。

あと今後の参考になるかと思いますので
原因がわかりましたら報告していただけると幸いです。

編集 削除
TS  2012-09-21 19:57:29  No: 42906  IP: 192.*.*.*

昔SetLength の設定を間違えて(メモリーを少なく設定)ASさんの現象と似た様
な訳の分からない現象を経験したような気がしますが、昔の事でよく覚えてい
ません。

メモリ−の確保をされている箇所はありますか。

編集 削除
どうでもいいが  2012-09-21 20:24:39  No: 42907  IP: 192.*.*.*

カーソルを初期位置に戻すのに  Lines[0] := ''  とかやったり、
LoadFromFileを2回やったりとか、どんな不具合があっても不思議じゃない
プログラムだね。
もうこの質問はクローズしたらいいんじゃない?
プログラム自体、まともな稼働が期待できないから、まともな解決方法
では対応できないだろうし、質問者も質問の手順すら分かってないように
見えるし。

編集 削除
AS  2012-09-21 20:45:15  No: 42908  IP: 192.*.*.*

takeさんへ

はい一致してましたよ。
メモリーオーバーですと言ってるのではなく、メモリーオーバーじゃないかと疑ったという意味ですよ。
2Gというのはプログラム文の量ですか。
データ量じゃなくね。

4万行の件は、delphi6で試してみてもらいたいということですよ。

いい気持ちはしませんって、けなされてるような気がするという感じですかね。
私もdelphiは長年使っているし、愛着持ってます。
決してdelphiをけなしたりしてるんではありませんので、その点は分かってくださいね。

原因ですが、問題のプログラムは消してますので、分からないです。
残しておく余裕もありませんので、解決にしたときに消しました。

もう、この辺で終わりにしてください。

貴方のおかげで、原因らしきものは分かったので、私は納得ですから。

ありがとう。



TSさんへ

2009でRichEditの読み込み量が少ないというエラーがありました。
setlengthで設定して解決しましたが、あれもdelphiのミスでしたよ。
これは私がここで質問して、回答いただきましたので、残っているはずですよ。
今回の件は、メモリーとかの話ではないので、すみませんが。

編集 削除
AS  2012-09-21 20:59:45  No: 42909  IP: 192.*.*.*

どうでもいいがさんへ

はい、クローズします。

編集 削除