![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OpenDialog и SaveDialog [D7, WinXP]
Delphi_is_cool © (2005-09-26 01:54:00)Здраствуйте ! У меня вопрос простой ) Как средставми WinApi осуществить сабж ?
Delphi_is_cool (2005-09-26 15:15:00) [1]Del_programmer, пишу простенький блокнот на Api, вот для этого :)
Delphi_is_cool (2005-09-26 15:13:00) [2]Спасибо большое !
Del_programmer (2005-09-26 15:11:00) [3]
> Delphi_is_cool ©
почему именно через АПИ?
ShiFT (2005-09-26 08:34:00) [4]
«Open File»
//Во-первых, константа с файловым фильтром.
//В данном примере определяется константа с двумя фильтрами:
// Text files (*.txt)'#0'*.txt' и All files'#0'*.*'.
//Разделяются фильтры символом с кодом нуль (#0),
//завершается строка двумя нулевыми символами.
//Каждый фильтр состоит из текста фильтра,
//затем нулевой символ,
//затем сам фильтр – файловая маска.
const
szFileFilter: string = 'Text files (*.txt)'#0'*.txt'#0'All files'#0'*.*'#0#0;
//Определяем глобальные переменные, в основном буферы для хранения строк.
var
lpCustFilter: array[0..255] of char = '';
nFilterIndex: DWORD = 0;
szFile: array[0..2048] of char = '';
szFileTitle: array[0..255] of char;
szCurrentDir: array[0..1024] of char = '';
//Теперь пишем код для вызова функции GetOpenFileName.
//В данном случае код находится внутри оконной функции –
//это реакция на нажатие кнопки.
var
ofn: TOPENFILENAME;
s: string;
cf: PChar;
errcode: DWORD;
begin
ofn.lStructSize := sizeof(TOPENFILENAME);
ofn.hWndOwner := wnd;
ofn.hInstance := hInstance;
ofn.lpstrFilter := @szFileFilter[1]; //преобразуем тип string к типу PChar
ofn.lpstrCustomFilter := lpCustFilter;
ofn.nMaxCustFilter := sizeof(lpCustFilter);
ofn.nFilterIndex := nFilterIndex;
ofn.lpstrFile := szFile;
ofn.nMaxFile := sizeof(szFile);
ofn.nFilterIndex := 0;
ofn.lpstrFileTitle := szFileTitle;
ofn.nMaxFileTitle := sizeof(szFileTitle);
ofn.lpstrInitialDir := szCurrentDir; //Глобальная переменная,
//где хранится адрес текущего каталога.
//Текущий каталог для ЭТОЙ функции,
//не для программы!
ofn.lpstrTitle := 'Заголовок диалога Open file';
ofn.Flags := OFN_EXPLORER or OFN_ALLOWMULTISELECT or OFN_ENABLESIZING or OFN_SHOWHELP or OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST;
ofn.lpstrDefExt := 'txt';
ofn.lpfnHook := nil;
ofn.lpTemplateName := nil;
ofn.lCustData := 0;
if GetOpenFileName(ofn) then begin
//т.е. пользователь выбрал файл(ы) и нажал OK
nFilterIndex := ofn.nFilterIndex; // Запоминаем номер текущего фильтра
if length(ofn.lpstrFile) < ofn.nFileOffset then begin
// т.е. пользователь открыл несколько файлов
cf := szFile;
inc(cf, ofn.nFileOffset);
s := 'Вы выбрали НЕСКОЛЬКО файлов в каталоге'#13#10;
s := s + szFile + ''#13#10;
repeat
s := s + cf + #13#10;
inc(cf, length(cf)+1);
until length(cf)=0;
end else begin
// Т.е. пользователь открыл всего один файл
s := 'Вы выбрали всего ОДИН файл: ' + szFile;
end;
end else begin
//либо пользователь нажал Cancel, либо произошла какая-то ошибка
errcode := CommDlgExtendedError;
case errcode of
0: s := 'Вы нажали CANCEL';
else
s := 'Ошибка с кодом ' + IntToStr(errcode);
end;
end;
MessageBox( 0, PChar(s), '', 0);
//Используемая в примере функция CommDlgExtendedError возвращает код ошибки от выполнения самого последнего вызова функции из модуля commdlg.
//Диалоговое окно «Save As», вызывается абсолютно точно так же, как и окно «Open File»,
//только вместо GetOpenFileName вызывается GetSaveFileName.
//Ещё нужно добавить в список флагов флаг OFN_OVERWRITEPROMPT для того, чтобы появлялся запрос на перезапись существующего файла.
Германн (2005-09-26 02:21:00) [5]Сабж навеял мне теплые воспоминания о bpw. Там мне приходилось это делать, но увы уже "навскидку" не помню "в деталях" как! А уж в применении к Д7, тем более.
Но не проще ли в данном случае воспользоваться функциями ShellAPI?