Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   *Решено* | Структура OpenFileName на Delphi (http://forum.oszone.net/showthread.php?t=51666)

DillerInc 14-07-2005 15:08 340966

*Решено* | Структура OpenFileName на Delphi
 
Доброго всем времени суток!
Значит конкретно интересует поле lpstrFilter указанной структуры.
Типа аналогия чисто дельфийскому варианту:
Код:

OpenDialog1.Filter := 'Executables|*.exe';
Вопрос же заключается в том,как правильно выразить необходимое значение этого поля в условиях Delphi?
К примеру,на MSDN предлагают написать так:
Код:

ofn.lpstrFilter = "Executables\0*.exe\0";
...но это по-видимому вариант для Си,а мне нужен аналогичный вариант для Delphi.

hasherfrog 14-07-2005 15:51 340983

ЕМНИП есть такое: Chr(0)
Т.е. ofn.lpstrFilter = "Executables" + chr(0) + "*.exe";

Savant 14-07-2005 16:50 341009

ИМХО:
1) вместо Chr(number), где number - некоторая целая константа, удобнее использовать конструкцию #number , хотя бы потому, что она не требует знака сложения до/после и высчитывается на этапе компиляции.
2) т.к. lpstrFilter указывает на пары нуль-терминантных строк, то оканчиваться должен двумя нулями.
итог: ofn.lpstrFilter := 'Executables'#0'*.exe'#0#0;

DillerInc 14-07-2005 18:46 341036

Savant
Цитата:

итог: ofn.lpstrFilter := 'Executables'#0'*.exe'#0#0;
...ну,наконец-то,заработало как надо :biggrin: .
В очередной раз говорю тебе : "Спасибо!" :) .

Maksim V 19-08-2007 23:01 629898

Ммм... А если я подгружаю строку из ресурса программы? Как же мне поступить?
Использую PChar(переменная из var) допустим для lpstrTitle. А вот как тут как?
Строковый ресурс примерно такой:
Код:

STRINGTABLE
LANGUAGE LANG_RUSSIAN, 0x1
{
100,        "One file (*.*)\nTwo file (*.*)"
}

Как в дилагое выбора файла в поле типа можно было выбрать интересующий тип файла? Это все отображается в одну строку. Помогите пожалуйста.

DillerInc 20-08-2007 11:48 630106

Должно быть что-то в этом роде:
Код:

"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 630193

Попробовал создать ресурс так:
Код:

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 630540

Maksim V
А можно спросить: Зачем так извращаться??
Почему нельзя параметры фильтра настроить по-человечески, т.е. во время заполнения структуры в самой программе??

Maksim V 21-08-2007 11:48 630663

Эээ... Это как так? Можно пример?

DillerInc 21-08-2007 20:20 630929

Цитата:

Цитата Maksim V
Можно пример?

...например,так:
Код:

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 630950

Ну вы видимо мня не поняли. Мне надо просто было брать типы файлов для фильтра из строковой таблицы в ресурсах. А вы опять привели пример фильтра, когда типы файлов указаны в самом коде. Согласитесь не очень удобно будет локализовывать приложение - заново перекомпилировать. А тут через любой редактор ресурсов подправил и никаких проблем. :)


Время: 19:27.

Время: 19:27.
© OSzone.net 2001-