Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - *Решено* | Структура OpenFileName на Delphi

Ответить
Настройки темы
Delphi - *Решено* | Структура OpenFileName на Delphi

Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Доброго всем времени суток!
Значит конкретно интересует поле lpstrFilter указанной структуры.
Типа аналогия чисто дельфийскому варианту:
Код: Выделить весь код
OpenDialog1.Filter := 'Executables|*.exe';
Вопрос же заключается в том,как правильно выразить необходимое значение этого поля в условиях Delphi?
К примеру,на MSDN предлагают написать так:
Код: Выделить весь код
ofn.lpstrFilter = "Executables\0*.exe\0";
...но это по-видимому вариант для Си,а мне нужен аналогичный вариант для Delphi.

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 15:08, 14-07-2005

 

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:51, 14-07-2005 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 16:50, 14-07-2005 | #3


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


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

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 18:46, 14-07-2005 | #4


Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ммм... А если я подгружаю строку из ресурса программы? Как же мне поступить?
Использую PChar(переменная из var) допустим для lpstrTitle. А вот как тут как?
Строковый ресурс примерно такой:
Код: Выделить весь код
STRINGTABLE
LANGUAGE LANG_RUSSIAN, 0x1
{
100, 	"One file (*.*)\nTwo file (*.*)"
}
Как в дилагое выбора файла в поле типа можно было выбрать интересующий тип файла? Это все отображается в одну строку. Помогите пожалуйста.

Отправлено: 23:01, 19-08-2007 | #5


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Должно быть что-то в этом роде:
Код: Выделить весь код
"Executables",0,"*.exe",0,"DLLs",0,"*.dll",0,0
Либо на Дельфях:
Код: Выделить весь код
'Executables'#0'*.exe'#0'DLLs'#0'*.dll'#0#0
Буфер,на который указавает lpstrFilter,характеризуется парами строк.
Каждая пара означает определённый фильтр.
Каждая строка в буфере должна заканчиваться нулём.
После последней строки идёт двойной нуль.

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 11:48, 20-08-2007 | #6


Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


Попробовал создать ресурс так:
Код: Выделить весь код
 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))
.....

Последний раз редактировалось Maksim V, 21-08-2007 в 00:52.


Отправлено: 13:54, 20-08-2007 | #7


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


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

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 02:00, 21-08-2007 | #8


Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:48, 21-08-2007 | #9


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Цитата 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 так сказано).

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 20:20, 21-08-2007 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - *Решено* | Структура OpenFileName на Delphi

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
HDD - [решено] Структура файловой системы на диске повреждена и непригодна.. В чём проблема? Vista rodnoy Накопители (SSD, HDD, USB Flash) 4 01-09-2008 23:58
Ошибка - [решено] Проблема с системным диском: "Структура диска повреждена. Чтение невозможно" Kashevaroff Microsoft Windows 2000/XP 12 16-12-2007 18:11
[решено] Структура данных для JavaScript Coutty Вебмастеру 7 11-08-2007 17:30
Структура трафика BanzayDima Хочу все знать 4 03-04-2005 20:54
структура бд в MySQL Dutchman Mihel Вебмастеру 10 09-09-2004 13:17




 
Переход