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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2011, 05:56   #1
EaRLL
Пользователь
 
Аватар для EaRLL
 
Регистрация: 03.01.2009
Сообщений: 22
По умолчанию Дочерний класс от TListItem

Приветствую.
В общем, возникла такая ситуация - сделал дочерний класс TRListView от TListView:
Код:
type
  TRListItem = Class(TListItem)
    private
      sIdReal : Integer;
    public
      property sId : integer read sIdReal write sIdReal;
  end;
далее использую его ниже в процедуре:
Код:
procedure TCore.Init();
var
  RS : TRListItem;
   {***}
begin
   {***}
  RS := SList.Items.Add;
  RS.sId := 1;
  RS.Caption := 'text';
  RS.SubItems.Add('subText');
   {***}
end;
Проблема в том, что на строке
Код:
RS := SList.Items.Add;
при компиляции выводится ошибка
[DCC Error] uCore.pas(732): E2010 Incompatible types: 'TRListItem' and 'TListItem'
Помогите кто чем сможет
EaRLL вне форума Ответить с цитированием
Старый 16.04.2011, 09:26   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

1 напиши
Код:
SList.Items.Add as Trslistitem;
2(более православный вариант) добавь потомок tlistitems, в нём добавь
Код:
function add(): TRlistitem; override;
а в implementation данного метода напиши
Код:
result := Trslistitem(inherited add);
и естественно данный потом тебе придётся включить в твой slist вот так
Код:
items : trlistitems;
phomm вне форума Ответить с цитированием
Старый 16.04.2011, 10:19   #3
EaRLL
Пользователь
 
Аватар для EaRLL
 
Регистрация: 03.01.2009
Сообщений: 22
По умолчанию

Сразу скажу: я специализируюсь не на дельфях, пишу иногда для разнообразия на них, поэтому не слишком в этой среде силён

Насчёт первого - сделал:
Код:
RS := (SList.Items.Add as TRListItem);
скомпилировалось нормально, но при запуске программы выскакивает "Invalid class typecast" и строки новые не добавляются.

Насчёт второго - добавил:
Код:
type
  TRListItems = Class(TListItems)
      function add(): TRListItem; override;
  end;
немного не понял насчёт "implementation данного метода"
"items : trlistitems;" - вставил, а но при компиляции указывает на строку
Код:
19|       function add(): TRListItem; override;
20|   end;
и пишет
Код:
[DCC Warning] uCore.pas(19): H2365 Override method TRListItems.add should match case of ancestor TListItems.Add
[DCC Error] uCore.pas(20): E2170 Cannot override a non-virtual method
Вот так вот...
EaRLL вне форума Ответить с цитированием
Старый 16.04.2011, 11:00   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

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

насчет кейс оф я не нашёл в справке к своей дельфи7 такой ошибка компилятора ((( могу в принципе на 2007 или 2009 поглядеть, но надо на др комп пересесть )) лениво, но по уму case это регистр буквы, попробуй не add a Add

имплементейшн это секция для реализации метода, а function add(): TRListItem; это декларация/интерфейсная часть/раздел объявления
т.е. тебе надо перейти в радел реализации этого метода и написать тот код в качестве функционала метода

ну а вообще скинь проект, могу погрести чего там )
phomm вне форума Ответить с цитированием
Старый 16.04.2011, 12:51   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> сделал дочерний класс TRListView от TListView:
> TRListItem = Class(TListItem)

так от чего дочерний класс вы сделали?

SList - это стандарный TListView? Если да, то как он может вернуть объект, о котором никогда не слышал? Никакой "as TRListItem" тут не поможет, правильно оно говорит Invalid class typecast.

Стандартный TListView не будет работать с вашим TRListItem, это не темплейты на С++.

> Помогите кто чем сможет

чтобы помочь, объясните сначала, что вы хотите сделать.

Хранить дополнительный кусок данных вместе с каждым элементом списка? Для этого есть свойство Data у стандартного TListItem. Если 4 байта мало, храните там указатель.


> ну а вообще скинь проект, могу погрести чего там )

phomm, лучше не стоит, судя по твоим сообщениям в этой теме )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 16.04.2011, 13:16   #6
EaRLL
Пользователь
 
Аватар для EaRLL
 
Регистрация: 03.01.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
SList - это стандарный TListView? Если да, то как он может вернуть объект, о котором никогда не слышал? Никакой "as TRListItem" тут не поможет, правильно оно говорит Invalid class typecast.
Уже понял )

Цитата:
Сообщение от veniside Посмотреть сообщение
Хранить дополнительный кусок данных вместе с каждым элементом списка? Для этого есть свойство Data у стандартного TListItem. Если 4 байта мало, храните там указатель.
Именно, надо сохранить в строке дополнительную числовую переменную, которую можно было-бы изменять в процессе работы программы ( Что-то типа свойства Tag у некоторых компонентов ). Все возможные property у listitem'а я проверял - не подходят. Data не подходит - там уже хранится цветовая переменная, с помощью которой окрашивается строка:
Код:
SList.Items.Item[RowID].Data := Pointer(Color);
как я уже сказал - я не спец в дельфях, поэтому не знаю - можно ли в date хранить несколько переменных - числовую и цветовую, и изменять их; и как сделать дополнительный параметр с компонента, к которому можно обращаться
EaRLL вне форума Ответить с цитированием
Старый 16.04.2011, 17:26   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

проще всего, имхо, хранить ваши данные в отдельном списке, типа TCollection. Ему можно передать вас класс, наследник от TCollectionItem, и в этом классе хранить то, что вам нужно.

Т.е. создаём наш класс элемента:

Код:
TMyCollectionItem = class(TCollectionItem)
private
  fInt: Integer;
  fString: string;
  fColor: TColor;
  //....
end;
Далее, создаём нашу коллекцию:

Код:
var
  dataStorage: TCollection;
begin
  dataStorage := TCollection.create(TMyCollectionItem);
  ....
end;
Вот теперь dataStorage.Add() будет возвращать объект класса TMyCollectionItem:

Код:
var
  myItem: TMyCollectionItem;
begin
  myItem := dataStorage.Add() as TMyCollectionItem;
end;
А чтобы связать это дело с TListView, в свойстве Data можно хранить ID ваших элементов:

Код:
var
  item: TListItem;
begin
  item := myListView.Items.Add();
  item.Caption := 'new item';
  item.Data := Pointer(myItem.ID);
  ///
  /// найти элемент по ID
  myItem := dataStorage.FindItemID(Integer(item.Data)) as TMyCollectionItem;
end;
типа того
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 16.04.2011 в 17:28.
veniside вне форума Ответить с цитированием
Старый 16.04.2011, 18:22   #8
EaRLL
Пользователь
 
Аватар для EaRLL
 
Регистрация: 03.01.2009
Сообщений: 22
По умолчанию

veniside, phomm, Спасибо) С этой задачкой справился

Но вот теперь возникла не менее спешная ситуация: у этого listview'а включил сортировку. Пробовал изменять разные параметры сортировки, но упорно при сортировке солбца изменяются и index'ы строк. Т.е. если кликнул по строке, произошло нужное действие, потом юзер отсортировал, вот потом и нельзя будет программно обратится к той же самой строке. Просто если их 10-20 - можно поиском по соответствию кэпшена строки, а у меня их несколько сотен и дальше - больше =(
EaRLL вне форума Ответить с цитированием
Старый 16.04.2011, 23:44   #9
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
phomm, лучше не стоит, судя по твоим сообщениям в этой теме )
прошу указать на мои огрехи, поучусь, буду впредь разборчивее, возможно, дело в том что необходимо наследовать визуальный компонент, и поменять его предлагаемым образом проблематично? надо будет новый компонент регистрировать на базе Tlistview ?

EaRLL, по последней проблеме твоей - тебе метод finddata может полезен будет, а ещё может additem(Item: String; AObject: TObject) ?

Последний раз редактировалось phomm; 17.04.2011 в 00:02.
phomm вне форума Ответить с цитированием
Старый 17.04.2011, 05:27   #10
EaRLL
Пользователь
 
Аватар для EaRLL
 
Регистрация: 03.01.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
EaRLL, по последней проблеме твоей - тебе метод finddata может полезен будет, а ещё может additem(Item: String; AObject: TObject) ?
FindData - Помог. Немного подправил и заработало)
Спасибо за помощь =)
EaRLL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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