unit Unit2; interface uses Classes; type //Classe de base des utilisateurs TUser = class (TCollectionItem) private FUserName: string; procedure SetUserName(const Value: string); public procedure Assign(Source: TPersistent);override; published property UserName: stringread FUserName write SetUserName; end; TUserClass = classof TUser; //Collection d'utilisateurs; TUsers = class (TCollection) private function GetItem(Index: integer): TUser; procedure SetItem(Index: integer; const Value: TUser); public constructor Create(UserClass: TUserClass); function Add: TUser; property Items[Index: integer]: TUser read GetItem write SetItem;default; end; implementation { TUser } procedure TUser.Assign(Source: TPersistent); begin if Source is TUser then begin UserName : = (Source as TUser).UserName; end else inherited; end; procedure TUser.SetUserName(const Value: string); begin FUserName := Value; end ; { TUsers } function TUsers.Add: TUser; begin Result : = inherited Add as TUser; end; constructor TUsers.Create(UserClass: TUserClass); begin inherited Create(UserClass); end; function TUsers.GetItem(Index: integer): TUser; begin Result := inherited GetItem(Index) as TUser; end; procedure TUsers.SetItem(Index: integer; const Value: TUser); begin inherited SetItem(Index, Value); end; end.Les propriétés peuvent être déclarées Public. Si j'ai choisi de les déclarer Published ici, c'est uniquement pour pouvoir utiliser le système de mise en flux qui facilite énormément la sauvegarde.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionunit TUse; interface uses classes; type //Classe de base des utilisateurs TUser = class (TcollectionItem) private FUserName: string; floggin: string; fpass: string; fip: string; fport: integer; famis: Tlist; fpseudo: string; fconfig: boolean; procedure SetUserName(const Value: string); procedure Setloggin(const log: string); procedure Setconfig(const co: boolean); procedure Setpass(const passe: string); procedure Setip(const ips: string); procedure Setport(const por: integer); procedure Setamis(const ami: Tlist); procedure Setpseudo(const pseud: string); public procedure Assign(Source: TPersistent); override; //Nécessité d'un constructor pour initialiser FAmis constructor Create(Collection: TCollection);override; //Nécessité d'un destructeur pour détruire FAmis destructor Destroy;override; published property UserName: stringread FUserName write SetUserName; property loggin: stringread Floggin write Setloggin; property pass: stringread Fpass write Setpass; property ip: stringread Fip write Setip; property port: integer read Fport write Setport; property pseudo: stringread Fpseudo write Setpseudo; property config: boolean read Fconfig write Setconfig; property amis: Tlist read Famis write Setamis; end; TUserClass = classof TUser; TUsers = class (Tcollection) private function GetItem(index: integer): TUser; procedure SetItem(Index: integer; const Value: TUser); public constructor Create(UsersClass: TUserCLass); function add: TUser; property Items[index: integer]: TUser read GetItem write SetItem; default; end; implementation procedure TUser.Assign(Source: TPersistent); begin if (Source is TUser) then begin Username : = (Source as TUser).UserName; loggin := (Source as TUser).loggin; pass : = (Source as TUser).pass; ip := (source as TUser).ip; port : = (source as TUser).port; amis := (source as TUser).amis; pseudo : = (source as TUser).pseudo; config := (source as TUser).config; {Les amis de nos amis sont aussi nos amis !} Amis.Assign((Source as TUser).amis); end else inherited; end; procedure TUser.SetUserName(const Value: string); begin FUserName : = Value; end; function TUsers.Add: TUser; begin Result := inherited Add as TUser; end; constructor TUsers.Create(UsersClass: TUserClass); begin inherited Create(UsersClass); end; function TUsers.GetItem(Index: integer): TUser; begin Result : = inherited GetItem(Index) as TUser; end; procedure TUsers.SetItem(Index: integer; const Value: TUser); begin inherited SetItem(Index, Value); end; procedure TUser.Setconfig(const co: boolean); begin fconfig := co; end ; procedure TUser.Setloggin(const log: string); begin floggin : = log; end; procedure TUser.Setpass(const passe: string); begin fpass := passe; end ; procedure TUser.Setip(const ips: string); begin fip : = ips; end; procedure TUser.Setport(const por: integer); begin fport := por; end ; procedure TUser.Setamis(const ami: Tlist); begin famis : = ami; end; procedure TUser.Setpseudo(const pseud: string); begin fpseudo := pseud; end ; constructor TUser.Create(Collection: TCollection); begin inherited; FAmis : = TList.Create; end; destructor TUser.Destroy; begin FAmis.Free; inherited; end; end.Maintenant, tu as tout ce qu'il te faut pour bien débuter.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, {ajouter TUse ici si nous utilisons un TUsers en tant que membre de classe ci-dessous} TUse ; type TForm1 = class (TForm) btnAddUsers: TButton; Memo1: TMemo; btnListUsers: TButton; procedure btnAddUsersClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure btnListUsersClick(Sender: TObject); private { Déclarations privées } Users: TUsers; public { Déclarations publiques } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin //crée la collection Users : = TUsers.Create(TUser); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin {Les éléments de la collection seront automatiquement libérés à condition de libérer la collection} Users.Free; end; procedure TForm1.btnAddUsersClick(Sender: TObject); var i: integer; const MaxUsers = 26; begin //ajoute 26 membres à la collection for i : = 0 to MaxUsers - 1 do {L'appel de la méthode Add suffit à ajouter un élément} with Users.add do begin {Affectation de quelques propriétés à l'utilisateur} UserName := 'User ' + Chr(65 + i); Loggin := ''; Pass := ''; IP := '127.0.0.' + IntToStr(i); Port := 80; Pseudo := 'Pseudo' + IntToStr(i); Config := False; end ; end; procedure TForm1.btnListUsersClick(Sender: TObject); var i: integer; begin Memo1.Clear; //Affiche la liste des utilisateurs for i : = 0 to Users.Count - 1 do Memo1.Lines.Append(Users[i].UserName); end; end.Est-ce plus clair maintenant ?
{La classe TCollectionHelper est utilisée pour mettre la collection TUSers dans un flux. Pour celà, nous utilisons les capacités de Delphi à sauvegarder les propriétés publiées (appel à la méthode WriteComponent d'un TStream).} TCollectionHelper = class (TComponent) private FCollection: TCollection; public constructor Create(AOwner: TComponent);override; destructor Destroy;override; published {Les valeurs contenues dans la propriété Collection seront sauvegardées. Il est donc impératif de leur donner une portée Published pour utiliser le mécanisme de mise en flux de Delphi.} property Collection: TCollection read FCollection write FCollection; end;
{ TTemp } constructor TCollectionHelper.Create(AOwner: TComponent); begin inherited; //Création de la collection TCollection FCollection : = TCollection.Create; end; destructor TCollectionHelper.Destroy; begin FCollection.Free; inherited; end;
procedure TCollectionMainForm.SaveToFile(const FileName: TFileName; Users: TUSers); var Temp: TCollectionHelper; FS: TFileStream; begin { Création d'une structure temporaire pour contenir les valeurs à sauvegarder} Temp := TCollectionHelper.Create( nil ); try {Copie des éléments contenus dans FPleins} Temp.Collection.Assign(Users); FS : = TFileStream.Create(FileName, fmCreate or fmOpenWrite); try {Ecriture des valeurs contenues dans Temp dans le flux} FS.WriteComponent(Temp); finally FS.Free; end; finally Temp.Free; end; end;
procedure TCollectionMainForm.LoadFromFile(const FileName: TFileName; Users: TUsers); var Temp: TCollectionHelper; fs: TFileStream; begin Temp := TCollectionHelper.Create( nil ); try try fs : = TFileStream.Create(FileName, fmOpenRead); try fs.ReadComponent(Temp); Users.Assign(Temp); finally fs.Free; end; {try..finally} except ShowMessage(FileName + ' n''est pas un fichier correct'); end;{try..except} finally Temp.Free; end; {try..finally} end;