| olegenty | 
| Отправлено: 23.04.2004, 07:36 | 
 
 
 | 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 2412 
  
  
 | 
 Господа разработчики, как вызвать СТАНДАРТНЫЙ диалог построения строки коннкта для ADOConnection? Не вижу ни среди методов TADOConnection, ни среди методов TADOConnection::ConnectionObject...
 | 
  | 
| Gedeon | 
| Отправлено: 23.04.2004, 09:25 | 
 
 
 | 
 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 1742 
  
  
 | 
 Посоветовать могу следующее: 
В Connection String прямо в инспекторе обьектов напишите: 
| QUOTE  |   
File name="C:\\yourfile.udl" |  
  
Дальше, либо сначала создайте пустой файл и поменяйте его расширение на *.udl либо создавайте его в программе. 
Вот таким макаром вызывается диалог 
| CODE  |   
ShellExecute(Handle,"open","C:\\yourfile.udl",NULL,NULL,SW_SHOW); |  
  
После нажатия кнопки Ок в диалоге в файл сохраняется информация о выбранном подключении. При AdoConnection1->Open() он вычитает все из файла. Прелесть в том, что командную строку можно менять в любой момент и этот выбор сохраняется.
 | 
  | 
| olegenty | 
| Отправлено: 23.04.2004, 10:04 | 
 
 
 | 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 2412 
  
  
 | 
 Спасибо, попробую. Но, мне кажется, это должно быть в какой-то системной DLL-ке прописано. Знать бы в какой, и как звать функцию...
 | 
  | 
| Gedeon | 
| Отправлено: 05.05.2004, 16:15 | 
 
 
 | 
 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 1742 
  
  
 | 
| QUOTE (olegenty @ 23/04/2004, 11:06) |  | Спасибо, попробую. Но, мне кажется, это должно быть в какой-то системной DLL-ке прописано. Знать бы в какой, и как звать функцию... |  
  
Имя этой dll — oledb32.dll, имя функции не знаю. 
Вот таким еще макаром м. зпустить этот диалог 
| CODE  |   
   Variant DL; 
   DL = CreateOleObject("Datalinks"); 
   DL.Exec(Procedure("PromptNew")); |  
  
Тока как вытащить оттуда строку подклчения пока не могу понять надо обьектные библиотеки ковырять.
 | 
  | 
| olegenty | 
| Отправлено: 06.05.2004, 08:36 | 
 
 
 | 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 2412 
  
  
 | 
 Блин, вот мудень, сам же должен быть догадаться, что посредством OLE это должно работать. Там надо только имя Property знать и посредством OlePropertyGet его успешно вытягивать.
  
А сейчас предложенный тобой первый вариант работает. И замечательно работает, надо сказать  
 | 
  | 
| olegenty | 
| Отправлено: 30.05.2004, 08:28 | 
 
 
 | 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 2412 
  
  
 | 
 Короче добил я вопрос. 
Есть варианты (в примере "с" — это TADOConnection*). 
1 (посложнее) — импортировать библиотеку типа и работать с импортированной оболочкой, которая зовётся TDataLinks. тогда это будет так:
  
| CODE  |   
   TDataLinks *dl = new TDataLinks(Application); 
   dl->Connect(); 
   IDispatch *d = c->ConnectionObject; 
   dl->PromptEdit(&d); 
   dl->Disconnect(); 
   delete dl; 
 |  
 
  
2 (попроще) 
| CODE  |   
  Variant DL = CreateOleObject("Datalinks"); 
  DL.OleProcedure("PromptEdit", c->ConnectionObject); 
  DL.Clear(); 
 |  
 
  
 
P.S. В случае 1 екзешник примерно на полметра больше получается, а вот случай 2 — рулит
  
P.P.S. А из PromptNew вытянуть строку никак, PromptNew возвращает IDispatch* объекта _ConnectionPtr... т.е. там строку из объекта надо вытягивать. я подумал-подумал, да и решил, что мне не пригодится. принудительно менять ConnectionObject у TADOConnection не вижу смысла 
 | 
  | 
| _vadim_ | 
| Отправлено: 30.05.2004, 17:17 | 
 
 
 | 
  
Ученик-кочегар 
 
Группа: Участник 
Сообщений: 18 
  
  
 | 
 В составе C++Builder 5 имеется недокументированная функция 
PromptDataSource(), которая позволяет вводить строку подключения. 
Обьявление этой функции находится в файле ADODB.hpp:
  
WideString PromptDataSource 
(int theWindowHandle, WideString theOriginalConnectionString);
  
Эта функция выводит на экран диалоговое окно, в котором пользователь может сформировать строку подключения или отредактировать ту, которая передана параметром theOriginalConnectionString. Это такое же диалоговое окно, как и то, что выводится на экран при редактировании значения свойства ConnectionString в процессе разработки программы.
  
Удачи.    | 
  | 
| olegenty | 
| Отправлено: 31.05.2004, 06:44 | 
 
 
 | 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 2412 
  
  
 | 
 ха-ха   зато мы с Gedeon'ом изобрели велосипед. 
спасибо. где ж ты раньше был, друг любезный?  
 | 
  | 
| olegenty | 
| Отправлено: 31.05.2004, 06:59 | 
 
 
 | 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 2412 
  
  
 | 
 вот и текст функции: 
| CODE  |   
function PromptDataSource(ParentHandle: THandle; InitialString: WideString): WideString; 
var 
 DataInit: IDataInitialize; 
 DBPrompt: IDBPromptInitialize; 
 DataSource: IUnknown; 
 InitStr: PWideChar; 
begin 
 Result := InitialString; 
 DataInit := CreateComObject(CLSID_DataLinks) as IDataInitialize; 
 if InitialString <> '' then 
   DataInit.GetDataSource(nil, CLSCTX_INPROC_SERVER, 
     PWideChar(InitialString), IUnknown, DataSource); 
 DBPrompt := CreateComObject(CLSID_DataLinks) as IDBPromptInitialize; 
 if Succeeded(DBPrompt.PromptDataSource(nil, ParentHandle, 
   DBPROMPTOPTIONS_PROPERTYSHEET, 0, nil, nil, IUnknown, DataSource)) then 
 begin 
   InitStr := nil; 
   DataInit.GetInitializationString(DataSource, True, InitStr); 
   Result := InitStr; 
 end; 
end; 
 |   
 | 
  | 
| Gedeon | 
| Отправлено: 01.06.2004, 08:53 | 
 
 
 | 
 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 1742 
  
  
 | 
 И в 6 есть эта функция.
  
| QUOTE (olegenty @ 31/05/2004, 07:46) |  ха-ха    зато мы с Gedeon'ом изобрели велосипед. 
спасибо. где ж ты раньше был, друг любезный?    |  
  
Изобретение таких велосипедов считаю полезным.
  
Лучше всего знать несколько способов решения одной проблемы.  
 | 
  | 
| olegenty | 
| Отправлено: 01.06.2004, 09:20 | 
 
 
 | 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 2412 
  
  
 | 
 естественно полезно, вопросов нет  
 | 
  |