Newsgroup: it.comp.lang.delphi
Titolo: Frame qualcosa non torna

ho provato l'esempio di Marco B. , e non ha problemi, i Frame
quando visualizzati sono visualizzati , nel modo atteso.
ho creato un semplice esempio
1 Form (con 1 TreeMenu e 1 Panel)
1 Frame (chiamato TCustomPageFrame) da New-Other-Delphi Files-Frame
1 Frame (chiamato StartPageFrame senza alcun componente
   al suo interno)
il test funziona , ma se chiudo D2006 , lo riapro ho dei problemi:
dal menu ViewForm visulizzo StartPageFrame, ottengo degli errori
error Reading StartPageFrame.ParentColor
property ParentColor does nor exists)
error Reading StartPageFrame.TabOrder
property TabOrder does nor exists)
error Reading StartPageFrame.TabStop
property TabStop does nor exists)
a questo punto vedo il frame come se fosse un normale form
se provo ad eseguire ho eccezione
.. class EReadeError with message
Property Client Height does not exists
aiutatemi a capire il problema, grazie
Maurizio
// Form Base
... uses unt_CustomPageFrame;
...
implementation
uses unt_Start;   // il Frame StartPageFrame
type
  Tfrm_Base = class(TForm)
    TreeView1: TTreeView;
    Splitter1: TSplitter;
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
  strict private
    { Private declarations }
    FCurrentPage: TCustomPageFrame;
  public
    { Public declarations }
    procedure LoadPage(APageClass: TPageFrameClass);
  end;
procedure Tfrm_Base.LoadPage(APageClass: TPageFrameClass);
begin
  // Verifica che il riferimento alla "metaclasse" sia valido
  if APageClass = nil then
    Exit;
  // Verifica che la pagina richiesta sia differente da quella attuale
  if FCurrentPage <> nil then
    if FCurrentPage.ClassType = APageClass then
      Exit;
  // Distrugge l'istanza della pagina esistente
  if FCurrentPage <> nil then
    FreeAndNil(FCurrentPage);
  // Crea un'istanza della pagina richiesta
  FCurrentPage := APageClass.Create(Self);
  try
    // Dispone la pagina all'interno del pannello contenitore
    FCurrentPage.Parent := Panel1;
    // Forza la pagina ad occupare lo spazio disponibile
    FCurrentPage.Align := alClient;
  except
    // Distrugge la pagina in caso di errore imprevisto
    FreeAndNil(FCurrentPage);
    // Risolleva l'eccezione per consentire al gestore predefinito
    // di visualizzare il "classico" messaggio
    raise;
  end;
end;
// Frame Custom
type
  TCustomPageFrame = class(TFrame)
  strict private
    { Private declarations }
  strict protected
    { Protected declarations }
    function GetDescription: string; virtual;
    function GetTitle: string; virtual;
  public
    { Public declarations }
    property Description: string read GetDescription;
    property Title: string read GetTitle;
  end;
  // Class type declaration
  TPageFrameClass = class of TCustomPageFrame;
// frame StartPage
uses .....unt_CustomPageFrame;
type
  TStartPageFrame = class(TCustomPageFrame)
  private
    { Private declarations }
  strict protected
    { Protected declarations }
    function GetDescription: string; override;
    function GetTitle: string; override;
  public
    { Public declarations }
  end;

 il test funziona , ma se chiudo D2006 , lo riapro ho dei problemi
Come hai creato i Frame discendenti? Non avrai mica modificato il codice 
a mano, vero? ;-)
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

> a mano, vero? ;-)
l'ho fatta grossa eh ? :-(
ma come dovrei fare , dopo la scelta del Frame ottengo
type
  TFrame1 = class(TFrame)
  private
    { Private declarations }
  public
    { Public declarations }
  end;
se volessi far ereditare a TFrame1 TCustomPageFrame non posso
modificare "a mano" ?
  TFrame1 = class(TFrame) in TFrame1 = class(TCustomPageFrame)
Maurizio

 modificare "a mano" ?
No, devi usare il menu [File|New|Other...], selezionare la pagina che 
corrisponde al nome del progetto, scegliere il Frame che vuoi utilizzare 
come base, assicurarti che la voce "Inherit" sia selezionata e premere 
il pulsante di conferma.
Delphi genererà una unit appropriata ma, soprattutto, un file DFM 
corretto, cosa che non ottieni intervenendo manualmente sul codice di un 
nuovo Frame qualsiasi.
In effetti, nell'articolo non c'è scritto nulla a riguardo, forse perché 
  dà troppo per scontato che si abbia una certa dimestichezza nell'uso 
di Form e di Frame e nella loro ereditarietà attraverso la VFI (Visual 
Form Inheritance) di Delphi; invece, molto spesso l'articolo viene preso 
proprio come spunto per iniziare a comprendere e sfruttare i vantaggi 
della VFI, quindi sarebbe più opportuno modificare il testo inserendo 
anche le istruzioni di cui sopra. Tu che dici? :-)


> anche le istruzioni di cui sopra. Tu che dici? :-)
non sarebbe una cattiva idea, cosi' altri come me eviterebbero di incappare
in simili errori.
counque ho provato la VFI ed ora il progetto test, va bene , e non
inconvenienti, grazie per i chiarimenti.
Maurizio