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