Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 044

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Мне нужно создать компонент (родительский - TListBox) со свойством похожим на ListBox1.Items.Strings[<integer>]. Уперся только в создание свойства - нада сделать свойство-массив типа TID3TAG(пользовательский тип). Помогите сделать!

Vova Sitnov Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Vova Sitnov (статус: Посетитель)
Вопрос отправлен: 4 ноября 2008, 12:50
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: DNK

Здравствуйте, Vova Sitnov!
Так как TID3TAG является классом, то советую сделать его потомком от TCollectionItem. А само свойство не массивом, а потомком от TCollection. Как это правильно сделать можно посмотреть на примере свойства Panels компонента StatusBar. Получится на много удобнее.

Ответ отправил: DNK (статус: Студент)
Время отправки: 4 ноября 2008, 13:35

Ответ #2. Отвечает эксперт: min@y™

Вот, набросал тут кое-что (см. приложение).
Естесвенно, туда можно ещё методои/свойств и даже событий надобавлять, но я стремился обрисовать саму концепцию.
Вопросы будут - обращайся.

Приложение:
  1. unit uId3ListBox;
  2.  
  3. interface
  4.  
  5. uses
  6. StdCtrls, SysUtils;
  7.  
  8. type
  9. TId3Tag = class
  10. FTitle: string;
  11. FArtist: string;
  12. FAlbum: string;
  13. FYear: string;
  14. FComment: string;
  15. FGenre: string;
  16. FPath: string;
  17. public
  18.  
  19. constructor Create(const ATitle, AArtist, AAlbum, AYear,
  20.  
  21.  
  22. property Title: string read FTitle write FTitle;
  23. property Artist: string read FArtist write FArtist;
  24. property Album: string read FAlbum write FAlbum;
  25. property Year: string read FYear write FYear;
  26. property Comment: string read FComment write FComment;
  27. property Genre: string read FGenre write FGenre;
  28. property Path: string read FPath write FPath;
  29. end;
  30.  
  31. TId3ListBox = class(TListBox)
  32. private
  33. function GetId3Tag(const Index: Integer): TId3Tag;
  34. public
  35.  
  36. AComment, AGenre, APath: string): TId3Tag;
  37.  
  38.  
  39.  
  40.  
  41. end;
  42.  
  43. implementation
  44.  
  45. uses Classes;
  46.  
  47. { TId3Tag }
  48.  
  49. constructor TId3Tag.Create();
  50. begin
  51. FTitle:= '';
  52. FArtist:= '';
  53. FAlbum:= '';
  54. FYear:= '';
  55. FComment:= '';
  56. FGenre:= '';
  57. FPath:= '';
  58. end;
  59.  
  60. constructor TId3Tag.Create(const ATitle, AArtist, AAlbum, AYear,
  61. AComment, AGenre, APath: string);
  62. begin
  63. FTitle:= ATitle;
  64. FArtist:= AArtist;
  65. FAlbum:= AAlbum;
  66. FYear:= AYear;
  67. FComment:= AComment;
  68. FGenre:= AGenre;
  69. FPath:= APath;
  70. end;
  71.  
  72. { TId3ListBox }
  73.  
  74. function TId3ListBox.NewId3Tag(const ATitle, AArtist, AAlbum, AYear,
  75. AComment, AGenre, APath: string): TId3Tag;
  76. begin
  77.  
  78. Result:= Tid3Tag.Create(ATitle, AArtist, AAlbum, AYear,
  79. AComment, AGenre, APath);
  80. Self.AddItem(ATitle, Result);
  81. end;
  82.  
  83. procedure TId3ListBox.AddId3Tag(AId3Tag: TId3Tag);
  84. begin
  85.  
  86. if Assigned(AId3Tag)
  87. then Self.AddItem(AId3Tag.Title, AId3Tag);
  88. end;
  89.  
  90. procedure TId3ListBox.DeleteId3Tag(const Index: Integer);
  91. var
  92. obj: TObject;
  93. begin
  94.  
  95. if (Index > -1) and (Index < Self.Count)
  96. then begin
  97. obj:= Self.Items.Objects[Index];
  98. FreeAndNil(obj);
  99. Self.Items.Delete(Index);
  100. end;
  101. end;
  102.  
  103. function TId3ListBox.GetId3Tag(const Index: Integer): TId3Tag;
  104. begin
  105.  
  106. if (Index > -1) and (Index < Self.Count)
  107. then Result:= TId3Tag(Self.Items.Objects[Index])
  108. else Result:= nil;
  109.  
  110.  
  111. var
  112. t: TId3Tag;
  113. Index: Integer;
  114. begin
  115. Index:= 0;
  116. t:= ListBox.Id3Tags[Index];
  117. if Assigned(t)
  118. then ..........
  119. end;
  120. }
  121. end;
  122.  
  123. end.
  124.  


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 4 ноября 2008, 13:52


Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 5 ноября 2008, 10:09; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 4 ноября 2008, 12:59 [#1]:

А зачем так? зачем идти сложный путем? я же писал о более простом.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 4 ноября 2008, 13:02 [#2]:

Давай описание своего типа TID3TAG, покажу, как надо.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Vova Sitnov

Vova Sitnov (статус: Посетитель), 4 ноября 2008, 13:06 [#3]:

Низнаю. Но почемуто охото сделать ИМЕННО так.
ЗЫ а количество элементов вредли будет превышать 200.
Vova Sitnov

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™

min@y™ (статус: Доктор наук), 4 ноября 2008, 14:00 [#6]:

Ответ добавил, но следует понимать, что это только пример, а не руководство типа "как надо писать программы". Вот так вот пишу я, но не значит, что это правильно. Конечно, наследовать надо от TCustomListBox и пооткрывать только те свойства/методы, какие нужно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 4 ноября 2008, 14:16 [#7]:

to min@y™.
Да, пример действительно очень плохой. Ведь в нем мне никто не мешает обратиться через свойсто Items и спортить всю идею. И будут утечки памяти...
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 4 ноября 2008, 19:14 [#8]:

2 Вадим К:

Ну так я же и предупреждал, что показал, что так вот можно, но не обязательно. Хотя, в принципе, когда знаешь, что делаешь (т.е. не лезть в Items), утечек памяти не будет.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 4 ноября 2008, 23:33 [#9]:

Я просто констатировал факт, min@y™.
Галочка "подтверждения прочтения" - вселенское зло.
Vova Sitnov

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;
будет неверной идеологически и грозит утечками памяти и "крайне странным поведением" с следующими жалобами "я присваиваю и пытаюясь прочитать, а полчаю либо пустую запись/мусор, либо ошибку доступа".
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 21 октября 2017, 11:38
Выполнено за 0.11 сек.
Рейтинг@Mail.ru