Newsgroup: it.comp.lang.delphi
Titolo: creare un componente a runtime

E' possibile creare a runtime dei componenti come ad esempio un TPowersock??
Ad esempio se volessi fare una semplice form vuota con un pulsante che,
cliccandoci sopra, ne crea uno che comando devo inserire?
GRAZIE CIAO!!!!!!!!!!!

 cliccandoci sopra, ne crea uno che comando devo inserire?
Certo che puoi farlo, come qualsiasi oggetto che sia un'istanza di una
classe delphi.
Però prima devi :
1) Definire una variabile del tipo richiesto o nella sezione public della
form o nella sezione var della interface, o nelle var della procedura
OnClick, in funzione della visibilità che il componente dovrà avere.
Ad esempio :
var
    PSock :TPowerSock;
2) nella OnCLick
PSock := TPowerSock.Create(Self);
In questo caso, 'Self' si riferisce alla form sottostante, che diventa così
il 'proprietario' (Owner) del componente.
3) Dopo averlo utilizzato, e comunque prima di uscire dal programma,
ricordati di 'liberarlo' (o di 'friarlo', come direbbe Dario....) con una
semplice
PSock.Free;
Commento.
E' pericoloso (o meglio, poco bello) creare componenti in seguito ad una
OnClick.
Quantomeno dovresti, una volta premuto, disabilitare il pulsante per evitare
di ricreare un nuovo componente ad ogni pressione del tasto, oppure
verificare prima di crearlo che non lo sia già (con la classica 'if not
Assigned(PSock) then ....').
A meno che nella onclick tu possa crearlo, utilizzarlo e poi liberarlo, nel
qual caso è tutto ok.
Molto meglio sarebbe utilizzare gli eventi OnCreate & OnClose della Form,
dai quali puoi creare e distruggere tutti i componenti che vuoi, dato che i
due eventi avvengono sicuramente una sola volta (nel caso di form normali, e
non MDI).

 cliccandoci sopra, ne crea uno che comando devo inserire?
Basta aprire le FAQ, e leggere la domanda 3.2

cliccandoci sopra, ne crea uno che comando devo inserire?
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs,
  StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure MyClick(Sender: TObject);
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.MyClick(Sender: TObject);
begin
  ShowMessage('Ciao sono un bottone appena nato !');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  B: TButton;
begin
  B := TButton.Create(Self);
  B.Parent := Self;
  B.Caption := 'PREMIMI !';
  B.Left := Button1.Left;
  B.Top := Button1.Top + Button1.Height +
           Button1.Height div 2;
  B.OnClick := MyClick;
end;
end.
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]


[CUT]
Domanda: Non viene liberato dal form quando viene terminata
l'applicazione?

 l'applicazione?
si, ma sarebbe buona abitudine lasciare eliminare al form quel che lui ha
creato (ovvero gli oggetti creati a designtime) e che sia tu a gestire la
memoria degli oggetti che hai creato dinamicamente.
Molte persone pensano di lasciare memoria allocata tanto "Quando
l'applicazione termina poi Windows o chi per lui ripulisce tutto", è un modo
di pensare errato.
Nello specifico si tratta di un componente per le Socket, ovvero la
comunicazione di Rete ... immagina un processo Server che non deve terminare
... chi la libera quella memoria? :-)
--
- Carlo -
c.b...@libero.it

... chi la libera quella memoria? :-)
Non l'ho capita...


 Non l'ho capita...
Immagina un processo che *non* deve terminare, ma deve restare in ascolto di
dati per mesi o per anni (un processo Server, ad esempio) ... se tu non
liberi esplicitamente l'oggetto allocato esso occuperà memoria fisica (che
risulterebbe così inutilizzabile dagli altri processi) finchè il processo
non termina ... ma se il processo non deve terminare tieni memoria allocata
inutilmente?


