Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дополнительные поля для TColumn в TListView [D7]


Страницы:   1 2

MegaVolt ©   (2006-12-15 11:20:00) 

Как красиво добавить в TColunm входящие в TListView новые поля? С одной стороны правильно было бы написать наследника ЕСщдгьт и добавить их туда. Но с другой стороны это придётся переписывать часть ListView что не очень хочется. Как можно по другому получить тот же результат?


MegaVolt   (2006-12-18 14:49:00) [1]

Спасибо это ещё круче и красивее :)


Юрий Зотов   (2006-12-17 12:14:00) [2]


type
 TMyListColumns = class(TListColumns)
 ...
 end;

 TMyListView = class(TListView)
 public
   constructor Create(AOwner: TComponent); override;
 end;

constructor TMyListView.Create(AOwner: TComponent);
var
 P: ^TObject;
begin
 inherited;
 P := @Columns;
 Columns.Free;
 P^ := TMyListColumns.Create(Self)
end;


После чего ListView содержит колонки НАШЕГО класса. Они могут иметь любую дополнительную функциональность. Одно маленькое неудобство - задействовать эту дополнительную функциональность придется через приведение типа.


MegaVolt   (2006-12-15 15:21:00) [3]

Супер :)
Спасибо это как раз то что я хотел :)
Недопёр заменить добавление колонок моей функцией :)


clickmaker   (2006-12-15 15:12:00) [4]


> [22] MegaVolt ©   (15.12.06 14:57)

каких правок? Ежели тебе нужны довески только в твоих обработчиках, то достаточно написать наследника с этими 2 методами либо функцию-обертку наподобие
AddListColumn(LV: TListView; ColEx: TListColumnEx)
begin

 Col := LV.Columns.Add;
 Col.Assign(ColEx.Col);
 Col.Tag := integer(ColEx);
end;

function GetListColumn(LV: TListView; Index: integer): TListColumnEx;
begin
  Result := TListColumnEx(LV.Columns[Index].Tag);
  Result.Col := LV.Columns[Index];
end;

не самое красивое решение, может, но "малой кровью"


MegaVolt   (2006-12-15 14:57:00) [5]

>ну так, а кто сказал, что будет легко?

Так после всего этого ещё придётся делать исправления во всех местах куда входит TListColumn т.е. получаем TListColumnsEx далее правим TCustomListView что то многовато правок получается. Или можно обойтись без правки этих классов?


clickmaker   (2006-12-15 14:48:00) [6]


> [20] MegaVolt ©   (15.12.06 14:39)

ну так, а кто сказал, что будет легко?
пишешь свой класс
TListColumnEx = class
public
 Column: TListColumn;
 Extension: TAppendix;
end;
пишешь наследника с методами AddColumn(col: TListColumnEx), GetColumn: TListColumnEx, в которых все и будешь делать. Или функцию-обертку.


MegaVolt   (2006-12-15 14:39:00) [7]

>погоди... у TListColumn же есть Tag. Не подойдет?

Есть но его мало :( Если исспользовать его как указатель то можно прицепить к TListColumn мой довесок. Но опять же при создании я сам буду должен следить за навешиванием этого довеска.


clickmaker   (2006-12-15 14:29:00) [8]


> [18] MegaVolt ©   (15.12.06 14:23)

погоди... у TListColumn же есть Tag. Не подойдет?


MegaVolt   (2006-12-15 14:23:00) [9]

>а как ты собираешься использовать эти новые св-ва?

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

>Среди извращенных, пожалуй, найдется.

Хм... Поправить генофонд :) Так если уж править так можно и сам исходный класс поправить :) И по идее всё будет хорошо :)


Сергей М.   (2006-12-15 13:46:00) [10]


> Есть ли ещё способы?


Среди извращенных, пожалуй, найдется.
Сводится он к небольшой доработке класса TCollectionItem прямо в исходниках юнита classes.pas - превращению св-ва ID в записываемое.
Это св-во, по большому счету, не несет никакой важной функциональной нагрузки и не используется нигде кроме метода FindItemId(), поэтому его можно смело задействовать под хранение своих ц/ч констант.

Учти что сейчас в нас полетят яйца и помидоры со стороны ревностных защитников генофонда, что вполне справедливо)


clickmaker   (2006-12-15 13:38:00) [11]


> [15] MegaVolt ©   (15.12.06 13:28)

а как ты собираешься использовать эти новые св-ва? Для своих нужд или подтянуть ЛистВью до нового функционала commoncontrols, который не портировали в VCL?


MegaVolt   (2006-12-15 13:28:00) [12]

>Чтобы некий класс и его объекты стали обладать новым свойством, необходимо как минимум декларировать это св-во в описании класса.

Это понятно но это ведёт к переписыванию всех мест где входил предок нового объекта.

Следовательно нужно найти обходные пути. Например у меня N колонок. Создаём дополнительно массив из N записей(объектов) в которых хранятся нужные нам свойства. Далее добавляя новую колонку одновременно добавляем в наш массив ещё один элемент. В результате имеем некое подобие того что нам нужно получить.

Есть ли ещё способы?


Сергей М.   (2006-12-15 13:18:00) [13]


> Добавления в колонки TListView новых свойств.


Опять двадцать пять)...

Свойства есть у классови, соответственно, объектовэтих классов, а не каких-то там колонок !

Чтобы некий класс и его объекты стали обладать новым свойством, необходимо как минимум декларировать это св-во в описании класса. Иные "псевдоспособы" мне не ведомы)


MegaVolt   (2006-12-15 13:05:00) [14]

>Псевдоспособы чего ?

Добавления в колонки TListView новых свойств.


Сергей М.   (2006-12-15 13:01:00) [15]


> А псевдо способы есть?


Псевдоспособы чего ?


> в чём можно?


Наслышан, что в более поздних версиях Делфи у TListView есть событие а-ля OnNewColumn, в обработчике которого ты волен создать свой объект-наследник TListColumn.


MegaVolt   (2006-12-15 12:52:00) [16]

А псевдо способы есть? Может не полностью красивые?

>Ответ: в D7 - никак.

А в чём можно?


Сергей М.   (2006-12-15 12:50:00) [17]

Нет, неверно.

Columns - это не поле, а свойствообъектов любого класса-наследника T CustomListView.


> TListColumn входит в TListColmns


Нет, не входит. И уж тем более в TListView.

Вся эта чехарда с терминологией и словоблудие сводится, как я понял, к след.задаче: как в классе-наследнике TListColumn объявить и реализовать некое новое св-во, чтобы при этом не пришлось изменять декларацию и реализацию других классов, использующих класс TListColumn

Ответ: в D7 - никак.


MegaVolt   (2006-12-15 12:38:00) [18]

TListView objects use TListColumns to maintain a collection of TListColumn objects.

Т.е. TListColumn входит в TListColmns и следовательно в TListView как поле Columns и Column.

Так верно?


Сергей М.   (2006-12-15 12:31:00) [19]


> TColumn входит в TListView


Нет, не входит. Не выдумывай небылиц.


Сергей М.   (2006-12-15 12:30:00) [20]

TColumn не имеет отношения к TListView


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо