Anche se la risposta di David è anche molto corretta, ho pensato di prendere un momento ed entrare in ulteriori dettagli. A quanto sembra, sembra che tu sia molto nuovo con Delphi. C'è un problema molto comune con i principianti, che David non affronta nella sua risposta, relativo alla creazione e alla liberazione di questi oggetti. Ogni volta che chiami "Crea" in una classe, ad un certo punto, quando hai finito, devi anche "Liberare" quella classe. La mancata liberazione di qualcosa comporterà una perdita di memoria e nessuno la vorrà. Liberare è semplice quanto creare - finché non si entra nel tema di tenere una lista di oggetti (di cui non hai bisogno in questo momento).
Supponiamo di voler creare una casella di testo (TEdit
) e posizionarla al centro del modulo. Ora, prima di tutto, l'IDE Delphi ti consente di rilasciare semplicemente questi controlli nel modulo, assicurandoti solo che tu lo sappia. Non devi necessariamente crearli/liberarli da soli, a meno che non ci sia uno scenario speciale. Ma farlo è pericoloso. Per questo esempio, supponiamo che questo controllo TEdit
sarà lì per l'intera durata della tua applicazione.
In primo luogo, è necessario dichiarare una variabile da qualche parte per questo controllo. Il posto più ragionevole per questo è all'interno della classe in cui verrà utilizzato (in questo caso, il modulo che chiameremo Form1
). Quando lavori con variabili (anche Fields) nel tuo modulo, assicurati di non mettere nulla sopra la sezione private
. Tutto sopra private
è inteso per codice generato automaticamente da Delphi per tutto ciò che è stato rilasciato (ed è visivo) nel modulo. In caso contrario, qualsiasi elemento creato manualmente deve passare a private
o a public
. L'area public
sarebbe un buon posto per il vostro controllo ...
type
TForm1 = class(TForm)
private
public
MyEdit: TEdit;
end;
Ora che è dichiarato, dobbiamo creare (e gratuito) di esso. È una buona pratica che ogni volta che crei qualcosa, che tu inserisca immediatamente il codice per liberarlo prima di continuare a lavorare. Crea un gestore di eventi per gli eventi OnCreate
e OnDestroy
del tuo modulo ...
procedure TForm1.FormCreate(Sender: TObject);
begin
MyEdit:= TMyEdit.Create(nil);
MyEdit.Parent:= Self;
MyEdit.Left:= (ClientWidth div 2) - (Width div 2);
MyEdit.Top:= (ClientHeight div 2) - (Height div 2);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if assigned(MyEdit) then MyEdit.Free;
end;
Se non si crea l'oggetto (prima creazione o dopo la distruzione), allora si otterrà un "violazione di accesso" quando si tenta di usarla. Questo perché l'applicazione tenta di accedere a un'area della memoria del computer che non è allocata o non corrisponde al tipo che si intende ottenere.
Bene, questo è il punto di partenza per sistemare il tuo scenario. Comunque un'altra cosa da mostrarti. Supponiamo che tu debba semplicemente creare un oggetto per un breve periodo, per la durata di una procedura. C'è un approccio diverso per questo. Nel tuo codice sopra, hai dichiarato la tua variabile direttamente all'interno della procedura. Questo esempio mostra quando è necessario farlo ...
procedure TForm1.Button1Click(Sender: TObject);
var
MyObject: TMyObject;
begin
MyObject:= TMyObject.Create;
try
MyObject.DoSomething;
Caption:= MyObject.GetSomething;
finally
MyObject.Free;
end;
end;
Vedete, finché MyObject
saranno utilizzati solo in questo una chiamata a questa procedura, quindi è possibile dichiarare qui. Ma se ci si aspetta che l'oggetto rimanga in memoria dopo che questa procedura è terminata, allora le cose si complicheranno. Di nuovo, nel tuo caso, continua a metterlo nella classe del form fino a quando non avrai più familiarità con la creazione dinamica di oggetti.
Una nota finale, come già detto, consente di posizionare il controllo TEdit
direttamente sul modulo in fase di progettazione senza scrivere il proprio codice. Se lo fai, ricorda di NON provare a creare o liberare questi. Questo è anche il caso in cui Delphi inserirà automaticamente il codice sopra la sezione private
- è quando c'è qualcosa con cui non dovresti giocare.
Questo ha fatto il trucco David. Ora dovrò solo studiare come questo può influenzare poche altre cose come, una serie di tpanel, ecc. Grazie mille! –
@DimitrisNats Gli array di controlli vengono gestiti in modo simile. Hai solo bisogno di un campo della tua classe del tipo appropriato, ad es. 'FPanel: array di TPanel'. –