2012-03-09 6 views
0

私はアプリケーションでそれを実行せずにWindowsフォームを持っています。アプリケーションを使用しないフォームの処理

これはフォーム内で呼び出さなければならないコア関数です。いくつかのクラス変数があります。本当に重要なのは、closurepermissionだけです。ユーザはウィンドウを閉じるためにボタンを押さなければならない。

残念ながら、イベントを更新して処理することはできません。 this.Update()this.Refresh()トリックはしません。

internal short ask(String question, String RegExFilter, out String answer) 
    { 
     this.RegExFilter = RegExFilter; 
     this.Text = question; 

     this.Show(); 
     while (!closingpermission) 
     { 
      //Window needs to process its events and allow the user to interact. 
     } 
     answer = answerBox.Text; 
     this.Close(); 
     return RetVal; 
    } 

EDIT:

"アプリケーション" シングルトンアプリケーションを意味します - 私はそれを持っていけません。

ループはフォームを表示したままにしておく必要があります - 私はsoutionが何かであると思っていますHans Passantが書いています。私はメッセージループをポンピングする必要があります。

Ken2Kの解決策は私にとっては機能しません。

編集#2:ここでは

がコンパイル可能です。例 - 更新methos私の窓をリフレッシュするが、私はテキストボックスを編集することはできません - 用事ボタンまたは私はテキストで次に何をしますについて。私はテキストを編集することもできません。

using System.Windows.Forms; 
using System.Drawing; //System.Drawing.dll 

namespace StackOverFlowDemo 
{ 
    class Example 
    { 
     public static void Main() 
     { 
      Input input = new Input(); 
      input.Ask("Something"); 
     } 
    } 

    class Input : Form 
    { 
     TextBox textbox = new TextBox(); 

     public Input() 
     { 
      this.Controls.AddRange(new Control[] { textbox }); 
      this.Bounds = new Rectangle(0, 0, 500, 500); 
      this.textbox.Bounds = new Rectangle(10, 10, 480, 200); 
     } 

     internal void Ask(string question) 
     { 
      this.Text = question; 
      this.Show(); 
      while (true) 
      { 
       this.Update(); 
      } 
     } 
    } 
} 

編集#は3

私は私が行うことができない何をしたいと思います。私はトピックを読んで、あなたはいつもprotected override void WndProc(ref Message m);と呼ぶ何かを必要としているようです。それはアプリケーションのようです。私は、アプリケーションを持たないアプリケーションでこれを行う方法を知らない。私と同意しないでください:)

+0

わかりません。「アプリケーションなし」とはどういう意味ですか? – Steve

+2

「アプリケーション」がないため、明らかに動作しません。フォームを有効に保つには、Application.Run()コールが必要です。メッセージループをポンピングします。またはForm.ShowDialog()。 –

+0

[この質問](http://stackoverflow.com/questions/4721962/c-sharp-application-run-without-form)と承認された回答をご覧ください。 – Steve

答えて

0

一つにそれをしていた:

あなたは(ユーザーに価値を促し、ポップアップのため、多くの場合、望ましい)モーダルフォームとFormClosingEventArgsCancelプロパティを使用することができます開始。

「アプリケーション」がないため、明らかに機能しません。フォームを有効に保つには、 Application.Run()コールが必要です。 メッセージループをポップします。またはForm.ShowDialog()。 - 12時34

あなたは、アプリケーションを使用する必要がFroms使用する場合で、3月9日ハンスアンパッサン - あなたはいけない私は、一例として、XNAのような可視化のためのいくつかの他のフレームワークに切り替えるには、あなたが持っているアプリケーションを使用したいです。

アプリ内にシングルトンが存在することを受け入れ、アプリケーションを使用します。

0

単純な解決策はApplication.DoEvents();を使用することになりますが、私はあなたのタイトルでちょっと混乱しています。

+1

'Application.DoEvents()'は一般的には**問題を隠していますが、*はそれらを修正しないというダーティな回避策です。できるだけDoEvents()を避けてください。悪意のあるバグの原因となることがよくあります。 – ken2k

+0

私はApplication.DoEvents()を持っていました。そこには別の環境で - しかし、私はもはやそのグローバル "アプリケーション"を持っていないので、私は何もそれを呼び出すことはできません。 – Johannes

1

私が理解するところでは、フォームをポップアップしてテキストを入力するように求めています。無限ループを行わないでください。動作しません。 UpdateおよびRefreshも無意味です。からrigth最初のコメンターの

public partial class Form2 : Form 
{ 
    private bool preventClose = true; 

    public string ResultString 
    { 
     get 
     { 
      // Returns the content of a textbox 
      return this.textBox1.Text; 
     } 
    } 

    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     // Closes only when button1 is clicked 
     this.preventClose = false; 
     this.Close(); 
    } 

    private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     e.Cancel = this.preventClose; 
    } 
} 


using (Form2 frm = new Form2()) 
{ 
    frm.ShowDialog(); 

    string res = frm.ResultString; 
} 
関連する問題