调试代码如下: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;嘻嘻嘻 伴水 :) 谢谢参与讨论 嘻嘻嘻嘻
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;嘻嘻嘻 伴水 :) 谢谢参与讨论 嘻嘻嘻嘻
有什麼好思路嗎???能不能從exe資源入手???
明顯的, 就是, 一個有 放在 exe 資源, 一個沒有!
但這樣做, 是不是麻煩點????期待新的思路!!!
看看窗体里是不是有你这个控件:
代码如下:
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;
再来:
.....
如果是個小菜鸟提問, 我可能會建議他這樣做!
但..., 提這個問題的, 是傳說中...神秘的...>>看看窗体里是不是有你这个控件:
應該一樣找到的!!!>>SetDesigning
應該不關這個問題>>內存位置,
倒可以考慮!
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部分~~考虑的情况还有:部分静态控件有可能已经被释放了~~
想问问,在Delphi里面,有静态创建的TControl实例么?
*************************这里的所谓静态,是指在设计时就已经添加或者说已编译到可执行文件或资源文件里的控件,是相对于在程序执行时才创建(动态)的控件而言
>>一個有 放在 exe 資源, 一個沒有!
DeDE 不是带源码的吗??
可直接分析,得到对应的Dfm!!!
但,太麻烦了!分析下,创建的内存位置,不知有何异同?
(*//
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 }
>> 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...
呵呵,看来我真是有点浅薄了,向各位study!
仔细看看先:)
哈哈,纯水纯水