PDA

Visualizza la versione completa : Settare valori di un Frame da Form.OnCreate


VaLvOnAuTa
03-05-2006, 19:07
Dopo esser riuscito a creare la struttura a pagine, sto affrontando un altro problema.
Una delle pagine contiene dei campi edit. Volevo, all'avvio del main form, mettere dei valori in quei campi (prendendoli ad esempio da un file .ini)
Pare che non posso accedere direttamente ai componenti quindi ho pensato di aggiungere una procedura pubblica alla classe che lo facesse

type

TConfigPageFrame = class(TCustomPageFrame)
Panel1: TPanel;
GroupBox1: TGroupBox;
Label1: TLabel;
Edit_IP: TEdit;
Label2: TLabel;
Edit_Port: TEdit;
CB_Connect: TCheckBox;
CheckBox1: TCheckBox;
Button1: TButton;
protected
function GetTitle: string; override;
public
procedure SetIP(value: string);
end;La funzione non fa altro che assegnare un valore al Text dell'Edit_IP. Ma ovviamente mi da errore di access violation. E' possibile accedervi o si deve settare direttamente dalla classe quando viene istanziata? E se si, come accedo all'evento della creazione della classe?

smt
03-05-2006, 21:12
se ho capito bene puoi usare l'evento onCreate della form, ma forse lo saprai già... comunque l'access violation deve essere dovuto a qualcosa d'altro.
tieni presente che una acces violation aviene quando tenti di accedere ad un oggetto che in quel momento è nil. esegui passo passo il programma, metti un break poin sull'istruzione che genera errore, e con l'inspector verifica quale oggetto non è + presente...

alka
03-05-2006, 22:39
Mi unisco alla discussione per aggiungere altre informazioni a quanto è stato detto.

Se stai utilizzando una "logica a pagine", battezziamola così, occorre tenere presente che qualsiasi implementazione specifica delle classi che discendono dalla pagina generica non è visibile al livello di MainForm se tu usi un riferimento che appartiene al tipo della pagina generica: devi fare un cast.

In ogni caso, devi assicurarti che la pagina venga creata, cioè il Frame venga istanziato, prima di poterne richiamare i metodi.

La parte di codice che hai postato, in questo caso, mi sembra ok. Devi verificare cosa accade e qual è la situazione nel momento in cui invochi il metodo.

Ciao! :ciauz:

VaLvOnAuTa
04-05-2006, 09:42
Ero certo del fatto che non potevo accedere alle proprietà di un frame se questo non era stato ancora creato, per questo chiamo la funzione di assegnazione dopo l'istanziamento del frame.

Nella unit del Frame la funzione è questa:
procedure TConfigPageFrame.SetIP(value: string);
begin
Edit_IP.Text := value;
end; Mentre nel mainform il codice dell'evento oncreate è questo:
procedure TMain.FormCreate(Sender: TObject);
begin
LoadPage(TConfigPageFrame);
ConfigPageFrame.SetIP('172.23.2.7');
end;Però in fase di esecuzione mi da errore sull'istruzione di assegnazione del valore all'Edit_IP (che dovrebbe essere stato già creato, o no?)

alka
04-05-2006, 09:49
Dove viene valorizzata la variabile ConfigPageFrame?

VaLvOnAuTa
04-05-2006, 10:08
Originariamente inviato da alka
Dove viene valorizzata la variabile ConfigPageFrame? :dhò: :dhò: :dhò:

Hai ragione. Allora come faccio ad accedere alla proprietà del frame una volta caricato nel TPanel?

alka
04-05-2006, 10:13
Originariamente inviato da VaLvOnAuTa
Hai ragione. Allora come faccio ad accedere alla proprietà del frame una volta caricato nel TPanel?
Quando "carichi" il Frame, cioé ne crei un'istanza, dovrai pur memorizzare il riferimento all'oggetto creato in qualche variabile, no? :stordita:

Attraverso quel riferimento, puoi chiamare il tuo metodo.

VaLvOnAuTa
04-05-2006, 10:21
Originariamente inviato da alka
Quando "carichi" il Frame, cioé ne crei un'istanza, dovrai pur memorizzare il riferimento all'oggetto creato in qualche variabile, no? :stordita:

Attraverso quel riferimento, puoi chiamare il tuo metodo. :zizi: Grazie, sei stato illuminante.

TConfigPageFrame(FCurrentPage).Edit_IP.Text := '172.23.2.7';

alka
04-05-2006, 11:00
Se la porzione di codice che "carica pagine" è valida anche per altri tipi di Frame che discendono dalla classe base rappresentante la pagina generica, e devi eseguire inizializzazioni in base al tipo specifico di pagina che crei, usa eventualmente l'operatore is per verificare che la classe della pagina selezionata per il caricamento sia quella corretta, prima di procedere con un "casting" forzato.

In alternativa, potresti prevedere l'introduzione di un metodo nella classe base, tipo InitializeControls o qualcosa del genere, che faccia l'inizializzazione dei controlli della pagina caricata, da richiamare ogni volta che crei l'istanza di un Frame relativo ad una pagina.

Ciascuna pagina può ridefinire questo metodo con override per "personalizzare" le inizializzazioni da compiere.

Questo è un chiaro esempio dei vantaggi della OOP applicati in un ambito specifico che è quello dell'interfaccia utente, e rivela tutta la sua potenza e manutenibilità.

Ciao! :ciauz:

VaLvOnAuTa
04-05-2006, 12:12
Correggimi se sbaglio, in alternativa al controllo che mi hai suggerito (onde evitare un casting errato) si può usare anche
(FCurrentPage as TConfigPageFrame).Edit_IP.Text := '172.23.2.7';. Giusto?

Loading