![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Этика классов и сортировка TList... [D6, Win2k]
tunguss © (2005-06-06 16:29:00)Значит так. Если кто знает программку Seqoia - примерно поймет - некоторые данные распологаются на некотором двумерном поле упорядочено по размеру вверх и вниз (алгоритм TreeMap разработанный в Массачусетском университете). Далее поймет тот, кто знаком с MFC. Концепция написания программы такова, что используется модель (aka документ) и представление (aka вьюха). В модели данные представлены некоторыми Item'ами, а во вььюхе эти итемы обернуты некоторыми Plate'ами - впрочем последнее не важно.
Модель наследник TObjectList.
Сейчас я делаю поддержку группировки.
Для этого я создаю наследника Item'a и называю его ItemGroup. От родителя он наследует методы типа GetValue - но вычисляет он уже не значение одного Item'а, а всей группы. И у него свой TList, который содержит Item'ы.
Итак. Хочется чтобы присобаченная к модели функция сортировки (см. TList.Sort) могла работать и с данными групп. Но ввиду ограниченний передаваемой в параметре функции определения соответствия - не удается ни получить от модели информацию, группируем мы что-то или нет, ни на основе этого сделать нужное приведение типов.
Есть ли выход обойти ограничения?
Вот так. Ниже буду объяснять подробнее если что.
tunguss (2005-06-06 16:47:00) [1]Премного благодарен. Кажется именно то, что мне нужно. Не сообразил, что можно так....
VladimirB (2005-06-06 16:35:00) [2]Вообщем вот.
TParent=class
function MMM:String; virtual;
end;
TChild=class(TParent)
function MMM:String; override;
end;
TChild2=class(TParent)
function MMM:String; override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TChild2 }
function TChild2.MMM: String;
begin
result:='TChild2.MMM';
end;
{ TChild }
function TChild.MMM: String;
begin
result:='TChild.MMM';
end;
{ TParent }
function TParent.MMM: String;
begin
result:='TParent.MMM';
end;
procedure XXX(Item:Pointer);
begin
ShowMessage(TParent(Item).MMM);
if TParent(Item) is TChild then ShowMessage('!!!');
if TParent(Item) is TChild2 then ShowMessage('222');
end;
procedure TForm1.Button1Click(Sender: TObject);
var x:TChild2;
begin
x:=TChild2.Create;
XXX(X);
x.Free;
end;
Соответственно в XXX можно вызвать виртуальный метод, узнать к какому классу относится item, о парится дальше.
Это к вопросу о том как узнать в Sotr что ей передали.