- ベストアンサー
Form2のボタンを1回押しても戻らない
Delphi XE3でDelphiをいじっています。自動で作成したForm2にボタンを2個配置しました。片方のボタンのプロパティーはMrOK、他はMrCancelにしてあります。 Form2をShowModalで呼び出してForm2を表示した状態でボタンを押してすのですが2回押さなければForm1に戻りません。1回押しで戻るようにするにはどうしたらよいか教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
implementation部以下だけで十分だったのですが…まあ、初心者のうちはコードを全部提示してもらった方が話が早いかもしれませんね。 長いコードを提示する場合は「コード貼り付けサイト」というのがありますので、ぜひ使ってください。 例えば http://pastebin.com/ とか。 問題点はここです。 ------------------------------------------------------------ Form2.Showmodal; //フォーム2の呼び出し if Form2.ShowModal = mrOK then ------------------------------------------------------------ これでは、 1. ShowmodalでForm2が呼び出され、Form2のButton1が押されると戻る 2. ShowmodalでForm2が呼び出され、Form2のButton1が押されると戻り、その戻り値がmrOKなら… という動作になるので、結果として2回ボタンを押すことになります。 つまり… Form2.Showmodal; //フォーム2の呼び出し ↑これは不要です。 TForm(TCustomForm)のShowmodalは関数です。 TCustomForm.ShowModal http://docwiki.embarcadero.com/Libraries/XE3/ja/Vcl.Forms.TCustomForm.ShowModal ------------------------------------------------------------ function ShowModal: Integer; virtual; ■説明 フォームをモーダル ダイアログとして表示します。 ShowModal を使用すると、フォームをモーダル ダイアログとして表示することができます。モーダル フォームとは、そのフォームが閉じない限り、アプリケーションが実行を継続できないフォームのことを指します。このため、ShowModal は、フォームが閉じられるまで返ってきません。フォームが閉じられると、ModalResult プロパティの値を返します。 モーダル フォームを閉じるには、その ModalResult プロパティを 0 以外の値に設定します。 メモ: ModalResult プロパティを mrNone 以外の値に設定したボタンをフォームが保有している場合、ユーザーがそれらのボタンをクリックすると、フォームは自動的に閉じられ、ModalResult 値が ShowModal の戻り値として返されます。 ------------------------------------------------------------ これを読むと分かるとおり、ShowModalメソッドは ・ フォームをモーダルダイアログとして表示する ・ (a) (ボタン以外で)フォームが閉じられたとき、フォームのModalResultプロパティを戻り値として返す (b) ModalResultプロパティをmrNone以外に設定したボタンが押された時、フォームを閉じてボタンのModalResultプロパティを戻り値として返す という動作を行います。 つまり、表示するという仕事をしつつ、戻り値を返すという関数なのです。別々ではありません。
その他の回答 (3)
- pacman_chie
- ベストアンサー率82% (14/17)
>「解決」のボタンが見当たらないためベストアンサーを押してみました。 それで特に問題なく、押せば「解決」するはずですけどねぇ…? http://guide.okwave.jp/question/bestanswer.html VB6を使っていたなら、Delphiのコツを覚えれば理解は早いでしょうね。 >Delphiとはそんなにマイナーなのですか? このOKWaveにVisual Basicのカテゴリはあるのに、Delphiのカテゴリが無いのが証拠の一つでは。(もっとも、現在のカテゴリ区分は不十分ですが。) http://okwave.jp/c257.html そう言えば、Delphiの質問するならここよりも以下の方が適切ですね。 [技術者向] コンピューター > プログラミング > その他(プログラミング) http://okwave.jp/c260.html) Delphiのメリットはネイティブコンパイラ、そして外部のランタイムライブラリに左右されないexeを作ることが出来る点です。プロ向けとしては、データベース対応の蓄積が多いことなのかな。 かつてはD6 Personalによるフリーソフトが隆盛を極めた時期もあったようですが、その後「VCLのUnicode対応」が遅れたことを主原因に、シェアを減らして行ったんだと思います。 >何がメジャーでしょうか? Windowsデスクトップアプリで、ということですよね。C#じゃないんですか? 正直、よく知らないです。 ちなみにC#の開発チーフ、アンダース・ヘルスバーグ氏は初代Delphiの開発チーフでした。そのせいか、C#はDelphiとよく似た点が多いと聞きます。 しかしDelphiも64bitはもちろん、今やMac/iOSにも対応しており、近くAndroidのアプリも作れるようになるという、新たなるマルチプラットフォーム開発ツールへと進化しつつあります。
- pacman_chie
- ベストアンサー率82% (14/17)
>常時DogWatchする それを言うなら Watchdog ですね。 四六時中監視するなら Polling かな。 >コードを提示する場合は貼り付けサイトを使わせていただきます 右も左も怪しいうちはそうした方が無難ですね。特にこのOKWaveでは、コードのインデントが反映されず、改行幅も広過ぎで見づらいですから。 Delphiに十分慣れてきて、問題と思われるポイント(および関連する箇所)を自分で抜き出せるようになったら、そこだけを提示すると良いです。 開発環境の他、OSの提示もお忘れなく。OSにより動作の細かい違いが出ることがあります。 …ところで、終了でしたら「解決」にしていただくと嬉しいです(笑) ああ、ついでにお聞きしたいのですが、マイナーなDelphiをどうしていま始めるのですか? 使ってるのはトライアルですか? 私は趣味で、化石のようなDelphi6 Personalを使ってますが。 差し支えなければひとことご返答いただき、それで「解決」してしまってください。
お礼
「解決」のボタンが見当たらないためベストアンサーを押してみました。 >マイナーなDelphiをどうしていま始めるのですか? 今まで趣味でVB6を使っていたのですがそれ以降のバージョンは文法がかなり変わってしまい、その文法はかなりDelphiに近くなったとどこかで読みました。そこでDelphi6 personalを使ってみようかと思ったらその速さはVBと比較にならないものでした。タダで使わせてもらうのも申し訳ないのでXE3を買ってみたわけです。(だからForm2.ShowModalもVBのForm2.Show1と同じような用法だと誤解してしまいました)Delphiとはそんなにマイナーなのですか? 何がメジャーでしょうか? 問題があるところなどあったら教えてください。 とにかくありがとうございました。
- pacman_chie
- ベストアンサー率82% (14/17)
それで特に問題なく、1回押せば戻るはずですけどねぇ…。 これ以上はコード等を確認しない限り分かりません。 Unit1とUnit2、この2つについて、下記の例のようにimplementation部以下を提示してください。 Unit1.pas ------------------------------------------------------------ implementation uses Unit2; procedure TForm1.Button1Click(Sender: TObject); begin Form2.ShowModal; end; end. ------------------------------------------------------------
補足
pacman_chie様 回答をありがとうございます。 Form2を初めて使ってみるに当たって次のようなテストを試みました。 よろしくお願いします。 // Form1にButton1とLabel1を配置 // Form2にImage1、Button1、Edit1を配置 Button1のModalResultをmrOKにする // Form2.Button1を1回押してもForm1に戻らない (2回押せば設計時の値取得成功) unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,jpeg; type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation uses Unit2; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then //オープンダイアログボックスの呼び出し begin Form2.Edit1.text:=inttostr(i); Form2.Image1.Picture.LoadFromFile(OpenDialog1.FileName); Form2.Showmodal; //フォーム2の呼び出し if Form2.ShowModal = mrOK then Label1.Caption := Form2.Edit1.Text; //Form1でForm2の値参照確認 end; end; procedure TForm1.FormCreate(Sender: TObject); begin i:=123456; // iはForm2で宣言 Form1で値を代入可能 end; end. //////////////////////////// unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm2 = class(TForm) Image1: TImage; Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form2: TForm2; var i:integer; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); begin //form2.Edit1.Text:=inttostr(i); end; end.
お礼
pacman_chie様 大成功でした。何日もこの問題で悩んでいたのが解消し大変助かりました。 ありがとうございました。 このサイトは初めてですが投稿情報のメール連絡が利用できるためご回答のある無しを常時DogWatchする必要もなく、またコード貼り付けサイトなど大変便利だと感心しました。次回にコードを提示する場合は貼り付けサイトを使わせていただきます。 ありがとうございました。