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

Вниз

Вопрос про синтаксис :-)   Найти похожие ветки 

 
GuAV ©   (2005-09-22 17:09) [0]

procedure TForm1.Button1Click(Sender: TObject);
begin
// Caption := (x.y[z]);     {1}
// Caption := (x.y)[z];     {2}
end;


Оба варианта присвоения Caption могут быть синтаксически правильными.
В каком случае может оказаться, что оба варианта компилируются и выполняются, но выдают разный результат ?

[D7]


 
заглянул   (2005-09-22 17:20) [1]

а разве {2} можно?


 
asp ©   (2005-09-22 17:20) [2]

x - объект. y - векторное свойство, в котором метод Get... при каждом чтении выдает новый результат.


 
GuAV ©   (2005-09-22 17:24) [3]

asp ©   (22.09.05 17:20) [2]

Ну, возможно, но имелось ввиду не то.
Чтобы не было всяких random, property с методом Get, etc пусть {1} всегда возвращает 1, а {2} всегда возвращает 2, не зависимо от порядка вызова.


 
Sandman29   (2005-09-22 17:27) [4]

y - индексируемое default property


 
GuAV ©   (2005-09-22 17:46) [5]

Sandman29   (22.09.05 17:27) [4]
y - индексируемое default property


Нет, если y - индексируемое property, то {2} вообще не компилируется.


 
jack128 ©   (2005-09-22 19:11) [6]

ну и вопроси у тебя..скомпилируется такой вариант:
type
 TTest = class
 private
   function Gety(index: Integer): Integer;
   procedure Sety(index: Integer; const Value: Integer);
 public
   property y[index: Integer]: Integer read Gety write Sety; default;
 end;

 TTest2 = class
 private
   Fy: TTest;
   procedure Sety(const Value: TTest);
 public
   property y: TTest read Fy write Sety;
 end;

procedure TForm1.Button1Click(Sender: TObject);
var
 x: TTest2;
begin
 (x.y[1]);
 (x.y)[1];
end;

А вот чтобы он еще и результат выдавал разный..


 
GuAV ©   (2005-09-22 20:38) [7]


> скомпилируется такой вариант:


Ха, ну если только скомиплирвать, то самый простой вариант:
const
 z = 1;
var
 x: record
   y: array[1..2] of string;
 end;
begin
 Caption := (x.y[z]);
 Caption := (x.y)[z];
end;


PS: Может кто догадается ;) завтра ответ выложу.


 
GuAV ©   (2005-09-23 11:47) [8]

Если кому интересно, ответ:

uses ActiveX, ComObj;

type
 TTest = class(TInterfacedObject, IDispatch)
 protected
   { IDispatch }
   function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
   function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
   function GetIDsOfNames(const IID: TGUID; Names: Pointer;
     NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
   function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
     Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
 end;

function TTest.GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount,
 LocaleID: Integer; DispIDs: Pointer): HResult;
begin
 if NameCount <> 1 then
   Result := E_NOTIMPL
 else
 begin
   Result := S_OK;
   PDispIdList(DispIDs)^[0] := 1;
 end
end;

function TTest.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
begin
 Result := E_NOTIMPL;
end;

function TTest.GetTypeInfoCount(out Count: Integer): HResult;
begin
 Count := 0;
 Result := S_OK;
end;

function TTest.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
 Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
begin
 if not IsEqualGUID(GUID_NULL, IID) then
 begin
   Result := DISP_E_UNKNOWNINTERFACE;
   Exit;
 end;
 if (Flags and DISPATCH_PROPERTYGET) <> 0 then
 begin
   case TDispParams(Params).cArgs of
     0: OleVariant(VarResult^) := VarArrayOf([2, 2, 2, 2]);
     1: OleVariant(VarResult^) := 1;
   else
     OleVariant(VarResult^) := NULL;
   end;
   Result := S_OK;
 end
 else
 begin
   Result := DISP_E_MEMBERNOTFOUND;
 end;
end;

var
 x: Variant;
const
 z = 1;

procedure TForm1.FormCreate(Sender: TObject);
begin
 x := (TTest.Create as IDispatch);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := (x.y[z]);     {1}
Caption := (x.y)[z];     {2}
end;


 
Sandman29   (2005-09-23 11:53) [9]

И это вопрос про синтаксис??? Начинаю понимать, почему в заголовке смайлик :)
Я даже ответа не понял, потому как с написанием COM только в качестве клиента работал :)


 
GuAV ©   (2005-09-23 12:36) [10]


> с написанием COM только в качестве клиента работал :)

Я тоже, да и в случае сервера самому реализовывать IDispatch вряд ли нужно.

В первом случае z идёт в параметры IDispatch::Invoke, а во втором используется как индеск Variant Array. Вопрос таки про синтаксис :-P

Фича была обнаружена, когда мне захотелось распарсить текстовый config файл, чтобы его параметры записать в stringlist, и затем обращатся как к вариантным полям. Посмотрел статью "Использование Microsoft ScriptControl" © Анатолий Тенцер и написал класс, вроде [8].
Некоторые параметры config файла представляли из себя два Integerа, для них было использованно VarArrayOf. Код {1} приводил к тому, что [z] шло в параметры Invoke, где успешно игнорировалось. Учитывать параметры в своём самопальном Invoke не захотел, поэтому решил использовать форму {2}.


 
Sandman29   (2005-09-23 12:49) [11]

GuAV ©   (23.09.05 12:36) [10]

Я вчера решал эту задачу по дороге домой:
1) Посчитал, что скобки из 2 нужны, чтобы изменить приоритет, то есть в первом случае вычисляется сперва y[z], а потом x.y.
2) Понял, что такого приоритета нет ни в одном случае.
3) Вспомнил, что речь о D7, а у меня D6.
4) Посчитал, что в D7 ввели какую-то новую фичу, о которой я не знаю.

Сегодня убедился, что так и было - я не знаю механизма Com в требуемой для решения задачи мере. Даже не стыдно :)


 
jack128 ©   (2005-09-23 14:07) [12]

а мне стыдно :-( . Что то я не подумал о диспаче.



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

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

Наверх




Память: 0.5 MB
Время: 0.05 c
2-1127143331
softerost
2005-09-19 19:22
2005.10.16
Преобразование


9-1116326699
VVV-First
2005-05-17 14:44
2005.10.16
GlScene, Objects


3-1125772095
Eagle Owl
2005-09-03 22:28
2005.10.16
Подключение к MySQL при помощи ADO + MyODBC


3-1125579072
Андрей Жук
2005-09-01 16:51
2005.10.16
Индексы по выражениям в Firebird


6-1111927099
Nes
2005-03-27 16:38
2005.10.16
IdUDPClient &amp; IdUDPServer ==> Вешаться или подскажите?