• ベストアンサー

Form2のボタンを1回押しても戻らない

Delphi XE3でDelphiをいじっています。自動で作成したForm2にボタンを2個配置しました。片方のボタンのプロパティーはMrOK、他はMrCancelにしてあります。 Form2をShowModalで呼び出してForm2を表示した状態でボタンを押してすのですが2回押さなければForm1に戻りません。1回押しで戻るようにするにはどうしたらよいか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

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プロパティを戻り値として返す という動作を行います。 つまり、表示するという仕事をしつつ、戻り値を返すという関数なのです。別々ではありません。

cgsksnng
質問者

お礼

pacman_chie様 大成功でした。何日もこの問題で悩んでいたのが解消し大変助かりました。 ありがとうございました。 このサイトは初めてですが投稿情報のメール連絡が利用できるためご回答のある無しを常時DogWatchする必要もなく、またコード貼り付けサイトなど大変便利だと感心しました。次回にコードを提示する場合は貼り付けサイトを使わせていただきます。 ありがとうございました。 

その他の回答 (3)

回答No.4

>「解決」のボタンが見当たらないためベストアンサーを押してみました。 それで特に問題なく、押せば「解決」するはずですけどねぇ…? 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のアプリも作れるようになるという、新たなるマルチプラットフォーム開発ツールへと進化しつつあります。

回答No.3

>常時DogWatchする それを言うなら Watchdog ですね。 四六時中監視するなら Polling かな。 >コードを提示する場合は貼り付けサイトを使わせていただきます 右も左も怪しいうちはそうした方が無難ですね。特にこのOKWaveでは、コードのインデントが反映されず、改行幅も広過ぎで見づらいですから。 Delphiに十分慣れてきて、問題と思われるポイント(および関連する箇所)を自分で抜き出せるようになったら、そこだけを提示すると良いです。 開発環境の他、OSの提示もお忘れなく。OSにより動作の細かい違いが出ることがあります。 …ところで、終了でしたら「解決」にしていただくと嬉しいです(笑) ああ、ついでにお聞きしたいのですが、マイナーなDelphiをどうしていま始めるのですか? 使ってるのはトライアルですか? 私は趣味で、化石のようなDelphi6 Personalを使ってますが。 差し支えなければひとことご返答いただき、それで「解決」してしまってください。

cgsksnng
質問者

お礼

「解決」のボタンが見当たらないためベストアンサーを押してみました。 >マイナーなDelphiをどうしていま始めるのですか? 今まで趣味でVB6を使っていたのですがそれ以降のバージョンは文法がかなり変わってしまい、その文法はかなりDelphiに近くなったとどこかで読みました。そこでDelphi6 personalを使ってみようかと思ったらその速さはVBと比較にならないものでした。タダで使わせてもらうのも申し訳ないのでXE3を買ってみたわけです。(だからForm2.ShowModalもVBのForm2.Show1と同じような用法だと誤解してしまいました)Delphiとはそんなにマイナーなのですか? 何がメジャーでしょうか? 問題があるところなどあったら教えてください。 とにかくありがとうございました。

回答No.1

それで特に問題なく、1回押せば戻るはずですけどねぇ…。 これ以上はコード等を確認しない限り分かりません。 Unit1とUnit2、この2つについて、下記の例のようにimplementation部以下を提示してください。 Unit1.pas ------------------------------------------------------------ implementation uses Unit2; procedure TForm1.Button1Click(Sender: TObject); begin   Form2.ShowModal; end; end. ------------------------------------------------------------

cgsksnng
質問者

補足

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.