inutilmente?
Non capisco che razza di esempio e'...
In quali occasioni tu crei talmente tanti oggetti in anni di
lavoro da far risiedere (o comunque agganciare) a un form ?
La memoria non e' allocata *inutilmente*, e' allocata per
far esistere il componente che serve all'applicazione.  
Il componente cessa di esistere quando cessa l'applicazione.


 far esistere il componente che serve all'applicazione.
Ancora? Ma non capisci o fai finta? Se è stato creato un metodo Free è
presumibile che ci sia la necessità di distruggere un componente prima che
termini l'applicazione.
Preso da un thread nell'area Winapi di Cantù:
"...ops... giusto, anche se credo che l'handle per i kernel
object appartenenti all'applicazione vengano rilasciati in
automatico all'uscita del programma.  In ogni caso e'
giusto, ci vuole."
Direi che hai capito che non è necessario attendere la terminazione di un
applicazione per poter eliminare gli oggetti (VCL - Kernel e chi più ne ha
più ne metta) ...
Comunque vedo che siamo su punti di vista molto differenti, per cui è
*inutile* proseguire la discussione.
Rispetto il tuo punto di vista ma non lo condivido.


più ne metta) ...
Certo che non e' necessario, credi davvero che non sappia a
cosa serva Free o un qualunque altro metodo di rilascio di
risorse ?  Grazie di avermelo spiegato...
Non confondere le cose: nel caso della funzione che ho
postato sullo spazio winapi di Cantu' c'era una coerenza
logica da seguire.  La funzione puo' essere richiamata molte
volte e ci puo' essere realmente un consumo di risorse
notevole se non si chiudono gli handle (in realta' perche'
il consumo sia significativo, ci dovrebbero essere centinaia
di migliaia di chiamate).  Siccome il codice di quella
funzione e' contenuto TUTTO nella funzione, e' giusto che
anche la chiusura dell'handle sia in quella funzione
(perche' non lo si potrebbe fare da nessun'altra parte, ne'
avrebbe senso farlo).  Nel caso di componenti creati
dinamicamente e assegnati al form, non vedo proprio la
necessita' di forzare la deallocazione in automatico, ma se
vuoi pensare che sia *meglio cosi'*, fa pure.  A mio parere,
e' MOLTO piu' logico, visto che Windows prevede l'ownership
dei controlli, affidare i componenti allo stesso
"possessore" di quelli allocati staticamente.


necessita' di forzare la deallocazione in automatico, 
Errata Corrige:
"necessita' di forzare la deallocazione in modo esplicito" 


 ma se vuoi pensare che sia *meglio cosi'*, fa pure.
Infatti penso che sia così.
Questa discussione, lo ripeto, non ha più motivo di esistere, tantopiù
perchè non è produttiva per il NG.
E' stato chiesto come si può creare un componente a run-time e la risposta è
stata data. Se per amor di discussione o della programmazione vuoi
continuare il discorso scrivimi in privato e la continuerò più che
volentieri, altrimenti cerchiamo di finire qui.


 volentieri, altrimenti cerchiamo di finire qui.
Non ci tengo proprio.
Ti saluto.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ha scritto nel messaggio:
pensavo che il tempo trascorso sul ng avesse cambiato il tuo modo di fare
arrogante e prepotente!
Eě palese la mia *correzione*  (4 errori su 5) ti ha infastidito e questo mi
fa intuire che tu perseveri sulla vecchia via in cui ti vedi su un
piedistallo e chiunque ti corregga viene preso di mira come fosse preda di
un cecchino. Ora so il motivo per cui hai risposto a questo thread. Ora so
che non meriti altre mie risposte.
--
- Carlo -
c.b...@libero.it
ps: perfavore risparmiami il tuo ROTFL

 arrogante e prepotente!
ROTFL... la verita' e' che tu non sai discutere.
Difenditi pure dietro queste teorie.  
E' comodo tirare fuori offese personali, quando non si sa come
ribattere sul piano tecnico.


 ROTFL... la verita' e' che tu non sai discutere.
Ragazzi, io sono nuovo del ng, ma mi sembra che anche qui non ci si discosti
poi molto da quello che succede 'fuori'.
E' la seconda volta che intervengo 'a sproposito' e senza essere stato
chiamato in causa, ma mi sento di dire qualcosa;
Da +di 20 anni ho la passione per la programmazione, che poi è diventata la
mia professione (ed il mio divertimento) dal 1986.
La passione non ha limiti, e cresce ogni giorno di più.
Quando c'è passione, ogni cosa, ogni inezia è sufficiente ad innescare
infervorate prese di posizione su teorie, metodologie, è meglio questo o è
meglio quello.
Vedi sistemi operativi, vedi linguaggi, vedi produttori di sw.
Il tempo e l'esperienza, mi hanno insegnato che :
1) Nessuno è depositario della *verità*, perchè non esiste una sola verità
2) Si incontrerà sempre, nella vita, qualcuno che ne sa un qualcosa in più;
Guai a trattarlo dall'alto in basso solo in funzione della acquisita
esperienza, o dei titoli di studio, o della proprietà lessicale. Prima o poi
(sicuramente) ci si fa male ai denti.
3) Non si finisce mai di imparare, e soprattutto quello che è
*assolutamente* sbagliato (oltrechè stupido) è l'impuntarsi nel difendere
concetti che si reputano giusti solo perchè per noi lo sono. Si guadagna
molto di più (anche in stima da parte degli altri) nel sottoporre
costantemente a verifica le proprie convinzioni, i propri metodi, alla luce
di ciò che possiamo 'sentire' e quindi imparare dagli altri.
Dato che voglio rimanere sul neutrale,  (e soprattutto, che non c'entro un
tubo) non darò ragione all'uno nè all'altro (anche se... :-)
Per cui, penso sia nell'interesse del ng (e quindi di tutte le persone che
ci 'girano' intorno) continuare a rispondere per quello che si sa, domandare
per quello che serve, e lasciare campanilismi e incomprensioni al tifo da
stadio.
Buona giornata & buon lavoro a tutti.

 tubo) non darò ragione all'uno nè all'altro (anche se... :-)
Allora andremo a FORUM...
p.s.: risparmia, per cortesia, le paternali dopo ogni discussione
che si fa nel ng.  Il premio "Babbo Natale" non e' previsto in
questo ng ;)


 in questo ng
E' vero, nelle FAQ non c'è... :-))
Cosa vuoi... ognuno ha i suoi difetti,  non è vero?

 Cosa vuoi... ognuno ha i suoi difetti,  non è vero?
No, io sono perfetto.


 No, io sono perfetto.
Visto che sei perfetto invito tutta la gente a fare un giro su Google/Deja
alla ricerca degli errori che ti sono stati corretti!
Personalmente ti ho corretto diverse volte, signor perfetto! Scendi da quel
piedistallo ... io tecnicamente ti potrei dare molte piů risposte di quelle
che cerchi, ma non discuto con chi mi guarda dall'alto verso il basso. Forse
č ora che capisci che se fossi un fenomeno come credi (mica uno qualunque
... era una tua firma forse?) a quest'ora avresti riempito le nostre
librerie di testi e i nostri pc di programmi.
Guarda fuori dalla finestra e ti renderai conto che c'č anche un altro mondo
e che sei circondato da altre persone che tra loro si rispettano!
Svegliati bimbo ...


 Svegliati bimbo ...
No no e no...
p.s.: continui o ti plonko da subito ?


 p.s.: continui o ti plonko da subito ?
Mi plonki da Mailgate fenomeno?
Ah, un'ultima cosa, hai capito perchè tua nonna ti diceva sempre che a lavar
la testa all'asino si spreca sia il fiato che il sapone?


 Non credo che sia una pretesa assurda.
Mi ricordi mio padre (siamo alle citazioni), che non ha mai voluto sentire
ragioni su consigli o pareri che provenissero da nessuno, e per
giustificarsi diceva sempre :
"Per farmi ammettere che non ho ragione, devi dimostrare che ho torto."
Ora, se io ti dico che "terra è rotonda" e tu mi rispondi "invece no, la
terra gira", non troveremo mai un punto di incontro, e nessuno potrà mai
dimostrare l'erroneità dell'altrui tesi.
Nel nostro (anzi, vostro) caso, Carlo sostiene che un componente istanziato
a run-time con create, 'per logica' va anche liberato con free.Altrimenti,
se sai già che ti servirà, tanto vale posizionarlo sulla form e lasciare che
sia delphi ad occuparsene.
Tu, d'altro canto, sottolinei come non sia necessario liberarlo, in quanto
se l'owner del componente è la form stessa (il 'self' dell'esempio), questa
automaticamente lo rilascia in fase di chiusura.
Avete ragione entrambi.
Però mi sento di sottoscrivere la tesi di Carlo (non per dispetto nei tuoi
confronti, le frecciatine satiriche che mi hai tirato mi hanno solo
divertito), ma perchè so quanto incasinato può diventare un sorgente se non
segui determinate regole, diciamo così, stilistiche.
Quindi, essendo una questione puramente di principio, bisognerebbe seguire
il consiglio che la saggezza popolare ci tramanda, che è "Chi ha più
cervello, lo adoperi".
Trovo inutile (e anch'io ora lo sto facendo) perdere tempo in discussioni
sterili.
Molto meglio sarebbe, ad esempio, dare risposte *concrete* a chi pone
domande anche banali, come io stesso spesso continuo a fare.
Però, se devi dare risposte del tipo 'Mai visto' (vedi convertitore
VB/Delphi) credo sarebbe meglio non rispondere; chi ha fatto la domanda
potrebbe, leggendo la firma del Perfetto, perdere ogni speranza (come già è
successo ad altri..)
Ossequi a Vossignoria.
P.S.: Perchè non ti fai una risata, ogni tanto ?

 Mi plonki da Mailgate fenomeno?
Certo... basta non leggerti... noumeno...


 P.S.: Perchè non ti fai una risata, ogni tanto ?
E' tutto il tempo che sto ROTFLEGGIANDO amico mio...


 E' tutto il tempo che sto ROTFLEGGIANDO amico mio...
ma parla in italiano! Ma perchè ti rispondo ancora?


 Ma perchè ti rispondo ancora?
Perche' ti sei innamorato, e' chiaro, ma non lo vuoi 
ammettere...


Bene; sentite, qui si sta degenerando un po' troppo.
Rientro nei panni del buon Babbo Natale, e propongo una tregua senza
vincitori nè vinti.
Ognuno di voi (noi) continuerà ad utilizzare il sistema che più gli piace, e
sono sicuro che ogni volta che lo farà si ricorderà di questa *colorita*
discussione.
Bertuccini digrignerà i denti ogni volta che scriverà una
<qualcheoggetto>.Free, ed Andrea (che ha la fortuna di essere un mio omonimo
(;-) si farà delle belle risate ad ogni <componente>.Create(Self).
Un unico dubbio resta : (per sdrammatizzare....)
Sicuro che Laforgia non sia in realtà una Intelligenza Artificiale ?
A parte gli scherzi, nonostante tutto dalla discussione si può comunque
imparare qualcosa (ecco la paternale...) Che i programmatori (senza
offesa..), più sono bravi e più sono difficili.
Okkio però, che più sono difficili, più restano isolati.
Anch'io sono un tipino difficile, ma il tempo (e l'esperienza) mi stanno
aiutando a capire che non sempre conviene gettarsi in discussioni così
infervorate, in difesa di principi che poi, al lato pratico, non portano ad
alcun vantaggio.
La cosa migliore sarabbe farsi una pizza tutti insieme.
Saluti a tutti.
(alla prossima... ;-)

 ammettere...
Ti piacerebbe che io mi innamorassi di te, perchč si tratterebbe della prima
volta che capita nella tua vita
addio.


 alcun vantaggio.
Giusto, faccio bene io che, invece, mi infervoro per cose che,
effettivamente, dal lato pratico, portano parecchi vantaggi.
Ciao Babbo Natale.


 volta che capita nella tua vita
Be', effettivamente di uomini sarebbe la prima volta...


 effettivamente, dal lato pratico, portano parecchi vantaggi.
...--sospiro--...
Niente da fare.
Qualcuno chiami la croce verde, please.
P.S.
Scusa, dovresti aiutarmi (sai, l'età....) non mi ricordo più che è 'sto
rotfl..
Mi ricorda tanto il rumore che mi fa la coca-cola appena deglutita quando
tenta di tornare all'aperto.....
P.P.S : Stavo giusto pensando di scrivere a Zelig, e proporvi come nuova
coppia di fenonomeni.
Ah, se mi volete vengo anch'io, eh ?
P.P.P.S.
Dai, molla l'osso e torna a rispondere a chi ne ha bisogno !
Ciao.

 Dai, molla l'osso e torna a rispondere a chi ne ha bisogno !
E' quello che faccio, ma vedo che non fa effetto: 
Dottore, li abbiamo persi.
BIIIIIIIIIIIIIIIIIIIIIIIIP.
E con questo ti do' un bacione, caro Babbo Natale, ti saluto.
Torna a trovarmi l'anno prossimo.


 Belli & Bertuccini non sarebbe male come coppia...
Già, forse (oopss.. scusa, volevo dire 'naturalmente') hai ragione tu.
Non faresti ridere granchè....
Sei più adatto ad un documentario.
Che ne dici di Gaia ? (quello delle catastrofi naturali)
P.S. Ho girato il bacio alla Befana, ma non ne ha voluto sapere......

P.S. Ho girato il bacio alla Befana, ma non ne ha voluto sapere......
Eeeeh... lo so.. vuol sempre qualcosa di piu'...
Ora, Babbino, scusami, ma cominci a diventare un po' palloso
quindi (SENZA OFFESA, si intende) rinfilati nel buco del
camino.  Adioooos...


alla ricerca degli errori che ti sono stati corretti!
Tutta la gente ha capito che era una battuta, 
tranne te, evidentemente ;) 
Comunque se dovete ancora continuare a lungo con questo flame,
avvisatemi che vi mando al fresco nel mio kill file per qualche
mesetto, ok?
-- 
(*metallikop*libero*it*)          
{
http://web.tiscali.it/mbsoftware
}

mesetto, ok?
Uh, come mi dispiace !


 tranne te, evidentemente ;)
