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

Вниз

Проблема с KOLComObj   Найти похожие ветки 

 
chum   (2007-12-14 13:00) [0]

Есть вот такая процедурка. Здесь используя SQL-DMO ищутся все доступные SQL сервера и добавляются в ListBox.

procedure TForm1.Button1Click(Sender: PObj);
var
 i,j:integer;
 CS:string;
 V_n:Variant;
begin
CoInitialize(nil);
try
 Form.CursorLoad(0,IDC_WAIT);
 CS:=ServerEdit.Text;
 ServerEdit.Clear;
 V_n:=CreateOleObject("SQLDMO.Application");
 V_n:=V_n.ListAvailableSQLServers;
 j:=V_n.Count;
 For I:=1 to J do
   ServerEdit.Add(V_n.item(I));
 ServerEdit.Text:=CS;
 SendMessage(ServerEdit.Handle,CB_SHOWDROPDOWN,1,0);
except
on e: Exception do
   ShowMessage(e.Message);
end;  // try/except
Form.CursorLoad(0,IDC_ARROW);
end;


Суть проблемы в том, что при использовании библиотеки comobj всё работает замечательно, однако при использовании KOLComObj в строке
ServerEdit.Add(V_n.item(I))
возникает исключение: "[SQL-DMO]The passed ordinal is out of range of the specified collection."

В чем может быть проблема????


 
Vladimir Kladov ©   (2007-12-14 13:26) [1]

Уверены что не 0 to J-1? (Вообще то я не в теме, что такое SQL-DMO не в курсе. Просто подумал, что раз com-объекты делаются на С, то там все индексы начинают с нуля. А может и нет.)

Ещё может быть проблема с вариантами, при преобразовании в строку. Попробуйте сначала присвоить строке (даже наверное WideString), а потом, когда получено значение, дажльше с ним разбираться. Но что-то range мне кажется отнсится именно к границам массива.


 
chum   (2007-12-14 14:02) [2]

SQL-DMO - это COM объекты для работы с MS SQL SERVER.
А вот к индексам это не имеет никакого отношения - это точно. Повторюсь, что при использовании comobj, которая поставляется с DELPHI проблем нет, а вот при её замене на KOLComObj, возникает такое исключение.
Прям не понятно... если интересует, могу скинуть весь проект, он на DELPHI 7.


 
chum   (2008-01-29 15:08) [3]

Vladimir Kladov

И всё-же проблемка остаётся. В чём косяк. В приведённом примере ошибка возникает в строке
ServerEdit.Add(V_n.item(I))
а конкретнее, когда обращаешься к коллекции V_n.item(I).
Очень нужно разобраться.


 
Dimaxx ©   (2008-01-29 17:31) [4]

Что за код исполняется при вызове item(I)?


 
chum   (2008-01-30 09:43) [5]

2 Dimaxx
Из MSDN:
The Item method extracts a member from a SQL Distributed Management Objects (SQL-DMO) container object such as the Databases collection or the NameList object

В моём случае Item относится к NameList. Всё это COM-объекты.
В общем мистика какая-то.


 
Dimaxx ©   (2008-01-30 11:53) [6]

Смотри код, где описывается item и что вызывается. Возможно Владимир при перегонке кода под КОЛ исправил что-то, что нарушает нормальную работу.

V_n.ListAvailableSQLServers
V_n.Count
V_n.item

Где-то ведь это все описано, иначе компиляция невозможна была бы.


 
chum   (2008-02-01 12:50) [7]

Вы вероятно что-то не так поняли.
V_n:Variant; это тип вариант.
Создается объект SQLDMO.Application:
V_n:=CreateOleObject("SQLDMO.Application");
Далее нужно лезть в MSDN и смотреть какие есть методы у этого объекта.
Никакого описания элементов нет.
А проблема заключается в портировании comobj.pas под KOL. Но я не очень понимаю, где и какая ошибочка вкралась.


 
Dimaxx ©   (2008-02-01 14:03) [8]

А как компилятор будет компилировать строку V_n.ListAvailableSQLServers если он понятия не имеет о методе ListAvailableSQLServers?? Я просто OLE не занимался, поэтому спрашиваю.


 
mdw ©   (2008-02-01 17:12) [9]

В свое время тоже сталкивался с аналогичной проблеммой. Но потом плюнул, и стал использовать Delphi"йский comobj. Т.к. KOLComObj подглючивает, а при компиляции даже такого кода:
var V: Variant;
....
V:=0;

все равно неявно добавляется модуль Variants (и все что он тянет за собой), хотя в uses и нет его (можно посмотреть, открыв exe файл как текст).
Так что, если что-то присваевается переменной с типом Variant, то делфи линкует Variants... Тогда какой смысл в KOLComObj? Правда может я что-то не понял?
Это относится к D7. А вот в D5, насколько я знаю, смысл использовать KOLComObj кажется есть.
Еще помнится, мне кто то советовал подкладывать пустой Variants.pas, а  с переменными работать как то "похитрому", но как не помню, т.к. не получилось....


> А как компилятор будет компилировать строку V_n.ListAvailableSQLServers
> если он понятия не имеет о методе ListAvailableSQLServers?
> ? Я просто OLE не занимался, поэтому спрашиваю.

Там все нормально, связывание идет во время выполнения.



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

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

Наверх




Память: 0.49 MB
Время: 0.012 c
15-1239169620
vrem
2009-04-08 09:47
2009.06.14
Вопрос к программистам-безлимитчикам)


15-1239046670
Nic
2009-04-06 23:37
2009.06.14
Автовыравнивающаяся табличка html


4-1211165726
DJ Kondakov
2008-05-19 06:55
2009.06.14
Как запаковать файлы в 1 экзешник?


2-1240585096
Fraizer
2009-04-24 18:58
2009.06.14
stringgrid добавление строк сверху


15-1238445234
Дмитрий Белькевич
2009-03-31 00:33
2009.06.14
Вопрос по дедлокам.