Выбрать главу

Этот пример выводит диалоговое окно и создает псевдоним на основе информации, введенной пользователем.

Директория, имя сервера, путь, имя базы данных и другая необходимая информация для получения псевдонима может быть получена приложением из диалогово окна или конфигурационного .INI файла.

1. Выполняем шаги 1-11 из примера #1.

2. Пишем следующий обработчик события OnClick компонента TButton:

procedure TForm1.Button1Click(Sender: TObject);

var

 NewString: string;

 ClickedOK: Boolean;

begin

 NewString:= 'C:\';

 ClickedOK:= InputQuery('Database Path', 'Path: –> C:\DELPHI\DEMOS\DATA', NewString);

 if ClickedOK then begin

  Database1.DatabaseName:= 'MyNewAlias';

  Database1.DriverName:= 'STANDARD';

  Database1.Params.Clear;

  Database1.Params.Add('Path=' + NewString);

  Table1.DatabaseName:= 'MyNewAlias';

  Table1.TableName:= 'CUSTOMER';

  Table1.Active:= True;

  DataSource1.DataSet:= Table1;

  DBGrid1.DataSource:= DataSource1;

 end;

end;

3. Запускаем приложение.

Информация о псевдонимах BDE

Как через конфигурацию IDAPI получить физический каталог расположения базы данных, зная ее псевдоним?

Обратите внимание на метод GetAliasParams класса TSession.

Возвращенная строка будет содержать искомый путь.

Я пользуюсь следующей функцией:

uses DbiProcs, DBiTypes;

function GetDataBaseDir(const Alias : string): String;

(* Возвращает каталог расположения базы данных по заданному псевдониму

  (без обратного слеша) *)

var

 sp: PChar;

 Res: pDBDesc;

begin

 try

  New(Res);

  sp:= StrAlloc(length(Alias)+1);

  StrPCopy(sp,Alias);

  if DbiGetDatabaseDesc(sp,Res) =  0 then Result:= StrPas(Res^.szPhyName)

  else Result:= '';

 finally

  StrDispose(sp);

  Dispose(Res);

 end;

end;

Мультимедиа

Аудио-компакт

Получение идентификатора диска

Как получить идентификатор находящегося в CD-ROM'е аудио-компакта?

const

 MCI_INFO_PRODUCT              = $00000100;

 MCI_INFO_FILE                 = $00000200;

 MCI_INFO_MEDIA_UPC            = $00000400;

 MCI_INFO_MEDIA_IDENTITY       = $00000800;

 MCI_INFO_NAME                 = $00001000;

 MCI_INFO_COPYRIGHT            = $00002000;

{ блок параметров для командного сообщения MCI_INFO }

type

 PMCI_Info_ParmsA = ^TMCI_Info_ParmsA;

 PMCI_Info_ParmsW = ^TMCI_Info_ParmsW;

 PMCI_Info_Parms  = PMCI_Info_ParmsA;

 TMCI_Info_ParmsA = record

  dwCallback: DWORD;

  lpstrReturn: PAnsiChar;

  dwRetSize: DWORD;

 end;

 TMCI_Info_ParmsW = record

  dwCallback: DWORD;

  lpstrReturn: PWideChar;

  dwRetSize: DWORD;

 end;

 TMCI_Info_Parms = TMCI_Info_ParmsA;

Идентификатор возвращается функцией MCI_INFO_MEDIA_IDENTITY в виде строки с десятичным числом. Для получения дополнительной информации обратитесь к электронной справке (Win32 и компонент TMediaPlayer).

Аппаратное обеспечение

CD-ROM

Открытие и закрытие привода CD-ROM

Есть ли Win32 API функция, позволяющая не только открыть НО И ЗАКРЫТЬ CD-ROM? Хотелось бы не тянуться ручками к РС, а нажать мышкой на кнопку. Компонентом TMediaPlayer пользоваться не хочу, тем более компакт он может только извлечь…

Для закрытия CD-ROM:

mciSendString('Set cdaudio door open wait', nil, 0, handle);

Для открытия CD-ROM:

mciSendString('Set cdaudio door closed wait', nil, 0, handle);

Не забудьте включить MMSystem в список используемых модулей (uses).

Операционная система

Буфер обмена

Просмотр буфера обмена

Пример на основе простого модуля-класса, осуществляющего просмотр буфера обмена.

unit ClipboardViewer;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type TForm1 = class(tform)

 procedure FormCreate(Sender: TObject);

 procedure FormDestroy(Sender: TObject);

private

 FNextViewerHandle : THandle;

 procedure WMDrawClipboard(var message: TMessage); message WM_DRAWCLIPBOARD;

 procedure WMChangeCBCHain(var message: TMessage); message WM_CHANGECBCHAIN;

public

end;

var Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

 // Проверяем работоспособность функции.

 // При невозможности просмотра буфера обмена

 // функция возвратит значение Nil.

 FNextViewerHandle:= SetClipboardViewer(Handle);

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

 // Восстанавливаем цепочки.

 ChangeClipboardChain(Handle, FNextViewerHandle);

end;

procedure TForm1.WMDrawClipboard(var message: TMessage);

begin

 // Вызывается при любом изменении содержимого буфера обмена

 message.Result := SendMessage(WM_DRAWCLIPBOARD, FNextViewerHandle, 0, 0);

end;

procedure TForm1.WMChangeCBCHain(var message: TMessage);

begin

 // Вызывается при любом изменении цепочек буфера обмена.

 if message.wParam = FNextViewerHandle then begin

  // Удаляем следующую цепочку просмотра. Корректируем внутреннюю переменную.

  FNextViewerHandle:= message.lParam;