Как свободно нажимать между открытыми формами.VBA - PullRequest
0 голосов
/ 06 июня 2018

Я искал немного, но, похоже, не подбирал правильные ключевые слова.

Чего я надеюсь добиться, так это иметь 2 отдельные формы пользователя, видимые рядом.Обе формы будут иметь свои собственные функциональные возможности и назначение, но предназначены для временного использования в сочетании друг с другом (следовательно, бок о бок).Я хотел бы иметь возможность свободно переключаться между двумя формами, предпочтительно одним щелчком мыши, как это было бы с открытыми приложениями на рабочем столе или в ОС.

Кажется, я даже не могунайти способы или способы сделать активную несфокусированную форму.

Я не очень сильный программист, но я бы не считал себя нубом, но я все еще вижу много синтаксиса, который выглядитГреческий и не понимаю.

работает над Microsoft Office Excel для Mac 2011

Спасибо за любую помощь, ребята и девочки.

Приветствия

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Пользовательские формы VBA имеют свойство «ShowModal», для которого установлено значение «Ложь», что позволяет выбирать или отменять выбор формы по желанию, а также отображать и использовать несколько форм одновременно (при условии, что все они немодальны)

Это также может быть выполнено в коде события show, используя

Userform1.Show vbModeless

, затем вы можете использовать событие инициализации одной формы для отображения второй формы.

Private Sub UserForm_Initialize()
     UserForm2.Show vbModeless
End Sub
0 голосов
/ 13 июня 2018

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

Еще раз спасибо.

0 голосов
/ 06 июня 2018

Вам нужно немодальное диалоговое окно.См. как отображать модальные и немодальные диалоговые окна

Модальное диалоговое окно

Модальное диалоговое окно - это диалоговое окно, которое принимает весь пользовательский ввод приложения.Пока это диалоговое окно открыто, другие формы приложения не будут реагировать на ввод пользователя.Это наиболее используемая форма диалоговых окон.Пример: диалоговое окно сохранения файла .Пока это диалоговое окно открыто, вы не можете редактировать документ.Сначала вам нужно закрыть диалоговое окно, прежде чем вы сможете продолжить изменение документа.Вы можете увидеть это в Блокнот при сохранении файла.Пока открыто диалоговое окно сохранения файла, вы ничего не можете сделать с главной формой

Модальное диалоговое окно обычно отображается следующим образом:

private void onButton1_Clicked(object sender, ...)
{
    using(var dlg = new MyModalDialog())
    {
        dlg.PropertyA = ...;  // set some properties of the dialog
        dlg.PropertyB = ...;
        var dlgResult = dlg.ShowDialog(this); // show the dialog. I am the parent

        // this procedure is blocked until the dialog is closed.
        // if here: result is available:
        switch (dlgResult)
        {
            case DialogResult.OK:
                ProcessResult(dlg.GetResult());
                break;
            case DialogResult.Cancel:
                ProcessCancel();
                break;
            default:
                 ...
        }
    }
}

Немодальное диалоговое окно

Вы хотите немодальное диалоговое окно: после показа одной формы вы хотите продолжить в своем коде, чтобы иметь возможность показать другую форму.Для этого вы не используете Form.ShowDialog , но Form.Show

private MyForm1 formA = null;
private MyForm2 formB = null;
private void onButton1_Clicked(object sender, ...)
{
    this.formA = new MyForm1())
    this.formA.PropertyA = ...;

    this.formB = new MyForm2())
    this.formB.PropertyA = ...;

    // make sure the forms are shown side by side
    this.formA.Position = ...
    this.formA.Size = ...
    this.formB.Position = ...
    this.formB.Size = ...

    // show the forms:
    this.formA.Show(this);
    this.formB.Show(this);

    // while the form are shown, your main form can continue
    ...
}

Вам придется подписаться на Form.Closed событие, прежде чем показывать формы, чтобы вы могли выполнять действия, такие как Утилизация форм.

this.FormA.Closing += new System.EventHandler(this.OnSubFormClosed);
this.FormA.Show(this);

В OnSubFormClosed вы должны проверить «Отправителя», чтобы проверить, какая форма закрыта, и действовать соответственно:

void OnSunFormClosed(object sender, EventArgs e)
{
    if (Object.ReferenceEquals(sender, this.formA)
    {   // FormA closed:
        this.ProcessFormAClosed();
        this.FormA.Dispose();
        this.FormA = null;
    }
    else if (Object.ReferenceEquals(sender, this.FormB)
    {
        ...
    }
}

Наконец: вы должны сообщить свои формы, когда ваша основная форма закрывается.Если вы сделаете это в Form.OnClosing вместо Form.OnClosed , вы можете спросить свои формы, согласны ли они с тем, что они закрыты.Например, форма может попросить оператора сохранить файл и дать возможность ответить да / нет / отменить.В последнем случае приложение не должно быть закрыто.Проверьте это поведение, если вы пытаетесь закрыть Блокнот с несохраненными изменениями.

protected override void OnFormClosing(cancelEventArgs e)
{
     // the following may be optimized
     bool closeFormAallowed = this.formA?.IsClosingAllowed ?? true;
     bool closeFormBallowed = this.formB?.IsClosingAllowed ?? true;

     // cancel closing if closing is not allowed
     e.Cancel = !closeFormAallowed || !closeFormBallowed;

     // don't forget to raise the event so my subscribers my decide to cancel closing:
     if (!e.cancel) base.OnClosing(e);

     // if no one wants to cancel closing: close the forms:
     if (!e.Cancel)
     {
         if (this.formA != null) this.formA.Close();
         it (this.formB != null) this.formB.Close();
         // this will raise the events, so the forms are properly disposed
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...