Показать сообщение отдельно
  #4  
Старый 26.03.2009, 20:20
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

можно самому, используя WinAPI функции вызвать диалог и работать с его окном:
Код:
uses
  CommDlg;

function DialogHook(Wnd: HWND; Mes: UINT; wParam: WPARAM; lParam: LPARAM): UINT; stdcall;
var
  Style: Integer;
  Window: HWND;
begin
  if Mes = WM_INITDIALOG then
  begin
    if (Win32MajorVersion >= 5) and (Win32Platform = VER_PLATFORM_WIN32_NT) or { Win2k }
    ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and (Win32MajorVersion >= 4) and (Win32MinorVersion >= 90)) then { WinME }
      Window:= GetWindowLong(Wnd, GWL_HWNDPARENT)
    else
      Window:= Wnd;
    Style:= GetWindowLong(Window, GWL_STYLE);
    SetWindowLong(Window, GWL_STYLE, Style and not WS_SYSMENU);
  end;
  Result:= 0;
end;

function OpFile(Form: HWND; Filter, DefExt: string; var Str: string): boolean;
var
  OpenFN: TOpenFilename;
  FileName: array[0..MAX_PATH-1] of Char;
begin
  Result:= false;
  FileName:= '';
  lstrcpy(FileName, pChar(Str));
  FillChar(OpenFN, SizeOf(TOpenFileName), 0);
  with OpenFN do
  begin
    if (Win32MajorVersion >= 5) and (Win32Platform = VER_PLATFORM_WIN32_NT) or { Win2k }
    ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and (Win32MajorVersion >= 4) and (Win32MinorVersion >= 90)) then { WinME }
      lStructSize:= SizeOf(TOpenFilename)
    else
      lStructSize:= SizeOf(TOpenFilename) - (SizeOf(DWORD) shl 1) - SizeOf(Pointer); { subtract size of added fields }
    hwndOwner:= Form;
    lpstrFilter:= pChar(Filter);
    lpstrFile:= FileName;
    nMaxFile:= SizeOf(FileName);
    lpstrDefExt:= pChar(DefExt);
    lpfnHook:= DialogHook;
    flags:= OFN_EXPLORER or OFN_FILEMUSTEXIST or OFN_NOREADONLYRETURN or
      OFN_HIDEREADONLY or OFN_OVERWRITEPROMPT or OFN_ENABLEHOOK;
    FlagsEx:= 0;
  end;
  if GetOpenFileName(OpenFN) then
  begin
    Str:= FileName;
    Result:= true;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  if OpFile(Handle, 'exe files'#0'*.exe'#0'all files'#0'*.*'#0, '', s) then ShowMessage(s);
end;
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием