Вверх ↑
Этот топик читают: Гость
Ответов: 99
Рейтинг: 4
#1: 2022-01-22 13:00:52 ЛС | профиль | цитата
(Извините, если пишу не в том разделе )
Единственное, что изменилось, так это добавление точки OnExecuteEnd, которая происходит после выбора всех файлов при множественном выборе и Select = Multi.
Сделал это, чтобы можно было использовать один компонент вместо двух или трёх для получения того-же "эффекта".
Схема:
Make(delphi)
ver(4.05 build 186)
Add(MainForm,2953706,21,105)
{
}
Add(Button,13926934,231,133)
{
Left=145
Top=85
Width=130
Caption="Test ODialog"
link(onClick,11902614:doExecute,[(303,139)(303,153)])
}
Add(ODialog,11902614,343,147)
{
FileName=""
Select=1
Point(onExecuteEnd)
link(onExecute,15869480:doMessage,[(397,153)(397,132)])
link(onExecuteEnd,6420839:doMessage,[(396,167)(396,185)])
}
Add(Message,15869480,420,126)
{
Caption="Файл"
}
Add(Message,6420839,417,179)
{
Message="Конец файлов"
}

Если честно, это было проще, чем я думал.

--- Добавлено в 2022-01-22 13:20:08

Новая версия модификации, теперь onExecuteEnd происходит даже если только один файл был выбран

Редактировалось 3 раз(а), последний 2022-01-22 13:20:08
карма: 0

0
файлы: 1ODialog1.11.rar [1.5KB] [290]
Разработчик
Ответов: 26149
Рейтинг: 2127
#2: 2022-01-22 13:42:25 ЛС | профиль | цитата
TheRenat писал(а):
OnExecuteEnd, которая происходит после выбора всех файлов при множественном выборе и Select = Multi

Я бы все же назвал это событие OnMultiExecute и описание сделал немного другим:
*OnMultiExecute=Событие происходит всякий раз при нажатии кнопки ОК в режиме Select = Multi (файлы выбраны)|2|
В коде это одиночное событие (не выдаваемое в цикле), поэтому желательно делать не так
      _hi_onEvent(_event_onExecuteEnd);
а вот так
      _hi_CreateEvent(_Data, @_event_onExecuteEnd);
Посмотри внимательно код и ты заметишь, что все одиночные события выдаются именно так, как я отметил.

Редактировалось 1 раз(а), последний 2022-01-22 13:43:52
карма: 22

0
Ответов: 99
Рейтинг: 4
#3: 2022-01-22 16:54:12 ЛС | профиль | цитата
Хорошо... вот тогда новая версия. Только вот разницы между onEvent и CreateEvent я не особо вижу.
Ой блин, nesco, оказывается если пользоваться твоим способом, onExecute не вызывается.
Ещё похоже есть баг, связанный с тем, что onExecuteEnd вызывается перед любым onExecute (если выбран один файл вне зависимости от того, Select = Multi или Single)

Редактировалось 2 раз(а), последний 2022-01-22 17:11:51
карма: 0

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#4: 2022-01-22 18:40:14 ЛС | профиль | цитата
TheRenat писал(а):
Ещё похоже есть баг, связанный с тем, что onExecuteEnd вызывается перед любым onExecute (если выбран один файл вне зависимости от того, Select = Multi или Single)

Да там такого быть не может, если брать первую твою версию. Это же разные методы работают, в методе Single вообще нет никакого упоминания про onExecuteEnd, как он может срабатывать?
Млин, заставил ты меня проверить твой код в деле. Все у меня прекрасно работает. На одном файле при Multi отрабатывает только onExecute, на множественном: в цикле -- onExecute, в конце цикла -- onExecuteEnd, и только один раз. Я бы вообще сделал, чтобы onExecuteEnd выдавался и на один файл. Вот схема, при множественном выборе список исправно копируется в Memo, при выборе одного файла -- фиг вам, а ведь, КМК, должен.

Схема

