![]() |
Collection in einem ColectionItem
Hallo,
wie stelle ich es richtig an das ich innerhalb eines CollectionItems eine Collection anlege? Bisher habe ich folgendes:
Delphi-Quellcode:
Innerhalb des TUsers hätte ich jetzt noch gerne eine Collection von Channels, da jeder User in mehreren Channels sitzen kann.
Type
TUser = class (TCollectionItem) private FNick: String; FDummy1: String; FDummy2: String; FUserID: String; FAddress: String; FServer: String; FDummy3: String; FName: String; published property Nick: String read FNick write FNick; property Dummy1: String read FDummy1 write FDummy1; property Dummy2: String read FDummy2 write FDummy2; property UserID: String read FUserID write FUserID; property Address: String read FAddress write FAddress; property Server: String read FServer write FServer; property Dummy3: String read FDummy3 write FDummy3; property Name: String read FName write FName; end; Type TUsers = class (TCollection) private function GetItem(Index: Integer): TUser; public function Add: TUser; function AddEx(Name : String): TUser; property Item[Index: Integer]: TUser read GetItem; end; implementation { TUsers } function TUsers.Add: TUser; begin result := inherited Add as TUser; end; function TUsers.AddEx(Name: String): TUser; begin result := inherited Add as TUser; result.Name := Name; end; function TUsers.GetItem(Index: Integer): TUser; begin result := inherited Items[Index] as TUser; end;
Delphi-Quellcode:
Wie füge ich diesen Teil am ehesten so ein das sie zusammen arbeiten?
Type
TChan = class (TCollectionItem) private FName: String; published property Name: String read FName write FName; end; Type TChans = class (TCollection) private function GetItem(Index: Integer): TChan; public function Add: TChan; property Item[Index: Integer]: TChan read GetItem; end; Ich nutze z.Z. die Standard Create Methode von TUsers. Muß ich in der eingreifen damit ich meine Channels dort anlegen kann? Ist das erste mal das ich mich damit rumschlage :) Gruß Daniel |
Re: Collection in einem ColectionItem
Leg innerhlab der Klasse TUser ein Verweisattribut auf einen Container an. Du brauchts also noch eine dritte Klasse: TChannelColection. Wi das mit den Containerklassen geht, kannst du dir hier angucken:
![]() |
Re: Collection in einem ColectionItem
|
Re: Collection in einem ColectionItem
Hab es jetzt hinbekommen, wußte halt nur nicht wo das TChans hingehört und wie ich es initialisiere.
Delphi-Quellcode:
Ich hoffe damit seid ihr alle einverstanden, falls nicht nehme ich gerne Verbesserungsvorschläge an.
Type
TChan = class (TCollectionItem) private FName: String; published property Name: String read FName write FName; end; Type TChans = class (TCollection) private function GetItem(Index: Integer): TChan; public function Add: TChan; function Find(AChan: String; Var AIndex: Integer): Boolean; property Item[Index: Integer]: TChan read GetItem; end; Type TUser = class (TCollectionItem) private FNick: String; FDummy1: String; FDummy2: String; FUserID: String; FAddress: String; FServer: String; FDummy3: String; FName: String; FMode: String; FHost: String; FChans: TChans; published property Nick: String read FNick write FNick; property Dummy1: String read FDummy1 write FDummy1; property Dummy2: String read FDummy2 write FDummy2; property UserID: String read FUserID write FUserID; property Address: String read FAddress write FAddress; property Server: String read FServer write FServer; property Dummy3: String read FDummy3 write FDummy3; property Name: String read FName write FName; property Mode: String read FMode write FMode; property Host: String read FHost write FHost; property Chans: TChans read FChans write FChans; end; Type TUsers = class (TCollection) private FUpdate: TUpdate; function GetItem(Index: Integer): TUser; public function Add: TUser; function AddEx(Name : String): TUser; function Find(ANick: String; Var AIndex: Integer): Boolean; Procedure Upt(); property Item[Index: Integer]: TUser read GetItem; Property Update: TUpdate read FUpdate write FUpdate; end; implementation { TUsers } function TUsers.Add: TUser; begin result := inherited Add as TUser; Result.FChans := TChans.Create(TChan); end; Dazu kommen aber nun noch einmal zwei kleinere Fragen auf. Eine direkt mit den Collections/Items und die andere mehr so genrell. Wie sieht es mit dem Speicherbedarf aus. Nehmen wir mal an ich würde eine ULine bei Gamesurge oder Quakenet bekommen. Die Server sind ja recht voll und ich würde nach dem obigen Source alle User inkl. aller Channels in denen sie sind hiermit verwalten. Ca. einige tausend User mit mehreren Channels. Mit was für einer Speicherbelastung dürfte ich da grob rechnen und wie sieht es noch mit der Geschwindigkeit aus wenn ich einen User suche. Klar ne ULine würde ich nie bekommen aber interessieren würde es mich halt dennoch. :) Hierüber Suche ich einen User, dazu gibt es nochmal eine Funktion zum Suchen eines Channels innerhalb des Users.
Delphi-Quellcode:
Die zweite Frage hat nichts direkt mit der Fragestellung des Threads zu tun aber gehört für mich irgendwie noch zum Thema.
function TUsers.Find(ANick: String; var AIndex: Integer): Boolean;
begin Result := False; AIndex := 0; While AIndex < Count Do Begin Result := AnsiCompareText(ANick, Item[AIndex].Nick) = 0; If Result Then Exit; Inc(AIndex); End; AIndex := -1; end; Die Collections und CollectionItems sind in einer eigenen Klasse untergebracht. Ich habe eine Klasse in der ich die ankommenden Daten auswerte siehe unten und dann von da aus auf eine andere Klasse verweise um den Betreffenden Befehl auszuführen. In dem Fall HandleUsers Kleiner BeispielSource TIRCService.
Delphi-Quellcode:
HandleUsers
GCMDIndex := GetGenericCMDIndex(FToken);
If (GCMDIndex > -1) Then Begin Case GCMDIndex of 0: If (FConnectionState = sConnected) Then KeepAliveEvent; { PING } 1: If (FConnectionState = sConnected) Then HandleUsers.AddUser(Users, Str); { NICK } //2: { QUIT } 3: If (FConnectionState = sConnecting) Then SetServerName(Str); { SERVER } End; Exit; End;
Delphi-Quellcode:
Macht es Sinn es so auszulagern? Ich persönlich dachte da hauptsächlich an die Übersicht des Sources.
Procedure AddUser(AUsers: TUsers; ANickLine: String);
Var User: TUser; Index: Integer; TmpStr: String; CMD: String; Nick: String; Dummy1: String; Dummy2: String; UserID: String; Address: String; Server: String; Dummy3: String; Name: String; Begin TmpStr := ANickLine; Index := Pos(' ', TmpStr); CMD := Copy(TmpStr, 1, Index -1); TmpStr := Copy(TmpStr, Index +1, Length(TmpStr) - Index); Index := Pos(' ', TmpStr); Nick := Copy(TmpStr, 1, Index -1); TmpStr := Copy(TmpStr, Index +1, Length(TmpStr) - Index); Index := Pos(' ', TmpStr); Dummy1 := Copy(TmpStr, 1, Index -1); TmpStr := Copy(TmpStr, Index +1, Length(TmpStr) - Index); Index := Pos(' ', TmpStr); Dummy2 := Copy(TmpStr, 1, Index -1); TmpStr := Copy(TmpStr, Index +1, Length(TmpStr) - Index); Index := Pos(' ', TmpStr); UserID := Copy(TmpStr, 1, Index -1); TmpStr := Copy(TmpStr, Index +1, Length(TmpStr) - Index); Index := Pos(' ', TmpStr); Address := Copy(TmpStr, 1, Index -1); TmpStr := Copy(TmpStr, Index +1, Length(TmpStr) - Index); Index := Pos(' ', TmpStr); Server := Copy(TmpStr, 1, Index -1); TmpStr := Copy(TmpStr, Index +1, Length(TmpStr) - Index); Index := Pos(' ', TmpStr); Dummy3 := Copy(TmpStr, 1, Index -1); TmpStr := Copy(TmpStr, Index +1, Length(TmpStr) - Index); Name := Copy(TmpStr, 2, Length(TmpStr) -1); User := AUsers.Add; User.Nick := Nick; User.Dummy1 := Dummy1; User.Dummy2 := Dummy2; User.UserID := UserID; User.Address := Address; User.Server := Server; User.Dummy3 := Dummy3; User.Name := Name; AUsers.Upt; End; Gruß Daniel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz