Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.11;
Скачать: CL | DM;

Вниз

Дополнительные поля для TColumn в TListView   Найти похожие ветки 

 
MegaVolt ©   (2006-12-15 11:20) [0]

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


 
icWasya ©   (2006-12-15 11:47) [1]

>Как можно по другому получить тот же результат?
А вот с этого места - по подробнее.


 
MegaVolt ©   (2006-12-15 11:55) [2]

Что именно поподробней? Спроси что именно непонятно? Что такое поля объекта?  Или что такое похожие результаты?


 
icWasya ©   (2006-12-15 12:15) [3]

Что такое новые поля


 
Сергей М. ©   (2006-12-15 12:24) [4]


> добавить в TColunm входящие в TListView новые поля


А где в классе TColumn фигурируют поля, уже имеющиеся в классе TListView ?


 
MegaVolt ©   (2006-12-15 12:26) [5]

Новые поля это значит поля которых в оригинальном объекте нет.
Например в стандартном TColumn можно задать выравнивание текста. Мне же например нужно добавить ещё выравнивание картинок. Отрисовка OwnerDraw поэтому могу сам положение картинок менять. Или нужно добавить пару числовых полей для хренения каких то параметров колонок.

Можно конечно содлать свой TColumnEx в котором будут лежать эти самые параметры но тогда появляется куча ручных операций которые могут приводить к ошибкам.

Например
Columns.Add;
Columns[0].Caption:="11111";
Columns[0].Alignment:=taRightJustify;
и дальше своё:
ColumnEx.Add;
ColumnsEx[0].ImageAlignment:=taRightJustify;
Так вот можно же и забыть это дописать да и некрасиво как то :(


 
MegaVolt ©   (2006-12-15 12:29) [6]

>А где в классе TColumn фигурируют поля, уже имеющиеся в классе TListView ?

Мою фразу следует понимать как Новые поля для TColumn которые в свою очередь входит в ListView. Т.е. новые поля в TColumn. А TColumn входит в TListView


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

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


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


> TColumn входит в TListView


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


 
MegaVolt ©   (2006-12-15 12:38) [9]

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

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

Так верно?


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

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

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


> TListColumn входит в TListColmns


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

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

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


 
MegaVolt ©   (2006-12-15 12:52) [11]

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

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

А в чём можно?


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


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


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


> в чём можно?


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


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

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

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


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


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


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

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

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


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

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

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

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

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


 
clickmaker ©   (2006-12-15 13:38) [16]


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

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


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


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


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

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


 
MegaVolt ©   (2006-12-15 14:23) [18]

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

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

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

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


 
clickmaker ©   (2006-12-15 14:29) [19]


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

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


 
MegaVolt ©   (2006-12-15 14:39) [20]

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

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


 
clickmaker ©   (2006-12-15 14:48) [21]


> [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:57) [22]

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

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


 
clickmaker ©   (2006-12-15 15:12) [23]


> [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 15:21) [24]

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


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


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-18 14:49) [26]

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



Страницы: 1 вся ветка

Текущий архив: 2007.02.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.065 c
1-1165021404
allrussia
2006-12-02 04:03
2007.02.11
Закрепление и привязка компонентов на форме


2-1169396785
md
2007-01-21 19:26
2007.02.11
динамический массив


2-1169430968
delphim
2007-01-22 04:56
2007.02.11
цвет ячейки combobox


1-1166520492
VID
2006-12-19 12:28
2007.02.11
Я что-то не понял с этим XML...


15-1169570106
Cyrax
2007-01-23 19:35
2007.02.11
Как, кем и какие оформляются документы, отражающие...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский