Trình kiểm tra đối tượng Delphi không hiển thị thuộc tính bổ sung của thuộc tính TFrame theo thiết kế. Mọi người có xu hướng đề xuất sử dụng một thủ thuật đã biết thường được sử dụng để hiển thị các thuộc tính của hậu duệ TForm trên thanh tra Object. Bí quyết là: đăng ký mô-đun tùy chỉnh cho con cháu TForm để Delphi IDE qua gói thời gian thiết kế như:Hiển thị thuộc tính bổ sung của thuộc tính TFrame trên thanh tra đối tượng
RegisterCustomModule(TMyFrame, TCustomModule);
Đối tượng thanh tra có thể hiển thị thuộc tính bổ sung của dụ TFrame Hậu duệ với cách này nhưng nó sẽ mất hành vi khung của nó trong khi nó là được nhúng trong một biểu mẫu. Không thể thiết kế lại, không thể thực hiện các sự kiện cho các thành phần con của nó và nó chấp nhận các điều khiển con (mà nó không có khả năng). Nhưng nó hoạt động bình thường trong khu vực thiết kế riêng của nó.
Dường như, những hành vi được cung cấp bởi Delphi IDE đặc biệt chỉ dành cho TFrame. Họ problaly không phải là loại cơ sở chung chung.
Có cách nào khác để thực hiện việc này mà không làm mất hành vi khung không?
Tôi đang sử dụng Delphi 2007
@Tondrej,
đã đọc ý kiến cho vấn đề này, cảm ơn trước.
frameunit.dfm:
object MyFrame: TMyFrame
Left = 0
Top = 0
Width = 303
Height = 172
TabOrder = 0
object Edit1: TEdit
Left = 66
Top = 60
Width = 151
Height = 21
TabOrder = 0
Text = 'Edit1'
end
end
unit frameunit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TBaseFrame = Class(TFrame)
protected
Fstr: string;
procedure Setstr(const Value: string);virtual;
published
Property str:string read Fstr write Setstr;
End;
TMyFrame = class(TBaseFrame)
Edit1: TEdit;
private
// This won't be called in designtime. But i need this to be called in designtime
Procedure Setstr(const Value: string);override;
end;
implementation
{$R *.dfm}
{ TBaseFrame }
procedure TBaseFrame.Setstr(const Value: string);
begin
Fstr := Value;
end;
{ TMyFrame }
procedure TMyFrame.Setstr(const Value: string);
begin
inherited;
Edit1.Text := Fstr;
// Sadly this code won't work and Edit1 won't be updated in designtime.
end;
end.
unit RegisterUnit;
interface
procedure Register;
implementation
uses
Windows, DesignIntf, frameunit;
procedure Register;
var
delphivclide: THandle;
TFrameModule: TCustomModuleClass;
begin
delphivclide := GetModuleHandle('delphivclide100.bpl');
if delphivclide <> 0 then
begin
TFrameModule := GetProcAddress(delphivclide, '@[email protected]@');
if Assigned(TFrameModule) then
begin
RegisterCustomModule(frameunit.TBaseFrame, TFrameModule);
// Just registering that won't cause Tmyframe to loose its frame behaviours
// but additional properties won't work well.
//RegisterCustomModule(frameunit.TMyFrame, TFrameModule);
// That would cause Tmyframe to lose its frame behaviours
// But additional properties would work well.
end;
end;
end;
end.
Nice, tôi havn't khung được sử dụng trong một thời gian, bởi vì tôi nghĩ rằng họ không phải là giá trị phức tạp. Nhưng tôi sẽ thử cái này. –