Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.043 c
1-1182243710
DrAndrew
2007-06-19 13:01
2007.08.26
Ошибка #10061 у IdHTTP1. Как исправить?


15-1185295412
Sergey Masloff
2007-07-24 20:43
2007.08.26
Nokia 6510 самый лучший телефон ;-)


2-1186105128
Glivera
2007-08-03 05:38
2007.08.26
TaskBar


2-1186090859
Rumin
2007-08-03 01:40
2007.08.26
как записать clienttoscreen как api функцию


2-1186141366
ambhtr
2007-08-03 15:42
2007.08.26
Нужно составить запрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский