0

私の質問と説明が単純すぎると思われる場合や、他の人から既に質問されている場合は、私の謝罪を受け入れてください.

以前にも似たような質問をしたことがあるかもしれません。ただし、winformについてはまだ少し混乱しています。Mainform、Form1、Form2、Form3を含む Delphi プリズム .net プログラムがあるとします。さらに、Mainform、Form2、および Form3 内から Form1 の単一のインスタントを表示できるようにする必要があります。どうやってそれをしますか?RichTextBox 内でアプリケーション エラーを表示するには、プログラム全体で必要に応じて表示する必要がある winform が必要です。これは、SysErrorDlg winform をいつでもプログラムのどこからでも呼び出して、プログラム エラーを表示できることを意味します。私がこれを行うことができるのは、プログラム全体で SysErrorDlg winform の単一のインスタンスのみにアクセスできる場合です。

以下の非常に単純なコードに従ってください。それは私がやろうとしていることです。

=========================================
Mainform

using
Form1;
Form2;
Form3;   

Mainform1 = class(System.Windows.Form)
private
method ShowBtn_Click(sender: System.Object; e: System.EventArgs)
public
constructor;
F1:Form1;
end;

constructor MainForm1;
begin
   F1 := new Form1;
end;

method Mainform1.ShowBtn_Click(sender: System.Object; e: System.EventArgs);
begin
   F1.Show; // or ShowDialog;
end;

=====================================================
Form1

Form1 = class(System.Windows.Form)
private
public
constructor;
end;

constructor Form1;
begin

end;

=====================================================
Form2

using
Mainform;

Form2 = class(System.Windows.Form)
private
method ShowBtn_Click(sender: System.Object; e: System.EventArgs)
public
constructor;
end;

constructor Form2;
begin

end;

method Form2.ShowBtn_Click(sender: System.Object; e: System.EventArgs);
begin
   MainForm1.F1.Show; // or ShowDialog;
end;

====================================================
Form3

Using
MainForm;

Form3 = class(System.Windows.Form)
private
method ShowBtn_Click(sender: System.Object; e: System.EventArgs)
public
constructor;
end;

constructor Form3;
begin

end;

method Form3.ShowBtn_Click(sender: System.Object; e: System.EventArgs);
begin
   MainForm1.F1.Show; // or ShowDialog;
end;

============================================

それは可能ですか?私のコンパイラは、グローバルな winform 変数を宣言することを許可しませんが、パブリックであることを識別する必要があると不平を言います。この機能を有効にするオプションがあったとしても、変数をクラスに対してプライベートまたはローカルに保つという考えが好きなので、そうしたくありません。

Form1 のインスタンスが Mainform 内で既に宣言およびインスタンス化されている場合、form1 のインスタンスを form2 または form3 に渡すにはどうすればよいでしょうか? show と showdialog の仕組みを理解しています。Form1 インスタンスが MainForm 内にある場合、Form2 から Form1 インスタンスにアクセスするには、どのコード行を使用しますか?

説明とともに小さなコードを提供できます。

4

4 に答える 4

1

ShowDialog()あなたは、この目的のためにのヘルプを使用することができます。F1.ShowDialog()たとえば、F1がForm1のオブジェクトである場合、初めてform1を呼び出すと、Form1が開き、2回目は、最初のインスタンスウィンドウが閉じられるまで呼び出すことができません。ただし、F1.Show()呼び出しごとにForm1の複数のウィンドウが開きます。

于 2011-08-16T13:21:58.950 に答える
1

これにはsingleton-patternを使用する必要があるようです。たとえば、c# では、次のようにForm1を定義できます。

public partial class Form1 : Form
{
    static Form1 _theform;

    /// <summary>
    /// Gets the one and only instance of Form1.
    /// </summary>
    static public Form1 TheForm
    {
        get
        {
            if ( null == _theform )
            {
                _theform = new Form1();
            }

            return _theform;
        }
    }

    protected Form1()
    {
        InitializeComponent();
    }
}

次に、アプリケーションのどこでも、これを行うことで Form1 の同じインスタンスを取得できます。

Form1.TheForm.Show();
于 2011-08-17T03:22:41.853 に答える
0

フォームのインスタンスをアクティブにしておくことは、おそらく最善の方法ではないと思います。ロギングをログの表示から分離することをお勧めします。

.NET で利用可能なロギングおよび/またはトレース (つまり、静的 Trace クラス) のテクノロジを使用し、アプリケーション全体でログに記録されたすべてのエントリを追跡する特定のリスナーを追加するだけでなく、への読み取りアクセスを提供するという考え方です。このログ。

その後、必要に応じてログ ウィンドウを表示できます。このログ ウィンドウは単にリスナーにアクセスし、データバインディングを使用してリスナーのコンテンツをテキスト フィールドに表示します。

データバインディングを使用すると、新しいエントリがログに書き込まれるとすぐに、表示が自動的に更新されるようにすることもできます。

このようにして、現在発生している制限を「ハッキング」することなく、必要なときにいつでもフォームを閉じて再インスタンス化できます。

于 2011-08-17T11:17:15.713 に答える