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
|
естественно полезно, вопросов нет
|
|