Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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("Èíèöèàëèç&#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.005 c
2-1264842900
Евгений Р.
2010-01-30 12:15
2010.04.04
Русские буквы в полях ADO-таблиц (DBF)


15-1263208174
ocean
2010-01-11 14:09
2010.04.04
Как восстановить флешку?


2-1264797504
NoSilence
2010-01-29 23:38
2010.04.04
Рабочий стол за формой


3-1222293772
ЮЮ
2008-09-25 02:02
2010.04.04
MS SQL. inserted и deleted таблицы в InstedOfUpdate триггере


15-1262156476
прохожий
2009-12-30 10:01
2010.04.04
домен продлить





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский