* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 16, 2024, 06:12:22 am

Inserisci il nome utente, la password e la durata della sessione.

59 Visitatori, 0 Utenti

Autore Topic: [Risolto] gestione tabellare di una serie di TEdit  (Letto 2858 volte)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
[Risolto] gestione tabellare di una serie di TEdit
« il: Novembre 27, 2020, 04:57:43 pm »
Allego l'immagine di una Form del mio corrente progetto d'apperndimento.
In essa ho inserito 9 TEdit, disposte in serie, destinatarie di altrettanti numeri da digitare uno dopo l'altro, in maniera disordinata, nella TEdit sottostante, al centro della Form.
Ciascun numero digitato dovrà essere trasferito, tenendo conto della sequenza in ordine crescente di valore dei numeri immessi, nella corretta TEdit della serie interna al riquadro "Numeri della Serie".
Piuttosto che fare riferimento a ciascuna TEdit, per procedere al caricamento del numero digitato di volta in volta, vorrei assegnare loro un Name  comune di raggruppamento, in modo da gestirle come se fossero elementi di un array.
Non ho trovato l'indicazione che mi occorrerebbe.
E' possibile farlo?
« Ultima modifica: Dicembre 16, 2020, 10:21:11 pm da petrusic »
ciao ciao

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:gestione tabellare di una serie di TEdit
« Risposta #1 il: Novembre 28, 2020, 08:23:03 am »
dovresti fare in modo che, per tutti gli edit, il nome sia formato da un prefisso + un contatore, ad esempio:
Edit1, Edit2, Edit3, ec...

poi puoi cercare l'edit come suggerito nella funzione sotto

Codice: [Seleziona]
    
function EnumControls(const aControl:TWinControl; const StartSpace :string=''):String;
    var
      Res : string;
    begin
      for Cnt := 0 to aControl.ControlCount -1 do
      begin
        WriteStr(Res,StartSpace + aControl.Controls[Cnt].Name);
        Result:= Result + Res + LineEnding;
        if aControl.Controls[Cnt] is TWinControl then
          EnumControls(TwinControl(aControl.Controls[Cnt]), StartSpace+'  ')
      end;
    end;

in alternativa ti puoi salvare i puntatori dentro ad un array in modo da accedere tipo:

Codice: [Seleziona]

TEdit(controlli[2]).Text

Imagination is more important than knowledge (A.Einstein)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:gestione tabellare di una serie di TEdit
« Risposta #2 il: Novembre 30, 2020, 12:31:01 pm »
dovresti fare in modo che, per tutti gli edit, il nome sia formato da un prefisso + un contatore, ad esempio:
Edit1, Edit2, Edit3, ec...

poi puoi cercare l'edit come suggerito nella funzione sotto
Codice: [Seleziona]
    
function EnumControls(const aControl:TWinControl; const StartSpace :string=''):String;
    var
      Res : string;
    begin
      for Cnt := 0 to aControl.ControlCount -1 do
      begin
        WriteStr(Res,StartSpace + aControl.Controls[Cnt].Name);
        Result:= Result + Res + LineEnding;
        if aControl.Controls[Cnt] is TWinControl then
          EnumControls(TwinControl(aControl.Controls[Cnt]), StartSpace+'  ')
      end;
    end;

Ti ringrazio moltissimo per il suggerimento e sto cercando di capire bene il primo dei due esempi che mi hai gentilmente fornito. Purtroppo ho alcuni vuoti di comprensione nel tuo codice:
- StartSpace, aControl sono costanti.
- EnumControls è una funzione tua che visualizza in qualche modo i controlli con lo stesso prefisso nel nome?   (Error: Identifier not found "EnumControls")

Te lo chiedo perchè ho ricevuto errori in compilazione e, in particolare:
Codice: [Seleziona]
procedure TForm411.FormCreate(Sender: TObject);
const
  aControl:TWinControl;  // Fatal: Syntax error, "=" expected but ";" found




« Ultima modifica: Novembre 30, 2020, 10:34:07 pm da petrusic »
ciao ciao

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:gestione tabellare di una serie di TEdit
« Risposta #3 il: Dicembre 01, 2020, 08:35:40 am »
EnumControls non è una mia funzione, è solo un esempio che ho trovato che mostra come accedere ai controlli figli tramite la proprietà controls

