Показать полную графическую версию : *Решено* | Структура OpenFileName на Delphi
DillerInc
14-07-2005, 15:08
Доброго всем времени суток!
Значит конкретно интересует поле lpstrFilter указанной структуры.
Типа аналогия чисто дельфийскому варианту:
OpenDialog1.Filter := 'Executables|*.exe';
Вопрос же заключается в том,как правильно выразить необходимое значение этого поля в условиях Delphi?
К примеру,на MSDN предлагают написать так:
ofn.lpstrFilter = "Executables\0*.exe\0";
...но это по-видимому вариант для Си,а мне нужен аналогичный вариант для Delphi.
hasherfrog
14-07-2005, 15:51
ЕМНИП есть такое: Chr(0)
Т.е. ofn.lpstrFilter = "Executables" + chr(0) + "*.exe";
ИМХО:
1) вместо Chr(number), где number - некоторая целая константа, удобнее использовать конструкцию #number , хотя бы потому, что она не требует знака сложения до/после и высчитывается на этапе компиляции.
2) т.к. lpstrFilter указывает на пары нуль-терминантных строк, то оканчиваться должен двумя нулями.
итог: ofn.lpstrFilter := 'Executables'#0'*.exe'#0#0;
DillerInc
14-07-2005, 18:46
Savant
итог: ofn.lpstrFilter := 'Executables'#0'*.exe'#0#0;
...ну,наконец-то,заработало как надо :biggrin: .
В очередной раз говорю тебе : "Спасибо!" :) .
Maksim V
19-08-2007, 23:01
Ммм... А если я подгружаю строку из ресурса программы? Как же мне поступить?
Использую PChar(переменная из var) допустим для lpstrTitle. А вот как тут как?
Строковый ресурс примерно такой:
STRINGTABLE
LANGUAGE LANG_RUSSIAN, 0x1
{
100, "One file (*.*)\nTwo file (*.*)"
}
Как в дилагое выбора файла в поле типа можно было выбрать интересующий тип файла? Это все отображается в одну строку. Помогите пожалуйста.
DillerInc
20-08-2007, 11:48
Должно быть что-то в этом роде:
"Executables",0,"*.exe",0,"DLLs",0,"*.dll",0,0
Либо на Дельфях:
'Executables'#0'*.exe'#0'DLLs'#0'*.dll'#0#0
Буфер,на который указавает lpstrFilter,характеризуется парами строк.
Каждая пара означает определённый фильтр.
Каждая строка в буфере должна заканчиваться нулём.
После последней строки идёт двойной нуль.
Maksim V
20-08-2007, 13:54
Попробовал создать ресурс так:
STRINGTABLE
LANGUAGE LANG_RUSSIAN, 0x1
{
1653, "1653, "Исполняемый файл (*.exe)|*.exe|Динамическая библиотека (*.dll)|*.dll||"
}
Затем выполнил замену строк:
.....
function CharReplace(const Source: string; oldChar, newChar: Char): string;
var
i: Integer;
begin
Result := Source;
for i := 1 to Length(Result) do
if Result[i] = oldChar then
Result[i] := newChar
.....
lpstrFilter := PChar(CharReplace(Номер строки, '|', #0))
.....
DillerInc
21-08-2007, 02:00
Maksim V
А можно спросить: Зачем так извращаться??
Почему нельзя параметры фильтра настроить по-человечески, т.е. во время заполнения структуры в самой программе??
Maksim V
21-08-2007, 11:48
Эээ... Это как так? Можно пример?
DillerInc
21-08-2007, 20:20
Можно пример?
...например,так:
var
OpenDlgBox:TOpenFileName;
pathFile : array [0..260] of Char = '';
nameFile : array [0..260] of Char = '';
...
{ Заполняем структуру OpenDlgBox класса TOpenFileName }
OpenDlgBox.lStructSize := SizeOf(OpenDlgBox);
OpenDlgBox.lpstrFilter := 'Text Files'#0'*.txt'#0'Bitmap Files'#0'*.bmp'#0#0;
OpenDlgBox.lpstrCustomFilter := NIL;
OpenDlgBox.lpstrFile := pathFile;
OpenDlgBox.nMaxFile := SizeOf(pathFile);
OpenDlgBox.lpstrFileTitle := nameFile;
OpenDlgBox.nMaxFileTitle := SizeOf(nameFile);
OpenDlgBox.lpstrInitialDir := 'C:\Program Files\';
OpenDlgBox.Flags := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST;
begin
GetOpenFileName(OpenDlgBox);
end;
...кстати,пример,где используется двойной фильтр.Массивы для пути и имени идут у меня как глобальные переменные,поэтому их можно инициализировать(в данном случае это будет нуль).
Кстати,если эти массивы не забить нулями(например,когда массивы находятся в процедуре как локальные переменные),то могут возникнуть глюки с вызовом функции GetOpenFileName.
Просто дело в том,что в начало массива pathFile,например,можно поместить строку с названием файла.Тогда это название будет отображено в поле Edit диалога открытия файла.Если же там будет какой-то бред в начале,то тогда будут и баги.
А вообще я это ещё не проверял,но скорее всего так оно и есть(на MSDN так сказано).
Maksim V
21-08-2007, 21:07
Ну вы видимо мня не поняли. Мне надо просто было брать типы файлов для фильтра из строковой таблицы в ресурсах. А вы опять привели пример фильтра, когда типы файлов указаны в самом коде. Согласитесь не очень удобно будет локализовывать приложение - заново перекомпилировать. А тут через любой редактор ресурсов подправил и никаких проблем. :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC