Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.034 c
15-1139329402
БарЛог
2006-02-07 19:23
2006.02.26
Телевизор


15-1138357010
Kerk
2006-01-27 13:16
2006.02.26
Переход на Linux


4-1133908355
Volf_555
2005-12-07 01:32
2006.02.26
Как получить строковое значение функции CreateGUID()?


2-1139045476
webpauk
2006-02-04 12:31
2006.02.26
Создание файла


2-1139402563
R.O.O.T
2006-02-08 15:42
2006.02.26
Как добавить поле в таблицу базы Access





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский