AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Collection in einem ColectionItem

Ein Thema von Cyberaxx · begonnen am 26. Feb 2007 · letzter Beitrag vom 27. Feb 2007
Antwort Antwort
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#1

Collection in einem ColectionItem

  Alt 26. Feb 2007, 22:23
Hallo,

wie stelle ich es richtig an das ich innerhalb eines CollectionItems eine Collection anlege?

Bisher habe ich folgendes:

Delphi-Quellcode:
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;
Innerhalb des TUsers hätte ich jetzt noch gerne eine Collection von Channels, da jeder User in mehreren Channels sitzen kann.

Delphi-Quellcode:
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;
Wie füge ich diesen Teil am ehesten so ein das sie zusammen arbeiten?
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
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Collection in einem ColectionItem

  Alt 26. Feb 2007, 23:44
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:
http://www.michael-puff.de/dirindex....len/Sonstiges/ -> Bank.zip Dort habe ich das mal für den Berufsschulunterricht mit Kunden und Konten gemacht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Collection in einem ColectionItem

  Alt 27. Feb 2007, 08:00
Hallo,
in der Testanwendung zur dpcollection findest ein Beispiel für verschachtelte TCollections
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#4

Re: Collection in einem ColectionItem

  Alt 27. Feb 2007, 22:43
Hab es jetzt hinbekommen, wußte halt nur nicht wo das TChans hingehört und wie ich es initialisiere.

Delphi-Quellcode:
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;
Ich hoffe damit seid ihr alle einverstanden, falls nicht nehme ich gerne Verbesserungsvorschläge an.

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:
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 zweite Frage hat nichts direkt mit der Fragestellung des Threads zu tun aber gehört für mich irgendwie noch zum Thema.

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:
    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;
HandleUsers
Delphi-Quellcode:
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;
Macht es Sinn es so auszulagern? Ich persönlich dachte da hauptsächlich an die Übersicht des Sources.

Gruß

Daniel
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz