Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.07.28;
Скачать: CL | DM;

Вниз

Custom Variant Type   Найти похожие ветки 

 
anton20vlad   (2011-07-18 22:21) [0]

Доброго времени суток. У меня RAD Studio 2007 Delphi c апдейтом от декабря 2007.

Пытаюсь определить свой тип для Variant. Вроде сделал как в доке написано. Но есть проблема: под дебагом ide зависает если поставить брейк поинт на строку в процедуре VarPointCreateInto(см. комент в коде). Привожу весь юнит ниже. Может я чего не так делаю? Помогите плиз советом.


unit cgCustomVariants;

interface

uses
 GDIPAPI, Variants, SysUtils;

function VarPointCreate(Point: TGPPointF): Variant;

function VarPointVar: TVarType;
function VarIsConvert(const AValue: Variant): Boolean;
function VarAsConvert(const AValue: Variant): Variant;

implementation

uses
 Math, Types;

type
 TcgVarPoint = class(TInvokeableVariantType)
 public
   procedure Clear(var V: TVarData); override;
   procedure Copy(var Dest: TVarData; const Source: TVarData;
     const Indirect: Boolean); override;

   function GetProperty(var Dest: TVarData; const V: TVarData;
     const Name: String): Boolean; override;
   function SetProperty(const V: TVarData; const Name: String;
     const Value: TVarData): Boolean; override;
 end;

 TConvertVarData = packed record
   VType: TVarType;
   X, Y: Single;
   Reserved1, Reserved2, Reserved3: Word;
 end;

var
 VarPoint: TcgVarPoint;

procedure VarPointCreateInto(var ADest: Variant; Point: TGPPointF);
begin
 VarClear(ADest);
 TConvertVarData(ADest).VType := VarPointVar; //СТАВЛЮ БРЕЙК ПОИНТ СЮДА. ЖМУ F8 И IDE ВИСНЕТ!!!
 TConvertVarData(ADest).X := Point.X;
 TConvertVarData(ADest).Y := Point.Y;  
end;

function VarPointCreate(Point: TGPPointF): Variant;
begin
 VarPointCreateInto(Result, Point);
end;

function VarPointVar: TVarType;
begin
 Result := VarPoint.VarType;
end;

function VarIsConvert(const AValue: Variant): Boolean;
begin
 Result := (TVarData(AValue).VType and varTypeMask) = VarPointVar;
end;

function VarAsConvert(const AValue: Variant): Variant; overload;
begin
 if not VarIsConvert(AValue) then
   VarCast(Result, AValue, VarPointVar)
 else
   Result := AValue;
end;

{ TConvertVariantType }

procedure TcgVarPoint.Clear(var V: TVarData);
begin
 SimplisticClear(V);
end;

procedure TcgVarPoint.Copy(var Dest: TVarData;
 const Source: TVarData; const Indirect: Boolean);
begin
 SimplisticCopy(Dest, Source, Indirect);
end;

function TcgVarPoint.GetProperty(var Dest: TVarData;
 const V: TVarData; const Name: String): Boolean;
begin
 Result := True;
end;

function TcgVarPoint.SetProperty(const V: TVarData;
 const Name: String; const Value: TVarData): Boolean;
begin
 Result := True;
end;

initialization
 VarPoint := TcgVarPoint.Create;
finalization
 FreeAndNil(VarPoint);
end.


 
anton20vlad   (2011-07-19 11:01) [1]

Разобрался. Может где в доке это пропустил, но необходимо переопределить ещё две процедуры:

 TcgVarPoint = class(TInvokeableVariantType)
   public
...
     procedure Cast(var Dest: TVarData; const Source: TVarData); override;
     procedure CastTo(var Dest: TVarData; const Source: TVarData;
       const AVarType: Word); override;
...
 end;
...
procedure TcgVarPoint.Cast(var Dest: TVarData; const Source: TVarData);
begin
 RaiseCastError();
end;

procedure TcgVarPoint.CastTo(var Dest: TVarData; const Source: TVarData;
 const AVarType: Word);
begin
 RaiseCastError();
end;


Они у меня никак не вызываются, так что RaiseCastError вполне пойдёт. А вот если их не переопределить таким образом, то происходит зависание, как описано в предыдущем посте.

Если честно, то мне не совсем понятно почему так происходит. Буду признателен за разъяснения.



Страницы: 1 вся ветка

Текущий архив: 2013.07.28;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.007 c
15-1362341410
Хыхы
2013-03-04 00:10
2013.07.28
Singleton в Delphi


2-1354379243
Аскалот
2012-12-01 20:27
2013.07.28
Неопознанная ошибка


11-1200759004
Jon
2008-01-19 19:10
2013.07.28
TabControl Pages


15-1362508639
jack128_
2013-03-05 22:37
2013.07.28
Почему в дельфи не шаблоны, а дженерики?


3-1291295803
svb
2010-12-02 16:16
2013.07.28
Одна таблица или много маленьких