2010-01-16 5 views
0

Есть ли способ отключить кнопки родительских окон? У меня есть «рабочая» форма, которая вызывается множеством форм, поэтому я бы хотел отключить кнопки родительской формы, пока она не закончит делать это. Затем включите их снова.Кнопки формы родителя Delphi

Я хотел бы сделать что-то, что связано с событием OnShow и событием onClose.

Благодаря

-Brad

+0

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

ответ

1

Создайте форму, которую вы хотите позвонить, как:

unit fMyModalForm; 
    interface 
    uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs; 
    type 
    TfrmMyModalForm = class(TForm) 
     procedure FormShow(Sender: TObject); 
     procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    private 
     fCallingForm: TForm; 
     { Private declarations } 
    public 
     { Public declarations } 
     property CallingForm: TForm read fCallingForm write fCallingForm; 
    end; 
    (* 
    var 
    frmMyModalForm: TfrmMyModalForm; 
    *) 
    implementation 

    {$R *.dfm} 

    procedure TfrmMyModalForm.FormShow(Sender: TObject); 
    begin 
    fCallingForm.Enabled := False; 
    end; 

    procedure TfrmMyModalForm.FormClose(Sender: TObject; 
    var Action: TCloseAction); 
    begin 
    fCallingForm.Enabled := True; 
    end; 

    end. 

Затем после нажатия на кнопку, где вы хотите назвать это модальный форма:

unit fMain; 

    interface 

    uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, 
    fMyModalForm; 

    type 
    TfrmMain = class(TForm) 
     btnCall: TButton; 
     btn1: TButton; 
     btn2: TButton; 
     procedure btnCallClick(Sender: TObject); 
    private 
     { Private declarations } 
     f : TfrmMyModalForm; 
    public 
     { Public declarations } 
    end; 

    var 
    frmMain: TfrmMain; 

    implementation 


    {$R *.dfm} 

    procedure TfrmMain.btnCallClick(Sender: TObject); 
    begin 
    if not Assigned(f) 
    then begin 
     f := TfrmMyModalForm.Create(Self); 
     f.CallingForm := Self; 
    end; 
    f.Show(); 
    end; 

    end. 

Если вы просто хотите отключить все кнопки, вы можете прокручивать их и вместо disablin g CallingForm отключает только кнопки в CallingForm. См. Раздел «Переполнение стека» (и мой ответ) по адресу: Cast a form dynamically EDITED: см. Ответ _J_ (который в основном показывает тему).

Я бы использовал действия вместо кнопок.

0

Если вторичное окно открывается, что-то делает и закрывается, тогда имеет смысл открыть его ShowModal вместо Show. Таким образом, пользователь не может использовать основную форму до закрытия второй формы.

Если вы хотите перебрать, хотя все кнопки и отключить или включить их, код будет выглядеть примерно так:

var 
    i: Integer; 
begin 
    for i := 0 to MainForm.ComponentCount - 1 do 
    if (MainForm.Components[i] is TButton) then 
     TButton(MainForm.Components[i]).Enabled := False; 
end; 
+1

Я не хочу, чтобы он был открыт как ShowModal, потому что в других формах в фоновом режиме происходят другие процессы, и ShowModal останавливает эти процессы, насколько мне известно (я в лучшем случае новичок-программист Delphi) – Brad

+0

Да , вы правы, я не знал об этом факте. –

0

Для Stuf как это вам понадобится только одна строка кода и компонент TActionList ,

Создайте список действий с действием и привяжите действие к кнопке. Действие имеет событие OnUpdate, которое позволяет определить, должно ли быть активировано действие (и, следовательно, связанная кнопка). Событие OnUpdate запускается каждый раз, когда действие должно знать, должно ли оно быть включено или нет.

Смежные вопросы