Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.04.2013, 01:44
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию Не вызывается GetOpenFileNameW

Хочу вызвать винапишный файлдиалог.
но при вызове ничего не происходит.то есть диалог просто не появляется.
код:
Код:
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  
Старый 01.04.2013, 02:36
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Лень разбираться
Код:
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
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 01.04.2013, 09:46
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

>>подскажите где я накосячил?
Код:
GetMem(Buf, SizeOf(PWideChar)); 
Это сколько памяти заказвыается? А потом
Код:
nMaxFile := 128;


Далее
Код:
lStructSize := SizeOf(DWORD);

Это какой размер структуры получается?
Ответить с цитированием
  #4  
Старый 01.04.2013, 17:12
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

angvelem данный способ не подходит. мне нужен именно GetOpenFileNameW так как основная работа будет на компе с русской локалью но файлы имён присутствуют и юникодные
например ддд.txt не откроется...

icWasya а не подскажите как кореектно сделать?
Ответить с цитированием
  #5  
Старый 01.04.2013, 18:07
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Snake22
... данный способ не подходит...
Да ну? А немного подправить нет желания?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:52.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025