Création dynamique de TStringList et de TBitmap

sisi231 Messages postés 207 Date d'inscription mercredi 5 mars 2003 Statut Membre Dernière intervention 29 mars 2013 - 24 janv. 2007 à 15:14
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 - 24 janv. 2007 à 16:55
Bonjour,

je souhaiterais pouvoir créer dynamiquement (i.e. pendant l'exécution de mon programme) des TBitmap et des TstringList autant que je veux.
L'ennui c'est que je ne peut pas savoir à l'avance combien je vais en créer, donc je ne peux pas tous les déclarer.

Merci de votre aide.

PS : Ne me dîtes pas qu'il faut faire b:=TBitmap.cretae par exemple je le sais c'est pour avoir des b1, b2, b3, bref j'espère que je suis clair.

SISI231

2 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
24 janv. 2007 à 16:37
fait des tableaux :

type
TBitmaps = array of TBitmap;
TStringsLists = array of TStringsList;

aprés c'est juste une question de SetLength ect...

sinon, tu peu partir sur une base TCollectionItem/TCollection, ç'est pas trop complexe a faire, et tu pourras gerer tes elements comme tu le souhaite plus facilement qu'avec des tableaux dynamique.
de plus c'est plus simple pour les liberations des objets.

tu peu regarder aussi du coter TObjectList. et deriver la classe pour l'adapter aux TBitmap et TStringsList

0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
24 janv. 2007 à 16:55
Pour approfondir la proposition de fOxi, voici un exemple basé sur un TList.

type
//...
TBmpList = class(TList)
  public
    destructor Destroy; override;
    function AddBitmap(W,H: integer): integer;
    procedure DelBitmap(I: integer);
    procedure ClearAll;
    function GetBitmap(I: integer): TBitmap;
  end;

var
   //...  
   BmpList: TBmpList;

implementation


function TBmpList.AddBitmap(W,H: integer): integer;
var
  P: ^TBitmap;
  Bmp: TBitmap;
begin
  Bmp: = TBitmap.Create;
  with Bmp do
  begin
    Width:= W;
    Height:= H;
    PixelFormat:= pf24bit;
  end;
  New(P);
  P^:= Bmp;
  Result:= Add(P);
end;


procedure TBmpList.DelBitmap(I: integer);
var
  P: ^TBitmap;
begin
  if (I >= 0) and (I < Count) then
  begin
    P:= Items[I];
    P^.Free;
    Dispose(P);
    Delete(I);
  end;
end;


procedure TBmpList.ClearAll;
var
  I: integer;
  P: ^TBitmap;
begin
  for I:= 0 to Count-1 do
  begin
    P:= Items[I];
    P^.Free;
    Dispose(P);
  end;
  Clear;
end;


destructor TBmpList.Destroy;
begin
   ClearAll;
   inherited Destroy;
end;


function TBmpList.GetBitmap(I: integer): TBitmap;
var
  P: ^TBitmap;
begin
  try
    P:= Items[I];
    Result:= P^;
  except
    Result:= nil;
    //...
  end;
end;

Pour utiliser cela :
BmpList:= TBmpList.Create;
I:= BmpList.AddBitmap(200,100)  // nouveau bitmap de 200 sur 100
with BmpList.GetBitmap(I) do ....

Et ne pas oublier de faire un Free de BmpList quand tu n'en as plus besoin.
J'espère ne pas avoir commis d'erreur...
A +
Thierry
0
Rejoignez-nous