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

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

Вопрос по custom variant [D7, WinXP]


Страницы:   1 2 3

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).


Страницы:   1 2 3

Наверх

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