Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.044 c
11-1108113078
Alec
2005-02-11 12:11
2005.10.16
KOLEDB:MEMO поля


4-1124146408
alex-drob
2005-08-16 02:53
2005.10.16
Изменить рабочую область


1-1127225050
Германн
2005-09-20 18:04
2005.10.16
Ошибка Invalid File Name


3-1126028987
Ермак
2005-09-06 21:49
2005.10.16
ODBC &amp; MS Access


1-1127820657
ZeroDivide
2005-09-27 15:30
2005.10.16
О самоуничтожении объекта.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский