Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с KOLComObj [Delphi]


chum ©   (2007-12-14 13:00:00) 

Есть вот такая процедурка. Здесь используя 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.'

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


mdw   (2008-02-01 17:12:00) [1]

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

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


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

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


Dimaxx   (2008-02-01 14:03:00) [2]

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


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

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


Dimaxx   (2008-01-30 11:53:00) [4]

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

V_n.ListAvailableSQLServers
V_n.Count
V_n.item

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


chum   (2008-01-30 09:43:00) [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-29 17:31:00) [6]

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


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

Vladimir Kladov

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


chum   (2007-12-14 14:02:00) [8]

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


Vladimir Kladov   (2007-12-14 13:26:00) [9]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо