Главная страница
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]
Я надеюсь? что как раз таки понял, в каком случае возникает ошибка, что должно быть в вызывающих функциях чтобы получилась ошибка, как правило ошибка появляется на пару функций выше.



Страницы: 1 2 вся ветка

Текущий архив: 2010.04.04;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.014 c
15-1263395893
El
2010-01-13 18:18
2010.04.04
Старый Новый год


15-1262972486
soldier
2010-01-08 20:41
2010.04.04
Чем снять образ компьютера, чтобы потом его развернуть на VMWare


2-1264951826
pomaxa27
2010-01-31 18:30
2010.04.04
Как реализовать загрузку изображений через страницу


2-1265180253
oleg1963lora
2010-02-03 09:57
2010.04.04
Убрать свойство из класса


2-1265207702
HF-Trade
2010-02-03 17:35
2010.04.04
GetPixel