Зарезервированное слово- type
Модератор: Модераторы
- pi1
- новенький
- Сообщения: 59
- Зарегистрирован: 19.04.2012 18:11:24
- Откуда: г.Зеленокумск
- Контактная информация:
Зарезервированное слово- type
Решил использовать PrintScalesDriver от КАС - центра (электронные весы фирмы CAS).
Все как обычно, берем пример из другой среды:
//..............................
Пример работы с драйвером весов
// Создаем объект
Scale scale = создать СОМОбъект “CAScentre_DLL_printScale.Scale”;
Попытка
//Задаем основные настройки драйвера для работы с весами
scale.IP=”127.0.0.1”;
scale.Port=20304;
scale.Type = 3;
//Подключаемся к весам
scale.Open
//..............................
поправляем синтаксис и можно использовать (много раз так делал), но вот тут имя поля объекта, type, не проходит проверку на синтаксис в Lazarus.
Как обойти и можно ли вообще обойти? Не хотелось бы до батников опускаться.
Все как обычно, берем пример из другой среды:
//..............................
Пример работы с драйвером весов
// Создаем объект
Scale scale = создать СОМОбъект “CAScentre_DLL_printScale.Scale”;
Попытка
//Задаем основные настройки драйвера для работы с весами
scale.IP=”127.0.0.1”;
scale.Port=20304;
scale.Type = 3;
//Подключаемся к весам
scale.Open
//..............................
поправляем синтаксис и можно использовать (много раз так делал), но вот тут имя поля объекта, type, не проходит проверку на синтаксис в Lazarus.
Как обойти и можно ли вообще обойти? Не хотелось бы до батников опускаться.
можно так попробовать:
но вообще, проблем с зарезервированными словами и КОМ-объектами в паскале быть не должно.
Потому что КОМ интерфейсы работают не на основе названия метода, а только на основе порядка, т.е. интерфейс может быть описан как
и никаких проблем вознинуть не должно.
Код: Выделить всё
scale.&Port := 20304
но вообще, проблем с зарезервированными словами и КОМ-объектами в паскале быть не должно.
Потому что КОМ интерфейсы работают не на основе названия метода, а только на основе порядка, т.е. интерфейс может быть описан как
Код: Выделить всё
CAScentre_DLL_PrintScale = IInterface
public
function getPort(aport: Integer): Integer;
procedure setPort(aport: Integer);
property _Port: Integer read getPort write setPort;
end;
и никаких проблем вознинуть не должно.
Код: Выделить всё
scale._Port := 20304
- pi1
- новенький
- Сообщения: 59
- Зарегистрирован: 19.04.2012 18:11:24
- Откуда: г.Зеленокумск
- Контактная информация:
Теоритически я согласен, но вот на практике IDE Lazarus не пропускает синтаксис этого куска кода - scale.Type = 3;
Потому как в нем используется слово -Type. В более новых редакциях этого софта от CAS имя поля исправлено на type_ , но одновременно с этим разработчик придумал бюрократическую процедуру по активации, регистрации и т.п. . Наверное вместо весов будут теперь софт продавать
Потому как в нем используется слово -Type. В более новых редакциях этого софта от CAS имя поля исправлено на type_ , но одновременно с этим разработчик придумал бюрократическую процедуру по активации, регистрации и т.п. . Наверное вместо весов будут теперь софт продавать
я теперь понимаю своё непонимание!
а можно ли пример кода на паскале увидеть? а то выше приведённый пример из батника.
особенно интересует объявление типа Scale
а можно ли пример кода на паскале увидеть? а то выше приведённый пример из батника.
особенно интересует объявление типа Scale
скалогрыз писал(а):особенно интересует объявление типа Scale
Type Scale:OleVariant или как то так. Это же COM объект; нет для него объявления как такового
pi1 писал(а):IDE Lazarus не пропускает синтаксис этого куска кода - scale.Type = 3;
Потому как в нем используется слово -Type.
Ну а так:
Код: Выделить всё
scale.&Type := 3;хм... почему когда я советовал использовать & я указал на port вместо type? наверное я был пьян!
SSerge писал(а):Type Scale:OleVariant или как то так. Это же COM объект; нет для него объявления как такового
А если быть точнее то Automation COM объект, с поддержкой IDispatch интерфейса. ("особая магия" по вызову метода без его определения, работает на основе информации о методе информации полученной через IDispatch)
А значит объявление такое "существует", просто поставщики библиотеки поленились сделать его для delphi?!
скалогрыз писал(а):с поддержкой IDispatch интерфейса
Тут, видишь ли, при явном определении "заголовочного файла" в виде IDispatch, появляется такая хрень, как CLID COM-объекта. И программа, благополучно отлаженная и работающая, при другой инсталляции может этого COM-объекта не найти, в случае даже небольшого изменения версии программы, которая должна вызываться через COM. В частности, если есть компонент например управления Excel"м скажем 2003-м, построенный на базе IDIspatch, то он в упор не видит Excel любой другой версии - зато в редакторе все свойства доступны. В противоположность получения Variant через GetOleObject (могу нещадно путать названия ф-й) - программист не видит при кодировании ни одного свойства (их надо знать, как и порядок и назначения параметров), зато вызывается любой (первый попавшийся) инсталлированный Excel.
SSerge писал(а):Тут, видишь ли, при явном определении "заголовочного файла" в виде IDispatch, появляется такая хрень, как CLID COM-объекта.
и ведь действительно, использование только IDispatch помогает с совместимостью между разными версиями.
- pi1
- новенький
- Сообщения: 59
- Зарегистрирован: 19.04.2012 18:11:24
- Откуда: г.Зеленокумск
- Контактная информация:
Конкретно это выглядит так:
procedure Tf_fasovka.SpeedButton12Click(Sender: TObject);
var
scale:OleVariant;
begin
{
Сэмпл от разработчика-
Пример работы с драйвером весов
// Создаем объект
Scale scale = создать СОМОбъект “CAScentre_DLL_printScale.Scale”;
Попытка
//Задаем основные настройки драйвера для работы с весами
scale.IP=”127.0.0.1”;
scale.Port=20304;
scale.Type = 3;
//Подключаемся к весам
scale.Open
работает во многих средах кроме паскаля,
наверняка нужно просто отключить проверку синтаксиса перед компиляцией
}
try
// Создаем объект для Tandem7PI
scale :=createoleobject('CAScentre_DLL_printScale.Scale');
//Задаем основные настройки драйвера для работы с весами
scale.IP:='127.0.0.1';
scale.Port:=20304;
scale.Type := 3;
//Подключаемся к весам
scale.Open;
//тут работа с полями и методами объекта
scale.close;
except
end;
end;
Простой вопрос, как отключить проверку синтаксиса части кода в IDE Lazarus ?
scale.&Type = 3; - не прошло
procedure Tf_fasovka.SpeedButton12Click(Sender: TObject);
var
scale:OleVariant;
begin
{
Сэмпл от разработчика-
Пример работы с драйвером весов
// Создаем объект
Scale scale = создать СОМОбъект “CAScentre_DLL_printScale.Scale”;
Попытка
//Задаем основные настройки драйвера для работы с весами
scale.IP=”127.0.0.1”;
scale.Port=20304;
scale.Type = 3;
//Подключаемся к весам
scale.Open
работает во многих средах кроме паскаля,
наверняка нужно просто отключить проверку синтаксиса перед компиляцией
}
try
// Создаем объект для Tandem7PI
scale :=createoleobject('CAScentre_DLL_printScale.Scale');
//Задаем основные настройки драйвера для работы с весами
scale.IP:='127.0.0.1';
scale.Port:=20304;
scale.Type := 3;
//Подключаемся к весам
scale.Open;
//тут работа с полями и методами объекта
scale.close;
except
end;
end;
Простой вопрос, как отключить проверку синтаксиса части кода в IDE Lazarus ?
scale.&Type = 3; - не прошло
pi1 писал(а):Простой вопрос, как отключить проверку синтаксиса части кода в IDE Lazarus ?
scale.&Type = 3; - не прошло
а если не прошло, то с какой ошибкой?
например такой вот тест:
Код: Выделить всё
program project1;
{$mode delphi}
var
o : OleVariant;
begin
o.&Type := 3;
end.
компилируется без проблем, а ассебмлерный листинг показывает что всё должно быть правильным:
Код: Выделить всё
...
# [6] o.&Type := 3;
leal -4(%ebp),%eax
movl $3,(%eax)
leal -4(%ebp),%eax
pushl %eax
movl $_$PROJECT1$_Ld1,%ecx
movl $U_P$PROJECT1_O,%edx
movl $0,%eax
call fpc_dispinvoke_variant
..
.globl _$PROJECT1$_Ld1
_$PROJECT1$_Ld1:
.byte 4,1,0,16,84,121,112,101,0
84,121,112,101 - и есть "Type", а не "&Type"
- pi1
- новенький
- Сообщения: 59
- Зарегистрирован: 19.04.2012 18:11:24
- Откуда: г.Зеленокумск
- Контактная информация:
Респект и уважуха за подсказку scale.&type. Теперь нужно в поле scale.pluName1 скормить OLE char строку. Еще этот тип называют bstr. В префиксе идет описание длины строковой части. Не подскажите?
Добавлено спустя 59 минут 44 секунды:
Похоже нашел !
===================
Answer
by:simonetPosted on 1999-05-15 at 22:23:18ID: 1374599
Use StringToWideChar to convert A (type string) to a TBstr (type PWideString).
This way you can do:
var
a : string;
c : Variant;
pws : PWideString;
begin
a := 'The quick brown fox jumped from the bridge.';
GetMem(pws, 1024); // Remove this if it fails.. haven't tried
C := View.CreateConcept(StringToWideChar(a, pws, lenght(a), ' '); // remove this if you remove GetMem
FreeMem(pws);
(...)
Yours,
Alex
================================
Добавлено спустя 59 минут 44 секунды:
Похоже нашел !
===================
Answer
by:simonetPosted on 1999-05-15 at 22:23:18ID: 1374599
Use StringToWideChar to convert A (type string) to a TBstr (type PWideString).
This way you can do:
var
a : string;
c : Variant;
pws : PWideString;
begin
a := 'The quick brown fox jumped from the bridge.';
GetMem(pws, 1024); // Remove this if it fails.. haven't tried
C := View.CreateConcept(StringToWideChar(a, pws, lenght(a), ' '); // remove this if you remove GetMem
FreeMem(pws);
(...)
Yours,
Alex
================================
