Форум: "Основная";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];
ВнизTDialodи Найти похожие ветки
← →
ShowMessage(OpDlg.FileName) (2007-06-13 01:51) [0]А нельзя ли как нибудь более простым способом
получить доступ к значению в поле имени файла
диалога, в то время когда он открыт?
Собственно и нужно менять расширение в имени файла
при смене типа файлов.
Пытался разобрать вот этот пример
http://delphiworld.narod.ru/base/autochg_ext.html
но ничего не получилось, да и он копипастом не работает
должным образом.
Также во время работы диалога его свойство FileName работает
почти в режиме только чтение, тоесть если сделать так:
procedure TFJCrossFase.OpDlgTypeChange(Sender: TObject);
begin
OpenDialog.FileName := "12345678";
ShowMessage(OpenDialog.FileName);
end;
Он один фик покажет выбранное имя файла, или по крайней мере
не 12345678
← →
Германн © (2007-06-13 02:04) [1]
> ShowMessage(OpDlg.FileName) (13.06.07 01:51)
> Он один фик покажет выбранное имя файла, или по крайней
> мере
> не 12345678
>
А он (TOpenDialog) и не предназначен для подобных манипуляций.
← →
ShowMessage(OpDlg.FileName) (2007-06-13 02:58) [2]Германн © (13.06.07 02:04) [1]
> А он (TOpenDialog) и не предназначен для подобных манипуляций.
Да это понятно, что не преднозначен.
Проблема такакя. Есть например два типа файлов 1 - *.111 и 2 - *.222
При открытом диалоге выбора файла в типах стоит первый тип, юзер выделяет в окне файл, например rrrrr.111. В строку имени файла заноситься
rrrrr.111 и тут он меняет тип файлов на второй и жмет открыть. И прога открывает rrrrr.111 а по смыслу проги должна открыть rrrrr.222
Как бы эту штуку побороть самым простым способом?
Я хотел на событие OnTypeChange Диалога Делать нечто такое
procedure TFJCrossFase.OpenDialogTypeChange(Sender: TObject);
begin
{Здесь выствить DefExt и диалога}
OpenDialog.FileName := ExtractFileName(ChangeFileExt(OpenDialog.FileName, OpenDialog.DefaultExt));
// SendMessage(GetParent(OpenDialog.Handle), WM_USER + 101, SizeOf(Path), Integer(@Path));
// ShowMessage(StrPas(Path)); так можно получить оттуда текст
end;
PS В каталоге выбора есть rrrrr.111 и rrrrr.222
В свойствах системы убрана галка скрывать расширения зарег файлов.
← →
zorik © (2007-06-13 10:24) [3]Может я неправильно понял, но можно типа так:
with OpenDialog do
if Execute then
begin
FN := FileName;
case FilterIndex of
0: FN := ChangeFileExt(FN, ".111");
1: FN := ChangeFileExt(FN, ".222");
end;
ShowMessage(FN);
end;
а почему меняеш на DefaultExt? По умолчанию у тебя как я понял 111, а надо 222
← →
ShowMessage(OpDlg.FileName) (2007-06-13 13:35) [4]> zorik © (13.06.07 10:24) [3]
> Может я неправильно понял, но можно типа так:
Не совсем правильно.
Обрати внимание где у меня происходит смена расширения.
В обработчике ОпенДиалога OnTypeChange. А там уже просто не добраться
до имени файла OpenDialog.FileName то есть его изменить не так просто)
> а почему меняеш на DefaultExt? По умолчанию у тебя как я
> понял 111, а надо 222
Еще раз внимательно см [2]. Только уточню:
> юзер выделяет в окне файл, например rrrrr.111.
выделяет, но не закрывает диалог.
← →
zorik © (2007-06-13 14:59) [5]А дальше что с 111 или 222? файл открыватся не будет? или это типа как предварительный просмотр должно работать, чтоб сразу при выделении считывать нечто из нужного файла?
← →
Serega_61 (2007-06-13 21:56) [6]Нет, он должен открыть нужный файл. допустим в файле
rrrrr.111 содержится строка "файл rrrrr.111."
а в файлей
rrrrr.222 содержится строка "файл rrrrr.222".
Мы выделяем файл с расширением *.111 (в это время файл *.222 не виден, из за фильтра). меняем внизу филтр на *.222 (файл с расширеним *.111 исчезает, но имя в строке остается!!!) виден только rrrrr.222.
Жмем открыть, открывает файл rrrrr.111. хотя его даже не было видно в диалоге выбор( т.к. мы сменили фильтр). Вот мы и думаем, как можно во время РАБОТЫ диалогового окна обнулить(хотя бы) переменную с именем файла. Или лучше даже заменить расширение...
← →
antonn © (2007-06-13 22:26) [7]короче говоря, при смене расширения в диалоге в комбобоксе, имя уже выбранного ранее файла не исчезает. Решение - проверять тип файла после нажатия кнопки "открыть" - extractfileext() и пройтись в цикле по фильтру опендиалога. В какой фильтре встечается - той процедурой его и обрабатывать.
В диалоге выбор типа - это только для удобства пользователя.
← →
Servelat © (2007-06-14 01:06) [8]Полностью согласен с [7].
Как пользователь, не могу не ответить что все из [2] это излишне и нафик никому не нужно, потому как я привык к стандартному поведению. В случае
> Мы выделяем файл с расширением
> ...
> меняем внизу филтр
следует открывать файл rrrrr.111, так как именно он и был выбран пользователем. Сменить фильтр я (как пользователь) мог, скажем, случайно, желая посмотреть, какие еще типы файлов данная программа поддерживает. При этом, если имя введенного файла вдруг пропадет, я, как пользователь, сильно обижусь, так как чтобы вернуть назад выделенный мной файл, мне надо снова переключить фильтр (а для этого вспомнить, под какой фильтр подходил выбранный файл) и выделить файл.
В общем, мое имхо - оставить стандартное поведение и не заморачиваться, а тип файла определять по расширению его имени, а не по выбранному фильтру в момент закрытия диалога.
← →
ShowMessage(OpDlg.FileName) (2007-06-14 03:51) [9]В общем согласен и с [7] и с [8] но, есть такая изиминка, она и туда и сюда
проситься. В итоге пересмотрел пример по ссылке переделал его в "корень"
и сделал желаемый результат. Оно вроде как нормально получилось :)
Так как на всех не угодишь. Это уж точно :) Спасибо за ответы.
Вариант анализировать расширение после закрытия я так же рассамтривал,
но данный способ получился вроде бы проще. Там в примере много лишнего:)
Может быть у меня не так универсально получилось, но все же.
← →
Германн © (2007-06-14 04:28) [10]
> ShowMessage(OpDlg.FileName) (14.06.07 03:51) [9]
>
> В общем согласен и с [7] и с [8] но, есть такая изиминка,
> она и туда и сюда
> проситься. В итоге пересмотрел пример по ссылке переделал
> его в "корень"
> и сделал желаемый результат. Оно вроде как нормально получилось
> :)
> Так как на всех не угодишь. Это уж точно :) Спасибо за ответы.
>
> Вариант анализировать расширение после закрытия я так же
> рассамтривал,
> но данный способ получился вроде бы проще. Там в примере
> много лишнего:)
> Может быть у меня не так универсально получилось, но все
> же.
>
Хорошим тоном было бы приведение решения сабжа, is"nt it?
:)
← →
ShowMessage(OpDlg.FileName) (2007-06-14 14:48) [11]Германн © (14.06.07 04:28) [10]
Я сделал так:const
ExtR: array [1..3] of string[4]=("", ".112", ".222");
ExtD: array [1..3] of string[4]=("", ".221", ".222");
function dHook(const HWn: THandle; ExtInd: Longint): Longbool; stdcall;
var
ss: ShortString;
SFlNm: AnsiString;
begin
Byte(ss[0]):=GetClassName(HWn, @ss[1], 255);
if ss="Edit" then begin
Byte(ss[0]):=GetWindowText(HWn, @ss[1], 255);
ss:=Trim(ss);
if ss="" then begin
Result:=True; Exit;
end;
if ExtInd=1 then SFlNm:="" else
if Form.OpenDialog.Tag=0 then SFlNm:=ChangeFileExt(ss, ExtD[ExtInd])
else SFlNm:=ChangeFileExt(ss, ExtR[ExtInd]);
SetWindowText(HWn, PChar(SFlNm));
Result:=False;
end else Result:=True;
end;
procedure TForm.OpenDialogTypeChange(Sender: TObject);
begin
if OpenDialog.Tag=0 then OpenDialog.DefaultExt:=ExtD[OpDlg.FilterIndex]
else OpenDialog.DefaultExt:=ExtR[OpDlg.FilterIndex];
EnumChildWindows(GetParent(OpenDialog.Handle), @dHook, OpenDialog.FilterIndex);
end;
И я вижу некоторые "не верные" моменты в моем коде, точнее вместо
передавания OpenDialog.FilterIndex лучше что нибудь типа записи как в
примере, куда и записывать такой параметр как OpenDialog.Tag который
потом "некрасиво так" используется в dHook.
Пояснять нужно что нибудь?
PS а что значит is"nt it ?
← →
ShowMessage(OpDlg.FileName) (2007-06-14 14:55) [12]В диалоге в разных ситуациях могут быть два вида типа файлов
первый:
Оба - (*.112, *.222)
первый - *.112
второй - *.222
второй:
Оба - (*.221, *.222)
первый - *.221
второй - *.222
Да, решение [11] получилось не универсальное, но под конкретную "мою" задачу подошло :)
← →
Германн © (2007-06-14 15:27) [13]
> PS а что значит is"nt it ?
Очепятка. Следует читать как isn"t it.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.042 c