Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Maggio 16, 2024, 03:38:08 pm

Titolo: [Risolto] parametri passati per riferimento
Inserito da: petrusic - Maggio 16, 2024, 03:38:08 pm
Dovrei richiamare una procedura alla quale passare un array contenente gli ID dei record di Database da eliminare.
Di fronte a tale prospettiva, ho pensato di passare alla procedura che dovrà occuparsi dell'eliminazione concreta dei record interessati, tutti i codici ID da cancellare dentro una variabile di tipo array. Gli array, come meglio chiarito qui (https://www.lazaruspascal.it/index.php?topic=2570.msg16569#msg16569), sono passati per riferimento.

Prendendo forza da ciò, ho proceduto a preparare il codice necessario:
Codice: [Seleziona]
var
 . . .
 striCodId2Canc: String = '';

  tabSplit: TStringArray;
  tbEl: TstringArray;
  tbIDmovimgg: TstringArray;         
 . . .
sql:= 'SELECT movimgg.IdMovvgg AS IDMovimgg, partmovv.IdPartGlob AS IDpartmovv FROM movimgg, partmovv, piancont WHERE movimgg.DtCoMovgg = partmovv.DtCoPartGlob';
    sql:= sql + ' AND movimgg.OraSolMovgg = partmovv.OraSolPartGlob AND movimgg.DtCoMovgg = ' + Form9.dataFin + ' AND movimgg.OraSolMovgg >= 235000 AND movimgg.OraSolMovgg <= 235959';
    sql:= sql + ' AND movimgg.CoVocMovvgg = piancont.NumVoce AND piancont.ContrPartSiNo = "Q" ORDER BY movimgg.NuProMovvgg, movimgg.CoVocMovvgg';
    striCodId2Canc:= PreparaCodIdCanc(sql); 
 . . .
    tabSplit:= striCodId2Canc.Split(chr(13));
    striCodIDmovimgg:= tabSplit[0];     // cioè tutti i codici ID della tabella di DB movimgg
    tbEl:= striCodIDmovimgg.Split(chr(9));
    setLength(tbIDmovimgg, Length(tbEl));
    for i:= 0 to (Length(tbEl) - 1) do
    begin
      tbIDmovimgg[i]:= tbEl[i];
    end;                                       
    CancMovvFinIniAnno(tbIDmovimgg, 'movimgg', 'IdMovvgg');      //  riga 4036
 . . .

Il Compilatore però non è però d'accordo con le mie assegnazioni perchè mi segnala il seguente errore:
Citazione
frm9.pas(4036,37) Error: Incompatible type for arg no. 1: Got "TStringArray", expected "AnsiString"

Ho provato a modificare l'array da "TStringArray" a "AnsiString", ma non ci sono riuscito per chè un tipo di array ansistring non è assegnabile (l'unico che ho trovato è "TAnsiStringBuilder").

Non capisco perchè non posso assegnare un array TStringArray. Pensavo ad un conflitto di assegnazioni nelle variabili dichiarate, ma non ho trovato niente. Non immagino perciò come potere procedere
Titolo: Re:parametri passati per riferimento
Inserito da: DragoRosso - Maggio 16, 2024, 04:58:28 pm
Prova così:
Codice: [Seleziona]
type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
     procedure Cancella(elenco: array of string);
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

var prova: array of string;

{ TForm1 }

procedure TForm1.Cancella(elenco: array of string);
var ID: string;
begin
  for ID in elenco do
   begin
     ///CANCELLA IL RECORD QUI
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetLength(prova, 10);
  ///RIEMPI L'ARRAY
  ///.............
  //Cchiama la canecllazione
  Cancella(prova);
  ///ELIMINA l'ARRAY
  SetLength(prova, 0);
end;

end.                           
Titolo: Re:parametri passati per riferimento
Inserito da: petrusic - Maggio 16, 2024, 05:16:17 pm
Ho trovato il conflitto di dichiarazioni.

Non si vede nel codice che ho postato, perchè veniva scatenato dalla dichiarazione riportata nelle procedura chiamata:
Codice: [Seleziona]
procedure CancMovvFinIniAnno(tbIDMovim: String; nomeTbDB, nomeCampoID: String);  <-- prima

procedure CancMovvFinIniAnno(tbIDMovim: array of String; nomeTbDB, nomeCampoID: String);  <-- dopo

Sostituendo la prima riga con la seconda, la segnalazione è scomparsa.

Grazie, comunque. ;)