Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Delphi. Π’Ρ€ΡŽΠΊΠΈ ΠΈ эффСкты». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 10

Автор Π’Π°Π»Π΅Ρ€ΠΈΠΉ Борисок

Π˜Ρ‚Π°ΠΊ, ΠΊΠΎΠ³Π΄Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сообщСниС WM_COMMAND, Ρ‚ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ… ΠΏΡ€ΠΈΠ»Π°Π³Π°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (lParam ΠΈ wParam) ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ свСдСния:

β€’ ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ 16 Π±ΠΈΡ‚ wParam ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой цСлочислСнный ΠΊΠΎΠ΄ увСдомлСния, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ с элСмСнтом управлСния;

β€’ младшиС 16 Π±ΠΈΡ‚ wParam ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ элСмСнта управлСния, состояниС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ измСнилось (ΠΈΠΌΠ΅Π½Π½ΠΎ этот ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»ΠΈ вмСсто дСскриптора мСню ΠΏΡ€ΠΈ создании элСмСнтов управлСния);

β€’ lParam содСрТит дСскриптор (HWND) ΠΎΠΊΠ½Π° элСмСнта управлСния, состояниС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ измСнилось.

Для выдСлСния ΡΡ‚Π°Ρ€ΡˆΠΈΡ… 16 Π±ΠΈΡ‚ ΠΈΠ· 32-Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ значСния ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ HiWord. Для получСния ΠΌΠ»Π°Π΄ΡˆΠΈΡ… 16 Π±ΠΈΡ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΈΠΌΠ΅Π½Π΅ΠΌ LoWord. ОбС ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Windows.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ привСсти ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ΄Ρ‹ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ:

β€’ BN_CLICKED – Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ°;

β€’ EN_CHANGE – ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ тСкст Π² тСкстовом ΠΏΠΎΠ»Π΅;

β€’ LBN_SELCHANGE – измСнилось Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² спискС;

β€’ CBN_SELCHANGE – измСнилось Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡΡ спискС.

Π­Ρ‚ΠΈ ΠΈ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ константы ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ стандартных элСмСнтов управлСния ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Messages.

...

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ΠšΠΎΠ΄Ρ‹ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ рассматриваСмых Π² этой Π³ Π»Π°Π²Π΅ элСмСнтов управлСния приводятся Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ 3.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ прилоТСния

Рассмотрим нСбольшой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с элСмСнтами управлСния, ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΌΠΈ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ описанным Ρ€Π°Π½Π΅Π΅ способом. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ этого прилоТСния называСтся ControlsDemo.

НС Π±ΡƒΠ΄Π΅ΠΌ Π·Π°ΠΎΡΡ‚Ρ€ΡΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° рСгистрации класса Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° прилоТСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π² листингС 2.4. Рассмотрим созданиС ΠΎΠΊΠ½Π° с элСмСнтами управлСния Π² Π½Π΅ΠΌ (листинг 2.21).

...

Листинг 2.21.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° прилоТСния (с элСмСнтами управлСния)

program ControlsDemo;

uses

Windows, Messages,

Controls in \'Controls.pas\

{$R *.res}

var

hMainWnd: HWND;

hInst: Cardinal;

mess: MSG;

//Ѐункция ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний

…

//Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° ΠΈ Ρ†ΠΈΠΊΠ»Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний

begin

hInst := GetModuleHandle(nil);

//РСгистрация ΠΈ созданиС Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°

if not RegisterWindow() then Exit;

hMainWnd := CreateWindow(

\'MyWindowClass\', //Имя класса окна

\'Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ\', //Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π°

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, //ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° X ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

CW_USEDEFAULT, //ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Y ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

CW_USEDEFAULT, //Π¨ΠΈΡ€ΠΈΠ½Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

CW_USEDEFAULT, //Высота ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

HWND(nil), //НСт Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°

HMENU(nil), //НСт мСню

hInst,

nil);

if (hMainWnd = HWND(nil)) then Exit;

//Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ модуля Controls для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠΊΠ½ΠΎΠΌ

Controls.hParentWnd := hMainWnd;

Controls.hAppInst := hInst;

//Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ элСмСнтов управлСния

CreateFrame(10, 80, 170, 70, β€“1, \'Кнопки\');

CreateButton(20, 100, 70, 30, 1001, \'Кнопка 1\');

CreateButton(100, 100, 70, 30, 1002,\'Кнопка 2\');

CreateFrame(200, 10, 200, 180, β€“1, \'Π€Π»Π°ΠΆΠΊΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ\');

CreateCheck(210, 30, 180, 20, 2001, \'Π€Π»Π°ΠΆΠΎΠΊ 1\');

CreateCheck(210, 60, 180, 20, 2002, \'Π€Π»Π°ΠΆΠΎΠΊ 2\', True);

CreateOption(210, 100, 180, 20, 3001, \'ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ 1\', True);

CreateOption(210, 130, 180, 20, 3002, \'ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ 2\', False,

True);

CreateOption(210, 160, 180, 20, 3003, \'ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ 3\', True);

CreateFrame(420, 10, 300, 180, β€“1, \'Бписки ΠΈ статичСскиС

надписи\');

CreateLabel(430, 30, 70, 20, -1, \'Надпись\');

CreateCombo(510, 30, 200, 100, 4001);

CreateList(430, 60, 280, 120, 5001);

CreateFrame(200, 200, 200, 240, β€“1, \'ВСкстовыС поля\');

CreateEdit(210, 220, 180, 20, 6001, \'ВСкст Π² тСкстовом ΠΏΠΎΠ»Π΅\');

CreateMemo(210, 250, 180, 180, 6002, \'ВСкст Π² многострочном\'

+ #13 + #10 + \'тСкстовом ΠΏΠΎΠ»Π΅\');

//Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ строк Π² списки

AddToCombo(4001, \'Π‘Ρ‚Ρ€ΠΎΠΊΠ° 1\');

AddToCombo(4001, \'Π‘Ρ‚Ρ€ΠΎΠΊΠ° 2\');

AddToCombo(4001, \'Π‘Ρ‚Ρ€ΠΎΠΊΠ° 3\');

AddToList(5001, \'Π‘Ρ‚Ρ€ΠΎΠΊΠ° 1\');

AddToList(5001, \'Π‘Ρ‚Ρ€ΠΎΠΊΠ° 2\');

AddToList(5001, \'Π‘Ρ‚Ρ€ΠΎΠΊΠ° 3\');

ShowWindow(hMainWnd, SW_NORMAL);

//Запуск Ρ†ΠΈΠΊΠ»Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний

while (Longint(GetMessage(mess, 0, 0, 0)) <> 0)

do begin

TranslateMessage(mess);

DispatchMessage(mess);

end;

end.

Листинг 2.21 Π·Π°ΠΎΠ΄Π½ΠΎ дСмонстрируСт использованиС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Ρ€Π°Π½Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с элСмСнтами управлСния. Выглядит созданноС ΠΎΠΊΠ½ΠΎ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 2.3.

Рис. 2.3. Окно с элСмСнтами управлСния

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ построСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний для этого ΠΎΠΊΠ½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 2.22.

...

Листинг 2.22.

Ѐункция ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний

//Ѐункция ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний

function WindowFunc(hWnd:HWND; msg:UINT; wParam:WPARAM;

lParam:LPARAM):LRESULT; stdcall;

var

ps: PAINTSTRUCT;

begin

case msg of

WM_PAINT:

begin

//ΠŸΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²ΠΊΠ° содСрТимого ΠΎΠΊΠ½Π°

BeginPaint(hWnd, ps);

TextOut(ps.hdc, 10, 10, \'ВСкст Π² ΠΎΠΊΠ½Π΅\', 12);

EndPaint(hWnd, ps);

end;

WM_CLOSE:

if (hWnd = hMainWnd) then

PostQuitMessage(0); //ΠŸΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ этого ΠΎΠΊΠ½Π°

//Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

WM_COMMAND:

begin

case LOWORD(wParam) of

//Π½Π°ΠΆΠ°Ρ‚Π° «Кнопка 1Β»

1001: if HIWORD(wParam) = BN_CLICKED then;

//Π½Π°ΠΆΠ°Ρ‚Π° «Кнопка 2Β»

1002: if HIWORD(wParam) = BN_CLICKED then;

//установлСн Β«Π€Π»Π°ΠΆΠΎΠΊ 1Β»

2001: if HIWORD(wParam) = BN_CLICKED then;

//установлСн Β«Π€Π»Π°ΠΆΠΎΠΊ 2Β»

2002: if HIWORD(wParam) = BN_CLICKED then;

//установлСн Β«ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ 1Β»

3001: if HIWORD(wParam) = BN_CLICKED then;

//установлСн Β«ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ 2Β»

3002: if HIWORD(wParam) = BN_CLICKED then;

//установлСн Β«ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ 3Β»

3003: if HIWORD(wParam) = BN_CLICKED then;

//Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² ComboBox

4001: if HIWORD(wParam) = CBN_SELCHANGE then;

//Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² ListBox

5001: if HIWORD(wParam) = LBN_SELCHANGE then;

//ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ тСкст Π² Edit

6001: if HIWORD(wParam) = EN_CHANGE then;

//ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ тСкст Π² Memo

6002: if HIWORD(wParam) = EN_CHANGE then;

end;

end;

else

begin

//ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

WindowFunc := DefWindowProc(hWnd, msg, wParam, lParam);

Exit;

end;

end;

WindowFunc := S_OK; //Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ

end;

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π² листингС 2.22 функция ΠΎΡ‚Π½ΡŽΠ΄ΡŒ Π½Π΅ ΠΏΡ€Π΅Ρ‚Π΅Π½Π΄ΡƒΠ΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ эталоном Π² порядкС классификации сообщСний ΠΎΡ‚ элСмСнтов управлСния. Иногда Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ сразу ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сообщСния Π½Π΅ ΠΏΠΎ элСмСнтам управлСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡ… прислали, Π° ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π² рядС случаСв ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСний сразу для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… элСмСнтов управлСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΉ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ окаТСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ 1 Par am сообщСния WM_COMMAND.

ΠšΡΡ‚Π°Ρ‚ΠΈ, Ρ€Π°Π·ΠΌΠ΅Ρ€ исполняСмого Ρ„Π°ΠΉΠ»Π° этого прилоТСния всСго 19 ΠšΠ±Π°ΠΉΡ‚.

2.4. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π° Windows

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Windows API Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ распространСнныС Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ структуры с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ для этих Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ:

β€’ CommDlg – для ΠΎΠΊΠΎΠ½ открытия/сохранСния Ρ„Π°ΠΉΠ»Π°, Π²Ρ‹Π±ΠΎΡ€Π° Ρ†Π²Π΅Ρ‚Π° ΠΈ ΡˆΡ€ΠΈΡ„Ρ‚Π°, поиска ΠΈ Π·Π°ΠΌΠ΅Π½Ρ‹ тСкста;

β€’ ShlObj ΠΈ ActiveX – для ΠΎΠΊΠ½Π° Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΠ°ΠΏΠΊΠΈ (Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½ΡƒΠΆΠ΅Π½ для дос Ρ‚ΡƒΠΏΠ° ΠΊ интСрфСйсу IMalloc, Π·Π°Ρ‡Π΅ΠΌ – Π±ΡƒΠ΄Π΅Ρ‚ рассказано Π΄Π°Π»Π΅Π΅);

β€’ Windows – ΠΏΠΎΠΌΠΈΠΌΠΎ объявлСния основных структур ΠΈ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ содСрТит объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠΊΠ½Π°ΠΌΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΡ‚ сСтСвого рСсурса (сСтСвого диска);

β€’ ShellAPI – для систСмного ΠΎΠΊΠ½Π° О ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ использования рассматриваСмых Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² ΠΏΠΎΠ΄Ρ€Π°Π·Π΄. «ДСмонстрационноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Β».

...

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π²Ρ‹Π·ΠΎΠ²Π° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΠΊΠΎΠ½ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ hApplnst ΠΈ hParentWnd. ΠŸΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ это Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π²Π½Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…. Для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с ΠΈΠΌΠ΅Π½Π΅ΠΌ I nit, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ значСния для hParentWnd ΠΈ hApplnst.

Окно открытия/сохранСния Ρ„Π°ΠΉΠ»Π°

Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ возмоТностями ΠΎΠΊΠ½Π° открытия Ρ„Π°ΠΉΠ»Π°, достаточно Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ листинг 2.23.

...

Листинг 2.23.

Окно открытия Ρ„Π°ΠΉΠ»Π°

function ShowOpen(strFilter: string; nFilterIndex: Integer = 0;

strInitFileName: string = \'\

var

ofn: OPENFILENAME;

begin

ZeroMemory(Addr(ofn), SizeOf(ofn));

//Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€Π° (260 символов)

SetLength(strInitFileName, MAX_PATH);

PrepareFilterString(strFilter);

//Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ структуры для Π΄ΠΈΠ°Π»ΠΎΠ³Π°

ofn.lStructSize := SizeOf(ofn);

ofn.hWndOwner := hParentWnd;

ofn.hInstance := hAppInst;

ofn.lpstrFilter := PAnsiChar(strFilter);

ofn.nFilterIndex := nFilterIndex;

ofn.lpstrFile := PAnsiChar(strInitFileName);

ofn.nMaxFile := MAX_PATH;

ofn.lpstrTitle := pAnsiChar(strTitle);

ofn.Flags := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or

OFN_HIDEREADONLY;

//ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° Π΄ΠΈΠ°Π»ΠΎΠ³Π° ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°

if (GetOpenFileName(ofn) = True) then

ShowOpen := ofn.lpstrFile;

end;

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π² листингС 2.23 функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ ΠΏΡƒΡΡ‚ΡƒΡŽ строку – ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Ρ„Π°ΠΉΠ»Π° Π² случаС, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±Ρ€Π°Π» ΠΈΠ»ΠΈ Π²Π²Π΅Π» имя Ρ„Π°ΠΉΠ»Π°. Π—Π΄Π΅ΡΡŒ Π³Π»Π°Π²Π½ΠΎΠΉ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡΡ‚ΡŒΡŽ являСтся Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ довольно большой структуры OPENFILENAME. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ возмоТности Π΄ΠΈΠ°Π»ΠΎΠ³Π° открытия Ρ„Π°ΠΉΠ»Π° ΠΈ лишь Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… ΠΈΠΌ Ρ„Π»Π°Π³ΠΎΠ² (ΠΏΠΎΠ»Π΅ Flags):

β€’ OFN_FILEMUSTEXIST – ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡƒΡ‚ΡŒ являСтся ΠΏΡƒΡ‚Π΅ΠΌ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π°;

β€’ OFN_PATHMUSTEXI ST – Π½Π΅ Π΄Π°Π΅Ρ‚ ввСсти имя Ρ„Π°ΠΉΠ»Π° Π² Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ°ΠΏΠΊΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ с:\docs\mydocl.doc, Ссли ΠΏΠ°ΠΏΠΊΠΈ docs Π½Π΅ сущСствуСт, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ сообщСниС);

β€’ OFNHIDEREADONLY – Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„Π»Π°ΠΆΠΎΠΊ Волько для чтСния.

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ рассмотрим, Π·Π°Ρ‡Π΅ΠΌ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ вызываСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ функция PrepareFilterString (листинг 2.24).

...

Листинг 2.24.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ строки Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°

procedure PrepareFilterString(var strFilter: string);

var

i: Integer;

begin

for i := 1 to length(strFilter) do