guarda che in quella 'battuta' che ho capito, giace un complesso di
superiorità che forse non conosci bene! Se vuoi aggiungermi al tuo kill file
fai pure, non è un mio problema ...


superiorità che forse non conosci bene! 
ROTFL ! tanto per cambiare... 


Uh, come mi dispiace !
Sempre il solito simpaticone eh?
Vai a cagare va
*PLONK*
-- 
(*metallikop*libero*it*)          
{
http://web.tiscali.it/mbsoftware
}

fai pure, non è un mio problema ...
Il problema era di chi vuole seguire questo ng e invece si ritrova
costretto a scaricare e leggere le vostre stupide zuffe. 
Bye.
-- 
(*metallikop*libero*it*)          
{
http://web.tiscali.it/mbsoftware
}

 ROTFL ! tanto per cambiare...
ma non mi dovevi plonkare circa 22 mex fa?
ah, capisco vuoi leggere le mie risposte ai tuoi errori futuri ...


 ah, capisco vuoi leggere le mie risposte ai tuoi errori futuri ...
aspetta che ti risparmio la fatica ... ROTFL


 *PLONK*
non mi sembra che tu abbia piů pazienza della mia! :-)
Cmq non posso che comprendere la tua risposta ... ma si sta formando un
partito anti-deficente o sbaglio?
