![]() |
| ||
|
|
Новости |
Поиск |
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.
Вообщем кто понял о чем я тут говорю, может выскажится.
Заранее благодарен.
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 так и библиотеками классов и т.п.