Newsgroup: it.comp.lang.delphi
Titolo: Come si fa?

Ciao a tutti. Vorrei un aiuto su questo quesito.
Esempio des.time
Form
__________________
|combobox1       edit1   |
combobox2        edit2
|         :                    :     |
|combobox10     edit10 |
___________________
Si può catturare un evento della edit per controllare la combo che sta
vicino senza riferirsi al nome della combo stessa cioè in modo astratto.
Esempio
....edit1onchange(sender:.......)
begin
if combobox1<>'' then
showmessagge('operazione nn valida...');
end;
Forse avete già capito che voglio usare tanti un onchange per tante edit che
non mi faccia riferimento a combobox1 ma ad una sua astrazione. In
conclusione come faccio a dire alla edit esegui un controllo sulla combobox
che hai vicino senza scriverne il nome?
Un salutone a tutta la news ed un caloroso grazie a tutti coloro che mi
aiuteranno.

 ha scritto nel messaggio
news:T8A3c.27302$O31.1...@news4.tin.it...

La soluzione piu elegante è sicuramente quella di crearti u TEditEX che
derivi dal TEdit standard al quale aggiungi una property 'ComboBoxAssociato'
da assegnare a DesignTime.
A runtime, ogni TEditEX avrebbe così il proprio ComboBox associato e
potrebbe controllare quello.
La più veloce invece potrebbe essere:
1) a DesignTime Imposti i Tag dei controlli a coppie:
ComboBox1.Tag := 101
ComboBox2.Tag := 102
...
Edit1.Tag := 101
Edit2.Tag := 102
...
in modo da creare una relazione implicita tra i controlli
2) dichiari una variabile privata al form che serva da contenitore del
ComboBox Corrente
CurrentComboBox: TComboBox/TControl
nel load del form la inizializzi a nil (ovviamente non va creata
esplicitamente, servirà solo da riferimento).
3) crei un evento EditEnter da associare all'OnEnter di tutti i TEdit nel
quale fai un ciclo su tutti i controlli del form alla ricerca di un
TComboBox con lo stesso Tag del Sender dell'evento.
Se e quando lo trovi, imposti CurrentComboBox facendolo puntare al controllo
individuato.
4) nell'evento che ti interessa gestire, verifichi se CurrentComboBox è
diverso da nil ed a questo punto puoi fare tutte le operazioni che vuoi,
perchè a tutti gli effetti stai puntando al controllo che avevi
precedentemente assegnato.
5) crei un evento EditExit da associare all'OnExit di tutti i TEdi nel quali
imposti CurrentComboBox a nil.
Più o meno dovrebbe funzionare.
Ciao,
Gianluca.

 mi aiuteranno.
Una soluzione potrebbe essere dare dei nomi progressivi ai componenti, tipo
edEdit001, edEdit002.... e
cbCombo001, cbCombo002
in modo poi da poter fare, nell'onChange:
if (FindComponent('cbCombo' + Copy((Sender as TEdit).Name, Length((Sender as
TEdit).Name) - 2, 3)) as TComboBox).Text = '' then .......
Con la copy prendo il progressivo del componente sender (per esempio, se il
sender è edEdit001 trovo 001), poi con la findcomponent trovo il cbCombo001
e da lì posso fare qualsiasi controllo, sul text, sull'itemindex...
--
Jax
====
Meglio essere lasciati, che mai amati.

Un pò complicato ma + o - ho capito grazie mille x la spiegazione molto
dettagliata.

 che hai vicino senza scriverne il nome?
Puoi utilizzare la proprietà Tag dei due componenti magari settandola uguale
a tutti
e due i componenti e ciclarteli tutti filtrandoli per tipo e tag tipo:
Procedure StdEditChange(Sender :TObject);
Var
    nComp:Integer;
Begin
    if Sender is TEdit Then
    Begin
        For nComp:=0 to Pred(Component.Count) do
        Begin
            If Component[nComp] is TComboBox Then
                Begin
                If TComboBox(Component[nComp]).Tag=TEdit(Sender).Tag then
                    Begin
                    If TEdit(Sender).Text='' Then
                        ShowMessage('Operazione non Valida!')
                    End;
                End;
        End;
    End;
End;
dove la Procedura
StdEditChange la associ alla OnChange di ogni Edit e setti la proprietà tag
Uguale in ogni "Coppia" !
Pung@

 controllo sulla combobox che hai vicino senza scriverne il nome?
Aggiungo il mio suggerimento (che combina la radita' dello sviluppo
visuale (se si vuole click & code) con la riusabilita' dell'approccio
OO).
Metti su un frame una combo ed un edit.
Codifica quel che si deve fare in risposta alle azioni dell'utente
facendo pure riferimento ai componenti per nome.
Salva il frame e mettilo nella palette.
Aggiungine quanti ne vuoi alla tua form.
Alternativamente (ma mi piace meno), la proprieta' tag puo' contenere
tanto un intero quanto un riferimento; quindi puoi anche assegnare (a
runtime) a ciascun Edit la combo di cui si deve occupare.
Saluti
Paolo Arosio
-- 
"La dimostrazione dell'esistenza di specie intelligenti nell'universo
 e' che non ci vengono a trovare" [Calvin & Hobbes]

Grazie mille ragazzi a volte mi chiedo quanti anni di programmazione avete
alle spalle. Grazie a tutti comunque.

 avete alle spalle. Grazie a tutti comunque.
Adesso però ci devi dire che soluzione hai adottato :)
--
Jax
====
Un bugiardo è sempre prodigo di giuramenti. (Pierre Corneille)

 Adesso perň ci devi dire che soluzione hai adottato :)
A mio avviso la soluzione piů elegante č senza dubbio quella che propone
l'uso dei Frame.
;-)
Gianluca.

 propone l'uso dei Frame.
Ma vuoi mettere la mia 1-line-code-solution? ;)))
--
Jax
====
Se litighi con un ubriaco, ricordati che offendi un assente. (proverbio
cinese)

Ho adottato questa soluzione :
procedure TForm1.Edit1Change(Sender: TObject);
Var
    I:Integer;
Begin
if Sender is TEdit Then
For I:=0 to Pred(ComponentCount) do
Begin
If Components[I] is TComboBox Then
If TComboBox(Components[I]).Tag=TEdit(Sender).Tag then
IF TComboBox(Components[I]).Text='' then
ShowMessage('Operazione non Valida!')
end;
end;

Non nego che penso la soluzione di jax sia la + congeniale ti risolve il
problema in una riga di codice.. ragà (ha proprio le p...skerzo) . xò nel
mio caso avevo già tutto inserito e collegato i nomi non li potevo +
cambiare(perdevo molto tempo). Ciaoooo a tutti ed un caloroso grazie.