Форум: "Прочее";
Текущий архив: 2010.04.04;
Скачать: [xml.tar.bz2];
ВнизShowModal или где? Найти похожие ветки
← →
Германн © (2010-01-12 01:56) [0]Нужен диалог, который (при вызове через ShowModal) полностью запрещает любую работу любых процедур/функций приложения.
← →
KilkennyCat © (2010-01-12 02:07) [1]любая форма, вызванная showmodal
← →
Германн © (2010-01-12 02:10) [2]
> KilkennyCat © (12.01.10 02:07) [1]
>
> любая форма, вызванная showmodal
>
Я тоже так думал. И нарвался на http://delphimaster.net/view/15-1262483235/
← →
Игорь Шевченко © (2010-01-12 02:15) [3]
> Нужен диалог, который (при вызове через ShowModal) полностью
> запрещает любую работу любых процедур/функций приложения.
>
Это невозможно
← →
KilkennyCat © (2010-01-12 02:22) [4]а, я думал, вызванных действием пользователя... почему же невозможно, возможно, если написать все линейно.
← →
Германн © (2010-01-12 02:28) [5]
> KilkennyCat © (12.01.10 02:22) [4]
>
> а, я думал, вызванных действием пользователя...
Костя. Ты же знаешь, что я, как правило, работаю с внешним железом.
← →
oxffff © (2010-01-12 02:28) [6]У таймера перехватить сообщения можно.
1.Либо по жесткой схеме через обновление WND процедуры через SetwindowLong с GWL_WNDPROC. И по флагу в ней проверять, если
в нужном режиме ничего не делать, иначе как обычно.
2. Либо проще у Ttimer перекрыть dynamic метод. И создавать наследников
protected
procedure Timer; dynamic;
И делать тож. самое.
3. просто убрать в nil на время property OnTimer: TNotifyEvent.
Мне больше нравиться второй вариант поскольку, можно глобальной одной переменной потушить на время все таймеры. Хотя формально они будут работать. Но тихо.
← →
oxffff © (2010-01-12 02:30) [7]Что еще заглушить кроме таймеров?
← →
Германн © (2010-01-12 02:34) [8]
> oxffff © (12.01.10 02:28) [6]
Тезка. Ты особо не переживай на моих вопросах. :)
← →
oxffff © (2010-01-12 02:36) [9]остался CheckSynchronize.
Его глушить нужно? :)
Придется правда по жесткой схеме.
через virtualprotect :))))))))))
← →
Германн © (2010-01-12 02:37) [10]
> oxffff © (12.01.10 02:30) [7]
>
> Что еще заглушить кроме таймеров?
>
Обработку сообщений от TCP-клиента, например. :)
← →
oxffff © (2010-01-12 02:38) [11]
> Германн © (12.01.10 02:37) [10]
Какой компонент класс ?
← →
oxffff © (2010-01-12 02:40) [12]
> 2. Либо проще у Ttimer перекрыть dynamic метод. И создавать
> наследников
>
> protected
> procedure Timer; dynamic
Либо проще вообще внаглую править RTTI таблицу по смещению. Включил/отключил.
← →
Германн © (2010-01-12 02:53) [13]
> Тезка. Ты особо не переживай на моих вопросах. :)
← →
test © (2010-01-12 02:54) [14]Германн ©
Ты прикалываешся что ли?
← →
oxffff © (2010-01-12 02:55) [15]О. Нашел у себя универские лабы
function ListenThread(p:pointer):DWORD;stdcall;
var data:WSADATA;
form:TmainForm;
ConnectedSock:TSocket;
name:sockaddr_in;
len:integer;
begin
form:=p;
if WSAStartup(MakeWord(2,0),data)=0 then
begin
form.memo1.lines.add("Èíèöèàëèç 4;öèÿ "+data.szDescription+" óñïåøíî çàâåðøåíà");
form.memo1.lines.add("Ñîñòîÿíèå "+data.szSystemStatus);
form.ServerSocket:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
form.SockAddr.sin_family:=AF_INET;
form.SockAddr.sin_port:=htons(1024);
form.SockAddr.sin_addr.S_addr:=INADDR_ANY;
if bind(form.ServerSocket,form.SockAddr,sizeof(TSockAddr))=0 then
begin;
form.memo1.lines.add("Ñîñòîÿíèå: ïðîñëóøèâàíèå") ;
// Ïîðò óñïåøíî ñîçäàí");
if listen(form.ServerSocket,SOMAXCONN)=0 then
begin
repeat
// form.memo1.lines.add("Ñîñòîÿíèå: ïðîñëóøèâàíèå") ;
ConnectedSock:=accept(form.ServerSocket,nil,nil);
if WSAAsyncSelect(ConnectedSock,form.Handle,MYSOCKET_MESSAGE,FD_READ)=0 then;
form.memo1.lines.add("Ïîäñîåäèí 2;ëñÿ êëèåíò");
form.AddClient(ConnectedSock);
until false;
form.memo1.lines.add("Ïðîñëóøèâ 4;íèå çàêîí÷åíî");
end;
end;
end;
end;
Ну и соответственно перехватываем сообщения у окна
← →
oxffff © (2010-01-12 02:57) [16]Что еще глушить будем?
← →
Германн © (2010-01-12 03:00) [17]
> test © (12.01.10 02:54) [14]
>
> Германн ©
> Ты прикалываешся что ли?
>
Хм.
Иногда прикалываюсь. Но не в этом случае!
← →
Кто б сомневался © (2010-01-12 03:49) [18]А что конкретно надо сделать? Опиши примерно.
← →
Вариант (2010-01-12 06:25) [19]Вообще решается все проще -чем чем предложенные перехваты чего-либо, но и то, и это и еще что-то другое в этом духе - извращения на мой взгляд. Легче и правильней будет организовать правильную логику работы приложения или выбрать верный тип приложения или верно разбить задачу на подзадачи. Всяких "и/или" можно привести целый вагон. Я бы предложил сперва на бумажке стрелочками нарисовать, что,как и когда происходит и куда движется
← →
TUser © (2010-01-12 08:55) [20]
> полностью запрещает любую работу любых процедур/функций
> приложения
В том числе и относящихся к обработке событий компонентов на этой форме? :)
---
Ну, если надо затормозить все дополнительные нити, то, возможно, подойдет SuspendThread/ResumeThread.
← →
Демо © (2010-01-12 09:09) [21]А чего не в "Начинающих", а в трёпе?
> а, я думал, вызванных действием пользователя... почему же
> невозможно, возможно, если написать все линейно.
Если линейно, то никаких окон, форм, ShowModal и проблем, соответственно.
← →
oxffff © (2010-01-12 09:23) [22]
> Вариант (12.01.10 06:25) [19]
> Вообще решается все проще -чем чем предложенные перехваты
> чего-либо, но и то, и это и еще что-то другое в этом духе
> - извращения на мой взгляд. Легче и правильней будет организовать
> правильную логику работы приложения или выбрать верный тип
> приложения или верно разбить задачу на подзадачи. Всяких
> "и/или" можно привести целый вагон. Я бы предложил сперва
> на бумажке стрелочками нарисовать, что,как и когда происходит
> и куда движется
Какой вы благородный. Нет вы конечно все правильно говорите.
НО! Реалии совсем другие. И поэтому порой приходится грубо менять то, для чего это не предназначено. Поскольку нет возможности, нет целесообразности, ресурсов, времени глубоко рефакторить что-то не предназначенное для другого. И тогда вступают в дело любые средства.
← →
Вариант (2010-01-12 09:50) [23]
> oxffff © (12.01.10 09:23) [22]
> Какой вы благородный. Нет вы конечно все правильно говорите.
>
Я именно такой.
Все мы имеем свои реалии.
Всякое бывает - бывает и так как ты говоришь. Но для задачи, которую пишешь сам и которую понимаешь, лучше продумать логику работы, чем изобретать "хакерские" методы. Если не получилось сразу -продумать еще раз и переписать. Самому потом легче будет сопровождать -не говоря уже о других. Поэтому мой совет в силе -бумажка и ручка.
> oxffff © (12.01.10 02:55) [15]
Если это потоковая функция (в отдельном потоке вызывается)....то код вызывает вопросы, если нет - то вопросы другие. Впрочем на лабах я сам еще и не то писал (да и потом тоже):-)
← →
Германн © (2010-01-12 13:40) [24]
> А чего не в "Начинающих", а в трёпе?
Привычка.
← →
Игорь Шевченко © (2010-01-12 13:44) [25]Правило ясности: Ясность лучше, чем мастерство.
Поддерживаю Вариант (12.01.10 06:25) [19]
← →
Германн © (2010-01-12 13:55) [26]
> Поддерживаю Вариант (12.01.10 06:25) [19]
>
Я всего лишь решил добавить в программу обработку ошибок функций сторонней библиотеки. Я то думал их будет немного (если вообще будет). Потому и решил сообщать о них в модальном диалоге. А их такое море, что в лучшем случае мне сообщают, что Cannot make a visible window modal. В худшем помогает только эникей. :)
← →
Германн © (2010-01-12 14:14) [27]А началось все с того, что получил AV в таком вот коде:
procedure TForm1.AdsOcx1AdsReadDoubleConf(ASender: TObject; nInvokeId, nResult,
- тут AV
cbLength: Integer; var pData: Double);
begin
if (pData > 10) then begin
Прошу обратить внимание на то, что приведенный метод - обработчик события OnAdsReadDoubleConf компонента AdsOcx1!
← →
Демо © (2010-01-12 14:50) [28]
> А их такое море, что в лучшем случае мне сообщают, что Cannot
> make a visible window modal.
Так может проще протоколировать в файл? ЗАчем каждую ошику на экране показывать?
← →
test © (2010-01-12 14:57) [29]Германн © (12.01.10 13:55) [26]
Так бы сразу и сказал ставь фреймворк Jedi он перехват исключительных ситуаций на весь приклад ставит, кроме того он позволяет дать точное место(строит карту выполняемой проги) где произошла ошибка и что было вызвано.
← →
test © (2010-01-12 14:58) [30]test © (12.01.10 14:57) [29]
У них в примерах к фраймворку есть приложение которое ничего не делает только глючит, на нем можно посмотреть что к чему.
← →
Inovet © (2010-01-12 15:01) [31]> [30] test © (12.01.10 14:58)
> приложение которое ничего не делает только глючит
Класс!
← →
test © (2010-01-12 15:05) [32]Inovet © (12.01.10 15:01) [31]
Они демонстрируют перехват ошибок, там их штук 5 и показано как перехват сделать на основном потоке, с выводом вплоть до строчки где произошла ошибка. Что им было еще писать?
← →
Anatoly Podgoretsky © (2010-01-12 15:17) [33]> Германн (12.01.2010 01:56:00) [0]
Не правда.
← →
test © (2010-01-12 15:23) [34]Anatoly Podgoretsky © (12.01.10 15:17) [33]
+1
← →
Inovet © (2010-01-12 15:55) [35]> [32] test © (12.01.10 15:05)
> Что им было еще писать?
Да это всё понятно - сама фраза классная, как и приложения такие, - напоминает что-то.:)
← →
Германн © (2010-01-12 17:16) [36]
> Демо © (12.01.10 14:50) [28]
> Так может проще протоколировать в файл?
Я уж даже и не знаю что вообще делать с этой массой. На большинство этих ошибок похоже можно просто плюнуть.
> test © (12.01.10 14:57) [29]
>
> Германн © (12.01.10 13:55) [26]
> Так бы сразу и сказал ставь фреймворк Jedi он перехват исключительных
> ситуаций на весь приклад ставит
У меня Эврика лицензионная. Но не в этом суть. Исключений эти функции не дают. У них либо результат, либо параметр говорит о том, как прошло выполнение.
← →
test © (2010-01-12 17:20) [37]Германн © (12.01.10 17:16) [36]
Посмотри Jedi они на хуках работают, если надо дадут такой же результат как System.out.print(e.printStack()) в Java, то есть что вызвало исключение с момента ошибки, там не только место где произошло но и линейка где она формировалась.
← →
test © (2010-01-12 17:28) [38]Германн © (12.01.10 17:16) [36]
Jedi ловит любые ошибки даже без
try
...
except
....
end.
← →
Германн © (2010-01-12 17:43) [39]
> test © (12.01.10 17:20) [37]
Ты не понял.
procedure TForm1.AdsOcx1AdsReadDoubleConf(ASender: TObject; nInvokeId, nResult,
cbLength: Integer; var pData: Double);
begin
if nResult = 0 then begin
if (pData > 10) then begin
...
end;
end else Сообщить о неудачном вызове процедуры AdsOcx1AdsReadDoubleConf
Вот что мне нужно.
← →
test © (2010-01-12 17:49) [40]Германн © (12.01.10 17:43) [39]
Я надеюсь? что как раз таки понял, в каком случае возникает ошибка, что должно быть в вызывающих функциях чтобы получилась ошибка, как правило ошибка появляется на пару функций выше.
← →
Дмитрий Белькевич (2010-01-12 18:57) [41]
> Вот что мне нужно.
StandardEurekaError?
← →
oxffff © (2010-01-12 19:28) [42]
> Вариант (12.01.10 09:50) [23]
>
> > oxffff © (12.01.10 02:55) [15]
>
> Если это потоковая функция (в отдельном потоке вызывается).
> ...то код вызывает вопросы, если нет - то вопросы другие.
> Впрочем на лабах я сам еще и не то писал (да и потом тоже):
> -)
:). Меня больше развеселила строчка
form:=p;
Неужели это мой код? :))))
← →
Германн © (2010-01-13 01:01) [43]Ну раз нет простого общего способа блокировать процесс, буду блокировать по частям. И буду в случае ошибки ака "неудачи выполнения функции сторонней библиотеки" создавать новый экземпляр модального диалога.
Попробую и запись в лог этих "ошибок" (может гендир ещё раз поймет, что то, что он купил за бешеные деньги - дерьмо).
← →
Дмитрий С © (2010-01-13 08:12) [44]
> Ну раз нет простого общего способа блокировать процесс
Открой диалог в другом потоке, а главный поток suspendThread-ом :)
← →
oxffff © (2010-01-13 11:26) [45]
> Германн © (13.01.10 01:01) [43]
> Ну раз нет простого общего способа блокировать процесс,
> буду блокировать по частям. И буду в случае ошибки ака "неудачи
> выполнения функции сторонней библиотеки" создавать новый
> экземпляр модального диалога.
> Попробую и запись в лог этих "ошибок" (может гендир ещё
> раз поймет, что то, что он купил за бешеные деньги - дерьмо).
>
Ну решений может быть много.
Вплоть до обработки разными процессами(не потоками).
Один процесс Ваш основной.
Второй подозрительный с этим компонентом.
Их взаимодействие через
pipes, sockets, creating Named Shared Memory, Synchronization Object, other stuff.
При проблеме рубите процесс и перезапускаете.
P.S. Если речь идет о Вашем проекте(есть доступ к исходнику, желание и полномочия). То озвучте кратко суть проблемы. И будем искать решение.
← →
Германн © (2010-01-13 17:39) [46]
> P.S. Если речь идет о Вашем проекте(есть доступ к исходнику,
> желание и полномочия). То озвучте кратко суть проблемы.
> И будем искать решение.
Спасибо, но это моя карма.
← →
Германн © (2010-01-14 01:13) [47]
> И будем искать решение.
Попробую создать новый топик.
← →
app © (2010-01-14 09:05) [48]> Германн (14.01.2010 01:13:47) [47]
Только попробуй
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2010.04.04;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.005 c