主窗体里用了dxBarManager,确实很漂亮,不过也有不方便的地方,原来用mainform只要设置下就可以在窗口菜单先列出当前打开的child窗体,现在用了这个,不行了。因为childform都是在bpl里面生成的,能有什么办法截获到他们创建和注销的过程吗,可以把它放到菜单列表里面,能够提供其他思路也可以,谢谢了

解决方案 »

  1.   

    BPL的没玩过,你试试截获MDI客户区的 WM_MDICREATE和WM_MDIDESTROY消息看看。
      

  2.   

    unit Unit1;interfaceuses
      Classes, Forms, dxBar;type
      TMainForm = class(TForm)
        dxBarManager: TdxBarManager;
        dxBarButtonNewWindow: TdxBarButton;
        dxBarButtonArrangeAll: TdxBarButton;
        dxBarButtonNextWindow: TdxBarButton;
        dxBarButtonPreviousWindow: TdxBarButton;
        dxBarListWindows: TdxBarListItem;
        dxBarSubItemWindow: TdxBarSubItem;
        procedure dxBarButtonNewWindowClick(Sender: TObject);    procedure dxBarButtonArrangeAllClick(Sender: TObject);
        procedure dxBarButtonNextWindowClick(Sender: TObject);
        procedure dxBarButtonPreviousWindowClick(Sender: TObject);
        procedure dxBarListWindowsGetData(Sender: TObject);
        procedure dxBarListWindowsClick(Sender: TObject);
      public
        CreatedMDICount: Integer;
      end;var
      MainForm: TMainForm;implementation{$R *.DFM}uses
      Unit2;// Creates a new child form
    procedure TMainForm.dxBarButtonNewWindowClick(Sender: TObject);
    begin
      TChildForm.Create(Application);
    end;procedure TMainForm.dxBarButtonArrangeAllClick(Sender: TObject);
    begin
      Tile;
    end;procedure TMainForm.dxBarButtonNextWindowClick(Sender: TObject);
    begin
      Next;
    end;procedure TMainForm.dxBarButtonPreviousWindowClick(Sender: TObject);begin
      Previous;
    end;// The OnGetData event handler of TdxBarListItem
    procedure TMainForm.dxBarListWindowsGetData(Sender: TObject);
    begin
      with dxBarListWindows do
        ItemIndex := Items.IndexOfObject(ActiveMDIChild);
    end;// The OnClick event handler of TdxBarListItem
    procedure TMainForm.dxBarListWindowsClick(Sender: TObject);
    begin
      with dxBarListWindows do
        TCustomForm(Items.Objects[ItemIndex]).Show;end;end.// The child form unit
    unit Unit2;interfaceuses
      Classes, Forms;type
      TChildForm = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      end;implementation{$R *.DFM}uses
      SysUtils, Unit1;// Adds a child window to the child window listprocedure TChildForm.FormCreate(Sender: TObject);
    begin
      Inc(MainForm.CreatedMDICount);
      Caption := 'Document' + IntToStr(MainForm.CreatedMDICount);
      MainForm.dxBarListWindows.Items.AddObject(Caption, Self);
    end;// Removes a child window from the child window list
    procedure TChildForm.FormDestroy(Sender: TObject);
    begin
      with MainForm.dxBarListWindows.Items do
        Delete(IndexOfObject(Self));
    end;procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caFree;
    end;end.
      

  3.   

    估计楼主是想只在主界面里操作来实现动态检测子窗体创建与销毁。
    参考下我请教过的帖子 http://topic.csdn.net/u/20081211/10/f6ee56b5-784f-4943-87c0-87c11b9f3fa7.html
      

  4.   

    利用Screen的OnActiveFormChange事件
    1、可在这里维护你的菜单列表;
    2、本进程内,一旦有窗体创建或者销毁,都会触发此事件,代码自己敲吧
      

  5.   

    用OnActiveFormChange可以捕获窗体了,但是不能捕获窗体的销毁
      

  6.   

      代碼我就不寫了,寫個上個項目我設計的思路吧,可行性嘛,肯定是成立的,不然項目驗收都通過不了。
      在BPL窗體中發送信息到主窗體,通過通知來實現。 當BPL窗體半閉時,發送住處:    RegisterWindowMessage  發送信息通知主窗體來處理。   重載了主窗體的 WndProc .   在WNDPROC中處理BPL或DLL窗體通過RegisterWindowMessage  發送過來的信息。   根據發送信息的值來判斷BPL或DLL窗體的請求。
      說明了就是模仿了一些WINDOWS的消息機制。   
      

  7.   

    窗體銷毀,必定會引發這個事件,你需要在這做的是對比上一次screen中的窗體列表和這一次的窗體列表(你可以采用screen提供的來比較,或者自己create兩個個list來記錄),看有何不同?不同的部分就是銷毀的或者新建的。
    這里有個疑問:你要捕獲窗體的銷毀和新建過程,僅僅是維護菜單的窗體列表嗎?若是這樣,你只需在OnActiveFormChange里取得當前screen所記錄的forms,重新產生即可。