Как отобразить один экземпляр Winform во всей программе? - PullRequest
0 голосов
/ 16 августа 2011

Примите мои извинения, если мой вопрос и описание кажутся слишком простыми или уже были заданы другими.

Возможно, я задавал подобный вопрос раньше. Тем не менее, я все еще немного запутался насчет winform. Допустим, у вас есть программа .net Delphi prism с Mainform, Form1, Form2, Form3 . Кроме того, вы хотите иметь возможность отображать одно мгновение формы Form1 из Mainform, Form2 и Form3. Как ты это делаешь? Мне нужно иметь winform, которая должна отображаться по мере необходимости во всей программе, чтобы показать ошибки приложения в RichTextBox. Это означает, что SysErrorDlg winform может быть вызван в любое время из любой точки моей программы для отображения ошибок программы. Для меня это возможно, если во всей моей программе доступен только один экземпляр winform SysErrorDlg.

следуйте очень простому коду ниже. Это в значительной степени то, что я пытаюсь сделать.

=========================================
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 в form2 или form3, если экземпляр form1 уже объявлен и создан в Mainform? Я понимаю, как работают шоу и шоудиалог. Какую строку кода вы бы использовали для доступа к экземпляру Form1 из Form2, если экземпляр Form1 находится в MainForm?

Вы можете предоставить небольшой код вместе с объяснением.

Ответы [ 4 ]

1 голос
/ 16 августа 2011

Отобразить форму 1, используя Form1.show() (вместо Form1.showdialog()). Затем используйте Скрыть вместо Закрыть, чтобы скрыть форму: Me.Hide(). Это оставляет экземпляр формы работающим, и к нему могут обращаться другие формы приложения.

Тогда, например, если Mainform помещает текст в поле richtextbox формы Form1, оно будет там, когда Form2 и Form3 показывают форму Form1.

1 голос
/ 17 августа 2011

Звучит так, как будто вам нужно использовать шаблон синглтона для этого.Например, в 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();
1 голос
/ 16 августа 2011

Вы можете использовать справку ShowDialog() для этой цели.Например, если F1 является объектом формы Form1, то при вызове form1 с F1.ShowDialog() в первый раз откроется форма Form1, а во второй раз она не позволит вызвать, пока не закроется окно первого экземпляра.Но где as F1.Show() открывает несколько окон Form1 для каждого вызова.

0 голосов
/ 17 августа 2011

Я думаю, что сохранение экземпляра формы активным, вероятно, не лучший подход.Я бы предложил отделить ведение журнала от его отображения.

Идея состоит в том, чтобы использовать технологии, доступные в .NET для ведения журнала и / или трассировки (т. Е. Статический класс Trace), и просто добавить определенныйслушатель, который будет отслеживать все зарегистрированные записи во всем приложении, а также предоставлять доступ для чтения к этому журналу.

Затем вы можете отобразить свое окно журнала, когда это потребуется.Это окно журнала просто обращается к слушателю и использует привязку данных для отображения содержимого слушателей в текстовом поле.

Используя привязку данных, вы также можете убедиться, что, как только новые записи будут записаны в журнал, отображение автоматическиОбновления.

Таким образом, вы можете закрыть и повторно создать экземпляр формы, когда это необходимо, без «взлома» ограничений, с которыми вы в настоящее время сталкиваетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...