![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ВDS 2006 тоже не поддерживает custom variant byRef
oxffff © (2006-09-14 23:21:00)Я уже писал о том, что Delphi 7 не поддерживает custom variant by ref. Дисскуссия шла где в июне-июля. Уже в архивах.
Сейчас установил BDS 2006. Решил проверь, а как же там дела с этим. К сожалению все также.
Ну во первых естественно в вызове VarCopy->VarCopyDeep
И далее строчки
// otherwise try for custom
else if FindCustomVariantType(Source.VType, LSourceHandler) then
LSourceHandler.Copy(Dest, Source, False)
Во первых FindCustomVariantType не найдет custom variant.
И во вторых вызывается direct copy
Если вызвать VarCopyNoInd(a,b).
То все равно будет ошибка поскольку FindCustomVariantType не найдет helper класс .
Кто хочет убедиться пожалуйста код
var a,b:variant;
begin
//here some custom variant by ref
tvardata(a).VType:=273 or varByRef;
a:=b; exception is generated
VarCopyNoInd(a,b); exception is generated
QC молчит.
jack128 (2006-09-16 14:18:00) [21]oxffff © (16.09.06 13:05) [22]
Ну допустим использую сторонний DLL, в котором есть новый произвольный тип. Основное приложение понятия не имеет как с ним работать. Но должно допустим копировать его, или приводить допустим к типу string;
так как и с вариантами - естественно ничего не заработает.
oxffff (2006-09-16 13:05:00) [22]Ну допустим использую сторонний DLL, в котором есть новый произвольный тип. Основное приложение понятия не имеет как с ним работать. Но должно допустим копировать его, или приводить допустим к типу string;
oxffff (2006-09-16 13:00:00) [23]А если я определю тип, который неизвестен на этапе компиляции.
jack128 (2006-09-16 06:21:00) [24]oxffff © (16.09.06 6:03) [19]
Э-э-э. Я не понял вопроса.
Ты _всегда_ знаешь к каким типам можно привести тип TComplex и какие типы можно привести к типу TComplex. Соответствующие опреторы привидения и перегуружаешь. В чем проблема то??
oxffff (2006-09-16 06:03:00) [25]А если учесть, что на этапе компиляции мы не можем опеределить все типы.
То есть не перегрузим все операторы.
Тогда как ты бы выкрутился?
jack128 (2006-09-16 05:26:00) [26]oxffff © (16.09.06 4:34) [16]
Но мне интересно, что ты хочешь предложить.
type
TComplex = record
public
Re: Double;
Im: Double;
constructor Create(_Re, _Im: Double);
class operator Add(const A, B: TComplex): TComplex; // сложение
class operator Implicit(A : TComplex) : string; // неявное приведение к строке
end;
var
A, B, C: TComplex;
begin
A := TComplex.Create(10, 20);
B := TComplex.Create(20, 10);
C := A + B;
Edit1.Text := C;
end;
oxffff © (16.09.06 5:07) [17]
При перегрузки присваивания Приемник просто перетирается.
Нет способа вызвать varclear.
Я заметил:
jack128 © (15.09.06 12:51) [5]
Единственный недостаток(правда очень существенный) - отсутствие у записей деструкторов
varclear - это и есть деструктор.
oxffff (2006-09-16 05:07:00) [27]to jack128
Ваш способ не подойдет.
Допустим мы знаем все custom variant. Все операторы перегружены.
Но в предложенном тобой способе есть проблема.
При перегрузки присваивания Приемник просто перетирается.
Нет способа вызвать varclear.
oxffff (2006-09-16 04:34:00) [28]Вообщем то сабж посвещен тому, что у меня нет проблемы с реализацией.
Сабж посвещен тому что указать, что был недостаток. И также и остался.
Но мне интересно, что ты хочешь предложить.
oxffff (2006-09-16 04:32:00) [29]TCustomVariantType is the base class for Delphi custom variant types.
TCustomVariantType descendants do not represent the Variants themselves. Rather, they act as utility classes that the custom Variants call on to perform their operations.
oxffff (2006-09-16 04:30:00) [30]> Я имею в виду, что аналогом TCustomVariantType в предложенной мною >
>схеме является запись.
Подробнее.
oxffff (2006-09-16 04:29:00) [31]to jack128
Уважаемый на этом вы далеко не уедите.
О как насчет того, что есть custom variant произвольный (неизвестный).
И перегрузить операторы не удастся.
Тогда вам придется городить аналогию с TCustomVariantType, TInvokeableVariantType.
jack128 (2006-09-16 04:27:00) [32]oxffff © (16.09.06 4:24) [11]
О как. Это не запись.
Ты не понял. Я имею в виду, что аналогом TCustomVariantType в предложенной мною схеме является запись.
oxffff (2006-09-16 04:24:00) [33]to jack128
> TCustomVariantType - это как раз и есть запись.
О как. Это не запись.
jack128 (2006-09-16 03:42:00) [34]Джо © (15.09.06 13:48) [7]
то это уже будут не записи, а, практически, классы.
вобщем то это и нужно. Классы, автоматом уничтожаемые при выходе за область видимости. Как в С++.
oxffff © (15.09.06 14:12) [8]
а именно сделать
аналогично varCopy, varCopyNoInd, TCustomVariantType, TInvokeableVariantType и т.
зачем varCopy , записи и так нормально копируются оператором присваивания. TCustomVariantType - это как раз и есть запись. От тя треба только переопределить нужные те операторы и привидения к нужным типам.
oxffff (2006-09-15 14:16:00) [35]> jack128
> какую такую инфроструктуру??
> Единственный недостаток(правда очень существенный) - отсутствие у
> записей деструкторов и не возможность переопределить конструктор по >умолчанию..
Ага добавить туда еще VMT И DMT и вообще тогда будет advanced object.
oxffff (2006-09-15 14:12:00) [36]to jack128
Причем чем здесь вообще конструктор. Вам внимательнее надо читать сабж.
Нужно определить свой custom variant. И передать его как by ref.
varCopy не делает этого, и даже пытается сделать это некорректно. Поскольку не расчитана вообще на custom byref
Вы написали что можно выкрутиться с помощью anvanced record в BDS 2006.
то есть вы предлагаете сделать аналог модуля variants, а именно сделать
аналогично varCopy, varCopyNoInd, TCustomVariantType, TInvokeableVariantType и т.д. Если вы это сделаете, то я вам буду благодарен. Но стоит ли оно того.
Джо (2006-09-15 13:48:00) [37]> [6] jack128 © (15.09.06 12:52)
> jack128 © (15.09.06 12:51) [5]
> не возможность переопределить конструктор по умолчанию..
> в смысле - это не недостаток. Это так.. Хотелка..
Если записям все это добавить, плюс еще чего нафантазировать, то это уже будут не записи, а, практически, классы. Главное — вовремя остановиться! :)
jack128 (2006-09-15 12:52:00) [38]jack128 © (15.09.06 12:51) [5]
не возможность переопределить конструктор по умолчанию..
в смысле - это не недостаток. Это так.. Хотелка..
jack128 (2006-09-15 12:51:00) [39]oxffff © (15.09.06 10:20) [4]
Это совсем не проще поскольку придется городить аналогичную инфраструктуру.
какую такую инфроструктуру??
Единственный недостаток(правда очень существенный) - отсутствие у записей деструкторов и не возможность переопределить конструктор по умолчанию..
oxffff (2006-09-15 10:20:00) [40]to jack128.
Это совсем не проще поскольку придется городить аналогичную инфраструктуру.