|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
TCollection и TCollectionItem
Ребят, подскажи как сделать свою коллекцию со вставкой, добавление и удалением. Прост никогда не работал с коллекциями.
Код:
type TTrack = class(TCollectionItem) private FId: integer; FOwner: integer; FTitle: string; FArtist: string; FUrl: string; FDuration: integer; public property Id: integer read FId write FId; property Owner: Integer read FOwner write FOwner; property Title: string read FTitle write FTitle; property Artist: string read FArtist write FArtist; property Url: string read FUrl write FUrl; property Duration: integer read FDuration write FDuration; constructor create(Collection: TCollection); override; destructor destroy; override; end; TTrackList = class(TCollection) private function GetItem(Index: Integer): TTrack; procedure SetItem(Index: integer; const Value: TTrack); public function Add: TTrack; function Insert(Index: Integer; value: TTrack): TTrack; procedure Delete(Index: Integer); property Item[Index: Integer]: TTrack read GetItem write SetItem; default; end; constructor TTrack.create(Collection: TCollection); begin inherited Create(Collection); FTitle := ''; FArtist := ''; FUrl := ''; FDuration := 0; FId := 0; FOwner := 0; end; destructor TTrack.destroy; begin FTitle := ''; FArtist := ''; FUrl := ''; FDuration := 0; FId := 0; FOwner := 0; inherited destroy; end; function TTrackList.Add: TTrack; begin result := TTrack(inherited Add); {Result.Id := id; Result.Owner := owner; Result.Title := title; Result.Artist := artist; Result.Url := url; Result.Duration := duration; } end; function TTrackList.GetItem(Index: Integer): TTrack; begin result := inherited Items[Index] as TTrack; end; procedure TTrackList.SetItem(Index: Integer; const Value: TTrack); begin inherited SetItem(index, value); end; {procedure TTrackList.Insert(Index: Integer; value: TTrack); begin result := inherited Insert(Index, value); end; } procedure TTrackList.Delete(Index: Integer); begin inherited Delete(Index); end; Код:
procedure TForm1.Button1Click(Sender: TObject); var Tracks: TTrackList; Track: TTrack; i: integer; begin Tracks := TTrackList.Create(nil); for i := 0 to 5 do begin Track := Tracks.Add; //ошибка вылетает при добавлении Track.Id := Random(100); end; for i := 0 to 5 do begin ListBox1.Items.Add(IntToStr(Tracks.Item[i].Id)); end; end; Причем в разных источниках по разному, но у меня все равно не работает |
#2
|
||||
|
||||
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TRSSChannelItem = class(TCollectionItem) private FTitle: String; FLink: String; FDescription: String; public property Title: String read FTitle write FTitle; property Link: String read FLink write FLink; property Description: String read FDescription write FDescription; constructor Create(Collection: TCollection); override; destructor Destroy; override; end; TRSSChannel = class(TCollection) private function GetItem(Index: Integer): TRSSChannelItem; procedure SetItem(Index: Integer; Value: TRSSChannelItem); public property Items[Index: Integer]: TRSSChannelItem read GetItem write SetItem; default; constructor Create(ItemClass: TCollectionItemClass); function Add: TRSSChannelItem; function Insert(Index: Integer): TRSSChannelItem; end; TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } FRSSChannel: TRSSChannel; end; var Form1: TForm1; implementation {$R *.dfm} { TRSSChannelItem } constructor TRSSChannelItem.Create(Collection: TCollection); begin inherited Create(Collection); FTitle:=''; FLink:=''; FDescription:=''; end; destructor TRSSChannelItem.Destroy; begin inherited Destroy; end; { TRSSChannel } constructor TRSSChannel.Create(ItemClass: TCollectionItemClass); begin inherited Create(ItemClass); end; function TRSSChannel.GetItem(Index: Integer): TRSSChannelItem; begin Result:=TRSSChannelItem(inherited GetItem(Index)); end; procedure TRSSChannel.SetItem(Index: Integer; Value: TRSSChannelItem); begin inherited SetItem(Index, Value); end; function TRSSChannel.Add: TRSSChannelItem; begin Result:=TRSSChannelItem(inherited Add); end; function TRSSChannel.Insert(Index: Integer): TRSSChannelItem; begin Result:=TRSSChannelItem(inherited Insert(Index)); end; { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin FRSSChannel:=TRSSChannel.Create(TRSSChannelItem); end; procedure TForm1.FormDestroy(Sender: TObject); begin FRSSChannel.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin with FRSSChannel.Add do begin Title:=IntToStr(GetTickCount); Link:='http://'; Description:=IntToStr(Random(100)); end; end; procedure TForm1.Button2Click(Sender: TObject); begin if FRSSChannel.Count>0 then begin with FRSSChannel.Items[0] do ShowMessage(Title+#13#10+Link+#13#10+Description); FRSSChannel.Delete(0); end; end; end. Пишу программы за еду. __________________ |
#3
|
|||
|
|||
я objectlist-ы использовал из модуля contnrs(если не ошибся)
типа того: PHP код:
если у objectlist свойство ownsobjects(вроде бы) не поменять он ещё и освобождать объекты при удалении будет Последний раз редактировалось Pyro, 31.10.2011 в 14:35. |