Последние сообщения

#1
7.7 / Re: Глюк, фича, или я чего-то ...
Последний ответ от cr - Сегодня в 00:51
Вот выбор из всех вложенных папок с таймаутом.
Сами-то попробуйте: успеете в таймаут прокрутить список в начало и выбрать строку?
СпКат=СоздатьОбъект("СписокЗначений");
СкриптШелл = СоздатьОбъект("WScript.Shell");

НачПапка=КаталогИБ();
СпКат.ДобавитьЗначение(?(Прав(НачПапка,1)="\",Сред(НачПапка,1,СтрДлина(НачПапка)-1) ,НачПапка));

ВременныйФайл = СкриптШелл.ExpandEnvironmentStrings("%TEMP%\dir_out.txt");
СкриптШелл.Run("%comspec% /c dir """ + НачПапка + """ /b /s /ad > """ + ВременныйФайл + """", 0, 1); 

Текст=СоздатьОбъект("Текст");   
Текст.КодоваяСтраница(1);  
Текст.Открыть(ВременныйФайл);
Для Н=1 По Текст.КоличествоСтрок() Цикл
	Стр=Текст.ПолучитьСтроку(Н);
	СпКат.ДобавитьЗначение(Стр);
КонецЦикла; 
Текст.Очистить();            
ФСВинды = СоздатьОбъект("Scripting.FileSystemObject");
ФСВинды.DeleteFile(ВременныйФайл, 1);

Для Н=1 По СпКат.РазмерСписка() Цикл
	Путь=СокрЛП(СпКат.ПолучитьЗначение(Н)); 
	ИмяПапки="";
	Для Бкв=-СтрДлина(Путь) По -1 Цикл
		ТекБуква=Сред(Путь,-Бкв,1);
		Если ТекБуква="\" Тогда
			Прервать;
		КонецЕсли;   
		ИмяПапки=ТекБуква+ИмяПапки;
	КонецЦикла; 
	СпКат.УстановитьЗначение(Н,Путь,ИмяПапки);
КонецЦикла;

ВыбЗнач="";
ТаймАут=5;     
РезВыбора=СпКат.ВыбратьЗначение(ВыбЗнач,"Выберите каталог для сохранения файлов выгрузок",,ТаймАут,0);
Если РезВыбора=1 Тогда
	ПутьККат=ВыбЗнач;
	Сообщить(""+ВыбЗнач); 
ИначеЕсли РезВыбора=0 Тогда
	Сообщить("Отмена выбора");
ИначеЕсли РезВыбора=-1 Тогда
	Сообщить("Закончился таймаут ("+СокрЛП(ТаймАут)+" сек.)"); 
КонецЕсли; 
Мазахисты!
Вас к юзерам на таймаут нельзя подпускать!
#2
7.7 / Re: Глюк, фича, или я чего-то ...
Последний ответ от cr - Вчера в 22:42
Вот выбор папки с таймаутом:
СпКат=СоздатьОбъект("СписокЗначений");
ФСВинды= СоздатьОбъект("Scripting.FileSystemObject");  
НачПапка=ФСВинды.GetFolder(КаталогИБ());
СпКат.ДобавитьЗначение(НачПапка.Path, НачПапка.Name);

Подпапки = НачПапка.SubFolders;

Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.Language = "JScript";
Скрипт.AddCode("function ПолучитьПеречислитель(Коллекция) { return new Enumerator(Коллекция); }");
ПеречислительПапок = Скрипт.Run("ПолучитьПеречислитель", Подпапки);
    
Пока ПеречислительПапок.atEnd(0) = 0 Цикл
   СпКат.ДобавитьЗначение(ПеречислительПапок.item(0).Path, ПеречислительПапок.item(0).Name);
   ПеречислительПапок.moveNext(0);
КонецЦикла;    
    
ВыбЗнач="";
ТаймАут=5;    
РезВыбора=СпКат.ВыбратьЗначение(ВыбЗнач,"Выберите каталог для сохранения файлов выгрузок",,ТаймАут,0);
Если РезВыбора=1 Тогда
   ПутьККат=ВыбЗнач;
   Сообщить(""+ВыбЗнач); 
ИначеЕсли РезВыбора=0 Тогда
   Сообщить("Отмена выбора");
ИначеЕсли РезВыбора=-1 Тогда
   Сообщить("Закончился таймаут ("+СокрЛП(ТаймАут)+" сек.)"); 
КонецЕсли;
#3
7.7 / Re: Глюк, фича, или я чего-то ...
Последний ответ от cr - Вчера в 19:49
Цитата: Злоп от Вчера в 04:04И - это самое - повырывать ноги прмяо до гланд тем, кто дает типа Предупреждение("АлеЧтоТо") - без таймаута, ругаюсь, плююсь и атата! и всегда походя сразу вкорячиваю таймаут если есть возможность. Ибо нефиг. Особенно в модуле проведения (в прошлом году не далее как пару раз натыкался на такое в самописке).
Орефков, кажется, рассказывал что контролы окон типа Предупреждения, Вопрос разработчик нарисовал сам, вместо того чтобы взять системные, еще удивлялся, зачем разработчик движка потратил время впустую? Поэтому таймаут там срабатывает.
А выбор файла/каталога - это системное окно.
И "закрыть" это окно (скорее всего, тот же Виндовс) приложению не дают. Таймаут явно срабатывает - кнопки исчезают, но события (закрытия окна) не происходит, поэтому -1 никогда не возвращается.

    
НачВремя=_GetPerformanceCounter();
ПутьК=""; 
ТаймАут=5;    
Ответ=ФС.ВыбратьКаталог(ПутьК, "Выберите каталог для сохранения файлов выгрузок", ТаймАут); 
КонВремя=_GetPerformanceCounter();
Если Ответ=0 Тогда
    Если (КонВремя-НачВремя+1)/1000 > ТаймАут  Тогда
            Сообщить("Закончился таймаут ("+СокрЛП(ТаймАут)+" сек.)"); 
        Иначе
            Сообщить("Отмена выбора");
        КонецЕсли;
    Иначе          
        ПутьККат=ПутьК;
        Сообщить(""+ПутьК);
    КонецЕсли;
КонецЕсли;
И, кстати, у системной библиотеки таймаута нет.
    
ФСВинды = СоздатьОбъект("Shell.Application"); 
НачПапка=ФСВинды.NameSpace(КаталогИБ());    
Попытка
   ВыбКат = ФСВинды.BrowseForFolder(0,"Выберите каталог для сохранения файлов выгрузок",1+16,0); //  НачПапка  
Исключение  
КонецПопытки;    
    
Если ПустоеЗначение(ВыбКат)=0 Тогда  
   Попытка
       ПутьККат=""+ВыбКат.Items().Item().Path;
       Сообщить(""+ВыбКат.Items().Item().Type+": "+ВыбКат.Items().Item().Path);
   Исключение
        ПутьККат="";
        Сообщить(""+ВыбКат.title);
   КонецПопытки;
Иначе
   Сообщить("Отмена выбора");
КонецЕсли; 

На самом деле, никакого смысла в этом тамауте нет. Потому что окна Предупреждение или Вопрос выводятся программно, а выбор каталога предназначен только для интерактивного действия пользователя - там таймаут не только не имеет смысла, но и просто был бы игрушкой для идиотов и убогих юмористов из предыдущего сообщения.
Ты что хочешь: задать таймаут 3-5 секунд и чтобы окно выбора закрылось потому что юзер не успел выбрать?
Это ты над кем так хочешь издеваться? И для чего? Хорошо если ты ему сразу дашь начальный каталог где-то рядом, а если ему надо выбрать каталог на флешке, которую еще не вставили в комп? Он никода не успеет выбрать по твоему таймауту потому что долго будет его искать. И что он должен делать после этого? Ноги тебе до гланд вырывать за такие фокусы с таймаутом?

#4
7.7 / Re: Глюк, фича, или я чего-то ...
Последний ответ от MWW_Ruza - Вчера в 11:06
Семерка ещё сырая ;)
#5
7.7 / Re: Глюк, фича, или я чего-то ...
Последний ответ от Злоп - Вчера в 04:04
Цитата: cr от 05 июля 2026, 10:17
Цитата: Злоп от 04 июля 2026, 19:38Проверил ВыбратьКаталог() у себя на Вин10Хоум.
По таймауту кнопки пропадают.
Ии? Что не так?
А что по-твоему должно произойти после окончания таймаута?
Какая вообще цель указания таймаута для выбора?
Выбор альтернативы - взять файл/отказаться от файла.
Взятие файла приводит к продвижению по шкале процесса "вперед". То есть будут какие-то изменения. Это д.б. осознанный выбор пользователя, т.к. в большинстве случаев это приводит к каким-либо изменениям. Если юзер "задумался/отошел" - оставлять висеть модальное окно есть плохо. Поэтому модальное окно искусственно делаем выбор по таймауту такой, который минимизирует возможный ущерб/последующие действия. Такой выбор из двух - один=отказ.
Поэтому таймаут истек - окно закрылось, процесс дальше не пошел. Я.п. что код должен предусматривать возможность обработки таймаута спецобразом или же как экиваалент отказа. Имхо.
Никогда с таймаутом проблем по логике обработки у меня не было. У себя даже не припомню, чтобы таймаут итерпретировался по коду как-то иначе чем "отказ".
.
И - это самое - повырывать ноги прмяо до гланд тем, кто дает типа Предупреждение("АлеЧтоТо") - без таймаута, ругаюсь, плююсь и атата! и всегда походя сразу вкорячиваю таймаут если есть возможность. Ибо нефиг. Особенно в модуле проведения (в прошлом году не далее как пару раз натыкался на такое в самописке).
#6
7.7 / Re: Глюк, фича, или я чего-то ...
Последний ответ от MWW_Ruza - 05 июля 2026, 12:52
Цитата: cr от 05 июля 2026, 10:17Какая вообще цель указания таймаута для выбора?
Ну, ИМХО - как и везде, окно выбора должно просто закрыться, если юзверь открыл выбор и задумался на долго...

И, просто по тому, что он там есть, и описан в СП.
#7
7.7 / Re: Глюк, фича, или я чего-то ...
Последний ответ от cr - 05 июля 2026, 10:17
Цитата: Злоп от 04 июля 2026, 19:38Проверил ВыбратьКаталог() у себя на Вин10Хоум.
По таймауту кнопки пропадают.
Ии? Что не так?
А что по-твоему должно произойти после окончания таймаута?
Какая вообще цель указания таймаута для выбора?
#8
7.7 / Re: Глюк, фича, или я чего-то ...
Последний ответ от MWW_Ruza - 05 июля 2026, 08:11
Тебе в "копилку" :-)

Раньше как-то не ставил таймаут, и не вылезало. А тут, черт дернул, и пару часов потерял, пока понял что кнопки пропадают именно по таймауту, а не от скролинга или выбора каталога... По началу было не понятно, открывается диалог, все ок. Начинаешь выбирать каталог - бах, пропали... А потом, перепробовав кучу всего, перезрузив комп и т.п. пляски с бубном, просто открыл диалог, и тупо смотрел в экран, почесывая репу, и думая, что-бы еще попробовать... Бах - пропали, без моих действий... Вот это уже и навело на мысль о таймауте...
#9
7.7 / Re: Глюк, фича, или я чего-то ...
Последний ответ от Злоп - 04 июля 2026, 19:38
Проверил ВыбратьКаталог() у себя на Вин10Хоум.
По таймауту кнопки пропадают.
.
"Клюшки неисчерпаемы как атом"
#10
7.7 / Re: Глюк, фича, или я чего-то ...
Последний ответ от Харлампий Дымба - 03 июля 2026, 21:55
Интересно будет посмотреть на старой Винде, может на новой что сломалось?
А так, да - на оригинальной голой 7.70.027 на Windows7 - воспроизводится.
Причем у всех троих:
ФС.ВыбратьФайл() - по таймеру исчезают кнопки и путь, но окошко не закрывается;
ФС.ВыбратьФайлКартинки() - по таймеру исчезает предпросмотр, но окошко не закрывается;
ФС.ВыбратьКаталог() - по таймеру окошко не закрывается.
При этом после закрытия окна все функции возвращают 0 (нажата кнопка "Отмена"), а не -1 (превышен таймаут).
Работа через созданный объект
ФСО = СоздатьОбъект("ФС");
ФСО.ВыбратьКаталог();
картину не меняет.
Баг.