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.

Вообщем кто понял о чем я тут говорю, может выскажится.
Заранее благодарен.


oxffff   (2006-07-21 00:33:00) [1]

newsgroup молчит
quality center молчит
Все молчат.


Суслик   (2006-07-13 16:57:00) [2]

у меня почему-то посты троятся :(


Суслик   (2006-07-13 16:57:00) [3]

у меня почему-то посты троятся :(


Суслик   (2006-07-13 16:57:00) [4]

у меня почему-то посты троятся :(


Суслик   (2006-07-13 16:46:00) [5]

не надо в qc постить вопросы.
многие сейчас это делают - изрядно загрязняя его.
сначала надо обсудить в news groupах, и вот когда будет хорошее понимание предмета, то запостить что нить в qc.
например, четкое понимание, что это есть недостаток программы - тогда можно запостить предолжение доделать программу.
или недостаток документации, тогда можно запостить предложение доделать документацию.
при этом можно приложить к посту в qc лог обсуждения в группах.

мое имхо, что это наиболее правильный путь.


Суслик   (2006-07-13 16:45:00) [6]

не надо в qc постить вопросы.
многие сейчас это делают - изрядно загрязняя его.
сначала надо обсудить в news groupах, и вот когда будет хорошее понимание предмета, то запостить что нить в qc.
например, четкое понимание, что это есть недостаток программы - тогда можно запостить предолжение доделать программу.
или недостаток документации, тогда можно запостить предложение доделать документацию.
при этом можно приложить к посту в qc лог обсуждения в группах.

мое имхо, что это наиболее правильный путь.


Суслик   (2006-07-13 16:45:00) [7]

не надо в qc постить вопросы.
многие сейчас это делают - изрядно загрязняя его.
сначала надо обсудить в news groupах, и вот когда будет хорошее понимание предмета, то запостить что нить в qc.
например, четкое понимание, что это есть недостаток программы - тогда можно запостить предолжение доделать программу.
или недостаток документации, тогда можно запостить предложение доделать документацию.
при этом можно приложить к посту в qc лог обсуждения в группах.

мое имхо, что это наиболее правильный путь.


REA   (2006-07-13 15:08:00) [8]

Там еще QC вроде есть - quality center на BDN. Хотя если в документации написано, что не должно работать, то это и не ошибка.


oxffff   (2006-07-13 15:02:00) [9]

Огромное спасибо вам REA и Суслик.
Попробую задать вопрос в Borland.


Суслик   (2006-07-13 14:38:00) [10]

только news группы. http://newsgroups.borland.com
все вопросы "на борланде" задаются именно здесь.
он, правда, сейчас что-то не открывается. но это за мою память с ним впервые такое.

выбери news группу, связанную с компилятором.


Суслик   (2006-07-13 14:38:00) [11]

только news группы. http://newsgroups.borland.com
все вопросы "на борланде" задаются именно здесь.
он, правда, сейчас что-то не открывается. но это за мою память с ним впервые такое.

выбери news группу, связанную с компилятором.


Суслик   (2006-07-13 14:38:00) [12]

только news группы. http://newsgroups.borland.com
все вопросы "на борланде" задаются именно здесь.
он, правда, сейчас что-то не открывается. но это за мою память с ним впервые такое.

выбери news группу, связанную с компилятором.


oxffff   (2006-07-13 13:02:00) [13]

Так при регистрации сustom variant и не нужно устанавливать byref.
Этот бит же указывает на передачу данных по ссылке.
Так есть еще и бит varArray.

varByRef, varArray эти биты не нужно устанавливать при регистрации пользовательского варианта.

varArray    = $2000;
varByRef    = $4000;

А вот найти FindCustomVariantType его не сможет поскольку нужно перед сравнением применимь маску. А именно varTypeMask

varTypeMask=$0FFF;

Поэтому для обработки varByRef и varArray
см. [37]
(AVarType AND varTypeMask)>= CMinVarType and
(AVarType AND varTypeMask)<=CMaxVarType)

Уважаемый REA.
Снабдите ссылкой на borland куда задать такого рода вопрос.


REA   (2006-07-13 10:13:00) [14]

см. [34] - я имел ввиду, что AVarType уже может содержать бит byref но тогда вероятно тип будет все же вне CMinVarType - CMaxVarType и не зарегистрируется.


oxffff   (2006-07-12 12:58:00) [15]

Ошибка в FindCustomVariantType поскольку реализовано некорректное сравнение.

function FindCustomVariantType(const AVarType: TVarType; out CustomVariantType: TCustomVariantType): Boolean;
begin
 // fail if no custom types are defined or if the vartype is way out of range
 Result := (LVarTypes <> nil) and
           (AVarType >= CMinVarType) and (AVarType <= CMaxVarType);
........
// здесь ошибка
(AVarType >= CMinVarType) and (AVarType <= CMaxVarType);

А вот если было так, то работало бы

(AVarType AND (NOT VARBYREF))>= CMinVarType and
(AVarType AND (NOTVARBYREF))<=CMaxVarType)


oxffff   (2006-07-12 12:51:00) [16]

Точнее ошибка на API VariantCopyInd.
До которой дело вообще не должно доходить.
Но из-за FindCustomVariantType доходит.


oxffff   (2006-07-12 12:49:00) [17]

попробуй сделать так

var a,b:variant;
begin
tvardata(a).VType:=273 or varByRef;
VarCopyNoInd(b,a);

Все равно ошибка на FindCustomVariantType
273 - пользовательский custom


REA   (2006-07-12 12:37:00) [18]

А там похоже тоже самое - я посмотрел.

Есть возможность создавать CustomVariant с заданным типом (т.е. выставить бит ByRef) и тогда не исключено, что FindCustomVariantType отработает.

constructor Create(RequestedVarType: TVarType); overload;


oxffff   (2006-07-12 12:07:00) [19]

Да вот такая экзотика. :)
Но дело в том, что если написать VarCopyNoInd(a,b).
Где source - custom variant by ref.
То и этом случае вылетит ошибка поскольку FindCustomVariantType
не найдет by ref custom.

Уважаемый REA благодарю за диалог.
Сейчас осталось найти 2006. Недорого ;)


REA   (2006-07-12 10:56:00) [20]

Да я проверил - вызывается и вылетает. (см. выше)
А вот как вызвать _VarCopyNoInd средствами компилятора (если написать := то вызовется _VarCopy, может другое заклятие есть)?
Она вроде должна ByRef обрабатывать.
Не исключено что в 2006 исправили это, хотя Custom var by ref экзотика.
В Delphi вообще экономят на реализациях как с API так и библиотеками классов и т.п.


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

Наверх

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