我的主界面有一个MDIFORM,一个TOOLBAR,一个OUTLOOKBAR,一个MDICHILDFORM问一: 当按下TOOLBAR上的一个按钮时来删除MDICHILDFORM中的一个控件?
我是不知道如何来写语句,我想在TOOLBAR的一个BUTTON的CLICK事件中写,但是在MDICHILDFORM中有很多控件,比如我用鼠标点了某个控件,在按一下TOOLBAR上的那个表示删除的BUTTON来删这个控件,我不知道这个语句应该怎么写?
问二,源代码如下:
unit MDIChildUnit;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ExtCtrls,StdCtrls,USwitchO,USwitchTriangle,UResistant,UTransformerC,
  DB, ADODB, MainUnit, Menus;type
  TMDIChildFrm = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    procedure NewMouseDown(Sender: TObject; Button: TMouseButton;
                           Shift: TShiftState; X,Y: Integer);
    procedure NewMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
    procedure NewMouseUp(Sender: TObject; Button: TMouseButton;
                         Shift: TShiftState; X,Y: Integer);
  public
    procedure CreateComponent(var PName: String; PRealName: String);  end;var
  MDIChildFrm: TMDIChildFrm;
  //移动中判鼠标是否落在边上
  SideNumber: Integer;
  //动态生成的控件
  FResistant: TResistant;
  FTransformerC: TTransformerC;
  FSwitchTriangle: TSwitchTriangle;
  FSwitchO: TSwitchO;
  FMemo: TMemo;
  //MOUSE事件中要用到的变量
  StartPoint: TPoint;
  OldLeft,OldTop: Integer;
  OldWidth,OldHeight: Integer;
  //判鼠标是否按下
  IfMouseDown: Boolean;
 implementation{$R *.dfm}//关闭MDICHILDFRM
procedure TMDIChildFrm.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Action := caFree;
end;//动态创建电阻符号
procedure TMDIChildFrm.CreateComponent(var PName: String; PRealName: String);
begin
  if PName = 'TransformerC' then
     begin
       FTransformerC := TTransformerC.Create(Self);
       with FTransformerC do begin
         Parent := MainFrm.MDIChildren[0];
         Left := 50;
         Top := 50;
         Width := 32;
         Height := 32;
         Name := PRealName;
         Pen.Style := PublicPenStyle;
         Pen.Color := PublicPenColor;
         Pen.Width := PublicPenWidth;
         OnMouseDown := NewMouseDown;
         OnMouseMove := NewMouseMove;
         OnMOuseUp := NewMouseUp;
      end;
     end;
end;
//动态创建的器件的MOUSEDOWN事件
procedure TMDIChildFrm.NewMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X,Y: Integer);
begin
   if (Button = mbLeft) and (Sender is TGraphicControl) then
     IfMouseDown := true
  else
     begin
       IfMouseDown := False;
       Exit;
     end;
  StartPoint.X := X;
  StartPoint.Y := Y;
  OldLeft := (Sender as TGraphicControl).Left;
  OldTop := (Sender as TGraphicControl).Top ;
  OldWidth := (Sender as TGraphicControl).Width;
  OldHeight := (Sender as TGraphicControl).Height;
[red] 出错处。[/red]
  Canvas.Pen.Style := psDash;
  Canvas.MoveTo(OldLeft,OldTop);
  Canvas.LineTo(OldLeft+OldWidth,OldTop);
  Canvas.MoveTo(OldLeft+OldWidth,OldTop);
  Canvas.LineTo(OldLeft+OldWidth,OldTop+OldHeight);
  Canvas.MoveTo(OldLeft+OldWidth,OldTop+OldHeight);
  Canvas.LineTo(OldLeft,OldTop+OldHeight);
  Canvas.MoveTo(OldLeft,OldTop+OldHeight);
  Canvas.LineTo(OldLeft,OldTop);  //判点是不是在四条边上
  if (X>=0) and (X<=OldWidth) and (Y=0) and (Y<=2) then  //上
     begin
       SideNumber := 1;
       (Sender as TGraphicControl).Cursor := crSizeNS;
     end
  else
     begin
       if (X=0) and (X<=2) and (Y>=0) and (Y<=OldHeight) then  //左
          begin
            SideNumber := 2;
            (Sender as TGraphicControl).Cursor := crSizeWE;
          end
       else
          begin
            if (X>=0) and (X<=OldWidth) and (Y>=OldHeight-2) and (Y<=OldHeight) then  //下
               begin
                 SideNumber := 3;
                 (Sender as TGraphicControl).Cursor := crSizeNS;
               end
            else
               begin
                 if (X<=OldWidth) and (X>=OldWidth -2 ) and (Y>=0) and (Y<=OldHeight) then  //右
                    begin
                      SideNumber := 4;
                      (Sender as TGraphicControl).Cursor := crSizeWE;
                    end
                 else
                    begin
                      SideNumber := 5;
                      (Sender as TGraphicControl).Cursor := crDrag;
                    end;
               end;
          end;
     end;
end;
。。end.每次运行到CANVAS是就出现EACCESSVIOLATION错误,我想这应该跟是否全局变量没有什么关系吧,CANVAS是TFoRM的一个方法,我不知道怎么会出错?
还有一个今天新碰到的问题,我想在MDICHILDFORM中的动态生成的控件中点击右键时弹出一个POPUPMENU菜单,源代码如下:
unit MDIChildUnit;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ExtCtrls,StdCtrls,USwitchO,USwitchTriangle,UResistant,UTransformerC,
  DB, ADODB, MainUnit, Menus;type
  TMDIChildFrm = class(TForm)
    pop: TPopupMenu;
    DeleteItem: TMenuItem;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure DeleteItemClick(Sender: TObject);  private
    procedure NewMouseDown(Sender: TObject; Button: TMouseButton;
                           Shift: TShiftState; X,Y: Integer);
    procedure NewMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
    procedure NewMouseUp(Sender: TObject; Button: TMouseButton;
                         Shift: TShiftState; X,Y: Integer);
public
    procedure CreateComponent(var PName: String; PRealName: String);  end;var
  MDIChildFrm: TMDIChildFrm;
  //移动中判鼠标是否落在边上
  SideNumber: Integer;
  //动态生成的控件
  FResistant: TResistant;
  FTransformerC: TTransformerC;
  FSwitchTriangle: TSwitchTriangle;
  FSwitchO: TSwitchO;
  FMemo: TMemo;
  //MOUSE事件中要用到的变量
  StartPoint: TPoint;
  OldLeft,OldTop: Integer;
  OldWidth,OldHeight: Integer;
  //判鼠标是否按下
  IfMouseDown: Boolean;
 implementation{$R *.dfm}//关闭MDICHILDFRM
procedure TMDIChildFrm.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Action := caFree;
end;//动态创建电阻符号
procedure TMDIChildFrm.CreateComponent(var PName: String; PRealName: String);
begin
  if PName = 'TransformerC' then
     begin
       FTransformerC := TTransformerC.Create(Self);
       with FTransformerC do begin
         Parent := MainFrm.MDIChildren[0];
         Left := 50;
         Top := 50;
         Width := 32;
         Height := 32;
         Name := PRealName;
         Pen.Style := PublicPenStyle;
         Pen.Color := PublicPenColor;
         Pen.Width := PublicPenWidth;
         OnMouseDown := NewMouseDown;
         OnMouseMove := NewMouseMove;
         OnMOuseUp := NewMouseUp;
      end;
     end;
  end;
//动态创建的器件的MOUSEDOWN事件
procedure TMDIChildFrm.NewMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X,Y: Integer);
begin
  if (Button = mbRight) then
     pop.Popup(x,y) ;
  if (Button = mbLeft) and (Sender is TGraphicControl) then
     IfMouseDown := true
  else
     begin
       IfMouseDown := False;
       Exit;
     end;
。。end.每次运行到POP。POPUP(X,Y);就出错,错误的原因跟上面的一样,也是eaccessviolation,但是我在另外的新建的MDIFORM和MDICHILDFORM里试了一下,却没有什么问题,我觉得很奇怪,为什么会这样?

解决方案 »

  1.   

    问题一循环子窗口所有的控件,用RTTI判断,再删除(removecomponent)
      

  2.   

    问题1:定义一个全局的变量removeComponent:TComponent在你的所有要删除的控件的OnMouseDown事件中记录下该控件,然后在需要时删除就可以了!
    问题2:太长了没有时间看!!!
      

  3.   

    对于问二,我找到出错的原因了,我是在MDICHILDFRM中根据MDIFRM中的OUTLOOKBAR中选中的内容动态生成一个控件,并执行相应的事件,当我想点击一个控件时在它周围出现一个虚框,源码如下:  Canvas.Pen.Style := psDash;
      Canvas.MoveTo(OldLeft,OldTop);
      Canvas.LineTo(OldLeft+OldWidth,OldTop);
      Canvas.MoveTo(OldLeft+OldWidth,OldTop);
      Canvas.LineTo(OldLeft+OldWidth,OldTop+OldHeight);
      Canvas.MoveTo(OldLeft+OldWidth,OldTop+OldHeight);
      Canvas.LineTo(OldLeft,OldTop+OldHeight);
      Canvas.MoveTo(OldLeft,OldTop+OldHeight);
      Canvas.LineTo(OldLeft,OldTop);
    但是运行时提示eaccessviolation错误,我设了断点,发现mdichildfrm为nil,我就用
      if mdichildfrm = nil then 
         mdichildfrm := TMdichildfrm.create(Self);
    但是这样一来就有两个窗口,这样不行,我只要一个窗口,我用active也不行,有没有什么别的好办法?
      

  4.   


    ------问题1:定义一个全局的变量removeComponent:TComponent在你的所有要删除的控件的OnMouseDown事件中记录下该控件,然后在需要时删除就可以了!这样好象不行吧,因为窗口上有很多动态生成的控件,都用同一个MOUSEDOWN事件的.
      

  5.   

    为什么这么多人喜欢写MDI程序