Newsgroup: it.comp.programmare.win32
Titolo: [C++ Builder] Evento OnClick premendo un tasto

Salve,
vorrei sapere se su C++ Builder 3 è possibile far si che premendo un tasto 
della tastiera sia scatenato l'evento OnClick (o anche altri) legati a 
qualche componente. Ad esempio supponiamo che io abbia un pulsante button1.
Vorrei che premendo il tasto 1 nella tastiera si verifichi lo stesso evento 
che si verifica cliccando su button1. Avevo pensato di fare una cosa simile 
inserendola nell'evento OnKeyPress della Form:
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
    if (Key == '1')
        TForm1::Button1Click(new TObject);
}
L'invocazione TForm1::Button1Click(new TObject) ho visto che funziona, nel 
senso che se la metto nell'evento OnClick di un button2 ad esempio, 
cliccando sul button1 si scatena l'evento legato al click del button1, ma se 
invece premo il tasto 1 dalla tastiera non funziona.
Grazie 

 funziona.
Prova a settare la proprietą KeyPreview del form a true.
HTH,
-- 
Stefano Frosio
www.esse-effe.com

 }
Il TObject lo deleti in Button1Click()? Non verrei dire una banalità, ma se 
TObject ti serve solo per chiamare Button1Click(), ovviamente utilizza 
Sender:
    if (Key == '1') Button1Click(Sender);
Cristiano 

    if (Key == '1') Button1Click(Sender);
Vero, posso usare Sender dato che è gia dichiarato. :-) 

 Prova a settare la proprietą KeyPreview del form a true.
Ora funziona, grazie.
Visto che ci sono volevo chiederti la differenza tra gli eventi OnActivate e 
OnCreate.
Per caso il primo si scatena solo all'avvio dell'applicazione, mentre il 
secondo ogni volta che la finestra ha il focus oppure viene ingrandita dopo 
essere stata ridotta ad icona?
Ciao 


Inoltre passando (new TObject) come parametro ti ritrovi il problema di 
aver
creato un oggetto che non viene mai distrutto (dovresti distruggerlo 
all'interno
dell'evento Button1Click, ma distruggere il Sender dentro all'evento e' 
una cosa da non fare mai!)
ciao
Giacomo

 una cosa da non fare mai!)
Si infatti, ma in pratica era solo un test per vedere se fosse possibile 
invocare i metodi degli eventi chiamandoli come se fossero funzioni da me 
definite.
Ciao 

 eventi OnActivate e OnCreate.
La guida in linea sarà senz'altro più chiara per questo.
Comunque OnActivate segnala che il form è diventato attivo, cioè 
che ha ricevuto il focus (ad esempio se ci clicchi sopra).
Invece OnCreate, che non va mai utilizzato, si verifica nella 
fase di creazione del form (ed infatti anzichè OnCreate si 
utilizza il costruttore).
Direi che i due eventi non sono legati tra loro, se non proprio 
quando il form è creato e reso visibile.
-- 
Stefano Frosio
www.esse-effe.com

 costruttore).
Ah quindi in pratica sarebbe l'inverso di quanto ho detto io, nel senso che 
ho scambiato il funzionamento dei due eventi. :-)
Ciao 

Ho provato il seguente codice:
// A livello globale;
int x;
...
void __fastcall TForm1::FormActivate(TObject *Sender)
{
    Label1->Caption = ++x;
}
Pensavo che in tal modo dando e togliendo il focus la x si incrementasse 
invece sull'etichetta rimane il valore 1. 

 incrementasse invece sull'etichetta rimane il valore 1.
Dipende come viene "dato e tolto" il focus. 
TCustomForm::OnActivate lavora a livello di form della stessa 
applicazione, quindi se hai un secondo form nell'applicazione ed 
attivi/disattivi quello il codice che hai postato fa quello che 
volevi, se invece attivi/disattivi un'altra applicazione no.
Invece per controllare quando l'intera applicazione viene 
attivata l'evento è TApplication::OnActivate.
-- 
Stefano Frosio
www.esse-effe.com

