Конференция "KOL" » Проблема с KOLComObj [Delphi]
 
  • chum (14.12.07 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 © (14.12.07 13:26) [1]
    Уверены что не 0 to J-1? (Вообще то я не в теме, что такое SQL-DMO не в курсе. Просто подумал, что раз com-объекты делаются на С, то там все индексы начинают с нуля. А может и нет.)

    Ещё может быть проблема с вариантами, при преобразовании в строку. Попробуйте сначала присвоить строке (даже наверное WideString), а потом, когда получено значение, дажльше с ним разбираться. Но что-то range мне кажется отнсится именно к границам массива.
  • chum (14.12.07 14:02) [2]
    SQL-DMO - это COM объекты для работы с MS SQL SERVER.
    А вот к индексам это не имеет никакого отношения - это точно. Повторюсь, что при использовании comobj, которая поставляется с DELPHI проблем нет, а вот при её замене на KOLComObj, возникает такое исключение.
    Прям не понятно... если интересует, могу скинуть весь проект, он на DELPHI 7.
  • chum (29.01.08 15:08) [3]
    Vladimir Kladov

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


    а конкретнее, когда обращаешься к коллекции V_n.item(I).
    Очень нужно разобраться.
  • Dimaxx © (29.01.08 17:31) [4]
    Что за код исполняется при вызове item(I)?
  • chum (30.01.08 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 © (30.01.08 11:53) [6]
    Смотри код, где описывается item и что вызывается. Возможно Владимир при перегонке кода под КОЛ исправил что-то, что нарушает нормальную работу.

    V_n.ListAvailableSQLServers
    V_n.Count
    V_n.item

    Где-то ведь это все описано, иначе компиляция невозможна была бы.
  • chum (01.02.08 12:50) [7]
    Вы вероятно что-то не так поняли.
    V_n:Variant; это тип вариант.
    Создается объект SQLDMO.Application:
    V_n:=CreateOleObject('SQLDMO.Application');
    Далее нужно лезть в MSDN и смотреть какие есть методы у этого объекта.
    Никакого описания элементов нет.
    А проблема заключается в портировании comobj.pas под KOL. Но я не очень понимаю, где и какая ошибочка вкралась.
  • Dimaxx © (01.02.08 14:03) [8]
    А как компилятор будет компилировать строку V_n.ListAvailableSQLServers если он понятия не имеет о методе ListAvailableSQLServers?? Я просто OLE не занимался, поэтому спрашиваю.
  • mdw © (01.02.08 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 не занимался, поэтому спрашиваю.

    Там все нормально, связывание идет во время выполнения.
 
Конференция "KOL" » Проблема с KOLComObj [Delphi]
Есть новые Нет новых   [134431   +12][b:0][p:0.001]