Add(MainForm,2953706,196,112)
{
Width=455
link(onCreate,8436208:doExecute,[])
}
Add(ODialog,8436208,266,126)
{
Select=1
Point(onExecuteEnd)
link(onExecute,12424732:doAdd,[])
link(onExecuteEnd,11324573:doData,[(326,146)(326,188)])
}
Add(ListBox,12424732,336,126)
{
Left=10
Top=10
Width=200
Height=220
}
Add(Memo,6918032,399,161)
{
Left=220
Top=10
Width=200
Height=220
}
Add(DoData,11324573,336,182)
{
link(onEventData,6918032:doText,[])
link(Data,12424732:Text,[])
}


Ладно в Simple, там на этапе построения схемы будет известно, что вызывается только один файл, но вот в Multi совершенно не очевидно, что будет выбрано именно несколько файлов. А вот использовать две точки в таком режиме ничего хорошего не дадут, тогда добавленная точка вообще смысла иметь не будет

Редактировалось 4 раз(а), последний 2022-01-22 18:44:43
карма: 22

0
Ответов: 99
Рейтинг: 4
#5: 2022-01-22 22:28:17 ЛС | профиль | цитата
nesco, ты версию 1.12 уже смотрел? Там onExecuteEnd активируется при выборе одного файла тоже, и баг про который я говорил (onExecuteEnd перед onExecute происходит)
Ах да, блин, забыл что я случайно её удалил. Потом загружу снова.

Редактировалось 1 раз(а), последний 2022-01-22 22:33:23
карма: 0

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#6: 2022-01-23 03:33:12 ЛС | профиль | цитата
TheRenat писал(а):
Потом загружу снова.

Валяй, посмотрим.
карма: 22

0
Ответов: 99
Рейтинг: 4
#7: 2022-01-23 12:36:23 ЛС | профиль | цитата
nesco писал(а):
Валяй, посмотрим.

Вот.
карма: 0

0
файлы: 1ODialog1.12.rar [1.5KB] [273]
Разработчик
Ответов: 26149
Рейтинг: 2127
#8: 2022-01-23 13:21:07 ЛС | профиль | цитата
TheRenat писал(а):
Вот.

Ну, первое, что увидел:
полезно для Select = Multi, так-как из-за этого onExecute вызывается для каждого файла
onExecute и должен вызываться для каждого файла, это задумано априори, тк onExecute выдает имя файла в поток. А onExecuteEnd придуман для того, КМК, чтобы сказать нам, что выдача файлов закончилась, и надо с ними что-то делать.
КМК, имя и описание точки должно быть таким:
*onMultiExecuteEnd=Событие происходит после выдачи всех имен файлов событием onExecute при множественном выборе (Select = Multi)|2|

--- Добавлено в 2022-01-23 13:40:45

Второе:
Должно быть не так
    if Lst.Count = 1 then
begin
_hi_CreateEvent(_Data, @_event_onExecute, S);
_hi_OnEvent(_event_onExecuteEnd);
end
else
Должно быть наоборот -- _hi_CreateEvent должен всегда ставиться последним и обязательно после _hi_OnEvent
    if Lst.Count = 1 then
begin
_hi_onEvent(_event_onExecute, S);
_hi_CreateEvent(_Data, @_event_onMultiExecuteEnd);
end

--- Добавлено в 2022-01-23 13:43:40

Короче, я вижу компонент вот так (версия 1.13), и все прекрасно работает.

Редактировалось 4 раз(а), последний 2022-01-23 13:44:26
карма: 22

0
файлы: 1ODialog1.13.zip [1.7KB] [292]
Ответов: 99
Рейтинг: 4
#9: 2022-01-23 23:23:09 ЛС | профиль | цитата
Хорошо, спасибо!
А может тогда и на SVN, если ошибок нет?
карма: 0

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#10: 2022-01-24 02:32:53 ЛС | профиль | цитата
TheRenat писал(а):
А может тогда и на SVN, если ошибок нет?

Подожду пока Netspirit отпишется, если отпишется, конечно.
карма: 22

0
10
Сообщение
...
Прикрепленные файлы
(файлы не залиты)