utilizza il costruttore).
Chi l'ha detta questa cosa? mi riferisco al fatto che non vada mai
usato. Non č vero. Non c'č alcun problema nell'usare OnCreate per
inizializzare i membri interni alla form. Si sfrutta il fatto che
l'OnCreate ha un suo momento specifico della catena degli eventi, che
non č necessariamente quello del costruttore.

 non è necessariamente quello del costruttore.
E' una cosa piuttosto risaputa. Si possono trovare parecchi 
riferimenti nei newsgroup Borland, ad esempio: 
http://groups.google.it/group/borland.public.cppbuilder.language.cpp/browse_thread/thread/4828c8aee2d465a/1676e30a2eb68d1c
. 
Discorso analogo per OnDestroy ovviamente.
-- 
Stefano Frosio
www.esse-effe.com

 non è necessariamente quello del costruttore.
E' una cosa piuttosto risaputa. Si possono trovare parecchi
riferimenti nei newsgroup Borland, ad esempio:
http://groups.google.it/group/borland.public.cppbuilder.language.cpp/browse_thread/thread/4828c8aee2d465a/1676e30a2eb68d1c
.
-- 
Stefano Frosio
www.esse-effe.com

 riferimenti nei newsgroup Borland, ad esempio:
<snip>
Grazie, non ricordavo questa differenza tra i due ambienti.
Parlavo in virtů dell'esperienza in Delphi.
Comunque quanto detto per il C++ Builder dovrebbe valere solo per le form
ereditate. Per la stessa form il comportamento corretto dovrebbe essere
garantito.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 riferimenti nei newsgroup Borland, ad esempio:
<snip>
Grazie, non ricordavo questa differenza tra i due ambienti.
Parlavo in virtů dell'esperienza in Delphi e di quella in C++ Builder, in
cui usando OnCreate non ho avuto alcun problema. Quanto detto per il C++
Builder dovrebbe valere solo per le form ereditate (quando lavoravo in C++
Builder, ancora non usavo la Visual Form Inheritance). Per la stessa form


 il comportamento corretto dovrebbe essere garantito.
Dipende cosa si intende per comportamento corretto. OnCreate può 
essere scatenato prima del costruttore, ergo non va bene. Poi 
certo si possono fare parecchie prove e non notare mai alcuna 
anomalia, dipende anche dal codice, però in generale 
OnCreate/OnDestroy in BCB vanno evitati. D'altronde anche il 
TeamB ne sconsiglia l'uso: 
http://web.archive.org/web/20030802150646/http://bcbdev.com/articles/suggest.htm#oncreate
.
-- 
Stefano Frosio
www.esse-effe.com

essere scatenato prima del costruttore, ergo non va bene.
Questa però mi è nuova (by the way: il link che riporti è del 2002,
quindi, a naso, stiamo parlando di C++ Builder 5). Io ho sempre visto
scatenare l'OnCreate alla fine dell'AfterConstruction e mai dal
costruttore (che è un errore ovvio). Sono anni però che non uso più il
C++ Builder, può darsi che il mio codice abbia sempre funzionato per
caso :-). Mi sembra strano, però, che di fronte a un problema così
grande, Borland non abbia cassato di netto i due eventi di costruzione
e distruzione.
Comunque, come già detto, buono a sapersi. Quello che mi fa sorridere
della pagina che mi hai riportato è la frase: "You are using a C++
product, so we feel it is wise just code things the C++ way."
Mi fa ridere perché in C++ Builder, senza programmazione generica e
dovendosi adeguare agli standard Delphi, non si programma affatto "the
C++ way" :-)

 l'evento č TApplication::OnActivate.
Ma c'e' un componente Application?
Come dovrei impostarlo? 

 Come dovrei impostarlo?
Non è un componente, è una classe. Trovi tutto nell'help in 
linea.
-- 
Stefano Frosio
www.esse-effe.com

 C++ way" :-)
Su questo non sono d'accordo, ma entriamo nelle opinioni 
personali quindi mi fermo qui.
-- 
Stefano Frosio
www.esse-effe.com