Mi trovo di fronte ad un problema, legato alla gestione di 3 serie di Componenti, di cui due sono Tedit ed una è TCheckBox.
La mia difficoltà nasce dal non riuscire a caricare nella TEdit corretta il valore caricato precedentemente in un array bidimensionale.
Infatti, come ho indicato nell'immagine allegata, alla fine del caricamento nella prima colonna di componenti TEdit, risultano 3 caselle valorizzate male.
Per eseguire il caricamento ho eseguito il seguente codice:
implementation
{$R *.lfm}
{ TForm10 }
uses
FrmMain;
type
TtbindTEdit = array [0..10, 0..1] of TComponent; // tabella di caricamento degli indici di puntamento ai componenti TEdit presenti nelle colonne:
// - "Totale record rilevati ora" (rg.x Col0)
// - "Totale record precedente" (rg.x Col1)
var
tbindTEdit: TtbindTEdit;
procedure TForm10.FormCreate(Sender: TObject);
var
indx, indCol1: TComponent;
i, j: Integer;
begin
for indx in self do
begin
if (indx is TEdit) and (indx.Tag = 1) then // estraggo l'indirizzo di puntamento al componente TEdit relativo alla colonna "Totale record rilevati ora"
begin
tbindTEdit[i, 0]:= indx; // e lo carico nella cella (Rg.corrente, Col.2) della tabella tbDBintegro
end;
end;
end;
procedure TForm10.FormActivate(Sender: TObject);
var
indx: TComponent;
i, lun1, lun2: Integer;
sql: String;
begin
for i:= 0 to 10 do // scansione per caricare il numero di record di ciascuna tabella del ContabFamDB nella Form10
begin
(tbindTEdit[i, 0] as TEdit).Text := (tbDBintegro[i, 1]);
end;
Io pensavo che, avendo caricato in ciascun tbindTEdit[i, 0] l'indirizzo di puntamento alla corrispondente casella della prima serie Tedit , la successiva istruzione "(tbindTEdit[i, 0] as TEdit).Text := (tbDBintegro[i, 1])" avrebbe eseguito la valorizzazione della Tedit puntata dal contenuto dell'elemento tbindTEdit[i, 0]. Così, a quanto pare, invece. non è.
Perciò, per sicurezza, io penso che dovrei indirizzare da codice il corretto puntamento sulla Tedit della colonna interessata, ma non ho trovato nessun esempio che faccia al caso mio.
Spero di essere riuscito, in così poche righe, ad esprimere a pieno il mio concetto, nonostante la complessità dell'argomento.
La sottovalutazione che fai è che l'elenco che ottieni dal for ...
begin
for indx in self do
begin
if (indx is TEdit) and (indx.Tag = 1) then // estraggo l'indirizzo di puntamento al componente TEdit relativo alla colonna "Totale record rilevati ora"
begin
tbindTEdit[i, 0]:= indx; // e lo carico nella cella (Rg.corrente, Col.2) della tabella tbDBintegro
end;
end;
end;
sia elencato come un preciso ordine. Così non è. Sulla sequenza non c'è alcuna certezza di avere un dato ordine.
Con quel "for" tu ottieni la sequenza di tutti i componenti della Form, e non è detto Edit1 venga prima di Edit2 (e così via ...).
Dovresti gestire il tag dando ad esempio alla Edit1 il tag = 1, alla Edit2 il tag = 2, etc ...
Così facendo poi puoi usare la sequenza in modo corretto.
Fai attenzione anche all'uso di "indx" senza "as": usi indx.Tag ed è corretto, però solo perchè Tag è una proprietà ereditata dal TEdit che è presente nella classe "padre" da cui deriva TEdit.
Ciao
Ho risolto.
Il problema era dentro il ciclo di ricerca della riga di appartenenza della TEdit puntata dentro il ciclo superiore for.
Ecco il codice di ricerca corretto:
procedure TForm10.FormCreate(Sender: TObject);
var
indx, indCol1: TComponent;
i: Integer;
striMia: String;
begin
for indx in self do
begin
if (indx is TEdit) and (indx.Tag = 1) then // estraggo l'indirizzo di puntamento al componente TEdit relativo alla colonna "Totale record rilevati ora"
begin
i:= 0;
while tbDBintegro[i, 0] <> (indx as TEdit).TextHint do
begin
i:= i + 1;
end;
tbindTEdit[i, 0]:= indx; // e lo carico nella cella (Rg.corrente, Col.2) della tabella tbDBintegro
end;
end;
end;
end;
Infatti, ora i valori riportati dentro la serie delle TEdit sono corretti.
Mi dispiace, ho fatto tanto rumore per niente. :'(