ShowOpen работает коряво :-(

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

ShowOpen работает коряво :-(

Сообщение XairOn » 02.08.2004 (Пн) 14:21

Здравствуйте, у меня такая проблема возникла: мне необходимо сделать так, что бы пользователь открывал некий файл (неважно какой), т.е. я добавляю компонент Microsoft Common Dialog Control, ну и потом вызываю .ShowOpen так вот проблема состоит в том, что если в пути к файлу встречаются пробелы (например C:\Мои документы\...) файл не открывается, хотя и ошибки никакой не выдаётся, а вот если файл мой лежит к примеру в C:\file.txt всё работает нормально. т.е. когда пробелов нет. Я пробовал заменять пробелы на - %20, не помогло, вылетает ошибка - Path not found (путь не найден). Так вот как мне исправить это недоразумение, что бы открывались любые файлы, независимо от их места нахождения???

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 02.08.2004 (Пн) 14:32

Я тоже сталкивался с такой проблеммой.
Дело в том, что когда в пути есть пробелы, компонент думает, что пользователь выбрал несколько файлов. Поэтому лучше чтобы путь был без пробелов

Хотя... етот пример у меня работает ок:
Код: Выделить всё
Option Explicit

Private Sub Command1_Click()
    Dim St As String
   
    CommonDialog1.ShowOpen
   
    List1.AddItem CommonDialog1.FileName
   
    Open CommonDialog1.FileName For Input As 1
        While Not EOF(1)
            Line Input #1, St
            List1.AddItem St
        Wend
    Close
   
End Sub
Последний раз редактировалось Sirik 02.08.2004 (Пн) 14:36, всего редактировалось 1 раз.

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Сообщение natcap » 02.08.2004 (Пн) 14:33

попробуй с флагами поиграться...
у меня стоят

Код: Выделить всё
CommonDialog1.Flags = cdlOFNFileMustExist Or cdlOFNHideReadOnly Or cdlOFNPathMustExist Or cdlOFNNoChangeDir Or cdlOFNNoDereferenceLinks Or cdOFNLongNames


иоткрывает все как миленький - только что проверила... на 90% уверена, что дело в последнем флаге, который длинные имена разрешает... Если длинные запрещены, то и пробел в имени запрещен :)
Последний раз редактировалось natcap 02.08.2004 (Пн) 15:32, всего редактировалось 1 раз.
Медленно переезжаю с 6.0 на 2008 .... задавая тонны глупых вопросов :)

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 02.08.2004 (Пн) 15:26

А если в кавычки взять длинное имя?
Например:

ComDlg1.FileName=CHR$(34) & ComDlg1.FileName & CHR$(34)

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 02.08.2004 (Пн) 17:04

Спасибо, за предложения, но проблема осталась, итак по порядку:

Sirik: интересный подход, но у меня почему-то не канает :-(

natcap: Что-то подобное Я делал для решения это проблемы, попробовал твой код, но тоже не работает :-( (если не трудно,

можешь сюда или на мыло полный код кинуть)

BP: так Я тоже пробовал - выдается ошибка - Bad file name or number :-(

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Сообщение ASD » 02.08.2004 (Пн) 17:17

Во первых смотря как ты потом файл открываешь.
Если типа shell то попробуй все в ковычки,
второе гдето в форуме (может даже в faq) есть исходник (модуль) как без MS Common вызвать диалог, гораздо лучше.

Сколько писал с использованием диалогов но такой проблеммы не наблюдал.
PS проверь что вообще в CommonDialog1.FileName
Moderator VBStreets
---------------------------

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Сообщение natcap » 02.08.2004 (Пн) 17:17

Код: Выделить всё
Private Sub Command1_Click()
On Error GoTo ErrorHandler
    CommonDialog1.CancelError = True
    CommonDialog1.Filter = "Ãðàôè÷åñêèå ôàéëû (*.jpg,*.gif,*.png)|*.jpg;*.gif;*.png|"
    CommonDialog1.Flags = cdlOFNFileMustExist Or cdlOFNHideReadOnly Or cdlOFNPathMustExist Or cdlOFNNoChangeDir Or cdlOFNNoDereferenceLinks Or cdOFNLongNames
    CommonDialog1.ShowOpen
load_pic CommonDialog1.FileName
    Exit Sub
ErrorHandler:
    If Err.Number = 32755 Then
             Exit Sub
    End If

End Sub

Public Sub load_pic(mpath)
    On Error Resume Next
    Set PictureScroller1.Picture = LoadPictureGDIPlus(mpath)
    Set Picture1.Picture = LoadPictureGDIPlus(mpath)
    Text1(0).text = Picture1.Width \ Screen.TwipsPerPixelX
    Text1(1).text = Picture1.Height \ Screen.TwipsPerPixelY
End Sub



это код целиком по заказам радиослушателей :)
Картинка берется из "Мои документы", в имени файла тоже пробел. Картинка грузится замечательно. Такой же функцией поднимаю другие файлы (расширения другие, послед. обработки совершенно разные есть... )...

Кстати таки да, ;) показал бы ты, что ты потом с этим именем файла делаешь... т.к. диалог всегда возвращает нормально путь, а вот что ты потом с ним делаешь - вопрос...
Медленно переезжаю с 6.0 на 2008 .... задавая тонны глупых вопросов :)

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 02.08.2004 (Пн) 19:21

