Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.04.04;
Скачать: CL | DM;

Вниз

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("Èíèöèàëèç&#22 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("Ïîäñîåäèí&#23 2;ëñÿ êëèåíò");
               form.AddClient(ConnectedSock);
               until false;
               form.memo1.lines.add("Ïðîñëóøèâ&#22 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,
     cbLength: Integer; var pData: Double);
begin
 if (pData > 10) then begin
 - тут AV

Прошу обратить внимание на то, что приведенный метод - обработчик события 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;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.014 c
15-1263421825
Юрий
2010-01-14 01:30
2010.04.04
С днем рождения ! 14 января 2010 четверг


2-1264851721
kalexi
2010-01-30 14:42
2010.04.04
В каком модуле содержится GetModuleBase?


2-1265108213
бегинер
2010-02-02 13:56
2010.04.04
Нет перегруженной функции с такими параметрами


11-1215270055
<>
2008-07-05 19:00
2010.04.04
Почему не работает KEY_PREVIEW?


3-1230121069
DSKalugin
2008-12-24 15:17
2010.04.04
как это будет для MSSQL?