* * * *

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.
Marzo 12, 2025, 10:28:52 pm

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

101 Visitatori, 0 Utenti

Autore Topic: Inizializzazione array di record  (Letto 410 volte)

cappe

  • Jr. Member
  • **
  • Post: 58
  • Karma: +0/-0
Inizializzazione array di record
« il: Marzo 08, 2025, 06:13:11 pm »
Ciao,
  ho un lapsus
con

type
pippo = record
  a : integer;
  b: String;
end;
arrPippo = array of pippo;

var
  uu : arrPippo; 
begin
   // la domanda è come lo inizializzo
   uu := arrPippo.Create( ??????) ;    // <- e se voglio mettere un record pippo come lo scrivo?
end;

Grazie.

Narciso

  • Scrittore
  • Full Member
  • *****
  • Post: 145
  • Karma: +0/-0
Re:Inizializzazione array di record
« Risposta #1 il: Marzo 09, 2025, 07:35:09 am »
guarda un po'...

Codice: [Seleziona]
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button2: TButton;

    procedure Button2Click(Sender: TObject);

  private

  type tpippo = record
  a:integer;
  b:string[20];
  end;
  Var A_pippo:array of tpippo;

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }


procedure TForm1.Button2Click(Sender: TObject);
var x:integer;
begin

  setlength(a_pippo,0);
  for x:=0 to 9 do begin
  setlength(a_pippo,x+1);
  a_pippo[x].a:=x;
  a_pippo[x].b:=inttostr(x);

  end;
  showmessage(inttostr(length(A_pippo)));
end;

end.     

cappe

  • Jr. Member
  • **
  • Post: 58
  • Karma: +0/-0
Re:Inizializzazione array di record
« Risposta #2 il: Marzo 09, 2025, 11:03:33 am »
guarda un po'...

Codice: [Seleziona]
  setlength(a_pippo,0);
  for x:=0 to 9 do begin
  setlength(a_pippo,x+1);
  a_pippo[x].a:=x;
  a_pippo[x].b:=inttostr(x);

  end;
 

Grazie per aver risposto.
Lo so che si più fare così, ma io volevo la forma ridotta con il .create
cioè dovrebbe essere qualcosa del tipo

uu := arrPippo.Create((1,'ww') ;

ma non mi ricordo (se si può fare) come.

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1522
  • Karma: +45/-0
  • Prima ascoltare, poi decidere
Re:Inizializzazione array di record
« Risposta #3 il: Marzo 09, 2025, 01:35:31 pm »
Puoi usare gli "advanced record" e creare delle procedure.
Comunque il costruttore di un record NON può avere parametri, procedure e metodi si.

Puoi quindi creare una procedura ad esempio Init( ....; ...) con cui inizializzi quello che vuoi.

I record non hanno distruttori !!!
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

cappe

  • Jr. Member
  • **
  • Post: 58
  • Karma: +0/-0
Re:Inizializzazione array di record
« Risposta #4 il: Marzo 09, 2025, 02:01:05 pm »
Ma scusa se fosse un TStringArray io posso fare così

begin
arr := TStringArray.create('eee','rrr');
end;

e funziona, ma con un array di record?

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1522
  • Karma: +45/-0
  • Prima ascoltare, poi decidere
Re:Inizializzazione array di record
« Risposta #5 il: Marzo 09, 2025, 03:00:14 pm »
Ma scusa se fosse un TStringArray io posso fare così
begin
arr := TStringArray.create('eee','rrr');
end;
e funziona, ma con un array di record?

Se vuoi creare un array di stringhe costanti puoi farlo anche così:

Codice: [Seleziona]
var
 strarr: array of string = ['uno', 'due', 'tre'];

Per un array l'indicazione che pensavo di fornirti è creare una procedura di inizializzazione, ovviamente da chiamare per ciascun elemento. Non ho conoscenza di una procedura che consente di inizializzare a dei valori voluti un array di record.
Perchè farlo a differenza di quanto suggerito da @Narciso (fermo restando che và comunque bene anche la sua soluzione): perchè nel caso tu cambi la struttura puoi sfruttare la procedura per fare si che la compilazione non avvenga se non aggiorni l'inizializzazione. Io sui record uso molto spesso le procedure per inserire i dati, non inserisco i dati direttamente nei campi del record perchè se cambio qualcosa (refactoring) con le procedure ho una segnalazione di errore e ciò mi consente di modificare il codice a "colpo sicuro".

Esempio:

Codice: [Seleziona]
type
  RProva = record
    private
      fNome: string;
      fCognome: string;
    public
      procedure Init(const Nome: string; const Cognome: string);
  end;

....
....

procedure RProva.Init(const Nome, Cognome: string);
begin
  fNome := Nome;
  fCognome := Cognome;
end;

...
...

var
  Prova: array of RProva;
  //EDIT2: al posto della definizione di Prova in modalità classica, puoi usare anche i generici se ti piace di più, non cambia il codice:
  //Prova: TArray<RProva>;
  i: RProva;
begin
  SetLength(Prova, 10);
  for i in Prova do
     i.Init('Non usato', 'Non usato');
end;

Se aggiorno il record con ad esempio l'aggiunta di una data:
Codice: [Seleziona]
type
  RProva = record
    private
      fNome: string;
      fCognome: string;
      fDataNascita: TDate;
    public
      procedure Init(const Nome: string; const Cognome: string; DataNascita: TDate);
  end;

La compilazione mi genererebbe un errore ovunque usi la procedura Init, e così via ove usi le funzioni o procedure per inserire i dati (o anche per leggerli se fosse importante).
EDIT: per spiegare meglio, se uso direttamente i campi potrei dimenticare da qualche parte nel sorgente di settare la data di nascita senza che me ne accorga, e ciò non è bello ...

E' leggermente differente che usare i campi direttamente, ma questo è un mio modo di programmare, non deve essere preso assolutamente come campione.

Ciao
« Ultima modifica: Marzo 09, 2025, 03:18:59 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

cappe

  • Jr. Member
  • **
  • Post: 58
  • Karma: +0/-0
Re:Inizializzazione array di record
« Risposta #6 il: Marzo 09, 2025, 04:08:58 pm »
Ti ringrazio della risposta, ma non è quello che cercavo. Cercherò e se trovo Vi saprò dire.
Capisco i tuoi esempi, es è come ho fatto fin'ora, ma volevo fare come nell'esempio scritto sopra , ripeto con TStringArray funziona e non so come fare (o non mi ricordo) con gli array di record.

Grazie a tutti.
« Ultima modifica: Marzo 09, 2025, 04:13:19 pm da cappe »

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2974
  • Karma: +20/-4
Re:Inizializzazione array di record
« Risposta #7 il: Marzo 10, 2025, 10:27:28 am »
forse vuoi usare la .Create con la sintassi che si usa per le costanti tipizzate?

https://forum.lazarus.freepascal.org/index.php/topic,61986.msg468094.html#msg468094
Imagination is more important than knowledge (A.Einstein)

cappe

  • Jr. Member
  • **
  • Post: 58
  • Karma: +0/-0
Re:Inizializzazione array di record
« Risposta #8 il: Marzo 10, 2025, 11:39:31 am »
Forse non mi sono spiegato bene. Io un array di stringhe posso inizializzarlo così:
Codice: [Seleziona]
program Project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Sysutils,
  Classes
  { you can add units after this };

var
  c : TStringArray;
begin
  c := TStringArray.Create('eee', 'rrr');
end.
                   

Però non riesco a farlo con un array di record

P.S. @nomorelogic  esempio interessante
« Ultima modifica: Marzo 10, 2025, 11:42:13 am da cappe »

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2974
  • Karma: +20/-4
Re:Inizializzazione array di record
« Risposta #9 il: Marzo 10, 2025, 03:36:30 pm »
se guardi nel link che ti ho indicato c'è questo pezzo di codice

Codice: [Seleziona]
type
  tConstArray  = array of TVarRec;
 
[...]

var
  x: TConstArray;
  y: TConstArray =
  (
    (vtype : vtChar;    vchar : '1'),
    (vtype : vtInteger; vinteger : 1),
    (vtype : vtPointer; vpointer : nil)
  );
 


non so se funziona (oggi non riesco a provare in quanto sono in giro)
ma pensavo tu intendessi qualcosa del genere

Codice: [Seleziona]

x:= TConstArray.Create (
 
         (
            (vtype : vtChar;    vchar : '1'),
            (vtype : vtInteger; vinteger : 1),
            (vtype : vtPointer; vpointer : nil)
          )

);


Imagination is more important than knowledge (A.Einstein)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1522
  • Karma: +45/-0
  • Prima ascoltare, poi decidere
Re:Inizializzazione array di record
« Risposta #10 il: Marzo 10, 2025, 03:49:54 pm »
Quel "modo" di creare gli array, se si legge bene l'articolo, ha tutta una serie di controindicazioni. Prima di usarlo io ci penserei N (con N che tende all'infinito e oltre) volte ....

E' una mimica usata per il compilatore (ci sono diverse discussioni anche su Delphi) per consentire un uso simile al WriteLn(var1, var2, var3, var n) ...

Quando viene usato, non c'è modo di sapere da parte di chi riceve questo "array" (se si può chiamare tale) quanti elementi ci sono, è necessario conoscerli a priori (o ci devo abbinare qualche altro dato che mi informi su ciò).

Però, ammettendo che si voglia usare, non penso sia ancora quello che vuole @Cappe, magari mi sbaglio però ...

:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2974
  • Karma: +20/-4
Re:Inizializzazione array di record
« Risposta #11 il: Marzo 10, 2025, 04:35:50 pm »
infatti non so se ho capito il problema
comunque, con l'occasione, questo è il link della documentazione ufficiale

(cercate la sezione "Dynamic array constructor")

https://www.freepascal.org/docs-html/ref/refsu14.html#x38-520003.3.1
Imagination is more important than knowledge (A.Einstein)

cappe

  • Jr. Member
  • **
  • Post: 58
  • Karma: +0/-0
Re:Inizializzazione array di record
« Risposta #12 il: Marzo 11, 2025, 06:18:04 am »
L'idea è questa
Codice: [Seleziona]
program Project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Classes
  { you can add units after this };

type
  calimero = record
    sonoNero : Boolean;
  end;
  sfigati = array of calimero;

var
  io : calimero;
  tu : calimero;
  noi : sfigati;
begin
  io.sonoNero:=True;
  tu.sonoNero:=True;
  noi := sfigati.Create(io, tu);
end.       
e funziona.

Vorrei fare  noi := sfigati.Create(io, tu); senza dichiarare le variabili io e tu, cioè se è possibile assegnare i valori del record direttamente dentro  noi := sfigati.Create

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1522
  • Karma: +45/-0
  • Prima ascoltare, poi decidere
Re:Inizializzazione array di record
« Risposta #13 il: Marzo 11, 2025, 09:09:40 am »
@cappe

... ma quanto sono indietro? ... non mi sono mai chiesto nulla sulla esistenza di un "helper" sul create di un array. Sempre che sia un helper e non un metodo risolto dal compilatore.

Dopo una breve ricerca non ho trovato nulla sul "create" di un array in quel modo che hai indicato (e su Delphi funziona) .....

Questa illuminazione mattutina mi mette curiosità sul sapere se esiste un qualcosa per fare quello che suggerisci.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2974
  • Karma: +20/-4
Re:Inizializzazione array di record
« Risposta #14 il: Marzo 11, 2025, 09:11:36 am »
dovresti provare con qualcosa tipo

Codice: [Seleziona]

noi := sfigati.Create(  ( sononero: True ), ( sononero: True ) );



oppure se puoi fare in modo che calimero sia un oggetto

Codice: [Seleziona]

noi := sfigati.Create(  TCalimero.Create(true), TCalimero.Create(true) );


è da provare ma la strada credo sia questa
Imagination is more important than knowledge (A.Einstein)

 

Recenti

How To

Utenti
Stats
  • Post in totale: 19587
  • Topic in totale: 2348
  • Online Today: 105
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 101
Total: 101

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.