Delphi opendialog initialdir не работает
OpenDialog просто не берет значение InitialDir, но зато упорно берет последний открытый каталог из реестра, куда я его даже и не собирался записывать! Не помню, с какого момента это перестало работать, очень может быть, что когда я перешел с Win98 на Win2k. Теперь даже на пустой форме положенный OpenDialog без какого-либо особого кода упорно и без моего спроса пишет свой InitialDir в реестр! И не хочет открывать тот каталог, который я ему указываю перед OpenDialog.Execute. Вот пример ключей реестра для файлов .rar, куда пишуться последние директории:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSaveMRU\*
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSaveMRU\rar
HKEY_USERS\S-1-5-21-1229272821-1682526488-854245398-1000\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSaveMRU\*
HKEY_USERS\S-1-5-21-1229272821-1682526488-854245398-1000\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSaveMRU\rar
Почему все это так происходит и как это отключить? Мне не надо, чтобы что-то без моего разрешения писалось в реестр и чтобы InitialDir принимал мое значение, а не из реестра! Спасибо.
← →
Aleks1 ( 2002-03-06 03:25 ) [1]
У TOpenDialog есть два свойства (параметра) — «InitialDir» и «FileName». «InitialDir» работатает только тогда ,когда «FileName» не содержит «Путь», то бишь каталог. Пример — FileName:=»*.exe». В противном случае (FileName — C:\myfile.exe) каталог для TOpenDialog устанавливается в каталог, который прописан в «FileName», т.е C:\.
← →
lipskiy ( 2002-03-06 11:51 ) [2]
Но я вообще не инициализирую FileName! Первый запуск программы — это свойство пустое. Но каждый следующий запуск программы (ничего никуда не сохраняю, никаких путей ни в какие инишки) — и открывается именно тот каталог, который был выбран в прошлом сеансе работы — берется из реестра! Пишется туда сам. Причем проверил уже точно — это только под Win2k, под Win98 все ок.
Источник
Delphi opendialog initialdir не работает
Как InitialDir в OpenDialog выставить в «My Computer»?
← →
DesWind © ( 2004-10-27 10:18 ) [1]
Может попробывать поставить псевдоним?
← →
Gero © ( 2004-10-27 10:22 ) [2]
← →
wild_arg © ( 2004-10-27 10:25 ) [3]
2Gero: пробовал.
2DesWind: в смысле?
← →
TUser © ( 2004-10-27 10:27 ) [4]
Три точки («. «) — по крайней мере под ХР. Но вроде бы, эти обозначения не одинаковы в разных системах
Короче, попробуй одну, две и т.д. точки под разнами ОС, а в программе сделай проверку.
← →
Gero © ( 2004-10-27 10:35 ) [6]
> Три точки («. «) — по крайней мере под ХР
У меня вот XP и нифига.
Открывает «Мои документы».
Если писать C:\.. открывает C:\
← →
Gero © ( 2004-10-27 10:35 ) [7]
Вобще, интересный вопрос.
← →
wild_arg © ( 2004-10-27 10:42 ) [8]
2TUser: к сожалению — нифига.
🙂 дошел до 16 точек, но после трех — это уже однозначно C:\
← →
Плохиш © ( 2004-10-27 10:44 ) [9]
Первая же ссылка!
Хм, забавно
procedure TForm1.Button1Click(Sender: TObject);
begin
shellexecute(0,»open»,». «,nil,nil,sw_shownormal);
opendialog1.InitialDir:=». «;
opendialog1.execute;
end;
В коммандной строке три точки однозначно воспринимаются, как Мой компьютер. А OD никак на три точки не реагирует. Он вообще точки по-другому воспринимает — не как винда. Одна точка — Projects, две — Delphi7, три — последняя открывавшаяся папка
← →
TUser © ( 2004-10-27 10:52 ) [11]
Хотя, почему не так — файл-то сам в Projects
← →
TUser © ( 2004-10-27 10:53 ) [12]
> дошел до 16 точек, но после трех — это уже однозначно C:\
Одна и две точки — своя папка, и предыдущая, дальше — умолчание
← →
DesWind © ( 2004-10-27 10:55 ) [13]
← →
DesWind © ( 2004-10-27 10:59 ) [14]
А есть еще апишная функция для получения разных системных путей по идентификатору CSIDL SHGetSpecialFolderPath
Да. Чукча — не читатель, чукча — писатель (c) известный анекдот
PS. А третья ссылка вообще на известном здесь многим языке
← →
Johnmen © ( 2004-10-27 11:17 ) [16]
>Плохиш © (27.10.04 11:00)
Глубоко ковырять лень, но всё это не работает для Моего компьютера. Да в коде есть неточность.
← →
Плохиш © ( 2004-10-27 11:29 ) [17]
> Johnmen © (27.10.04 11:17) [16]
Да я там и не проверял ничего, просто сделал работу за автора по поиску. А про 16 точек мне тут очень понравилось 🙂
← →
wild_arg © ( 2004-10-27 11:56 ) [18]
2Плохиш: thank»s, но, блин, правда для «моего_компутера» не работает че-то, зато некоторые другие вещи открывает.
← →
Плохиш © ( 2004-10-27 12:03 ) [19]
Мда, а нету у «My computer» никакой папки, о чём и говорит функция SHGetPathFromIDList. Word кстати заменяет «My computer» в настройках на стандартную папку с документами.
← →
Johnmen © ( 2004-10-27 12:08 ) [20]
Откажись от опендиалога в пользу ShellTreeView. И будешь вполне счастлив. )
← →
ssk © ( 2004-10-27 12:15 ) [21]
может лучше сделать свой ОпенДиалог?
← →
wild_arg © ( 2004-10-27 12:21 ) [22]
сия мысль меня уже посещала — видимо предстоит ей отдаться
← →
GuAV © ( 2004-10-27 13:47 ) [23]
Источник
Delphi opendialog initialdir не работает
Всем доброго дня. Диалог после открытия выбранного файла при повторном вызове диалога не меняет путь.
← →
Palladin © ( 2006-10-12 09:11 ) [1]
Это константация факта?
а если повод для беспокойства, то, телепатор подсказывает, ofNoChangeDir в True выставленно
← →
Unknone © ( 2006-10-12 09:13 ) [2]
Мне надо чтобы путь менялся, ofNoChangeDir в True ставил, все равно путь при повторном вызове не меняется
← →
Palladin © ( 2006-10-12 09:14 ) [3]
А зачем ты его в True ставил? Или ты не осознаешь что делаешь?
← →
Unknone © ( 2006-10-12 09:16 ) [4]
Я его и в True ставил и в False, никакой разницы
Не обманывай. False — работает как надо.
Hint: Если в диалоге нажать «Отмена»/Cancel, то путь не сменится.
← →
Unknone © ( 2006-10-12 09:24 ) [6]
Я не знаю как у кого но у меня так.
OpenDialog1.InitialDir:=. указывается папка
OpenDialog1.Title:=. указывается заголовок
if OpenDialog1.Execute then
begin
if OpenDialog1.FileName<>«» then
begin
Mes:=MessageBox(handle,pchar(«Îòêðûòü âûáðàííûé ôàéë?»),pchar(«ÌÏÏ»),36);
if Mes=IDYES then
begin
path_to_base:=OpenDialog1.FileName;
ShellExecute(handle,nil,pchar(path_to_base),»»,»»,SW_SHOWNORMAL);
end;
Этот кусок вызывается несколько раз, при этом меняется путь.
При первом вызове нормально открывает папку, если не открывать файл, то при повторном вызове папка меняетется. Если файл открывается то при повтормом вызове диалога остается директория предидущего вызова.
← →
Palladin © ( 2006-10-12 09:27 ) [7]
> OpenDialog1.InitialDir:=. указывается папка
ну и что ты хочешь? ты же все время жестко одну и туже начальную папку указываешь. с какой стати он (диалог) будет открываться в другой?
← →
Unknone © ( 2006-10-12 09:31 ) [8]
Путь при каждом вызове меняется. Я же написал что если не открывать файл все нормально, глюки со сменой пути появляются после открытия файла.
← →
Elen © ( 2006-10-12 09:56 ) [9]
> Unknone
попробуй замени OpenDialog1.InitialDir:=. указывается папка на OpenDialog1.FileName:=»c:\temp\*»;
> Unknone
поправочка — OpenDialog1.FileName:=»c:\temp\*»; следует читать как
OpenDialog1.FileName:=«указывается папка»+«\*»;
← →
Unknone © ( 2006-10-12 10:00 ) [11]
> Elen
Все равно директория не меняется
← →
Elen © ( 2006-10-12 10:05 ) [12]
> Unknone
еще раз подробнее проблему : тебе нужно чтоб OpenDialog открывал всегда в одном и том же месте или что?
← →
Unknone © ( 2006-10-12 10:09 ) [13]
В общем так. Есть несколько папок, в каждой из них лежат файлы. Есть несколько пунктов меню, которые вызывают диалог. Если просто вызывать диалог, не открывая файлов, директории менются правильно. Если открыть файл, то при следующем вызове диалога остается директория предидущего вызова.
← →
Unknone © ( 2006-10-12 10:11 ) [14]
Директории меняются в зависимости от выбранного пункта меню.
> Unknone
протестируй это у меня работает :
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.FileName:=»c:\temp\*»;
if OpenDialog1.Execute then
begin
if OpenDialog1.FileName<>«» then
begin
if MessageBox(handle,pchar(«fdf»),pchar(«sfsd»),36)=IDYES then
begin
ShellExecute(handle,nil,pchar(OpenDialog1.FileName),»»,»»,SW_SHOWNORMAL);
end;
end;
end;
Это все время открывает папку temp
← →
Unknone © ( 2006-10-12 10:26 ) [16]
Мне надо чтобы все время открывались разные папки, в зависимости от выбранного пункта меню.
← →
Elen © ( 2006-10-12 10:35 ) [17]
> Unknone
Составь меню из путей в капшинах и на каждый MenuItem задай обработчик :
procedure TForm1.c1Click(Sender: TObject);
begin
OpenDialog1.FileName:=tmenuitem(sender).Caption;
OpenDialog1.Execute
end;
В меню выставь autohotkeys:=mamanual и попробуй
← →
Elen © ( 2006-10-12 10:37 ) [18]
> Unknone
Кстати путь должен венчаться символом *
← →
Плохиш © ( 2006-10-12 11:02 ) [19]
> Unknone © (12.10.06 10:26) [16]
У тебя ошибка в 17й строке.
← →
Игорь Шевченко © ( 2006-10-12 11:31 ) [20]
Elen © (12.10.06 10:13) [15]
У меня небольшая просьба — давай ты слегка матчасть подучишь, все-таки начинающих сразу пугать не надо.
← →
Elen © ( 2006-10-12 11:39 ) [21]
← →
ЮЮ © ( 2006-10-12 11:45 ) [22]
OpenDialog1.InitialDir:=. указывается папка
Это убрать, или поставить в FormCreate лишт для первоначальной инициализации
OpenDialog1.Title:=. указывается заголовок
if OpenDialog1.Execute then
begin
OpenDialog1.InitialDir:= ExtractFileDir(OpenDialog1.FileName); // это добавить
← →
Unknone © ( 2006-10-12 14:56 ) [23]
← →
MsGuns © ( 2006-10-12 15:02 ) [24]
← →
Unknone © ( 2006-10-12 15:05 ) [25]
Боюсь это тоже не поможет, более действенный совет есть?
← →
Unknone © ( 2006-10-12 15:16 ) [26]
Директория не меняется только после того, как был открыт файл, если файл не открывать директория меняется нормально!
← →
MsGuns © ( 2006-10-12 15:21 ) [27]
>Unknone © (12.10.06 15:05) [25]
>Боюсь это тоже не поможет, более действенный совет есть?
Есть. И он до неприличности банален. Внимательно прочитать справку для диалога и поискать ошибку в коде. Например в том месте, где узер все-таки удосужился выбрать файл.
← →
Unknone © ( 2006-10-12 15:31 ) [28]
> Есть. И он до неприличности банален. Внимательно прочитать
> справку для диалога и поискать ошибку в коде. Например в
> том месте, где узер все-таки удосужился выбрать файл.
Я уже третий день смотрю, но так ничего и не усмотрел.
← →
MsGuns © ( 2006-10-12 15:40 ) [29]
>Я уже третий день смотрю, но так ничего и не усмотрел.
← →
Elen © ( 2006-10-12 15:47 ) [30]
> MsGuns
Объясни почему при выполнении несколько раз этого кода
OpenDialog1.InitialDir :=»c:\temp»;
OpenDialog1.Execute
Директории открываются там где остановились последний раз?
Проведи ликБез
← →
MsGuns © ( 2006-10-12 16:03 ) [31]
>Elen © (12.10.06 15:47) [30]
>Объясни почему при выполнении несколько раз этого кода ..
>Директории открываются там где остановились последний раз?
>Проведи ликБез
Ну хотя бы потому, что такого каталога просто нет, а юзер все-таки выбрал в предыдущем диалоге один из существующих.
← →
Elen © ( 2006-10-12 16:10 ) [32]
> Ну хотя бы потому, что такого каталога просто нет
Такой каталог есть. И при первом запуске он с него стартует А при последующих нет и NoChangeDir не влияет. Только изменение каталога в FileName до Execute помогает.
← →
Плохиш © ( 2006-10-12 16:36 ) [33]
> Только изменение каталога в FileName до Execute помогает.
Так и надо делать, об этом в справке по свойству FileName в последнем абзаце написано «Если Вы хотите установить стандартное имя, то присвойте значение свойству FileName.» Если имя включает в себя путь, то соответственно эта папка будет открыта по умолчанию.
← →
Elen © ( 2006-10-12 16:39 ) [34]
> Плохиш
Но ведь NoChangeDir должно влиять?
← →
Плохиш © ( 2006-10-12 17:06 ) [35]
> Elen © (12.10.06 16:39) [34]
> Но ведь NoChangeDir должно влиять?
NoChangeDir к тому, что обсуждается в этой ветке, ни какого отношения не имеет.
← →
Германн © ( 2006-10-12 22:56 ) [36]
> Unknone © (12.10.06 09:24) [6]
>
> Я не знаю как у кого но у меня так.
>
> OpenDialog1.InitialDir:=. указывается папка
> OpenDialog1.Title:=. указывается заголовок
Угу. А OpenDialog.FileName кто очищать будет? Пушкин? А этот FileName сидит полный путь к последнему открытому файлу. В том каталоге диалог и откроется. И чихать он при этом хотел на InitialDir.
← →
ASoft ( 2006-10-13 05:43 ) [37]
>Германн © (12.10.06 22:56) [36]
наконец-то, это прозвучало 🙂
давно пройденный этап.
всегда делал при обновлении каталога OpenDialog FileName:=»», чтоб он не открывал каталог по ранее выбранному файлу
← →
Unknone © ( 2006-10-13 07:33 ) [38]
> ASoft, Германн
> Угу. А OpenDialog.FileName кто очищать будет? Пушкин? А
> этот FileName сидит полный путь к последнему открытому файлу.
> В том каталоге диалог и откроется. И чихать он при этом
> хотел на InitialDir.
Он чихал и на OpenDialog1.FileName:=»», после открытия файла, путь программно не меняется.
← →
Elen © ( 2006-10-13 08:30 ) [39]
> Unknone
Я ж тебе говорю — попробуй OpenDialog1.FileName:= +»\*», . У меня это работает
← →
ASoft ( 2006-10-13 16:27 ) [40]
>Unknone © (13.10.06 07:33) [38]
вы хотите сказать, что
OpenDialog1.FileName:=»»;
OpenDialog1.InitialDir:=
не работает?
Источник