调试代码如下:function IsDynamicControl(mControl: TControl): Boolean;
begin
  { TODO : 判断是否动态创建 }
end;procedure TForm1.FormCreate(Sender: TObject);
var
  vButton: TButton;
begin
  vButton := TButton.Create(Self);
  vButton.Caption := 'hello';
  vButton.Name := 'ButtonHello';
  Caption := BoolToStr(IsDynamicControl(vButton), True);
end;嘻嘻嘻 伴水 :) 谢谢参与讨论 嘻嘻嘻嘻

解决方案 »

  1.   

    哎?!  伴水, 这个vButton没有Parent??
      

  2.   

    伴水老大的貼子, 只能跟著學習!!!
    有什麼好思路嗎???能不能從exe資源入手???
      

  3.   

    在VCL的结构中,凡是由Tcomponent衍生的元件类别都有一个SetDesigning方法,用以设定元件的状态,不过此方法宣告在Protected区段,您无法直接使用,因此必须另外定义一个继承自Tcomponent的类别,并将此方法开放出来。透过SetDesigning方法,可以设定元件为设计模式(True)或是执行模式(False),要分辨某一元件所处的状态,你可藉由ComponentState属性来得知,此属性为一集合(Set)型态属性,因此你可以以(csDesigning in ComponentState)来判别元件所处的状态。我不知道有没有关系 :D
      

  4.   

    動態創建的, 與在 IDE 設計好生成的, 有什麼分別???
    明顯的, 就是, 一個有 放在 exe 資源, 一個沒有!
    但這樣做, 是不是麻煩點????期待新的思路!!!
      

  5.   

    糊思乱想ing.............................
      

  6.   

    个人意见:
    看看窗体里是不是有你这个控件:
    代码如下:
    function EnumChildWindowsProc(H: HWnd; TF: TForm1): Boolean; stdcall;
    var
      Buffer: array[0..255] of Char;
    begin
      Result := True; //設定為True才會再找下一個
      //開始作某事
      GetWindowText(H, Buffer, 255);
      form1.LB.Items.Add(StrPas(Buffer));lb为一个Combobox
    end;
    ////////////// EnumChildWindows(Handle, @EnumChildWindowsProc, Longint(Self));procedure TForm1.Button2Click(Sender: TObject);
    begin
    EnumChildWindows(Handle, @EnumChildWindowsProc, Longint(Self));
    end;
    再来:
    .....
      

  7.   

    各大星星们,你们想得太复杂了吧,我个人有个简单方法,动态创建时加入一个标志,比如在Tag中赋为1000,然后根椐这个值去做条件,不是OK了。:)
      

  8.   

    对了,你们还是去看一下http://expert.csdn.net/Expert/topic/2946/2946238.xml?temp=.5898096,问题很实用啊:D
      

  9.   

    >>我个人有个简单方法,动态创建时加入一个标志
    如果是個小菜鸟提問, 我可能會建議他這樣做!
    但..., 提這個問題的, 是傳說中...神秘的...>>看看窗体里是不是有你这个控件:
    應該一樣找到的!!!>>SetDesigning
    應該不關這個問題>>內存位置, 
    倒可以考慮!
      

  10.   

    to CDSoftwareWj:是应该有个Parent,呵呵~~to LZGUI:“动态创建时加入一个标志”,静态控件也可以加Tag呀,那不就可以伪装了?~~
      

  11.   

    //先写一个有缺陷的函数,大家一起琢磨琢磨~~//用逆向思维,一点一点排除~~
    function IsDynamicControl(mControl: TControl): Boolean;
    var
      vHandle: THandle;
      vResourceName: PChar;
      S: string;
    begin
      Result := True;
      if not Assigned(mControl) then Exit; //nil算是动态的吧~~
      if mControl.Name = '' then Exit; //Name为空是动态的!~~
      if not Assigned(mControl.Owner) then Exit; //没有Owner是动态的!~~
      if not Assigned(mControl.Owner.FieldAddress(mControl.Name)) then Exit; //没在published部分是动态的!~~
      Result := False;
    end; { IsDynamicControl }缺陷:
    静态控件有可能Name为''~~
    动态控件也可以放在published部分~~考虑的情况还有:部分静态控件有可能已经被释放了~~
      

  12.   

    想问问,在Delphi里面,有静态创建的TControl实例么?
      

  13.   

    回复人: Eastunfail(浴血雏龙)==(恶鱼杀手) ( ) 信誉:120  2004-04-13 19:02:00  得分:0 
     
     
      想问问,在Delphi里面,有静态创建的TControl实例么?
      
    *************************这里的所谓静态,是指在设计时就已经添加或者说已编译到可执行文件或资源文件里的控件,是相对于在程序执行时才创建(动态)的控件而言
      

  14.   

    将保存窗体的资源读入到Stream中,然后用ObjectBinaryToText函数转换成DFM中的定义的文本,然后在取得TControl的Name,在ObjectBinaryText转换出来的文本里面查找定义,如果没有找到则搜索下一个窗体资源,如果全部搜索完还没找到那个控件,那就说明是动态创建的拉小子不才,只能想到这么多
      

  15.   

    说掉乐一点,如果一个叫Button1的TControl,Parent是Panel1,Panel的Parent是Form1,那么假设这个TControl的唯一名字是Form1_Panel_Button1,然后根据这个父类的关系在ObjectBinaryToText得到的文本中找,不过前提要吧ObjectBinaryToText得到的文本搞成树以保证每个对象的唯一性
      

  16.   

    用TControl.Owner就可以确定路径了,呵呵不用处理成树~~一个TControl.Name在TControl.Owner具有唯一性~~
      

  17.   

    Eastunfai 的讨论,又回到我最初的讨论
    >>一個有 放在 exe 資源, 一個沒有!
    DeDE 不是带源码的吗??
    可直接分析,得到对应的Dfm!!!
    但,太麻烦了!分析下,创建的内存位置,不知有何异同?
      

  18.   

    to Eastunfail:
    (*//
    var
      vHandle: THandle;
      vResourceName: PChar;
    //*)
    看我上面的残留代码,也正准备从读取窗体资源入手~~
    不过,碰见没有名字的静态控件,暂时没法(不过可以忽略,估计没人用这东东)~~function IsDynamicControl(mControl: TControl): Boolean;
    var
      vHandle: THandle;
      vResourceName: PChar;
      vResourceStream: TResourceStream;
      vMemoryStream: TMemoryStream;
      I: Integer;
    begin
      Result := True;
      if not Assigned(mControl) then Exit; //nil算是动态的吧~~
      if mControl.Name = '' then Exit; //Name为空是动态的!~~
      if not Assigned(mControl.Owner) then Exit; //没有Owner是动态的!~~
      vResourceName := PChar(string(mControl.Owner.ClassName));
      vHandle := FindResource(HInstance, vResourceName, RT_RCDATA);
      if vHandle = 0 then Exit;
      vResourceStream :=
        TResourceStream.Create(HInstance, PChar(vResourceName), RT_RCDATA);
      vMemoryStream := TMemoryStream.Create;
      with TStringList.Create do try
        ObjectBinaryToText(vResourceStream, vMemoryStream);
        vMemoryStream.Position := 0;
        LoadFromStream(vMemoryStream);
        vHandle := 0;
        while Pos(#32#32, Text) > 1 do
          Text := StringReplace(Text, #32#32, #32, [rfReplaceAll]);
        for I := 0 to Count - 1 do
          if Pos('object ' + mControl.Name + ':', Strings[I]) in [1, 2] then begin
            vHandle := I + 1;
            Break;
          end;
        if vHandle = 0 then Exit;
      finally
        Free;
        vResourceStream.Free;
        vMemoryStream.Free;
      end;  Result := False;
    end; { IsDynamicControl }
      

  19.   

    好象已经解决了!!!>>    while Pos(#32#32, Text) > 1 do
    >>      Text := StringReplace(Text, #32#32, #32, [rfReplaceAll]);
    >>    for I := 0 to Count - 1 do
    >>      if Pos('object ' + mControl.Name + ':', Strings[I]) in [1, 2] then begin
    >>        vHandle := I + 1;
    >>        Break;
    >>      end;能不能改为
      if Pos('object ' + mControl.Name + ':', Text) > 0 then...
      

  20.   

    zswangII 果然厉害, 只能再次佩服!!!
      

  21.   

    一晚上没有来,有这么多成果呀 hehe^^活到老学到老呀,对各位真是佩服!不过我再想想还有没有什么区别,再想一种方式....
      

  22.   

    传说中的老大的出来了。向zswang及zswangII学习。
      

  23.   

    zswangII 果然厉害.
      呵呵,看来我真是有点浅薄了,向各位study!
      仔细看看先:)
      

  24.   

    感觉zswangII设好的题目,旁边还有aiirii个托
    哈哈,纯水纯水
      

  25.   

    想当年我也是环保型的,在VB板块做乐2两年环保公民,在.net板做了半年的环保公民,然后又在delphi板做了半年的环保公民就成了红毛猩猩了:)现在这红毛猩猩当了半年多也不是个滋味啊,看到别人绿内裤越来越多,而我这半年来也就从一个红毛猩升级为红毛猩猩:(