Der Delphi-Objekt-Inspektor zeigt die zusätzlichen Eigenschaften von TFrame-Nachkommen nicht von Entwurf an. Die Benutzer neigen dazu, einen bekannten Trick vorzuschlagen, der häufig verwendet wird, um die Eigenschaften von TForm-Nachkommen im Objektinspektor anzuzeigen. Der Trick ist: Registrieren von benutzerdefinierten Modul für TForm Nachkommen zu Delphi IDE über Design-Zeit-Paket wie:Anzeigen der zusätzlichen Eigenschaften von TFrame-Nachkommen im Objektinspektor
RegisterCustomModule(TMyFrame, TCustomModule);
Objektinspektor zusätzliche Eigenschaften des TFrame Nachkommen der Instanz mit dieser Art und Weise zeigen kann, aber es verliert seinen Rahmen Verhalten während es eingebettet in eine Form. Nicht redesignable, nicht möglich, Ereignisse für seine Unterkomponenten zu implementieren, und es akzeptiert untergeordnete Steuerelemente (was nicht möglich ist). Aber es verhält sich normalerweise in seinem eigenen Entwurfsbereich.
Sieht aus wie diese Verhaltensweisen von Delphi IDE speziell für TFrame bereitgestellt. Sie sind wahrscheinlich keine generischen Einrichtungen.
Gibt es eine andere Möglichkeit, dies zu erreichen, ohne das Rahmenverhalten zu verlieren?
Ich verwende Delphi 2007
@Tondrej,
Lesen Sie Kommentare für das Problem, Dank im Voraus.
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.
Nizza, havn't ich gebrauchte Frames für einige Zeit, weil ich denke, sie sind nicht der Mühe wert. Aber ich werde es versuchen. –