Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Gennaio 24, 2024, 04:25:21 pm

Titolo: [Risolto] Come estrarre l'indice di posizione interna ad una serie di TEdit
Inserito da: petrusic - Gennaio 24, 2024, 04:25:21 pm
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:
Codice: [Seleziona]
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.
Titolo: Re:Come estrarre l'indice di posizione interna ad una serie di TEdit
Inserito da: DragoRosso - Gennaio 24, 2024, 07:10:30 pm
La sottovalutazione che fai è che l'elenco che ottieni dal for ...

Codice: [Seleziona]
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
Titolo: Re:Come estrarre l'indice di posizione interna ad una serie di TEdit
Inserito da: petrusic - Gennaio 24, 2024, 07:36:30 pm
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:
Codice: [Seleziona]
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. :'(