Newsgroup: it.comp.lang.delphi
Titolo: comunicazione Form Figlio-Padre

mettiamo di avere 2 Form non MDI
unit1 - padre e unit2 - figlio ereditato da Form1,
indicando nelle Uses della unit2 la unit1, posso
chiamare un metodo della classe TForm1, oppure
abilitare voci di un menu.
// unit Padre
//-----------
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, Buttons, ExtCtrls, ComCtrls;
type
  TForm1 = class(TForm)
....
  private
    { Private declarations }
    function LeggeTesto:String;
    procedure ScriveTesto(STesto:String);
  public
    { Public declarations }
    property Testo:String read LeggeTesto write ScriveTesto;
  end;
var
  Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
// Unit Figlio
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit1, Menus, StdCtrls, Buttons, ExtCtrls, ComCtrls;
type
  TForm2 = class(TForm1)
    Button2: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
 ..........
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.FormClose(Sender: TObject);
begin
  inherited;
  Form1.B1.Enabled:=True;
end;
Il compilatore non segnala riferimenti circolari , e in apparenza
non ci sono problemi.
Form2 e' ereditato tramite VFI da Form1.
Il mio dubbio e' Una dichiarazione come questa Form1.B1.Enabled:=True;
che va ad ubilitare una voce sel menu presente in Form1, e' perfettamente
lecita ?
Lo spunto mi e' venuto da "about.delphi" leggendo in merito al
subclassing.
Maurizio 

 lecita ?
Assolutamente no. Un brutto viziaccio di Delphi è quello di incoraggiare
una pessima tecnica, ovvero l'uso di variabili globali. La prima cosa da
fare, quando si crea una form, è cancellare quella maledetta dichiarazione
di variabile (Form1, Form2, ecc...) che Delphi genera appena prima
dell'implementation, nella unit della form. Non bisogna *MAI* fare
riferimento esplicito a quelle istanze. Bisogna *SEMPRE* ricordarsi che
una form è una classe. Nel tuo caso, la cosa si aggrava, perché TForm2 è
derivata da TForm1, quindi in quel codice stai semplicemente andando a
impostare una proprietà di un componente appartenente alla (maledetta)
istanza predefinita della form padre. Dubito molto sia quello che vuoi
fare.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

> fare.
Ho fatto una prova,eliminando la variabile Form2 dalla unit2
posso creare un Form a runtime riferendomi a formClass.
  RifForm:=unit2.TForm2;
  FormTest:=RifForm.Create(Self);
Per riabilitare invece un Button presente in Form1, solo se
chiamo esplicitamente unit1.Form1 posso accedere a Button1;
se faccio riferimento ad una variabile FormClass o ad una TForm
non vedo il Button
unit Unit1;
interface
uses ....
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    RifForm:TFormClass;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var FormTest:TForm;
begin
  Button1.Enabled:=False;
  RifForm:=unit2.TForm2;
  FormTest:=RifForm.Create(Self);
  FormTest.Show;
end;
unit Unit2;
interface
uses ............
type
  TForm2 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    RifForm1:TFormClass;
    RifForm:TForm;
  public
    { Public declarations }
  end;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // riabilita il pulsante
  RifForm1:=unit1.TForm1;
  RifForm:=unit1.Form1;
  // solo cosi' vedo il componente TButton
  unit1.Form1.Button1.Enabled:=True;
  //RifForm1.ClassName
end;
end. 

 chiamo esplicitamente unit1.Form1 posso accedere a Button1;
Come già detto, non devi *mai* fare uso di quelle variabili globali.
Fatti un favore: distruggile.
C'è una cosa che non capisco: se hai ereditato, come dici, TForm2 da
TForm1, questo bottone che vuoi riabilitare dovrebbe già esserci, su
TForm2, quindi dovresti poterci accedere direttamente. Dov'è il problema?
