Конференция "KOL" » потеря фокуса формы
 
  • BMouradov (17.07.08 14:18) [0]
    Добрый день, уважаемые!
    Подскажите, почему теряется фокус у главной формы и как корректно избежать этой проблемы:

     NewForm1(Form1, Applet);
     if Form1.IsCorrect then
       Form1.Form.ShowModal;
     Form1.Form.Free;

    Если IsCorrect, то все в порядке, а вот если условие не прошло, и форму не нужно отображать, то главная форма почему-то теряет фокус. Похоже, что теряет его дважды - и в первой строке, и в последней. Установка Form1.Visible := False не помогла.
    В принципе, помогает SetForegroundWindow(Form.Handle), но при этом всё равно видно, что главное окно на долю секунды теряет фокус.
  • BMouradov (22.07.08 13:39) [1]
    Ау! Возможно, я неправильно объяснил. Есть основная форма MainForm. из нее при определенных условиях надо открыть другую форму Form1 модально. Причем эти условия определяются в Form1. И если звезды так сошлись, что форму показывать не надо, то получается, что форма создается и тут же удаляется. Логически рассуждая, при этом ничего происходить не должно, однако, происходит потеря фокуса. Судя по всему, фокус ни чему после этого не присваивается.
  • Jon © (23.07.08 01:12) [2]
    I hope that I understand correctly.
    Try this code:


    program FormsTest;

    uses
     KOL;

    type
    PForm1 = ^TForm1;
    TForm1 = object(TObj)
      Form, Button, Checkbox: PControl;
    public
      procedure ButtonClick(Sender: PObj);
    end;

    var
    Form1: PForm1;

    procedure NewForm1(var Result: PForm1; AParent: PControl);
    begin
     New(Result,Create);
     with Result^ do
     begin
       Form := NewForm(AParent,'Form1').SetSize(320,240);
       Button := NewButton(Form,'New Form').AutoSize(True).CenterOnParent;
       Button.OnClick := ButtonClick;
       Checkbox := NewCheckbox(Form,'OK').PlaceUnder;
     end;
    end;

    procedure TForm1.ButtonClick(Sender: PObj);
    var
     NewForm: PForm1;
    begin
     if Checkbox.Checked then
     begin
       NewForm1(NewForm,Applet);
       NewForm.Form.ShowModal;
       NewForm.Form.Hide;
       NewForm.Free;
     end;
    end;

    begin
     Applet := NewApplet('Forms Test');
     NewForm1(Form1,Applet);
     Run(Applet);
    end.



    Forms always have correct focus with above code.
  • BMouradov (23.07.08 12:15) [3]
    Ваше решение - это не создавать форму вовсе. Такой подход работает, но он не всегда логически верный, т.к. условия показа или не показа формы могут определяться в самой форме.

    Конкретно, мой случай: Есть MainForm. Есть TipsForm. TipsForm считывает данные из файла в момент создания и потом в модальном режиме показывает их. Если в файле строк нет, то они и не должны показываться. Было бы неправильно считываение данных выносить в главную форму только для того, чтобы заранее определить, показывать форму или нет.
  • Медвежонок Пятачок © (23.07.08 14:20) [4]
    т.к. условия показа или не показа формы могут определяться в самой форме.

    Условия на форме тоже не из космоса берутся.
    Их анализировать можно и без самой формы
 
Конференция "KOL" » потеря фокуса формы
Есть новые Нет новых   [134431   +15][b:0][p:0.001]