![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Хочу вызвать винапишный файлдиалог.
но при вызове ничего не происходит.то есть диалог просто не появляется. код: Код:
uses commdlg;
...
procedure TfrmAdd.TntButton2Click(Sender: TObject);
var OFNW : TOpenFilenameW;
Buf : PWideChar;
begin
GetMem(Buf, SizeOf(PWideChar));
buf:='';
with OFNW do
begin
lStructSize := SizeOf(DWORD);
hWndOwner := hinstance;
lpstrfilter := 'Executable files (*.exe)' + #0 + '*.exe' + #0;
lpstrCustomFilter := 'All files (*.*)' + #0 + '*.*' + #0#0;
nMaxCustFilter := 255;
nFilterIndex := 1;
lpstrFile := Buf;
nMaxFile := 128;
lpstrFileTitle := 'test';
nMaxFileTitle:=128;
lpstrInitialDir := 'c:\';
lpstrTitle := 'Open File';
Flags := OFN_FileMustExist + OFN_PathMustExist + OFN_FORCESHOWHIDDEN;
end;
GetOpenFileNameW(ofnw); //при выполнении в этой строчке ничего не происходит. диалог не появляется
end;
|
|
#2
|
||||
|
||||
|
Лень разбираться
Код:
type
TFileName = type String;
TOpenDialog = Object
Parent : HWND;
FileName : TFileName;
Filter : String;
DefaultExt : String;
Title : String;
InitialDir : String;
function Execute : Boolean;
end;
var
OD : TOpenDialog;
...
function TOpenDialog.Execute : Boolean;
var
szFile : array[0..MAX_PATH - 1] of Char;
OFN : TOpenFileName;
TempFilter : String;
function ExtractLine(const S : String) : String;
var
P : String;
I : Integer;
begin
for I := 1 to Length(S) do
if S[i] = '|' then
P := P + #0
else
P := P + S[i];
Result := P + #0;
end;
begin
FillChar(OFN, SizeOf(OFN), 0);
FillChar(szFile, SizeOf(szFile), 0);
OFN.lStructSize := SizeOf(TOpenFilename);
OFN.hwndOwner := Parent;
OFN.hInstance := hInstance;
OFN.lpstrTitle := PChar(Title);
TempFilter := ExtractLine(Filter);
OFN.lpstrFilter := PChar(TempFilter);
OFN.lpstrFile := szFile;
OFN.Flags := OFN_EXPLORER or OFN_PATHMUSTEXIST or OFN_HIDEREADONLY or OFN_FILEMUSTEXIST or OFN_ENABLEHOOK or OFN_ENABLESIZING;
OFN.nMaxFile := MAX_PATH;
if (InitialDir = '') then
OFN.lpstrInitialDir := '.'
else
OFN.lpstrInitialDir := PChar(InitialDir);
Result := GetOpenFileName(OFN);
if Result then
FileName := szFile;
end;
...
OD.Parent := Wnd;
OD.Title := 'Выберите файл';
OD.Filter := 'Поддерживаемые форматы (*.png;*.jpg;*.tif;*.gif;*.bmp)|*.bmp;*.jpg;*.jpeg;*.jpe;*.tif;*.tiff;*.png;*.gif|' +
'Portable network graphics (*.png)|*.png|' +
'JPEG Image File (*.jpg)|*.jpg;*.jpeg;*.jpe|' +
'Tagged Image File Format (*.tif|*.tif;*.tiff|' +
'CompuServe GIF Image (*.gif)|*.gif|' +
'Bitmaps (*.bmp)|*.bmp';
OD.DefaultExt := '*.*';
...
if OD.Execute then |
|
#3
|
|||
|
|||
|
angvelem данный способ не подходит. мне нужен именно GetOpenFileNameW так как основная работа будет на компе с русской локалью но файлы имён присутствуют и юникодные
например ддд.txt не откроется... icWasya а не подскажите как кореектно сделать? |
|
#4
|
||||
|
||||
|
Цитата:
|
|
#5
|
|||
|
|||
|
>>подскажите где я накосячил?
Код:
GetMem(Buf, SizeOf(PWideChar)); Код:
nMaxFile := 128; Далее Код:
lStructSize := SizeOf(DWORD); Это какой размер структуры получается? |