Форум: "Потрепаться";
Текущий архив: 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