Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Элементы различных классов в одной коллекции... Разные наследники TCollectionItem... 
:(
    Опции темы
Gnusss
Дата 22.10.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



Привет всем.

Столкнулся с такой проблемой:

Нужно создать коллекцию (TCollection) которая состояла бы из разных наследников класса TCollectionItem.
Т.е. у меня есть основной класс элемента, например:
Код

  TCustomCollectionItem = Class(TCollectionItem)
  ...
  end;

В нем заданы общие свойства для всех элементов коллекции. Также TCustomCollectionItem задается при создании коллекции.
Также у меня несколько наследников этого класса, например:
Код

  TItemImage = Class(TCustomCollectionItem)
  ...
  end;

  TItemText = Class(TCustomCollectionItem)
  ...
  end;

  TItemData = Class(TCustomCollectionItem)
  ...
  end;

Каждый из которых обладает своими уникальным свойствами.
но проблема в том что делфи, совершенно не обращает внимание на класс элемента коллекции а все время создает TCustomCollectionItem...
Т.е. в дизинтайме все нормально(Кстати если создавать элементы коллекции в рантайме тоже все нормально) создаются именно те элементы которые нужны, а при запуске программы происходит ошибка типа:
"Свойство ‘Text’ не найдено в TCustomCollectionItem."
Ошибка происходит из-за того что делфи в файл формы не пишет класс каждого элемента пологая что все элементы класса одинаковые.
Отсюда следует вопрос, можно ли вообще сделать в делфи коллекции с разными элементами.
Т.е. сделать то можно, но можно ли заставить делфи правильно с ними работать.

п.с: Для того чтобы в дизинтайме можно было создавать разные (нужные) наследники TCustomCollectionItem я наследовал стандартный редактор коллекций и добавил в него нужную функциональность.


Заранее благодарю за ответ.
PM MAIL   Вверх
aktuba
Дата 22.10.2007, 15:06 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Приводи к нужному классу... "Элементарно, Ватсон"...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Gnusss
Дата 22.10.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



aktuba, кого приводить и когда?
PM MAIL   Вверх
Alix
Дата 22.10.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 7
Всего: 23



в зависимости от того что ты хочешь получить делать примерно так: TItemText(item).text, где item : TCustomCollectionItem


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Gnusss
Дата 22.10.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



Вы (все) наверное, не поняли суть моей проблемы.
Если все делать самому, т.е. добавлять нужные элементы (в дизинтайме или рантайме не важно) то все хорошо.
Проблема в том, что если в дизинтайме создать элементы разных классов задать им свойства то при стране программы будет ошибка, например:
"Свойство ‘Text’ не найдено в TCustomCollectionItem."
В файлах формы делфи не хранит класса каждого элемента и при создании формы элементы создаются "стандартного" класса (того который был задан при создании коллекции).
PM MAIL   Вверх
aktuba
Дата 22.10.2007, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата

В файлах формы делфи не хранит класса каждого элемента и при создании формы элементы создаются "стандартного" класса (того который был задан при создании коллекции).


А ты в published прописал эти свойства?


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Alix
Дата 22.10.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 7
Всего: 23



Цитата(Gnusss @  22.10.2007,  16:23 Найти цитируемый пост)
Вы (все) наверное, не поняли суть моей проблемы.

тогда чтобы ситуация прояснилась приведи код, как ты в designtime создаешь элементы


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Gnusss
Дата 22.10.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



Цитата(aktuba @  22.10.2007,  15:28 Найти цитируемый пост)
А ты в published прописал эти свойства? 

Естественно.
Цитата(Alix @  22.10.2007,  15:30 Найти цитируемый пост)
тогда чтобы ситуация прояснилась приведи код, как ты в designtime создаешь элементы 

Вот код "обновленного" редактора коллекций:
Код

unit ;

interface

uses
  SysUtils, Windows, Messages, Classes, ColnEdit, Menus, Forms, ComCtrls;

type                                                        
  TMyCollectionEditor = Class(TCollectionEditor)
  Private
    ClassMenu: TPopupMenu;
    procedure CreatePopupMenu;
    procedure MenuItemClick(Sender: TObject);
  protected
    FAddedItemIDList: TList;
    procedure DoCreate; override;
    procedure DoClose(var Action: TCloseAction); override;
    procedure CreteItem(ItemClass: Integer);
    procedure NewDeleteClick(Sender: TObject);
  End;

implementation

uses
  DesignConst;

{ TMyCollectionEditor }

procedure TMyCollectionEditor.CreatePopupMenu;
begin
 ClassMenu:= TPopupMenu.Create(Self);
//
 ClassMenu.Items.Add(NewItem('Add TItemImage',0,False,True,MenuItemClick,0,''));
 ClassMenu.Items.Add(NewItem('Add TItemText',0,False,True,MenuItemClick,0,''));
 ClassMenu.Items.Add(NewItem('Add TItemData',0,False,True,MenuItemClick,0,''));
//
 ClassMenu.Items[0].Tag:= 0;
 ClassMenu.Items[1].Tag:= 1;
 ClassMenu.Items[2].Tag:= 2;
end;

procedure TMyCollectionEditor.CreteItem(ItemClass: Integer);
var
 Item: TListItem;
 PrevCount: Integer;
begin
 SelectNone(False);
 Collection.BeginUpdate;
 try
  PrevCount:= Collection.Count+1;
  case ItemClass of // Collection.Add;
    0: TMyCollection(Collection).AddImage;
    1: TMyCollection(Collection).AddText;
    2: TMyCollection(Collection).AddData;
  end;
  // Take into account collections that free items
  if PrevCount <> Collection.Count then
   UpdateListBox
  else
   ListView1.Selected:= ListView1.Items.Add;
 finally
  Collection.EndUpdate;
 end;
 SetSelection;
 if csAncestor in Component.ComponentState then
  begin
   if FAddedItemIDList = nil then
    FAddedItemIDList := TList.Create;
   FAddedItemIDList.Add(Pointer(Collection.Items[Collection.Count - 1].ID));
  end;
 Designer.Modified;
// Focus last added item
 Item := ListView1.Items[ListView1.Items.Count-1];
 Item.Focused := True;
 Item.MakeVisible(False);
end;

procedure TMyCollectionEditor.DoClose(var Action: TCloseAction);
begin
 Inherited DoClose(Action);
 if FAddedItemIDList <> Nil then FreeAndNil(FAddedItemIDList);
end;

procedure TMyCollectionEditor.DoCreate;
begin
 Inherited DoCreate;
 CreatePopupMenu;
 AddCmd.OnExecute:= MenuItemClick;// ToolButton1.OnClick:= MenuItemClick;
 DeleteCmd.OnExecute:= NewDeleteClick;
 ToolButton1.Style:= tbsDropDown;
 ToolButton1.DropdownMenu:= ClassMenu;
end;

procedure TMyCollectionEditor.MenuItemClick(Sender: TObject);
begin
 CreteItem(TComponent(Sender).Tag);
end;

procedure TMyCollectionEditor.NewDeleteClick(Sender: TObject);
var
  I, J, K: Integer;
  Item: TCollectionItem;
  Found: Boolean;
begin
  Collection.BeginUpdate;
  try
    Designer.SetSelections(nil);
    if ListView1.Selected <> nil then
      J := ListView1.Selected.Index
    else J := -1;
    if (ListView1.SelCount = Collection.Count) and ((csAncestor in Component.ComponentState) = False) then
      Collection.Clear
    else if ListView1.SelCount > 0 then
      for I := ListView1.Items.Count - 1 downto 0 do
        if ListView1.Items[I].Selected then
        begin
          Found := False;
          if (FAddedItemIDList <> nil) and (FAddedItemIDList.Count > 0) then
          for K := 0 to FAddedItemIDList.Count -1 do
          begin
            Item := Collection.FindItemID(Integer(FAddedItemIDList[K]));
            if Item = Collection.Items[i] then
            begin
              FAddedItemIDList.Delete(K);
              Found := True;
              Break;
            end
            else Found := False;
          end;
          if (not Found) and (csAncestor in Component.ComponentState) then
            raise Exception.Create(DesignConst.SCantDeleteAncestor)
          else
            Collection.Items[I].Free;
        end;
  finally
    Collection.EndUpdate;
  end;
  UpdateListbox;
  if J >= ListView1.Items.Count then
    J := ListView1.Items.Count - 1;
  if (J > -1) and (J < ListView1.Items.Count) then
    ListView1.Selected := ListView1.Items[J];
  SetSelection;
  Designer.Modified;
end;


end.


Это сообщение отредактировал(а) Gnusss - 22.10.2007, 15:44
PM MAIL   Вверх
Alix
Дата 22.10.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 7
Всего: 23



бегло пролистал, не вижу обащения к св-ву Text, об ошибке на котором ты упоминал:
Цитата
"Свойство ‘Text’ не найдено в TCustomCollectionItem."



--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Gnusss
Дата 22.10.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



Цитата(Alix @  22.10.2007,  15:58 Найти цитируемый пост)
бегло пролистал, не вижу обащения к св-ву Text, об ошибке на котором ты упоминал:

Блин, естественно.
Эта ошибка происходит в тот момент когда делфи создает форму из .dfm файла.

Это сообщение отредактировал(а) Gnusss - 22.10.2007, 16:02
PM MAIL   Вверх
bems
Дата 22.10.2007, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



покажи dfm


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Gnusss
Дата 23.10.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



Код

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 284
  ClientWidth = 418
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object MyCollectionWND: TMyCollectionWND
    Left = 104
    Top = 8
    Width = 200
    Height = 200
    Items = <
      item
        Left = 0
        Top = 0
        Width = 0
        Height = 0
        FileName = '123'
      end
      item
        Left = 0
        Top = 0
        Width = 0
        Height = 0
      end
      item
        Left = 0
        Top = 0
        Width = 0
        Height = 0
        Text = 'Hello'
      end>
  end
end

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0686 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.