-
Есть вот такая процедурка. Здесь используя 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; 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.'В чем может быть проблема????
-
Уверены что не 0 to J-1? (Вообще то я не в теме, что такое SQL-DMO не в курсе. Просто подумал, что раз com-объекты делаются на С, то там все индексы начинают с нуля. А может и нет.)
Ещё может быть проблема с вариантами, при преобразовании в строку. Попробуйте сначала присвоить строке (даже наверное WideString), а потом, когда получено значение, дажльше с ним разбираться. Но что-то range мне кажется отнсится именно к границам массива.
-
SQL-DMO - это COM объекты для работы с MS SQL SERVER. А вот к индексам это не имеет никакого отношения - это точно. Повторюсь, что при использовании comobj, которая поставляется с DELPHI проблем нет, а вот при её замене на KOLComObj, возникает такое исключение. Прям не понятно... если интересует, могу скинуть весь проект, он на DELPHI 7.
-
Vladimir KladovИ всё-же проблемка остаётся. В чём косяк. В приведённом примере ошибка возникает в строке ServerEdit.Add(V_n.item(I)) а конкретнее, когда обращаешься к коллекции V_n.item(I). Очень нужно разобраться.
-
Что за код исполняется при вызове item(I)?
-
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-объекты. В общем мистика какая-то.
-
Смотри код, где описывается item и что вызывается. Возможно Владимир при перегонке кода под КОЛ исправил что-то, что нарушает нормальную работу.
V_n.ListAvailableSQLServers V_n.Count V_n.item
Где-то ведь это все описано, иначе компиляция невозможна была бы.
-
Вы вероятно что-то не так поняли. V_n:Variant; это тип вариант. Создается объект SQLDMO.Application: V_n:=CreateOleObject('SQLDMO.Application'); Далее нужно лезть в MSDN и смотреть какие есть методы у этого объекта. Никакого описания элементов нет. А проблема заключается в портировании comobj.pas под KOL. Но я не очень понимаю, где и какая ошибочка вкралась.
-
А как компилятор будет компилировать строку V_n.ListAvailableSQLServers если он понятия не имеет о методе ListAvailableSQLServers?? Я просто OLE не занимался, поэтому спрашиваю.
-
В свое время тоже сталкивался с аналогичной проблеммой. Но потом плюнул, и стал использовать Delphi'йский comobj. Т.к. KOLComObj подглючивает, а при компиляции даже такого кода: var V: Variant; .... V:=0; все равно неявно добавляется модуль Variants (и все что он тянет за собой), хотя в uses и нет его (можно посмотреть, открыв exe файл как текст). Так что, если что-то присваевается переменной с типом Variant, то делфи линкует Variants... Тогда какой смысл в KOLComObj? Правда может я что-то не понял? Это относится к D7. А вот в D5, насколько я знаю, смысл использовать KOLComObj кажется есть. Еще помнится, мне кто то советовал подкладывать пустой Variants.pas, а с переменными работать как то "похитрому", но как не помню, т.к. не получилось....
> А как компилятор будет компилировать строку V_n.ListAvailableSQLServers > если он понятия не имеет о методе ListAvailableSQLServers? > ? Я просто OLE не занимался, поэтому спрашиваю.
Там все нормально, связывание идет во время выполнения.
|