一般的控件在设计期不会做实际的I/O等操作。
你可以通过csDesigning判断是否在设计期,通过csLoading判断控件是否正在从载入。这两种状态下都不要执行实际的I/O。
type
TTCPAdoClient = class(TComponent)
……
private
procedure SetActive(const Value: boolean);
protected
procedure Loaded;override;
……
end;
implementation
procedure TTCPAdoClient.SetActive(const Value: boolean);
begin
if FActive=Value then Exit;
FActive:=Value;
if ComponentState*[csDesigning,csLoading]<>[] then Exit;
if FActive then
begin
if not Connected then
begin
// FIdTCPClient.Connect();<<----设计期控件出错,运行时没问题
end;
end;
end;
procedure TTCPAdoClient.Loaded;
begin
inherited;
if FActive then
begin
FActive:=False;
SetActive(True);
end;
end;
不打基础学人家写个毛的控件。