2012-05-04 47 views
0

我不知道如何解释这一点,但这里有: 我有一个窗体与一些组合框的网格。从这个表格我创建另一个编辑数据。编辑表单也有一些组合框,如网格。 这些组合框中的值可以从第三种形式进行编辑。 如果编辑它们,我会向所有打开的表单发送类似广播的消息来更新组合框。避免消息广播

procedure HsBrodcastUpdate; 
var 
    i: integer; 
begin 
    for i := 1 to Screen.FormCount - 1 do 
    SendMessage(Screen.Forms[i].Handle, WM_FORMUPDATES, 0, 0); 
end; 

在哪里更新应执行我有各种形式:

procedure FormUpdate(var aMessage: TMessage); message WM_FORMUPDATES; 

这就像使用shootgun当浅滩就足够了。 它应该足以将消息发送到创建编辑窗体的窗体

我不确定它是否会提高性能,但我想尝试。

我的问题:我怎么能代替使用发送到所有窗体的HsBrodcastUpdate发送消息到创建发送消息的窗体的窗体。

+1

你无法想象有多少消息是每秒发送一个工作的Windows系统上:)。消除你的消息将不会影响性能。 – kludg

+1

在编辑表单中使用类似'OnEditionDone'的事件并以'owner'形式创建事件处理程序。或者只发送/发布消息给所有者表单。 – teran

+1

..或致电业主控制执行()方法 –

回答

0

我会用一个类的方法来完成这项

Form1 = class(TForm1) 
    ... 
    private 
    ... 
    public 
    Class procedure UpdateComboBox; 
    ... 
    end; 

那么程序看起来像这样

class procudure TForm1.UpdateComboBox; 
    var 
    F: TForm2;//This is the target form 
    I: Integer; 
    begin 
    F := nil; 
    for i := Screen.FormCount - 1 DownTo 0 do 
     if (Screen.Forms[i].Name = '<The Form Name Here>') then 
     F := Screen.Forms[I] As TForm2; 
    if F <> nil then 
    begin 
     //update your form's F.comboBox here 
    end; 
    end; 
0

您可以构建一连串的事件,在您的形式暴露事件​​处理程序。 研究这个例子:

{- Main Form } 

Type 

TFormMain = Class(TForm) 
    private 
    procedure UpdateCombo(Sender : TObject); 
    procedure InvokeOtherForm; 
end; 

TFormMain.InvokeOtherForm; 
var 
    OtherForm : TOtherForm; 
begin 
    OtherForm := TOtherForm.Create(Nil); 
    try 
    OtherForm.OnUpdateCombo := Self.UpdateCombo; // Link update event ! 
    OtherForm.ShowModal; 
    finally 
    OtherForm.Free; 
    end; 
end; 

TFormMain.UpdateCombo(Sender : TObject); 
begin 
    {- Update the combos ... } 
    ... 
end; 

{- OtherForm } 
Type 

TOtherForm = Class(TForm) 
    private 
    FOnUpdateCombo : TNotifyEvent; 
    procedure InvokeThirdForm; 
    procedure UpdateCombo(Sender : TObject); 
    public 
    OnUpdateCombo : TNotifyEvent read FOnUpdateCombo write FOnUpdateCombo; 
    end; 

TOtherForm.InvokeThirdForm; 
var 
    ThirdForm : TThirdForm; 
begin 
    ThirdForm := TThirdForm.Create(Nil); 
    try 
    ThirdForm.OnUpdateCombo := Self.UpdateCombo; // Link update event ! 
    ThirdForm.ShowModal; 
    finally 
    ThirdForm.Free; 
    end; 
end; 

TOtherForm.UpdateCombo(Sender : TObject); 
begin 
    {- Do some internal updates } 
    ... 
    {- Pass on update information event } 
    if Assigned(FOnUpdateCombo) then 
    FOnUpdateCombo(Sender); 
end; 

{- ThirdForm } 
Type 

TThirdForm = Class(TForm) 
    private 
    FOnUpdateCombo : TNotifyEvent; 
    procedure UpdateCombo; 
    public 
    OnUpdateCombo : TNotifyEvent read FOnUpdateCombo write FOnUpdateCombo; 
    end; 

TThirdForm.UpdateCombo; 
begin 
    {- Do some internal updates } 
    ... 
    {- Pass on update information event } 
    if Assigned(FOnUpdateCombo) then 
    FOnUpdateCombo(Self); 
end;