L'inspecteur d'objets Delphi n'affiche pas les propriétés supplémentaires de TFrame descendants par conception. Les gens ont tendance à suggérer d'utiliser une astuce connue qui est couramment utilisée pour afficher les propriétés du descendant de TForm dans l'inspecteur d'objets. L'astuce est: l'enregistrement module personnalisé pour les descendants TForm à Delphi IDE par paquet de temps de conception comme:Affichage des propriétés supplémentaires du descendant de TFrame sur l'inspecteur d'objets
RegisterCustomModule(TMyFrame, TCustomModule);
L'inspecteur d'objets peut présenter des propriétés supplémentaires de l'instance de l'TFrame Descendant de cette façon, mais il perd ses comportements de cadre alors qu'il est intégré dans un formulaire. Non redessinable, impossible d'implémenter des événements pour ses sous-composants et il accepte les contrôles enfants (ce qu'il ne doit pas être). Mais il se comporte normalement dans sa propre zone de conception.
Apparemment, ces comportements fournis par Delphi IDE spécialement pour TFrame. Ils ne sont pas des installations génériques.
Existe-t-il un autre moyen d'y parvenir sans perdre les comportements de trame?
J'utilise Delphi 2007
@Tondrej,
Lire les commentaires pour le problème, merci d'avance.
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, je havn't cadres utilisés depuis un certain temps, parce que je pense qu'ils ne valent pas la peine. Mais je vais essayer celui-ci. –