![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по custom variant [D7, WinXP]
oxffff © (2006-07-06 13:40:00)Версия Delphi 7.
Изучаю возможность создания пользовательских variant.
Есть неплохой (но странный пример) TComplexVariantType из модуля VarCmplx.
Если посмотреть на реализацию метода copy
procedure TComplexVariantType.Copy(var Dest: TVarData; const Source: TVarData;
const Indirect: Boolean);
begin
if Indirect and VarDataIsByRef(Source) then
VarDataCopyNoInd(Dest, Source)
else
with TComplexVarData(Dest) do
begin
VType := VarType;
VComplex := TComplexData.Create(TComplexVarData(Source).VComplex);
end;
end;
При byref варианте происходит вызов VarDataCopyNoInd
В help про него написано
Unlike the VarDataCopy method, it can’t handle data that is stored indirectly (when the VType field includes varByRef)
Но бог с ним. Посмотрев на исходники можно убедится, что он
и byref variant пытается обработать вызвав внутри VarCopyByRef.
Смотрим дальше, если variant custom то происходит вызов VarCopyNoIndDeep. а там опять вызов
LSourceHandler.Copy(Dest, Source, True). Таким образом должно происходить зацикливание. Но оно не будет происходить по одной простой причине. FindCustomVariantType не работает с
byref custom variant.
Таким образом нельзя создать пользовательский byref variant.
+ некорректное описание VarDataCopyNoInd.
Вообщем кто понял о чем я тут говорю, может выскажится.
Заранее благодарен.
REA (2006-07-11 10:00:00) [41]А почему FindCustomVariantType не работает с byref custom variant?
Что то у меня не создалось такого впечатления. Там вообще byref не фигурирует - на входе код варианта, на выходе класс.
REA (2006-07-11 09:55:00) [42]Вообще то не Custom Variant не работает с variant by ref, а только TComplexVariantType (да и то еще не уверен). В остальных случаях ничто не мешает перекрыть Copy и делать все что угодно.
Германн (2006-07-11 03:20:00) [43]
> по custom variantam ты вряд ли что -то тут найдешь. я несколько
> раз спрашивал - ответ тишина. есть ощущение, что ими никто
> не пользуется...
Ну если у МАСТЕРОВД7 есть только дома и только вечером. И то не у всех (имхо), и то неизвестно для чего, то спрашивать придётся у Сергея Орлика. А он отвечает тут только по тем вопросам, которые связаны с политикой фирмы. Имхо. :-)
Суслик (2006-07-10 23:29:00) [44]по custom variantam ты вряд ли что -то тут найдешь.
я несколько раз спрашивал - ответ тишина.
есть ощущение, что ими никто не пользуется...
oxffff (2006-07-10 20:24:00) [45]То есть если есть конструкция такая
procedure Some(A:variant);
var b:variant;
begin
b:=A;
end;
И если A - custom variant by ref. То вывалиться exception.
Проблема в реализации VarCopyDeep и в реализации FindCustomVariantType.
Модуль variants.
Применительно для DElphi 7.
oxffff (2006-07-10 20:17:00) [46]Что касаемо custom variant by ref. То нормальными средствами это не реализуется :). Конечно выкрутися можно.
Просто хотел обратить внимание общественности на данную особенность.
oxffff (2006-07-10 20:14:00) [47]New for Delphi Win32! Records with methods (value types).
Тоже для .NET и #
oxffff (2006-07-10 20:12:00) [48]Это из FEATURE MATRIX.
Borland® Developer Studio 2006
Includes Borland® Delphi® 2006, C++Builder® 2006, and C#Builder® 2006
FEATURE MATRIX
Правда только New for Delphi Win32! Operator overloading.
Исключительно для .NET
Что касаемо вопроса меня смутила реализация в Delphi 7.
И описания в help.
oxffff (2006-07-10 20:09:00) [49]Правда только New for Delphi Win32! Operator overloading.
Исключительно для .NET
REA (2006-07-10 10:24:00) [50]Поддержжу - ну их нафиг эти варианты.
Суслик (2006-07-10 02:34:00) [51]выскажусь не совсем по теме, но тебе может поможет.
я сам с этими вариантами разбирался - завернуто там очень.
но есть хорошая новость - в delphi2006 в записи можно добавлять методы и перегрузку операторов. При этом это делается очень легко.
так что если тебе нужно создать какой-то специфический тип, то можно использовать новые возможности записей (в справке они называеются advanced records).