Newsgroup: it.comp.lang.delphi
Titolo: Frame

Per un pannello di immissione dati, uso un frame che devo riutilizzare anche 
altrove. Nel frame ho definito delle azioni in caso di eventi come OnClick, 
etc. in alcuni dei componenti (per esempio, TEdit). Ma come si fa a nei 
moduli dove uso il frame a ereditare gli eventi assegnati nel frame a questi 
componenti ? 
 
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

 componenti ? 
 
 
Il frame dovrebbe essere per quanto possibile autoconsistente, esponendo magari qualche evento (ma non troppi) per comunicare al suo parent e/o owner che è successo qualcosa.
 
A.

"Alberto Salvati"  ha scritto nel messaggio 
news:7bc5e290-2f40-4d7c...@googlegroups.com...
Il frame dovrebbe essere per quanto possibile autoconsistente, esponendo 
magari qualche evento (ma non troppi) per comunicare al suo parent e/o owner 
che č successo qualcosa.
----
Ho pensato di usare i frames, perchč si tratta di una serie di edit per la 
immissione di dati che devo riproporre in piů moduli, ma non so bene come 
funzionano. Nel frame che ho creato ho messo due eventi OnClick che azzerano 
l'eventuale testo contenuto in due edit. Poi ho creato un form nel quale ho 
messo il frame, ma l'OnClick č vuoto. Come faccio nel form parent a indicare 
questi due eventi che nel frame ci sono ? 
 
 
---
Questa e-mail č stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

 ma l'OnClick č vuoto. 
 
Continuo a non capire.
 
A.

 1) mai crearli a designtime ma sempre a runtime
 
Come mai questo consiglio? 
 
Io ho usato diverse volte i frame nei miei progetti e non mi hanno mai creato 
grossi problemi mettendoli a design time come qualunque altro controllo.
In alcuni casi ne ho messi persino su form che sono poi state ereditate.
 
Tu hai riscontrato problemi di instabilita' nell'IDE o altri tipi di 
problemi ?
 
 
 
ciao
Giacomo

Nessuna instabilità, tutt'altro.
 
Io ho contesti nei quali un form che fa da ancestor per altri form crea fino a 4 diversi frame alcuni dei quali a loro volta creano altri frame.
Il tutto in contesti nei quali alcuni frame sono utilizzati da DIVERSI FILE EXE (a volte anche DLL...)
 
Se:
 
1) li metti a designtime 
 
2) DOPO cambi qualcosa nel frame a livello di DFM (non di codice), basta anche rinominare un componente e/o la rimozione di qualcosa
 
3) da IDE non hai tutti i form che usano il frame APERTI in quel momento
 
se compili ed esegui,  i messaggi che l'ide ti mostrerebbe (component blabla not found  etc) sono ECCEZIONi se non erro da TFiler o similare.
..e vatti poi a ricordare che hai toccato un frame..
 
Crearli a runtime ti evita tutto ciò.
 
 
A.

 Crearli a runtime ti evita tutto ciò.
 
Ah, si e' vero. Ma non e' una cosa specifica dei frame, questo stesso 
problema ce l'hai anche se derivi le form. 
 
ciao
Giacomo
 

 problema ce l'hai anche se derivi le form. 
 
 
Si, ma il modo in cui GESTISCI la modifica è diverso.
 
Se modifichi un form ANCESTOR ti viene quasi automatico andare a beccare i discendenti ed aprirli.
A quel punto l'ide di dice "component blabla nont found etc". 
TU rispondi "elimina", ti sposti nel .pas fai una modifica scema e salvi.
 
En passant, hon ho mai capito come mai questo bug oramai piu' che ventennale non è mai stato risolto.
 
Form A è ancestor di  Form B
Togli un componente da form A mentre form B non è aperto nell'IDE.
Apri form B
L'ide ti dice "component blabla non found. Remove, leave etc??"
Tu rispondi REMOVE.
Salvi. Chiudi. 
Lo riapri e l'ide ti chiede un altra volta "component blabla non found. Remove, leave etc??"...
 
Quindi dopo aver risposto remove ti tocca:
andare nel punto pas 
dare anche solo un invio
salvare. 
 
A quel punto l'ide capisce che il file è stato modificato e lo salva correttamente.
...va be..uno lo sa e si adatta... :-)
 
 
Se hai modificato un frame incluso a designtime in 50 form NON IN GERARCHIA, ti tocca prima di tutto trovare tutti i posti dove è usato, poi toglierlo e rimetterlo...
 
Creandoli a runtime tutto sto casino te lo eviti.
POi, mea culpa, sono stato troppo "drastico" e me ne scuso.
Avrei dovuto specificare che CONSIGLIO di crearli sempre a runtime. :-|
 
 
A.

 a questi componenti ?
 
Dopo che ti ha risposto Alberto, direi che sei gia' a posto.
 
Comunque, per cronaca, ti riporto parte delle mie casistiche.
Mi e' capitato nell'uso dei frame in piu' form di avere necessita' diverse 
dai controlli inseriti all'interno dei frame.
Per esempio usando il tuo frame, in una form puo' andar bene che alla 
pressione di enter altri 2 edit cancellino il testo, mentre in un'altra form 
oltre che a cancellare il testo di quei 2 edit devi riempire una lista.
In questo caso all'interno della form dove viene inserito il frame ti crei 
una procedura da agganciare al componente del frame.
 
In pratica (mi scuso con tutti per l'alta artiginalita' della soluzione) :
 
unit Frame_Test
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, AdvEdit,
  Vcl.ExtCtrls, AdvPanel, Vcl.Mask;
 
type
  TFrameTest = class(TFrame)
    Edt1: TEdit;
    Edt2: TEdit;
    Edt3: TEdit;
 
  private
    { Private declarations }
 
  public
    { Public declarations }
 
    constructor CreateNew(AOwner: TComponent)
    destructor Destroy; override;
 
  end;
 
implementation
 
{$R *.dfm}
 
constructor TFrameTest.CreateNew(AOwner: TComponent)
begin
  inherited Create(AOwner);
  Edt1.Text:='Ciao';
  Edt2.Text:='Ciao';
  Edt3.Text:='A Riciao'
end;
 
destructor TFrameProdotti.Destroy;
begin
  inherited;
end;
 
end.
 
Nella tua form da qualche parte in qualche procedure
 
Procedure TForm1.Bho;
Var FT     : TFrameTest;
Begin
    // come ha suggerito Alberto il frame si genera in runtime
   FP:=TFrameProdotti.CreateNew(nil);  // Mettendo nil poi lo liberi tu ....
   // Gli diamo un nome
  FP.Name:='FP1';
  // Hai creato il frame, dove lo metti ??? se per esmpio hai un pannello lo 
inserisci li con
  FP.Parten:=TPanel1; // Adesso il tio frame e' dentro al pannello
  FP.Align:=AlClient; // Ha preso le dimensioni del pannello
  // Adesso diciamo cosa devi fare se premi enter nel primo edit
  FP.Edt1.OnChange:=FaiQualcosa; // Quando nell'edti il testo cambia parte 
questa pricedura
  FP.Edt1.OnKeyPress:=TastoPremuto; // Se premi un tasto nell'edit parte 
quest'altra procedura
End;
 
nella parte private della tua form avrai definito
 
    procedure FaiQualcosa(Sender: TObject);
    procedure TastoPremuto(Sender: TObject; var Key: Char);
 
Dove
 
Procedure TForm1.FaiQualcosa(Sender: TObject);
var FT : TFrameTest;
begin
   if (Sender is TEdit) then
   begin
     // Prendo il frame di appartenenza
     FT:=(((Sender as TEdit).Parent) as TFrameTest);
     // In FP hai il frame dove si trova l'edit in cui devi fare qualcosa.
    // Ovvero se hai 10 frame e hai cambiato il testo nel frame 5, in FP hai 
il frame 5
    FT.Edt1.Text:='In questo Frame ho questo testo';
    FT.Edt2.Text:='Nuovo ciao';
    FT.Edt2.Text:='Questa procedura si chiama ogni volta che il testo in 
EDT1 e'' cambaito';
   end;
end;
 
analogamente
 
procedure TForm1.TastoPremuto(Sender: TObject; var Key: Char);
var FT : TFrameTest;
begin
   if (Sender is TEdit) then
   begin
     if Key=#13 then
     begin
        FT:=(((Sender as TEdit).Parent) as TFrameTest);
        // Ho premuto enter passo il controllo sul secondo edit
        ActiveControl:=FT.Edit2;
   end;
end;
 
Questo a grandi linee ... poi, come dice Alberto, devi metterci del tuo 
magari partendo da qui (c'e' un po di tutto)
 
http://delphi.about.com/od/delphitips2007/qt/tframe_oncreate.htm
 
http://www.delphisources.ru/pages/faq/master-delphi-7/content/LiB0084.html
 
http://stackoverflow.com/questions/10608823/delphi-tframe-create-destroy
 
 
Spero di aver capito la tua necessita'
 
Ciao
 
Daniele
 

"Daniele"  ha scritto nel messaggio news:najstt$44e$1...@gioia.aioe.org...
Spero di aver capito la tua necessita'
Ciao Daniele
---
Hai capito benissimo e finalmente qualcuno mi ha fatto capire. Mi sono letto 
abbastanza sulle frames, ma quando vado nella pratica, poi mi accorgo che ci 
sono cosa che non so fare. Grazie. 
