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

Вниз

Делфи и 1с через OLE   Найти похожие ветки 

 
Maniacosaur   (2003-05-29 10:11) [0]

Может кто-нибудь сталкивался с проблемой передачи/получения данных из делфи в 1с через OLE?
Глюк у меня вот в чем.

--- Начало кусочка кода ---
var
OneS, Sotr: Variant;
s: string;

begin
try
OneS:=CreateOleObject("V77.Application");
except
on EOleSysError do begin
....
end
end;

OneS.Initialize(OneS.RMTrade,"/D"+Paths.Strings[ConfCombo.ItemIndex],"NO_SPLASH_SHOW");

Sotr:=OneS.CreateObject("Справочник.Сотрудники");
s:="Уволенные";

!!!! if Sotr.НайтиПоНаименованию(s)=0 then
begin
Sotr.НоваяГруппа;
Sotr.Наименование:="Уволенные";
Sotr.Записать;
end;

--- Конец кусочка кода ---

Вопрос касается строчки помеченно "!!!". Если в параметрах стоит
переменная типа string или variant, то вываливается с ошибкой о
недопустимом типе. Если стоит указатель на строку символов типа PChar,
то все проходит, но в итоге оказывается что хоть параметр и передался,
оно не нашло в справочнике то, что искал (хотя это заведомо есть).
НО. Если в параметре указать непосредственно "Уволенные", то все
работает как надо и все находится.


 
Skier   (2003-05-29 10:14) [1]

StringToOleStr(...) ?


 
MMF   (2003-05-29 10:23) [2]

Используй WideString


 
paxer   (2003-05-29 10:54) [3]

У НайтиПоНаименованию() три параметра. Все три надо передавать. Пустой параметр (не указанный) - Unassigned.


 
Maniacosaur   (2003-05-29 15:06) [4]

StringToOleStr тоже пробовал. Результат - не находит то, что нужно.
НайтиПоНаименованию пробовал и со всеми тремя параметрами (причем перебрал значения). Не помогает


 
Serginio   (2003-05-29 15:30) [5]

Вообще Delphi автоматически переводит String в WideString;
Можно использовать глобальные функции и переменные объявленные как Экспорт. (процедуры не прокатывают). Но твоя ситуация достаточно странная. Объяви на всякий случай s:WideString;

И учти опуская 3 параметр можешь получить не полное соответствие.
И используй не Variant а OleVariant;

НайтиПоНаименованию(<?>,,);
Синтаксис:
НайтиПоНаименованию(<Наименование>,<Режим>,<ФлагПоиска>)
Назначение:
Найти элемент справочника по наименованию.
Возвращает: 1 - если действие выполнено;
0 - если действие не выполнено (элемент не найден).
Параметры:
<Наименование> - строка с наименованием искомого элемента справочника,
<Режим> - необязательный параметр. Число: 1 - поиск внутри установленного подчинения (родителя); 0 - поиск во всем справочнике вне зависимости от родителя. Значение по умолчанию - 1.
<ФлагПоиска> - необязательный параметр. Число: 1 - найти точное соответствие наименования; 0 - найти наименование по первым символам. Значение по умолчанию - 0.
Замечание:
Метод можно использовать только для объектов, созданных функцией СоздатьОбъект.


 
Maniacosaur   (2003-05-30 11:49) [6]

Да, я забыл уточнить, что то, что я ищу - группа.
Когда вместо Variant поставил OleVariant - начало ругаться на несоответствие типа. :-(


 
Serginio   (2003-05-30 13:42) [7]

Одной из возможностей такого поведения 1С может буть что при передачи параметра Delphi использует ссылку на строку
Args[j-i].vt:=VT_BYREF or VT_BSTR ;
Args[j-i].byRef:=@p^[i];
Используй ВК или диспинтерфейсы. Для справки смотри
http://www.1c.hippo.ru/cgi-bin/predownl.cgi?id=2019


 
paxer   (2003-05-30 14:20) [8]

Все должно работать. Единственно, если параметр - строка, то это должна быть перемення типа String, а не Variant.


 
Serginio   (2003-05-30 14:43) [9]

Сейчас проверил "Неверно задана вызывающая сторона"
Так если вызывается строка через переменную идет код

BStr := StringToOleStr(PString(ParamPtr^)^);
PStr := PString(ParamPtr^);
ArgPtr^[0] := varOleStr or varByRef;
ArgPtr^[2] := Integer(@BStr);



Если же подставитьсторку
Sotr.НайтиПоНаименованию("Уволенные")=0
то вызывается
BStr := StringToOleStr(PString(ParamPtr)^);
PStr := nil;
ArgPtr^[0] := varOleStr;
ArgPtr^[2] := Integer(BStr);

То есть 1С не поддерживает параметры переданные как varByRef


 
Serginio   (2003-05-30 15:01) [10]

А вот такой код прокатывает на ура
procedure TForm1.Button1Click(Sender: TObject);
Var v1,sp:Olevariant;
s:String;
Procedure callSp(Const s:String);
begin
If sp.НайтиПоНаименованию(s,0,1)=1 Then
ShowMessage(sp.Наименование);
end;
Begin
v1:=CreateOleObject("v77.Application");
v1.initialize(v1.RMTrade,"","");
s:="Хозтовары";
sp:=v1.CreateObject("Справочник.Товары");
CallSp(s);


end;


 
Maniacosaur   (2003-06-03 11:37) [11]

Дааа. Голь на выдумки хитра!!!! ;-) ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!!!!


 
Serginio   (2003-06-03 17:31) [12]

Как раз проверил вызов из ВК функций экспорт глобального модуля 1С. Там тоже была заковыка с передачей параметров объектов 1С. Лечится так же. Созданием дополнительной процедурой с определением переменной как Const.



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

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

Наверх




Память: 0.47 MB
Время: 0.006 c
1-50323
Dankin
2003-06-03 12:35
2003.06.16
Drag and drop


1-50347
Rulya
2003-06-03 04:38
2003.06.16
Гнератор случайных чисел


14-50527
vitek
2003-06-01 11:41
2003.06.16
Installshield Limit edition


4-50575
b_Alex
2003-04-16 14:41
2003.06.16
Определение типа компонента


14-50507
Shpizel
2003-05-30 23:12
2003.06.16
Outlook





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский