Edit への入力をサブルーチン風に使うには?

解決


  2006-06-08 02:18:10  No: 22112

Delphi を始めて日の浅い新米です。宜しくお願いします。

  現在数値計算のプログラムを書いています。計算の進行に合せて時々(計算前には予測できない)補正係数を Edit を窓口にして送り込んでやる必要があるのですが、それが上手く出来ません。

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key=Chr($D) then
    if Edit1.Modified=True then
    begin
      s:=Edit1.Text;
      Edit1.Text:='';
      Key:=Chr($0);
    end;
end;

  必要の起る度にこのプロシージャをサブルーチン風に呼び出して、入力されたストリング s を受け取ることは出来ないものでしょうか。


igy  2006-06-08 06:08:18  No: 22113

>計算の進行に合せて時々(計算前には予測できない)補正係数を 
>Edit を窓口にして送り込んでやる必要があるのですが、それが上手く出来ません。

具体的には、どう、上手く出来ないのですか?

>サブルーチン風に呼び出して、入力されたストリング s を受け取ることは出来ないものでしょうか。

とは、具体的には、どのように呼び出して、s を受け取りたいのですか?


えーとね  2006-06-08 06:21:44  No: 22114

質問の趣旨が良く分からないのですが

> 必要の起る度に
キー入力と無関係なら、Edit1KeyPress に書く必要はないと思います。
以下のようにGetEdit1Text を作って、呼び出せば良いと思います。

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = Chr($D) then
  begin
    s := GetEdit1Text;
    Key := Chr($0);
  end;
end;

function TForm1.GetEdit1Text: string;
begin
  Result := '';

  if Edit1.Modified then
  begin
    Result := Edit1.Text;
    Edit1.Text:='';
  end;
end;


  2006-06-08 19:00:25  No: 22115

説明が下手だったようで、済みません。

  やろうとしているのは、一群の微分方程式を数値的に解いてその解曲線を描かせることです。素直な微分方程式なら初期値を与えるだけで簡単に解曲線が描かれてしまうのですが、今手掛けているものには多数の特異点があるので簡単に行きません。
  グラフを描いていて特異点に行き当たったとき、例えば f=0/0 のような不定形の計算が出現します。プログラム内部でそれを計算することは極めて困難ですので、プログラム中に

if (困難 1) or (困難 2) or … then subroutine;

というような文を書いて置いてサブルーチンに行かせ、人間からの入力を待たせます。人間はそこまでのグラフを見ていて、そこの値はこれこれであるとか、以後これこれだけ座標軸を回転させて計算しろとか、以後は計算の刻みをこれこれにしろとか、適切な指示を入力します。プログラムはそれを受け取って以後の計算を続行し、また困難が起ったら指示を仰ぐ、とこんな具合にやりたいのです。

  どの種類の困難がどのタイミングで何回起るか、人間側にもプログラム側にも予測が附かないので、その都度その都度のやり取りをするより仕方がないように思います(やり取りを除く他の部分のプログラムは既に出来ています。解が既知の微分方程式に就てはどの困難が何時持ち上るか分りますので、人間側からの指示をプログラム中に書き込むことが出来ます。それを実行すれば正しくグラフが描かれます)。

  procedure でなくても Edit でなくても勿論構いません。やり取りが出来さえすれば良いのです。何か有効な道具立てを御教示願えないでしょうか(無知ですので直ぐには理解出来ないと思いますが、方向さえ分ればそちらに向けて勉強することが出来ます。現在は霧の中です)。


igy  2006-06-08 19:21:56  No: 22116

>procedure でなくても Edit でなくても勿論構いません。やり取りが出来さえすれば良いのです。

TEditに入力を促すダイアログを用意するか、

    S := '';
    if not InputQuery('入力', '入力してください。', S) then
        exit;

のような方法では、どうですか?


人力入力  2006-06-08 19:42:54  No: 22117

その「困難」点にぶつかるたびに、ダイアログを出して、
(補正値)を人力入力・・では、ダメですか?


  2006-06-09 21:29:12  No: 22118

igy 様。

  ご提案の InputQuery が私の要求を完全に満たしてくれました。組み込んで走らせてみたところ、見事に解曲線を描きました。有難うございました。
  それにしても質疑応答を担当する関数があるなどとは予想もしませんでした。新しい言語の「家風」に馴染むには時間が掛りますね。

  外の方々もお知恵を貸して頂き、有難うございました。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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