| 
| 
 | Вопрос # 2 044/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!Мне нужно создать компонент (родительский - TListBox) со свойством похожим на ListBox1.Items.Strings[<integer>]. Уперся только в создание свойства - нада сделать свойство-массив типа TID3TAG(пользовательский тип). Помогите сделать!
 
|  |   Вопрос задал: Vova Sitnov (статус: Посетитель)Вопрос отправлен: 4 ноября 2008, 12:50
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: DNK Здравствуйте, Vova Sitnov!Так как TID3TAG является классом, то советую сделать его потомком от TCollectionItem. А само свойство не массивом, а потомком от TCollection. Как это правильно сделать можно посмотреть на примере свойства Panels компонента StatusBar. Получится на много удобнее.
 
|  | Ответ отправил: DNK (статус: Студент)Время отправки: 4 ноября 2008, 13:35
 
 |  Ответ #2. Отвечает эксперт: min@y™ Вот, набросал тут кое-что (см. приложение).Естесвенно, туда можно ещё методои/свойств и даже событий надобавлять, но я стремился обрисовать саму концепцию.
 Вопросы будут - обращайся.
 Приложение:Переключить в обычный режим unit uId3ListBox; interface uses  StdCtrls, SysUtils; type  TId3Tag = class    FTitle:    string;    FArtist:   string;    FAlbum:    string;    FYear:     string;    FComment:  string;    FGenre:    string;    FPath:     string;  public     constructor Create(const ATitle, AArtist, AAlbum, AYear,      property Title:    string read FTitle   write FTitle;    property Artist:   string read FArtist  write FArtist;    property Album:    string read FAlbum   write FAlbum;    property Year:     string read FYear    write FYear;    property Comment:  string read FComment write FComment;    property Genre:    string read FGenre   write FGenre;    property Path:     string read FPath    write FPath;  end;   TId3ListBox = class(TListBox)  private    function GetId3Tag(const Index: Integer): TId3Tag;  public                        AComment, AGenre, APath: string): TId3Tag;      end; implementation uses Classes; { TId3Tag } constructor TId3Tag.Create();begin  FTitle:= '';  FArtist:= '';  FAlbum:= '';  FYear:= '';  FComment:= '';  FGenre:= '';  FPath:= '';end; constructor TId3Tag.Create(const ATitle, AArtist, AAlbum, AYear,                       AComment, AGenre, APath: string);begin  FTitle:=   ATitle;  FArtist:=  AArtist;  FAlbum:=   AAlbum;  FYear:=    AYear;  FComment:= AComment;  FGenre:=   AGenre;  FPath:=    APath;end; { TId3ListBox } function TId3ListBox.NewId3Tag(const ATitle, AArtist, AAlbum, AYear,                               AComment, AGenre, APath: string): TId3Tag;begin   Result:= Tid3Tag.Create(ATitle, AArtist, AAlbum, AYear,                          AComment, AGenre, APath);  Self.AddItem(ATitle, Result);end; procedure TId3ListBox.AddId3Tag(AId3Tag: TId3Tag);begin   if Assigned(AId3Tag)    then Self.AddItem(AId3Tag.Title, AId3Tag);end; procedure TId3ListBox.DeleteId3Tag(const Index: Integer);var  obj: TObject;begin   if (Index > -1) and (Index < Self.Count)    then begin           obj:= Self.Items.Objects[Index];           FreeAndNil(obj);           Self.Items.Delete(Index);         end;end; function TId3ListBox.GetId3Tag(const Index: Integer): TId3Tag;begin   if (Index > -1) and (Index < Self.Count)    then Result:= TId3Tag(Self.Items.Objects[Index])    else Result:= nil;     var     t: TId3Tag;     Index: Integer;   begin     Index:= 0;     t:= ListBox.Id3Tags[Index];     if Assigned(t)       then ..........   end;  }end; end. 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 4 ноября 2008, 13:52
 
 |  
 Мини-форум вопросаВсего сообщений: 11; последнее сообщение — 5 ноября 2008, 10:09; участников в обсуждении: 3. 
|   | Вадим К (статус: Академик), 4 ноября 2008, 12:59 [#1]:А зачем так? зачем идти сложный путем? я же писал о более простом. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 4 ноября 2008, 13:02 [#2]:Давай описание своего типа TID3TAG, покажу, как надо. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Vova Sitnov (статус: Посетитель), 4 ноября 2008, 13:06 [#3]:Низнаю. Но почемуто охото сделать ИМЕННО так. ЗЫ а количество элементов вредли будет превышать 200.
 |  
|   | Vova Sitnov (статус: Посетитель), 4 ноября 2008, 13:07 [#4]:type 
 TID3TAG = class
 Titel: string;
 Artist: string;
 Album: string;
 Year: string;
 Comment: string;
 Genre: string;
 Path:string;
 end;
 |  
|   | Вадим К (статус: Академик), 4 ноября 2008, 13:46 [#5]:Мы простых путей не ищем, нам через голову надо, Vova Sitnov? Хотя тот путь, который я нарисовал как раз можно и завернуть в компонент. Просто подумайте как и всё станет понятно.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 4 ноября 2008, 14:00 [#6]:Ответ добавил, но следует понимать, что это только пример, а не руководство типа "как надо писать программы". Вот так вот пишу я, но не значит, что это правильно. Конечно, наследовать надо от TCustomListBox и пооткрывать только те свойства/методы, какие нужно. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 4 ноября 2008, 14:16 [#7]:to min@y™. Да, пример действительно очень плохой. Ведь в нем мне никто не мешает обратиться через свойсто Items и спортить всю идею. И будут утечки памяти...
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 4 ноября 2008, 19:14 [#8]:2 Вадим К: 
 Ну так я же и предупреждал, что показал, что так вот можно, но не обязательно. Хотя, в принципе, когда знаешь, что делаешь (т.е. не лезть в Items), утечек памяти не будет.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 4 ноября 2008, 23:33 [#9]:Я просто констатировал факт,  min@y™. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Vova Sitnov (статус: Посетитель), 5 ноября 2008, 06:01 [#10]:Просмотрев всё что сдесь написанно переделал кучу классов. Но никак не могу изменить свойство Items(добавить тоже). Пишу property IDItems read FIDItems write FIDItems;
 появляется ошибка: Property IDItems does not exist in base class.
 |  
|   | Вадим К (статус: Академик), 5 ноября 2008, 10:09 [#11]:И правильно ругает. Ибо Ваше обявления записано неверно. Если просто написать property XXXX; то это подразумевает, что свойство ХХХХ есть в базовом классе, а вы меняете уровень видимости. То есть, например переводите свойство с protected в published. Что бы всё было хорошо, надо указать тип свойства. Посмотрите на код min@y™. У него этот момент правильно написан. И если тип этого свойства "сложный" - то есть это как минимум класс, то запись property IDItems:TIDItems read FIDItems write FIDItems;
 будет неверной идеологически и грозит утечками памяти и "крайне странным поведением" с следующими жалобами "я присваиваю и пытаюясь прочитать, а полчаю либо пустую запись/мусор, либо ошибку доступа".
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |