Redimensionner un tableau



Introduction

La méthode est différente selon que vous utilisiez Delphi 4, 5, 6, 7 ou une version antérieure.

Delphi 4, 5, 6, 7

Il suffit de déclarer un tableau dynamique, sans spécifier de taille:

Déclaration du tableau

var
  xxx: array of integer; 



Ensuite, dans le programme, il suffit de lui assigner une taille à chaque fois que tu as besoin d'ajouter ou de retirer des éléments, grâce à la fonction SetLength:

Changement de taille du tableau

begin
  SetLength(xxx, 25);
end; 



Pour obtenir la taille, la fonction Length:

Récupération de la taille

var
  size: integer;
begin
  size := Length(xxx);
end; 



Pour ajouter une entrée au tableau:

Ajouter une etrée

begin
  SetLength(xxx, Length(xxx) + 1);
end; 



pour retirer une entrée au tableau:

Retirer une entrée

begin
  SetLength(xxx, Pred(Length(xxx)));
end;




Delphi 1, 2, et 3

Vous ne pouvez pas redimensionner un tableau non dynamique en Pascal. Vous pouvez créer et redimensionner un tableau créé dynamiquement. Pour le faire, vous devez créer le tableau dyamique, désactiver le contrôle d'intervalle, et accéder aux membres du tableau via une variable uniquement, ou vous aurez des erreurs lors de la compilation. Comme vous accedez au tableau à traversune variable pointeur, vous pouvez redimensionner le tableau en créant un nouveau tableau en mémoire, copiez tous les éléments valides du tableau original vers le nouveau tableau, libérer la mémoire pour le tableau original, et réassigner le pointeur du nouveau tableau au pointeur du tableau original:


Simulation de tableaux dynamiques

type
  TSomeArrayElement = integer;
  PSomeArray = ^TSomeArray;
  TSomeArray = array[0..0] of TSomeArrayElement;

procedure CreateArray(var TheArray : PSomeArray;
  NumElements : longint);
begin
  GetMem(TheArray, sizeof(TSomeArrayElement) * NumElements);
end;

procedure FreeArray(var TheArray : PSomeArray;
  NumElements : longint);
begin
  FreeMem(TheArray, sizeof(TSomeArrayElement) * NumElements);
end;

procedure ReSizeArray(var TheArray : PSomeArray;
  OldNumElements : longint;
  NewNumElements : longint);
var
  TheNewArray : PSomeArray;
begin
  GetMem(TheNewArray, sizeof(TSomeArrayElement) * NewNumElements);
  if NewNumElements > OldNumElements then
    Move(TheArray^,
         TheNewArray^,
         OldNumElements * sizeof(TSomeArrayElement)) else
    Move(TheArray^,
         TheNewArray^,
         NewNumElements * sizeof(TSomeArrayElement));
   FreeMem(TheArray, sizeof(TSomeArrayElement) * OldNumElements);
   TheArray := TheNewArray;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  p : PSomeArray;
  i : integer;
begin

{$IFOPT R+}
  {$DEFINE CKRANGE}
  {$R-}
{$ENDIF}

  CreateArray(p, 200);
  for i := 0 to 199 do p^[i] := i;
  ResizeArray(p, 200, 400);
  for i := 0 to 399 do p^[i] := i;
  ResizeArray(p, 400, 50);
  for i := 0 to 49 do p^[i] := i;
  FreeArray(p, 50);

{$IFDEF CKRANGE}
   {$UNDEF CKRANGE}
   {$R+}
{$ENDIF}

end;


3 requête(s) SQL executée(s) en 0.001 Secs - Temps total de génération de la page : 0.005 Secs