避免消息广播

时间:2012-05-04 07:54:53

标签: forms delphi message

我不知道如何解释这个,但是这里有: 我的表格带有一些带有一些组合框的网格。从这个表单我创建另一个编辑数据。编辑表单还有一些像网格一样的组合框。 这些组合框中的值可以从第三种形式编辑。 如果它们被编辑,我会向所有打开的表单发送类似消息的广播以更新组合框。

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;

这就像使用霰弹枪,当一个浅滩就足够了。 将消息发送到从

创建editform的表单应该足够了

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

我的问题:我怎样才能使用发送到所有表单的HsBrodcastUpdate将消息发送到创建发送消息的表单的表单。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

我在你的帖子中没有看到任何问题,所以这甚至可能不是你想要的。听起来像实施Observer模式可能就是你想要的。

以下是您可以查看的两篇文章,但还有更多内容。 http://tdelphihobbyist.blogspot.com/2009/10/observer-design-pattern-in-delphi-push.html http://sourcemaking.com/design_patterns/observer/delph

答案 2 :(得分: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;