Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2011, 06:08   #11
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> надо будет новый компонент регистрировать на базе Tlistview ?

и это не поможет, проще будет заново написать свой список с нуля.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 17.04.2011, 09:20   #12
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

таки тогда можно слегка пооффтопить ? можно ли всё-таки малой кровью добавить что-то в VCL-компонент ? я правда подобным никогда не озадачивался, мне интересен принцип. Я пробовал , написал tmylistview= class(tlistview) добавил 1 поле и в рантайме создаю компонент обычным способом (owner, parent - форма), он появляется и работает с добавленным полем. Правда поле простого типа, а не сложное, как Tlistitems. Пробовал и наследовать tlistitems, но уже не получилось добиться работы...

есть какие-то мысли по этому поводу здесь и сейчас? или мне лучше погуглить толковые статьи по усовершенствованию стандартных компонент ? думаю, и ТС это будет полезно и другим людям пытающихся создавать дочерние классы стандартных компонент (это слово в развитие темы )

Последний раз редактировалось phomm; 17.04.2011 в 09:22.
phomm вне форума Ответить с цитированием
Старый 17.04.2011, 12:32   #13
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> добавить что-то в VCL-компонент ?

визуальные компоненты особо ничем в этом плане не отличаются от остальных классов. Да, можно унаследовать свой класс от любой компоненты и навешать сколько угодно новых свойст на него, но эти свойства будут известны только вам, и на работу базового класса никак не повлияют.

> Правда поле простого типа, а не сложное, как Tlistitems.

проблема тут не в том, что поле "сложное", а в том, что элементы TListItems создаются самим TListView, и всё зависит от того, какой базовый класс этих элементов прописан в исходниках TListView.

Кстати, заглянув в исходники, обнаружил, что начиная с 6-той Дельфи, в TListView добавили вот такое событие:

Код:
  TLVCreateItemClassEvent = procedure(Sender: TCustomListView; var ItemClass: TListItemClass) of object;
И такие методы:

Код:
    function CreateListItem: TListItem; virtual;
    function CreateListItems: TListItems; virtual;
Т.е. перекрыв событие, теперь можно указать TListView, какого класса (наследника от TListItem) должны быть создаваемые элементы списка.

А перекрыв методы, можно управлять и тем, какого класса (наследника от TListItems) будет внутренний список элементов у TListView.

(Забавно, ещё во времена 6-той Дельфи борландовцы озаботились этими проблемами, кто б мог подумать )).

А теперь вернёмся в 5-ю Дельфи, где такого события и таких методов нет. И мы никак не можем повлиять на то, какой класс будет у создаваемых элементов списка, и у самого внутреннего списка.

> Пробовал и наследовать TListItems

опять же, наследовать можно сколько угодно, но пока в TListView прописано такое (строка из исходников к Дельфи 4):

Код:
  FListItems := TListItems.Create(Self);
Всё ваше наследование проходит мимо TListView, который продолжает спокойно работать с TListItems.

> и другим людям пытающихся создавать дочерние классы стандартных компонент

достаточно всего двух вещей:

— понимания, как работает ООП;
— исходников компонент
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 17.04.2011, 13:36   #14
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Вообще добавить в список наследника вполне возможно. Items.AddItem - и добавляйте на здоровье. Плюс у каждого итема есть поле Data. Туда можно поместить указатель на что угодно, к примеру на рекорд с произвольными полями.
eduard93 вне форума Ответить с цитированием
Старый 18.04.2011, 05:36   #15
xexxex
Пользователь
 
Регистрация: 31.07.2010
Сообщений: 52
По умолчанию

Код:
type
  TListItem = class(ComCtrls.TListItem)
  private
    FID: Cardinal;
    FStr: String;
  end;

  TListView = class(ComCtrls.TListView)
    function CreateListItem: ComCtrls.TListItem; override;
  end;

  TForm1 = class(TForm)
    ListView1: TListView;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


{ TListView }

function TListView.CreateListItem: ComCtrls.TListItem;
begin
  Result := TListItem.Create(Items);
end;

Последний раз редактировалось xexxex; 18.04.2011 в 05:41.
xexxex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Описать класс-родитель и класс-потомок. Delphi 7 Andrew_M Помощь студентам 0 15.01.2011 14:42
Класс Chartvit Visual C++ 2 05.01.2011 22:20
ошибка при добавлении елемента TListItem в TListVew lowercase Общие вопросы Delphi 2 15.11.2010 20:48
Дочерний процесс. Создание и "слежение" SNUPY Общие вопросы Delphi 8 16.12.2009 13:17
Программа, выполняет дочерний процесс IgorArhangel Помощь студентам 3 24.01.2009 23:12