On Sun, Jul 06, 2003 at 04:25:15PM +0200, Marco van de Voort wrote: > > Is there an example of using TCollection or something (without having to > > write the code myself) that manages a collection of FPC style classes > > (objects) ? > > > > I'd like to see one, code I have written to handle a dynamic array of > > objects has gone out of control... (Using FPC classes here) > > IIRC, TCollection only stores TCollectionItem derived classes. > > TList is closer to what you want probably.
Is there an example other than list.pp in the fcl source ? Also just for the record of knowing... I have attached datanicks.pas which hold a dynamic array of TNick ... Is this what TList already does (if so I'm wasting my time writing my own code...) ? cheers James > > _______________________________________________ > fpc-pascal maillist - [EMAIL PROTECTED] > http://lists.freepascal.org/mailman/listinfo/fpc-pascal -- - - James Mills Zero Defect Software Engineers Group - ZDSEG
unit dataNicks; interface uses sysUtils, Functions, tokenizerClass, nickClass; var nicks: PNick; nNicks: Integer; procedure init; procedure done; procedure addNick(data: String); procedure addNick(data: String; index: Integer); function backupNick(nick: String): TNick; procedure copyNickData(srcNick: TNick; destNick: TNick); function getNick(nick: String): Integer; procedure delNick(nick: String); function isIdentified(nick: String): Boolean; function isIdentified(nick: String; otherNick: String): Boolean; implementation procedure init; begin nNicks := 0; getMem(nicks, sizeOf(TNick) * nNicks); end; procedure done; var I: Integer; begin for I := 0 to (nNicks - 1) do begin nicks[I].free; end; freeMem(nicks); end; procedure addNick(data: String); var tokens: TTokenizer; nick: String; hops: Integer; signon: longInt; ident: String; host: String; server: String; unused: String; name: String; begin tokens := TTokenizer.Create(data); nick := tokens.nextToken; hops := strToInt(tokens.nextToken); signon := strToInt(tokens.nextToken); ident := tokens.nextToken; host := tokens.nextToken; server := tokens.nextToken; unused := tokens.nextToken; name := strip(tokens.restOfTokens); tokens.free; inc(nNicks); reAllocMem(nicks, sizeOf(TNick) * nNicks); nicks[(nNicks - 1)] := TNick.Create(nick, hops, signon, ident, host, server, unused, name); end; procedure addNick(data: String; index: Integer); var tokens: TTokenizer; nick: String; hops: Integer; signon: longInt; ident: String; host: String; server: String; unused: String; name: String; tmpNick: TNick; I: Integer; begin tokens := TTokenizer.Create(data); nick := tokens.nextToken; hops := strToInt(tokens.nextToken); signon := strToInt(tokens.nextToken); ident := tokens.nextToken; host := tokens.nextToken; server := tokens.nextToken; unused := tokens.nextToken; name := strip(tokens.restOfTokens); tokens.free; if index < nNicks then begin tmpNick := backupNick(nick); nicks[index].free; nicks[index] := TNick.Create(nick, hops, signon, ident, host, server, unused, name); copyNickData(tmpNick, nicks[index]); tmpNick.free; end; end; function backupNick(nick: String): TNick; var data: String; tokens: TTokenizer; hops: Integer; signon: longInt; ident: String; host: String; server: String; unused: String; name: String; index: Integer; I: Integer; tmpNick: TNick; begin index := getNick(nick); if index > -1 then begin data := nicks[index].getData; tokens := TTokenizer.Create(data); tokens.nextToken; hops := strToInt(tokens.nextToken); signon := strToInt(tokens.nextToken); ident := tokens.nextToken; host := tokens.nextToken; server := tokens.nextToken; unused := tokens.nextToken; name := strip(tokens.restOfTokens); tokens.free; tmpNick := TNick.Create(nick, hops, signon, ident, host, server, unused, name); for I := 0 to (nicks[index].numAccess - 1) do begin tmpNick.addAccess(nicks[index].getAccess(I)); end; tmpNick.addMode(nicks[index].getModes); for I := 0 to (nicks[index].numChannels - 1) do begin tmpNick.addChannel(nicks[index].getChannel(I)); end; tmpNick.setUseMsg(nicks[index].getUseMsg); tmpNick.setAutoAdd(nicks[index].getAutoAdd); backupNick := tmpNick; end else begin backupNick := nil; end; end; procedure copyNickData(srcNick: TNick; destNick: TNick); var I: Integer; begin for I := 0 to (srcNick.numAccess - 1) do begin destNick.addAccess(srcNick.getAccess(I)); end; for I := 0 to (srcNick.numChannels - 1) do begin destNick.addChannel(srcNick.getChannel(I)); end; destNick.addMode(srcNick.getModes); destNick.setUseMsg(srcNick.getUseMsg); destNick.setAutoAdd(srcNick.getAutoAdd); end; function getNick(nick: String): Integer; var I: Integer; index: Integer; begin index := -1; for I := 0 to (nNicks - 1) do begin if upperCase(nicks[I].getNick) = upperCase(nick) then begin index := I; break; end; end; getNick := index; end; procedure delNick(nick: String); var I: Integer; X: Integer; n: PNick; C: Integer; begin X := getNick(nick); if X > -1 then begin for I := X to (nNicks - 2) do begin addNick(nicks[(I + 1)].getData, I); end; end; end; function isIdentified(nick: String): Boolean; var index: Integer; I: Integer; begin index := getNick(nick); if index > -1 then begin if nicks[index].getAccess(nick) > -1 then begin isIdentified := TRUE; end else begin isIdentified := FALSE; end; end else begin isIdentified := FALSE; end; end; function isIdentified(nick: String; otherNick: String): Boolean; var index: Integer; begin index := getNick(nick); if index > -1 then begin if nicks[index].getAccess(otherNick) > -1 then begin isIdentified := TRUE; end else begin isIdentified := FALSE; end; end else begin isIdentified := FALSE; end; end; end.