Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ничего не происходит при вызове GetOpenFileName(ofn)


Buggy ©   (2005-07-10 18:08:00) 

uses CommDlg;

var
 ofn: OPENFILENAME;

if GetOpenFileName(ofn) ...

диалог не появляется вообще
по каким причинам это может быть?


alpet   (2005-07-20 15:16:00) [1]

Buggy   (20.07.05 14:40) [14]
1. Без буфера она не работает. Установи lpstrFile в nil и поймешь что к чему.
2. Что-то я не обнаружил у тебя глобальных переменных. Самой функции GetOpenFileNameпо барабану где определен буфер - в стеке, хипе, или секции данных.


Buggy   (2005-07-20 14:40:00) [2]

2alpet
работает и ещё как, даже без буфера :)

пришлось описать вручную функцию и вынести переменные в глобальный var - в локальном почему-то не работает


program mp;

uses
 Windows;

type
 POpenFilenameA = ^TOpenFilenameA;
 POpenFilename = POpenFilenameA;
 tagOFNA = packed record
   lStructSize: DWORD;
   hWndOwner: HWND;
   hInstance: HINST;
   lpstrFilter: PAnsiChar;
   lpstrCustomFilter: PAnsiChar;
   nMaxCustFilter: DWORD;
   nFilterIndex: DWORD;
   lpstrFile: PAnsiChar;
   nMaxFile: DWORD;
   lpstrFileTitle: PAnsiChar;
   nMaxFileTitle: DWORD;
   lpstrInitialDir: PAnsiChar;
   lpstrTitle: PAnsiChar;
   Flags: DWORD;
   nFileOffset: Word;
   nFileExtension: Word;
   lpstrDefExt: PAnsiChar;
   lCustData: LPARAM;
   lpfnHook: function(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): UINT stdcall;
   lpTemplateName: PAnsiChar;
 end;
 TOpenFilenameA = tagOFNA;
 TOpenFilename = TOpenFilenameA;

function GetOpenFileName(var OpenFile: TOpenFilename): Bool; stdcall; external 'comdlg32.dll' name 'GetOpenFileNameA';

var
 ofn      : TOpenFilename;
 szFile   : array [0..1024] of char;
 FileName : string;

begin
 FillChar(ofn, SizeOf(TOpenFileName), 0);
 with ofn do
   begin
     lStructSize := SizeOf(TOpenFileName);
     lpstrFile := szFile;
     nMaxFile := SizeOf(szFile);
   end;
 if GetOpenFileName(ofn) then
   begin
     FileName := szFile;
     // ...
   end;  
end.


alpet   (2005-07-16 13:28:00) [3]

В смысле указатель lpstrFile = 0.
Описание на русском языке:
http://firststeps.ru/mfc/steps/r.php?140


alpet   (2005-07-16 13:26:00) [4]

Buggy   (15.07.05 20:54) [11]
Она не может работать с такой инициацией структуры. Твой код показывает что ты несколько не разобрался с главными переменными структуры tagOFN, и вообще не читал справку. Помогать тебе в переводе мне особенно не хочется - подумай сам хорошенько, куда к примеру функция будет имя файла записывать, если указать на буфер у тебя равен nil (0).


Buggy   (2005-07-15 20:54:00) [5]

И снова проблема :(
почему не работает функция?

program mp;

uses
 CommDlg,
 Windows;

var
 ofn: tagOFN;

begin
 FillChar(ofn,SizeOf(ofn),0);
 ofn.lStructSize := sizeof(ofn);
 if GetOpenFileName(ofn) then
   begin
     // ...
   end;
end.


Buggy   (2005-07-13 22:07:00) [6]

2alpet
Спасибо!
Буду пробовать!!!


alpet   (2005-07-13 10:54:00) [7]

Buggy   (11.07.05 22:50) [8]
Окно (форма) не нужны. Вот кусочек действующей программы:

procedure   ZMem (var obj; sz: dword);
begin
fillchar (obj, sz, 0);
end; // ZMem

var s: string;
   fn: array [0..256] of char;
   ofn: tagOFN;

begin
s := ParamStr (1);
InitComCtrls;
if s = '' then
 begin
  ZMem (ofn, sizeof (ofn)); // fill zerro
  ofn.lStructSize := sizeof (ofn);
  ofn.hInstance := hInstance;
  ofn.lpstrFilter := 'Текстовое описание трейнера'#0'*.ttd'#0#0;
  ofn.lpstrInitialDir := PChar (GetCurrentDir);
  ofn.lpstrTitle := 'Открыть трейнер';
  ofn.Flags := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST;
  ofn.lpstrFile := fn;
  ofn.nMaxFile := 256;
  GetOpenFileName (ofn);
  s := fn;
 end;
if s <> '' then StartEngine (s);
end.


Buggy   (2005-07-11 22:50:00) [8]

2 KERK
OpenFileName.lStructSize := SizeOf(TOpenFileName)-12;
ошибка 6

формы в нет, делаю dll
видимо придётся всё-таки форму создать (невидимую), хоть и не хочется
по крайней мере отсутствие формы - первое, почему перестало работать, а если есть форма все ОК, даже если ofn.hWndOwner и ofn.hInstance равны 0

так без формы ТОЧНО никак?


alpet   (2005-07-11 13:54:00) [9]

Известный компонент TFileOpenDialog поставляется вместе с Delphi, в исходных кодах. Помоему это лучший пример для изучения сабжевой функции.


Kerk   (2005-07-11 13:17:00) [10]

Alex Konshin ©   (11.07.05 11:31) [5]

Ну я уже попытался угадать проблему :))
Видимо мимо :))


Alex Konshin   (2005-07-11 11:31:00) [11]

Сейчас выяснится, что это консольное приложение или сервис.
:)

Вопросы когда научимся задавать?


Buggy   (2005-07-11 11:25:00) [12]

а существование формы обязательно?


Kerk   (2005-07-11 09:35:00) [13]

Надо делать:
 OpenFileName.lStructSize := SizeOf(TOpenFileName)-12;


Гаврила   (2005-07-10 19:46:00) [14]

If the user cancels or closes the Open dialog box or an error occurs, the return value is zero. To get extended error information, call the CommDlgExtendedError function, which can return one of the following values:

CDERR_FINDRESFAILURE CDERR_NOHINSTANCE
CDERR_INITIALIZATION CDERR_NOHOOK
CDERR_LOCKRESFAILURE CDERR_NOTEMPLATE
CDERR_LOADRESFAILURE CDERR_STRUCTSIZE
CDERR_LOADSTRFAILURE FNERR_BUFFERTOOSMALL
CDERR_MEMALLOCFAILURE FNERR_INVALIDFILENAME
CDERR_MEMLOCKFAILURE FNERR_SUBCLASSFAILURE


begin...end   (2005-07-10 18:24:00) [15]

Структура ofn инициализирована?


Наверх

Титульная страница Поиск, карта сайта Написать письмо