Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
ВнизКоллекции Найти похожие ветки
← →
Bratskiy © (2006-02-07 12:06) [0]У меня есть свой класс. Я хочу добавить в него свойство объектного типа. Для этого хочу воспользоватбся коллекцией. Свойства объектов-членов коллекции буду заполнять из базы.
Возникает такой вопрос: когда происходит создание экземпляров классов коллекции, сразу после создания класса-владельца, или при обращению к ним как ко свойству?
Для меня это важно потому что при создании класса-владельца не все свойства в нём определяются сразу, и значения этих свойств должны быть учитаны при создании экземпляров класса коллекции.
← →
umbra © (2006-02-07 12:26) [1]по моему скромному мнению, коллекцию Вы должны создать сами (наверное, в конструкторе владельца)
← →
ZeroDivide © (2006-02-07 13:08) [2]
> Я хочу добавить в него свойство объектного типа. Для этого
> хочу воспользоватбся коллекцией.
Коллекции нужны не для того, чтобы можно было добавить свойство объектного типа в свой класс. Коллекции нужны для создания свойства содержащего множество объектов, наследников от TCollectionItem, с возможностью редактировать их свойства (всех элементов коллекции) в инпекторе объектов в DesignTime.
Т.е. можешь добавлять любые свойства объектного типа в свой компонент, без проблем, коллекции тут не при чем. О создании экземпляров ты должен позаботится сам. (В случае коллекци, при создании экземпляров в RunTime, ты так же должен позаботится об этом сам)
Вот тебе пример объектного свойства в компоненте:
TMyClass = class(TComponent)
private
FStrings: TStringList;
....
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
proprety Strings: TStringList read FStrings write SetStrings;
end;
constructor Create(AOwner: TComponent);
begin
inherited;
// После inherited
FStrings := TStrings.Create;
end;
destructor Destroy;
begin
// До inherited
FStrings.Free;
inherited;
end;
Published Property добавленного объекта можно будет редактировать в инспекторе объектов.
← →
Bratskiy © (2006-02-08 06:59) [3]Ещё вопрос (наверное тупой).
Коллекцию вроде создал. Функцию Add унаследовал у TCollection:
function TElements.Add: TElement;
begin
Result:= TElement(inherited Add)
end;
TElements - сама коллекция
TElement - элемент коллекции
В методе класса-владельца хочу использовать Add. Как правильно этот самый Add использовать?
Пробовал:
var
El:TElement;
...
El:=Elements.Add;
El.Name:="Имя";
...
Выдаёт ошибку Access Violation - наверное надо использовать конструктор
El:=Element.Create(). Что в этот конструктор надо передавать?
Код конструктора стандартный
constructor TElement.Create(Collection: TCollection);
begin
inherited Create(Collection);
end;
← →
MBo © (2006-02-08 07:15) [4]http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=215
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=217
← →
Bratskiy © (2006-02-08 07:21) [5]
> MBo © (08.02.06 07:15) [4]
Да я там был уже.
← →
Defunct © (2006-02-08 08:04) [6]> Bratskiy
type TElement = class( TCollectionItem )
public
Str : String;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
El : TElement;
C : TCollection;
begin
C := TCollection.Create( TElement );
El := TElement(C.Add);
El.Str := "Hello world";
ShowMessage( TElement(C.Items[0]).Str);
end;
← →
Bratskiy © (2006-02-08 08:43) [7]
> Defunct
Спасибо конечно, но если честно не совсем то, что мне нужо, так как создавать элементы коллекции мне надо в теле класса-владельца, а использовать значения свойств в модуле программы.
Не ужели чтобы добавить элемент в коллекцию нужно аж две вспомогательной переменные (El и С)
← →
ZeroDivide © (2006-02-08 08:46) [8]...И все таки я не уверен, что тебе именно коллекции нужны. Опиши задачу, решаемую твоим компонентом.
← →
Defunct © (2006-02-08 09:13) [9]Bratskiy © (08.02.06 08:43) [7]
почему вспомогательные?
Вообще-то достаточно только одной (а можно и без нее) - собственно самой коллекции...type
TElement = class( TCollectionItem )
public
Str : String;
end;
TElements = class( TCollection )
private
function GetItem( Index: integer ):TElement;
procedure SetItem( Index : Integer; Value: TElement );
public
function Add:TElement;reintroduce;
constructor Create;reintroduce;
property Items[Index: Integer]: TElement read GetItem write SetItem;
end;
function TElements.Add;
begin
Result := TElement( inherited add);
end;
constructor TElements.Create;
begin
inherited Create( TElement );
end;
procedure TElements.SetItem;
begin
inherited SetItem( Index, TCollectionItem(Value));
end;
function TElements.GetItem;
begin
Result := TElement( inherited GetItem(Index));
end;
procedure TForm1.Button3Click(Sender: TObject);
var
C : TElements;
begin
C := TElements.Create;
C.Add;
C.Items[0].Str := "Hello world";
ShowMessage( C.Items[0].Str);
end;
← →
Bratskiy © (2006-02-08 09:21) [10]>Defunct
Спасибо
>ZeroDivide
Если интересна постановка задачи, то вот она:
Делаю базу новостей. Новости приходят в .doc формате в виде ленты
В каждой ленте куча новостей. Ленты пришедшие от одного информационного агенства образуют класс - TNewsJournal (потомок от TWordDocument). Конкретная лента экземпляр класса TNewsLent (потомок от TNewsJournal). Ленты от одного поставщика имеют примерно одинаковую сруктуру. Ленты надо разбить на отдельные новости и занести их в базу.
Сначала я сделал втупую (написал для каждого журнала код который разбивает ленты на новости). Всё работает, но хочется сделать более унмверсальную вещь, чтобы если появится новый поставщик новостей не писать для него новый код
Я задумал это сделать следующим образом
Так как журналов много, я выделил в них части которые присутствуют(могут присутсвовать) во всех из них (например заголовок новости, комментарии новости, заголовки разделов и т. д.) это как бы и есть TElements.
Чтобы разбить ленту надо пользоваться поиском в Worde и искать какой-то конкретый шрифт, стиль рисунок и. т. д
Поэтому каждому из этих элементов я дал какбы свойства, например если все заголовки новости в ленте написаны одним стилем "Заголовок 2" то элемент новостной ленты "заголовок новости" обладает свойством Стиль, значение которого = "заголовок 2". Если в новостной ленте кроме заголовка новостей больше никакой другой элемент не написан стилем "Заголовок 2" то это свойство уникально, то есть для разбивки ленты на новости стоит использоват его.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.049 c