Newsgroup: it.comp.lang.delphi
Titolo: [D6/K2] Creazione Child Form Non MDI

C'č modo di inserie a runTime una form (graficamente) 
all'interno di un'altro componente contenitore (es. Panel,ScrollBox,...)
cosě come si fa assegnado la proprieta' parent di un altro 
qualsiasi componente visuale (es. Button,Label,Panel,...)
io ho scritto questo codice:
        FormChild := TFormChild.Create(Application);
        With FormChild do
        Begin
          BorderStyle := fbsNone;
          Parent := PanelChildForms;
          Align := alClient;
          Show;
        End;
il formChild lo crea ma allo show lo piazza in (0,0)
dello screen :( e non dentro il PanelChildForms.
Forse mi aspetto qualcosa che non si puň fare,
se non con un po piů di codice?
	Ciao
	MassimoB
 

 all'interno di un'altro componente contenitore 
...
...
protected
  procedure CreateParams(var Params: TCreateParams); override;
  procedure Loaded; override;
...
...
procedure TChildForm.CreateParams(var Params: TCreateParams);
Begin
  inherited CreateParams(Params);
  // devi impostare lo stile WS_CHILD nella proprietà Params.Style.
  Params.Style := Params.Style or WS_CHILD;
end;
procedure TChildForm.Loaded;
begin
  inherited;
  align := alClient;
  BorderStyle := bsNone;
  BorderIcons := [];
  Parent := NewParent; // ASSEGNA QUI IL PARENT.....
  Position := poDefault;
end;
Acqua
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 se non con un po più di codice?
Con CLX così non funziona... con la VCL ti basta settare il parent.
Dovresti provare con qualche chiamata diretta all'API Qt per risolvere
questa cosa, credo che il problema non sia della libreria grafica ma forse
qualcosa ancora non al 100% in CLX...
Ciao :-)
--
Andrea /\/\agni
ICQ#: 174108000

A prescindere dal funzionamento, xche non usi un frame?
Bye
A

 end;
completo quanto sritto sopra...
Definizione della form...
type
  TChildForm = class(TForm)
  private
    FTempParent: TWinControl; 
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure Loaded; override;
  public
    constructor Create(AOwner: TComponent; AParent: TWinControl);
reintroduce; overload;
  end;
implementation
procedure TChildForm.CreateParams(var Params: TCreateParams);
Begin
  inherited CreateParams(Params);
  // devi impostare lo stile WS_CHILD nella proprietā Params.Style.
  Params.Style := Params.Style or WS_CHILD;
end;
procedure TChildForm.Loaded;
begin
  inherited;
  align := alClient;
  BorderStyle := bsNone;
  BorderIcons := [];
  Parent := FTempParent; // E QUI CAMBI IL PARENT.....
  Position := poDefault;
end;
constructor TChildForm.Create(AOwner: TComponent; AParent: TWinControl);
begin
  FTempParent := aParent; //ASSEGNA QUI IL PARENT.....
  inherited Create(AOwner);
end;
Cosė dovrebbe essere pių chiaro...


 Dovresti provare con qualche chiamata diretta all'API Qt per risolvere
Trovata:
var
  pp: TPoint;
begin
  pp := Point(0,0);
  QWidget_reparent(Form2.Handle, Form1.Panel1.Handle, 0, @pp, True);
HTH, :-)


end;
prima di tutto grazie per la risposta velocissima :D
avevo appena fatto le stesse modifiche identiche modifiche ;)
ma al check della sitassi mi dice che non 
riesce a trovare TCreateParams ...
infatti e' solo VCL ed in più andando a vedere le classi
di QForms [D6/K2], equivalente CLX di Forms, non trovo neanche
il metodo CreateParams di cui chiami l'Override; e poi l'Inherited.
hai una maniera per aggirare il problema su CLX? :(
	Ciao
	MassimoB
 

> hai una maniera per aggirare il problema su CLX? :(
Oooops... Non avevo notato il K2 nel subject..... :)


Rispondo a Alessandro e Andrea, e per tutti i lettore del NG:
grazie a tutti ... ci sono riuscito
ho unito il metodo di Alessandro
all'attentissima informazione di Andrea
e ne ho prodotto un metodo Create CLX compatibile
per una ChildForm del tipo proposto nel Thread.
type
  TChildForm = class(TForm)
  .....
  public
    { Public declarations }
    Constructor Create(AOwner: TComponent; 
        AParent: TWidgetControl); reintroduce; overload;
  .....
implementation
.....
constructor TFormChild.Create(AOwner: TComponent; 
                        AParent: TWidgetControl);
var
  pp: TPoint;
begin
  inherited Create(AOwner);
  pp := Point(0,0);
  QWidget_reparent(Self.Handle, 
                             AParent.Handle, 
                             0, 
                             @pp, 
                             Self.Visible);
end;
......
La mia domanda ha avuto risposta e sono molto contento. :D
L'unico problemino che ho riscontrato è che la proprietà 
Align del ChildForm non funziona ... :( 
quindi adesso mi tocca capire come fare a intercettare dal ChildForm
quando il suo parent ha un resize ...
	Ciao
	MassimoB
 

quando il suo parent ha un resize ...
il metodo create corretto per evitare questo errore è:
constructor TFormChild.Create(AOwner: TComponent; AParent: TWidgetControl);
var
  pp: TPoint;
begin
  inherited Create(AOwner);
  Parent := AParent;
  pp := Point(0,0);
  QWidget_reparent(Self.Handle, Parent.Handle, 0, @pp, Self.Visible);
end;
mi ero scrodato di assegnare il parent del form
in questa maniera la prop Align, ovviamente o quasi, è tornata
a funzionare ...
graze ancora a tutti :)
	Ciao
	MassimoB
 

A prescindere dal funzionamento, xche non usi un frame?
ora nelle mie applicazioni sto usando correttamente i frames 
ma qualche tempo fa non li usavo ed andavo a form ... 
oppure mi costruvio dei ComponentTemplates ...
(eh la gioventù ;) )
volevo solo vedere se potevo riutilizzare al volo 
un paio di form che avevo già "bell'e'fatti" ...
passare questi form in frames 
(operazione sicuramente più corretta),
avrebbe richiesto un pò di tempo che al momento
non ho. :(
Poi non capivo perchè Borland avesse lasciato
le proprietà parent e align quando TForm
non poteva essere usato con un parent ...
cosa che ovviamente adesso è più chiara ...
è un Bugghettone CLX ;) [D6/K2] che Andrea
mi ha aiutato a "Risolvere".
	Ciao
	MassimoB
 


    Via De Gasperi, 14 - 42019
    Scandiano (Reggio Emilia)