関連するQ&A

  • Delphiで最前列にFormを表示し、フォーカス

    他のアプリを操作中に、Delphiで作成したFormをフォーカスを奪わずに表示する方法を調べています。 C++Builderなら 記事:最前面に表示するが、フォーカスは奪わない方法 http://ogawa-sankinkoutai.seesaa.net/article/115187189.html で出来るようですが、Delphiならどのようにすればいいんでしょうか? Delphi XE5 Starterを使っています。

  • 丸みのあるボタンの表示

    VisualStudio2008を使用しています。 リソースビューにて、ダイアログを作成、 ボタンを配置すると、XPやVistaのような 丸みのあるボタンが配置され、 Ctrl+Tで、ダイアログのテストをしてみても、 丸みのあるボタンで表示されるのですが、 ビルドして表示させると、直角のボタンで表示されてしまいます。 ボタンのプロパティを見る限り、丸みをON/OFFするような 設定は見つかりませんが、XPやVistaのようなボタンで 表示させるには、各ボタンごとに、SetWindowRgnを 行なう方法でしか、実現できないものなのでしょうか?

  • 異なるformで同一のnameは使用できる??

    1つのHTML内で使用する form~/form が2回あるとします。(formA, formBがあるとします) この場合に、formAで使用した name の名前をもう片方のformBで使用しても問題はありませんか? name="aa"のテキストboxと、value="表示"のSUBMITボタンを持つ form が2個あり、かつ どちらのボタンを押しても同じCGIを呼び出す場合、 B側のボタンを押すときにCGI側で受け取る aaの値は、 B側のテキストboxに入力した値になるのでしょうか?? 質問内容がわかりにくいかとは、思いますが、よろしくお願いします。

    • ベストアンサー
    • CGI
  • DelphiXEでコンパイルできません

    先日DelphiXEを購入しました。 XE 超初心者なので,こんなことがと言わずに助けてください。 DelphiXEを起動して, 1 「Fileメニュー」から「新規作成」「フォーム- Delphi」で,Formを開く 2 FormにTbuttonを一個乗せて, 3 button1をWクリックして,procedure TForm1.Button1Clickにshowmessage('Hello');を記述 Delphi5までは,ここでF9を押せば直ちに実行できたはずなのですが,全く反応無し 「実行メニュー」も全てグレーアウトしたまま。 ヘルプも複雑すぎて・・・とっかかりが判らない。 Delphi XE Starter Essentials eBookもDLしてみたけど・・・英語力ゼロ 旧Delphi5のプロジェクトはちゃんとコンパイルできたのですが,XE上で新規作成の場合はなにか基本的な設定が足りないようです。 どうやったら,コンパイルできるのか教えてください。 なにとぞ,なにとぞ よろしくお願いいたします。 m(_ _)m

  • form1のコマンドでform2を呼び出す方法を・・・

    御教授してください。 現在、研修でVBの演習問題で社員名簿を作成してます。 詳細 1、form1に追加、更新、削除のコマンドボタンがあります。  2、その際に追加、更新をクリックするとform2の社員名やら、コード、TELL、住所の入力formが表示されます。3、追加、更新で1つのform(form2のことです)を共有?しているような状態で書かないといけない(追加、更新をクリックしても同じfrom2がでて異なる点はfrom2の一番下のコマンドボタンの追加と更新が変わります)これをVBでどのようにして記入すればよろしいでしょうか? form1→追加クリック→form2のコマンドボタンが追加表記になり、テキストに入力したものが追加できる。 form1→更新クリック→form2のコマンドボタンが更新表記になり、テキストに入力したものが更新できる *ここで更新と書きましたがSQLサーバーをつかってます。入力したものがサーバのDBに追加なり更新される状態です。 DB&VBの複合演習問題みたいな感じです。 宜しくお願いします。

  • formでのtarget="_blank"2回目

    formタグでtarget="_blank"要素を指定して、別ウィンドウ(タブ)に結果を戻す仕組みを作成しました。 submitボタンをクリックすると処理が実行され、1回目は問題なく挙動します。 formタグが書かれている画面で2回目以降ボタンをクリックしても全く反応しません。 リロードすると反応するようになります。 リロードすると入力したデータが飛んでしまうので、それ以外の方法で2回以上ユーザーがボタンをクリックした場合submitしたいのですが何か方法はありますでしょうか? (少し調べてみたら、2回目以降出来なくなる事象は何件か見つかりましたが回避策が良く分かりませんでした。) 別タブに出てくるのであればフォームにtarget="_blank"を入れる形には一切こだわっていません。 よろしくお願いいたします。

  • 【VB.NET】別Formのボタンが押されるまで待機する方法??

    【VB.NET】別Formのボタンが押されるまで待機する方法??  今晩は,いつもいつも勉強させていただいております. 質問させていたきます.どうぞよろしくお願いいたします.  開発環境XP+VB2008になります。  今までは、コード中のMsgBoxで続行か中断かを選択するために  Private Sub Button1_Click        :        :        :    If MsgBox("続行しますか?", MsgBoxStyle.OkCancel, "確認") = vbOK Then    Else      Exit Sub    End If        :        :        :  End Sub     としておりましたが、このMsgBox上に複数のコントロールが必要になって しまいましたので、同じ形のFormを作成いたしました。 (Form_MsgBox上に、ButtonOK、ButtonCancel、Label1に加え                      TextBox1を配置)  Form_MsgBox.LabelMsg.Text = "確認"  Form_MsgBox.Show() が、このメッセージ表示中だけPrivate Sub Button1_Clickを 止めておく方法がわかりません。。。 ButtonOKかButtonCancelが押されるまで待機したいのですが。。  検索いたしておりますと、何か他のアプリを起動した場合に それが終わるまで待機する、といった方法は結構見つかるのですが。。。  何か良さそうな方法など思いつかれるようでございましたら、 是非ともアドバイスいただきたくお願い申し上げます。  もしお詳しい方がいらっしゃいましたら,どうぞよろしくお願いいたします。

  • フォーム内のボタンをまとめてdisableにする方法

    複数のページから構成されるWebページを作成しています。ページには、formが4つあり、1つのページには複数のボタンを配置してます。 他の3つのページが読み込み中の時には、このページのボタンを押せなくしたいと考えています。 他のページのunload、onload時にまとめてdisableの設定をしたいのですが、formの上にのってるinput全てをまとめて、disableにする方法や、formそのものをdisableにすることはできるでしょうか? よろしくお願いします。

  • Form2の変数をForm1に渡す方法について

    Form2の変数をForm1に渡す方法について Form2もForm1もPublicで宣言しているのですが、値の受け渡しができません。 具体的に説明しますと、Form2のデザイナでTrackbarを設け、 そのTrackbar1の値をForm1のTB1に格納したいです。 今Form2のボタンクリックイベントの中に 「Form1.TB1 = Trackbar1.Value.ToString()」 としているのですが、『Form1.TB1はPrivateであるため、このコンテキストではアクセスできません。』と表示されてしまいます。 Form1の中にはいくつかPartial Publicを使って関数をいくつか作成しています。これが何か邪魔をしたりすることはあるのでしょうか? 原因が全くわからないので、どうかよろしくお願いします。

  • </form>を書くとズレる

    こんばんは ホームページを作成していて、疑問に思うのですが、入力フォームを作成していてテーブルの中に</form>タグを記述すると、テーブルが壊れてしまいます。 </form>を外すと正常に表示されて、</form>をつけるとズレます。 記述する場所も直下に書いたり</td>の外や</table>の外に書いたりしますが、大丈夫の時とそうでない時があります。 他にもフォームがあるので、直下に記述したいのですが表が崩れてしまい困っています。 どのように対応したら良いか教えてください。 宜しくお願いします。

専門家に質問してみよう