Кстати флаги обозваны неправильно.
Const OFN_LONGNAMES = &H200000
Это если ты не знаешь в какую сторону копать.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 02.08.2004 (Пн) 20:54

Я тоже в свое время с этим столкнулся, и все решилось тем, что я запретил юзеру делать мульти-селект в диалоговом окне. В результате чего мне гарантированно возвращается 1 (один) файл, я беру всю эту строку и использую ее как полный путь с именем...

baha76
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 07.01.2004 (Ср) 10:59
Откуда: Ташкент

Сообщение baha76 » 03.08.2004 (Вт) 9:25

Я согласен с natcap.
Кажется проблема не в самом CommonDialog, а в обработке возвращенной строки. Выложи здесь код обработки.
Я часто пользуюсь ею и таких проблем не видал. :)

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 03.08.2004 (Вт) 20:33

Всем спасибо за оказанную помощь!!! Хотя ни одним из предложений Я не воспользовался. Я "решил" эту проблему, правда каким-то корявым способом, мне он не нравится. Мне нужно было считать из текстового файла информацию, а затем различные куски этого текста должны стать элементами массива. Я просто присвоил специально созданному текстовому полю результат возвращаемый ShowOpen, т.е. имя_диалога.FileName, а затем просто при открытии файла вписал: Open Text1.Text For Input As #1, так почему-то всё сработало нормально, т.е. пробелы в пути к файлу роли не играли, но способ этот как вы понимаете, откровенно говоря, ТУПОЙ... да и кому нужны лишние контролы на форме, вобщем не самый удачный выход из положения. Если не трудно, могли бы вы предложить код (или даже готовый исходник... вот наглость :-) ), который содержал бы всего одну кнопку - "Открыть" и текстовое поле в которое загружался бы выбранный файл.
Заранее благодарен!
:-) :-) :-) Обнаглевший в доску UNIX :-) :-) :-)

P.S. Если кто-нибудь возмётся помочь, исходник можно сюда отправить - unix@macbox.ru

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Сообщение natcap » 03.08.2004 (Вт) 21:02

да все ты правильно написал :) Только вместо текстового поля используй простую текстовую переменную и вся любовь :)
Медленно переезжаю с 6.0 на 2008 .... задавая тонны глупых вопросов :)

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 03.08.2004 (Вт) 21:14

natcap: спасибо большое, Я может и не далёк в программировании, но уж до этого догадался, не канает :-)

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Сообщение natcap » 03.08.2004 (Вт) 21:29

Я идиот! Убейте меня, кто-нибудь!??? проверь! у меня так написано, все пашет.. сейчас код соберу...
Медленно переезжаю с 6.0 на 2008 .... задавая тонны глупых вопросов :)

natcap
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 234
Зарегистрирован: 25.06.2003 (Ср) 13:15
Откуда: Москва

Сообщение natcap » 03.08.2004 (Вт) 22:20

Код: Выделить всё
Private Sub Command1_Click()
On Error GoTo ErrorHandler
    CommonDialog1.CancelError = True
    CommonDialog1.Filter = "*.txt|*.txt|"
    CommonDialog1.Flags = cdlOFNFileMustExist Or cdlOFNHideReadOnly Or cdlOFNPathMustExist Or cdlOFNNoChangeDir Or cdlOFNNoDereferenceLinks Or cdOFNLongNames
    CommonDialog1.ShowOpen

    mpath = CommonDialog1.FileName
Open mpath For Input As #2

Input #2, t
Close #2
Text1.Text = t
Exit Sub
ErrorHandler:
    If Err.Number = 32755 Then Exit Sub
End Sub


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


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList  
cron