molto più semplicemente Controls contiene tutti i controlli di un container (form, pannello, ec...)

quindi

Codice: [Seleziona]
Form1.Controls[0];

ti restituisce il puntatore al primo controllo della form
con un semplice loop da 0 (zero) a ControlCount -1 puoi avere una lista di tutti i controlli tra i quali cercare i tuoi TEdit
Imagination is more important than knowledge (A.Einstein)

brunello

  • Jr. Member
  • **
  • Post: 83
  • Karma: +0/-0
Re:gestione tabellare di una serie di TEdit
« Risposta #4 il: Dicembre 01, 2020, 06:56:10 pm »
puoi semplificare

Codice: [Seleziona]
for i := 1 to 9 do
  begin
    x := FindComponent('Label' + IntToStr(i)).ComponentIndex;
   TEdit(Components[x]).Text := IntToStr(i);
  end;

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:gestione tabellare di una serie di TEdit
« Risposta #5 il: Dicembre 01, 2020, 10:39:35 pm »
EnumControls non è una mia funzione, è solo un esempio che ho trovato che mostra come accedere ai controlli figli tramite la proprietà controls
molto più semplicemente Controls contiene tutti i controlli di un container (form, pannello, ec...)
quindi
Codice: [Seleziona]
Form1.Controls[0];
ti restituisce il puntatore al primo controllo della form
con un semplice loop da 0 (zero) a ControlCount -1 puoi avere una lista di tutti i controlli tra i quali cercare i tuoi TEdit

Benissimo!
In questa fase di studio sto cercando di capire come procedere per trattare le mie 9 TEdit (EmioNum1,EmioNum2ì, ..., EmioNum9), come un array "grafico".
Per arrivare a questo però mi pare di capire che col metodo che mi hai suggerito potrei costruire un array di puntatori alle suddette TEdit.

Se fin qui ho capito bene, dovrei estrarre il valore indirizzo di ciascuna TEdit e caricarlo in un array di tipo indirizzo (es.: Puntatore), in modo da potere accedere alle TEdit tramite il valori indirizzo contenuti nell'array Puntatore.

Mi mancano perciò le conoscenze corrette per ottenere i due risultati suddetti.

Per creare la struttura di aggancio necessaria, ho cominciato a scrivere, con l'aiuto della funzione da te suggeritami, alcune istruzioni nella seguente procedura:
Codice: [Seleziona]

procedure TForm411.FormCreate(Sender: TObject);
const
  aControl:TWinControl;
  StartSpace: String= '';
var

  i: Integer;
  Res, aControl: String;

begin

  for i := 0 to aControl.ControlCount -1 do
  begin
    WriteStr(Res,StartSpace + aControl.Controls[i].Name);
    Result:= Result + Res + LineEnding;
    if aControl.Controls[i] is TWinControl then
      EnumControls(TWinControl(aControl.Controls[i]), StartSpace+'  ')
  end;
{  for i:= 1 to 9 do
  begin
    tbSist[1,1]:= ;
    TWinControl;
  end;}
end;                       

Purtroppo la prova è finita prima di cominciare, perchè il compilatore, come ho indicato nel mio post precedente, mi ha segnalato l'errore già alla definizione di
Codice: [Seleziona]
const
  aControl:TWinControl;  // Fatal: Syntax error, "=" expected but ";" found
Quindi, intanto dovrei capire come uscire da detta segnalazione di errore, in modo da potere arrivare ad ottenere i famosi valori indirizzo a tutte e 9 la mie TEdit.
Spero di essermi spiegato meglio e di potere ancora ricevere l'aiuto che mi porterà a proseguire nella prova studio corrente.
Grazie!
ciao ciao

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:gestione tabellare di una serie di TEdit
« Risposta #6 il: Dicembre 02, 2020, 11:58:19 am »

Purtroppo la prova è finita prima di cominciare, perchè il compilatore, come ho indicato nel mio post precedente, mi ha segnalato l'errore già alla definizione di
Codice: [Seleziona]
const
  aControl:TWinControl;  // Fatal: Syntax error, "=" expected but ";" found
Quindi, intanto dovrei capire come uscire da detta segnalazione di errore, in modo da potere arrivare ad ottenere i famosi valori indirizzo a tutte e 9 la mie TEdit.
Spero di essermi spiegato meglio e di potere ancora ricevere l'aiuto che mi porterà a proseguire nella prova studio corrente.
Grazie!


nella sezione const devi definire le costanti e quindi l'operatore che ci si aspetta è '=' (da quì l'errore)

probabilmente volevi scrivere:
Codice: [Seleziona]
type
  aControl:TWinControl;



Imagination is more important than knowledge (A.Einstein)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:gestione tabellare di una serie di TEdit
« Risposta #7 il: Dicembre 02, 2020, 10:34:11 pm »
sono alquanto inguaiato. Pur scrivendo:
Codice: [Seleziona]
type
  aControl: TWinControl;
il compilatore segnala un errore di sintassi:
Citazione
carnumgioca.pas(65,11) Fatal: Syntax error, "=" expected but ":" found
Mi dispiace, ma non so proprio andare avanti.
« Ultima modifica: Dicembre 02, 2020, 10:38:07 pm da petrusic »
ciao ciao

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:gestione tabellare di una serie di TEdit
« Risposta #8 il: Dicembre 03, 2020, 12:25:42 pm »
infatti ho sbagliato a scrivere il codice
hai provato a fare come suggerisce il compilatore (cioè mettere '=' al posto dei ':')?
Imagination is more important than knowledge (A.Einstein)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:gestione tabellare di una serie di TEdit
« Risposta #9 il: Dicembre 03, 2020, 04:05:31 pm »
Si ho provato, anche se non so cosa scrivere dopo l'uguale.
Riporto il codice della unit, fino alla procedura incriminata:
Codice: [Seleziona]
unit carNumGioca;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons,
  LCLType, ExtCtrls;

type

  { TForm411 }

  TForm411 = class(TForm)
    EdigNum: TEdit;
    EmioNum1: TEdit;
    EmioNum6: TEdit;
    EmioNum7: TEdit;
    EmioNum8: TEdit;
    EmioNum9: TEdit;
    EmioNum2: TEdit;
    EmioNum3: TEdit;
    EmioNum4: TEdit;
    EmioNum5: TEdit;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    pulsAnnullFrm411: TButton;


    procedure EdigNumChange(Sender: TObject);
    procedure EdigNumKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
      );
    procedure FormCreate(Sender: TObject);
    procedure pulsAnnullFrm411Click(Sender: TObject);
  private

  public

  end;

var
  Form411: TForm411;

implementation

{$R *.lfm}

{ TForm411 }
type
  TtbSist = array[0..8] of Integer;
var
  tbSist: TtbSist;

procedure TForm411.pulsAnnullFrm411Click(Sender: TObject);
begin
  Close
end;

procedure TForm411.FormCreate(Sender: TObject);
type
  TWinControl= ^String;

const
  StartSpace: String= '';

var
  aControl: TWinControl;
  i: Integer;
  Res: String;

  begin
  Label1.Caption:= 'Digita un numero' + System.lineending + '(da 1 a 90)';
  for i := 0 to aControl.ControlCount -1 do
  begin
    WriteStr(Res,StartSpace + aControl.Controls[i].Name);
    Result:= Result + Res + LineEnding;
    if aControl.Controls[i] is TWinControl then
      EnumControls(TWinControl(aControl.Controls[i]), StartSpace+'  ')
  end;
end;                                   
 

Ora ricevo due errori:
Citazione
carnumgioca.pas(77,26) Error: Illegal qualifier
carnumgioca.pas(77,26) Fatal: Syntax error, "DO" expected but "identifier CONTROLCOUNT" found
Codice: [Seleziona]
for i := 0 to aControl.ControlCount -1 do f 


« Ultima modifica: Dicembre 03, 2020, 04:20:36 pm da petrusic »
ciao ciao

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:gestione tabellare di una serie di TEdit
« Risposta #10 il: Dicembre 03, 2020, 10:00:21 pm »
Ciao.




Come il solito cambio approccio.
Nelle ultime versioni di FPC esistono le enumerazioni (for x in insieme do).


Codice: [Seleziona]

type


  { TComponentEnumerator }


  TComponentEnumerator = class
  private
    FTarget: TWinControl;
    FIdx: integer;
    function getCurrent: TComponent;
  public
    constructor Create(aTarger: TWinControl);
    destructor Destroy; override;
    function MoveNext: boolean;
  published
    property Current: TComponent read getCurrent;
  end;


function TComponentEnumerator.getCurrent: TComponent;
begin
  Result := FTarget.Components[FIdx];
end;


constructor TComponentEnumerator.Create(aTarger: TWinControl);
begin
  FTarget := aTarger;
  FIdx := -1;
end;


destructor TComponentEnumerator.Destroy;
begin
  inherited Destroy;
end;


function TComponentEnumerator.MoveNext: boolean;
begin
  Inc(FIdx);
  Result := FIdx < FTarget.ComponentCount - 1;
end;


operator enumerator(target: TWinControl): TComponentEnumerator;
begin
  Result := TComponentEnumerator.Create(target);
end;


questo codice produce la classe che FPC necessita per poter "viaggiare" automaticamente su tipi custom.
In questo caso i component di una classe visuale.


Codice: [Seleziona]

var
  c: TComponent;


begin
  for c in self do
  begin
    if (c is TEdit) and (c.Tag = 1) then
    begin
      ShowMessage((C as TEdit).Text);
    end;
  end;
end; 


Questo è un esempio stupido di utilizzo (come vedi diventa quasi banale).
Per discriminare il tipo di component che ti interessa puoi usare la logica che meglio ti è più congeniale.


Spero di averti dato uno spunto, non so nemmeno se va (scritto di getto).


Stilgar.
[/code]
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

brunello

  • Jr. Member
  • **
  • Post: 83
  • Karma: +0/-0
Re:gestione tabellare di una serie di TEdit
« Risposta #11 il: Dicembre 04, 2020, 06:09:41 pm »
al di la delle varie strategie per scansionare tutti i componenti del progetto penso che il metodo che ti avevo suggerito sia il più semplice
con
Codice: [Seleziona]
  x := FindComponent('EmioNum1').ComponentIndex;
ricavi l'indice al componente da utilizzare poi  con
Codice: [Seleziona]
TEdit(Components[x]).Text := 'Prova';
puoi variare il valore  o con
Codice: [Seleziona]
stringa := TEdit(Components[x]).Text ;
leggerne il contenuto

brunello

  • Jr. Member
  • **
  • Post: 83
  • Karma: +0/-0
Re:gestione tabellare di una serie di TEdit
« Risposta #12 il: Dicembre 04, 2020, 11:50:44 pm »
Ti ho fatto programma di esempio

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:gestione tabellare di una serie di TEdit
« Risposta #13 il: Dicembre 05, 2020, 04:19:57 pm »
Ti ho fatto programma di esempio
L'ho scaricato, ma l'estrazione mi dà errore, infatti, nella cartella non trovo il file .lpi
Citazione
[petrus@localhost prog_Brunello]$ ls -R
.:
project1  project1.rar

./project1:
project1.ico  project1.lpr  project1.lps  unit1.lfm  unit1.pas
[petrus@localhost prog_Brunello]$
« Ultima modifica: Dicembre 05, 2020, 04:35:18 pm da petrusic »
ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:gestione tabellare di una serie di TEdit
« Risposta #14 il: Dicembre 05, 2020, 04:54:07 pm »
al di la delle varie strategie per scansionare tutti i componenti del progetto penso che il metodo che ti avevo suggerito sia il più semplice
Scusa Brunello. Non ho preferenze verso nessuno che tenti di aiutarmi. Ho cominciato a provare un percorso che non pensavo, comunque, fosse tanto ostico per me.
Ho semplicemente rimandato ad un secondo momento la prova che tu mi hai proposto, perchè mi piacerebbe capire ed apprendere i vari metodi attuabili.
Mi rendo conto per capire certe problematiche occorrerebbe una guida dedicata, diversa da domanda e riposta. Ciò perchè, a volte la risposta è diversa da quella che ci si aspetta, sicuramente perchè chi risponde pensa di fornire un tassello per colmare un buco nero, non immaginando, giustamente, che non si tratta di un buco nero, ma di una non conoscenza di tutto l'ambiente.
Ecco perchè, nonostante gli sforzi di nomorelogic e Stilgar, io sono ancora fermo alla fermata del treno.
ciao ciao

 

Recenti

How To

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18769
  • Topic in totale: 2232
  • Online Today: 60
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 59
Total: 59

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.