Newsgroup: it.comp.lang.delphi
Titolo: Simulare pressione tasto

Salve a tutti....
Sto realizzando un programma dove e' prevista a video una tastiera qwerty
Avendo nella form diverse Edit ... cliccandoci su una di loro e cliccando su 
un pulsante dove c'e' A ( x esempio ) come faccio a passare a solo quella 
edit il carattere A ? 

Mabi ha usato la sua tastiera per scrivere :

Puoi spiegarti meglio?
-- 
Morde

 ha scritto nel messaggio 
news:4a12...@news.x-privat.org...


 ITALIA 1 ....
Utilizza una property di tipo TEdit che aggiorni ogni volta che il fuoco 
va sul TEdit selezionato, e nei vari pulsati utilizzi la tua property 
per scrivere la lettera
Pseudo codice:
oEditFocus property di tipo TEdit
evento OnEnter di TEdit
   oEditFocus := (Sender As TEdit);
Eventi click per lettera 'A'
   oEditFocus.Text := oEditFocus.Text+'A'
Ci vogliono anche un po' di considerazioni a "margine":
- la gestione della proprty oEditFocus
- Se usi componenti TButton oppure TspeedButton
- Ovviamente codice unico per tutte le lettere non 30 eventi onclick
- varie che al momento non mi sovvengono :)
^_Goblin_^
-- 
Ibis et redibis non morieris in bello
http://goblinland.myminicity.com/

> Immagina una form con ragione sociale... indirizzo...cap.. cittï¿œ... 


 sui bottoni V .. I .. A .. la edit viene riempita e trovi VIA ITALIA 1 ....
Abilita la property keypreview del form a true.
Poi fai doppio click sull'evento del form onkeypress: dentro quel 
metodo potresti farti la tua gestione comoda.
Intendo dire che lï¿œ hai intercettatto tutti i tasti premuti, puoi farne 
quello che vuoi, magari aggiungerli al tedit attivo in quel momento 
previa verifica di un'eventuale modalitï¿œ, ad es.
if EditEnabled then edtIndirizzo.text := edtIndirizzo.text + char(key)
dove key ï¿œ la variabile che contiene il tuo tasto.
Qui dentro puoi anche filtrare i tasti, vale a dire che puoi escludere 
tutti i tasti non stampabili ecc..
Sto pensando ai sistemi di self ticketing di trenitalia che trovi nelle 
stazioni: mai usato uno? Ti dirï¿œ che il migliore lo hanno in svizzera: 
nel premere le lettere, progressivamente, scompaiono i pulsanti che non 
sono piu' necessari. Ad esempio, se sei nel campo stazione di arrivo e 
devi scrivere MILANO, incominci a premere M, poi I poi L e in tempo 
reale le lettere non piï¿œ utili si disabilitano restando solo quelle da 
premere. Spero di essermi spiegato chiaramente.
Ciao
-- 
Morde

Mabi ha scritto:

personalmente non la ritengo una soluzione ottimale perch� per ogni form 
poi dovresti immettere la tasteria, se invece crei una form con tastiera 
  e magari con un tedit dove ci scrivi quello che ti pare ed all'uscita 
della form immetti il testo nel componente che ha il focus credo che ti 
troveresti meglio. per gli altri controlli non credo ci sia problema 
visto che da quello che descrivi il lavoro � per touchscreen se ho una 
combo preferisco cliccarci piuttosto che scriverci mi fa risparmiare 
tempo ;)

 chi prima del bottone aveva il fuoco?
In un listview e in un combo non ci scrivi, almeno credo :), ma li 
selezioni da una lista già precaricata ... cmq se vuoi sapere il 
componente che aveva il fuoco prima del click sul bottone alzi di un 
paio di classi la property e la dichiari di tipo TWinControl e poi 
nell'evento on enter dei vari componenti la assegni oEditFocus := 
(Sender As TWinControl);
poi nel momento del click testi la classe e agisci di conseguenza ...


 ha scritto nel messaggio 
news:4a1284d2$0$843$4faf...@reader5.news.tin.it...


 selezioni da una lista giï¿œ precaricata ... cmq se vuoi sapere il 


usi l'evento onenter, precisamente LO STESSO evento per ogni tedit.
Nel codice dell'evento ti salvi in un membro private il riferimento
all'edit passato dall'eventi come tobject.
A quel punto, quando clicchi sul pulsante "a" controlli se il membro
private è assegnato e nel caso aggiungi un carattere alla sua property
text.
Generalizzando, se hai piu' oggetti di tipo DIVERSO, come griglie etc,
usi un solo evento per ogni classe di controllo e fai lo stesso.
Al click del pulsante, dovrai ovviamente diversificare a seconda della
classe di controllo attiva in quel momento.
Tutto sto casino si fa in 10 minuti usando una gerarchia di classi
creata ereditando i controlli visuali che devi usare. Ottieni un
codice piu pulito, meno ridondante e piu facile da modificare se
(cioe, quando..) in futuro il cliente cambiera idea su come far
funzionare il tutto.
storiella....
Un tizio va in giro per una foresta.
Attratto da dei rumori va a vedere e trova un tizio che sta abbattendo
un albero: decide di restare li a guardare...
Dopo un po si rende conto che il tizio da dei colpi fortissimi con la
sua scure, ma ottiene ben poco xche questa non è affilata...
Gli fa "scusa, se ti fermi e affili la scure quell'albero lo butti giu
in 2 minuti coi musccoli che hai..."
E il tizio gli fa "non posso fermarmi: devo tagliare l'albero...."
...
Pax vobiscum.
A.


Mabi ha scritto:

variabile tobject la valorizzi all'enter dell'oggetto all'exit la 
pulisci per la griglia metterei un tasto che avvia una locate o meglio 
un filtro sulla query sempre che avvia la form della tastiera quando lo 
clicchi ;)

 ha chiesto

TScreen ha un evento OnActiveControlChange. L� potresti salvare sempre 
l'attuale Control e quello ultimo.
L'altra possibilit� sarebbe di usare TSpeedButton anzich� TButton per la 
tastiera. TSpeedbutton non prende il focus. Cos� form.activecontrol ti da 
sempre il controllo dove l'utente pretende di immettere.
Saluti,
1/ Fritz 

funzionare il tutto.
Domanda da ignorante: TEdit � derivato da TWinControl. Se derivo una mia 
classe TWinControlMio in cui inserisco una nuova propriet�, come suggerito, 
poi come posso fare per avere un TEditMio che erediti quella propriet�, ma 
anche tutto il TEdit. Ci� � possibile? Oppure quando definisco il TEditMio 
sono costretto a derivarlo da TWinControlMio ma a riscrivere per intero 
tutto quello che definisce l'originale TEdit (vabb� che basterebbe copiare 
la unit)?
Gianni 

 
Tutti i componenti visuali hanno un nonno che si chiama (TWinControl), 
dunque dichiari una property/variabile Privata della classe di tipo 
TWinControl e poi sull'evento OnEnter di ogni componente sulla form la 
assegni oEditFocus := (Sender As TWinControl);
Poi sull'evento di pressione devi andare a scoprire la classe e in base 
al risultato ti comporti di conseguenza.
Private
   oEditFocus: TWinControl;
evento onEnter dei componenti
  oEditFocus := (Sender As TWinControl);
Evento click della lettera
   FocusControl(oEditFocus); Riassegno il fuoco al componente (bho .. )
   If oEditFocus is TEdit then
     (oEditFocus as TEdit).text := (oEditFocus as TEdit).text + 'A'
   else if oEditFocus is TComboBox then
....
   else if oEditFocus is TDBGrid then


erediti da TEdit, TComboBox etc...
A.

 wrote:

A parte tutte le belle considerazione su derivate varie...
Ma perche' non usare la tastiera di sistema per sistemi touch ?
'ao
S

Grazie a tutti per l'aiuto... Dovrei aver risolto ( non sar� bellissimo ma 
gira )
L'ho sviluppato cos�...
  public
    { Public declarations }
    hafuoco : tcomponent;
..
..
..
procedure TForm1.Edit1Enter(Sender: TObject);
begin
   hafuoco := (sender as twincontrol);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
   if hafuoco is tedit then
      (hafuoco as tedit).Text := (hafuoco as tedit).Text + 
TButton(Sender).caption;
end;
 

 L'ho sviluppato cos�...
[CUT]
http://www.krisopea.it/mvp/Quoting.htm
http://wiki.news.nic.it/QuotarBene
ecc.. ;)
Antonio

1) cosa singifica "edit1"?
Che nome è?
devo vedere il form per capire se edit1 è quello di un codice o di una
descrizione?
Ma siamo matti?
2) Pensa alla property IsEmpty di Tdataset..
Io se lecco "isQualcosa" oppure "HasQualcosa" mi aspetto un BOOLEAN e
non un riferimento ad oggetto.
3) Alle "entita" esterne al form gli frega qualcosa di sapere quale è
l'edit attivo?
4) dichiarare VARIABILI nella public di una classe... che schifo.
....
private
  FLastEdit: TEdit;
...
procedure TForm1.Edit1Enter(Sender: TObject);
begin
  // FACCIO IL CAST SOLO OGNI VOLTA CHE CAMBIA L'EDIT ATTIVO....
  FLastedit :=  TEdit(Sender);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  // CONTROLLO SE ESISTE UN ULTIMO EDIT:
  if (Assigned(FlastEdit)) then
  begin
     // QUI NON FACCIO IL CAST OGNI VOLTA: NON ME NE FREGA NIENTE -
L'HO GIA FATTO A MONTE.
     FLastEdit.Text :=  FLastEdit.Text + TButton(Sender).caption;
end;
Infine, FlastEdit va inizializzato a NIL o all'edit prededfinito. Ci
sono vari modi di fare questa cosa.
A.