powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Отслеживание появления MessageBoxa
25 сообщений из 33, страница 1 из 2
Отслеживание появления MessageBoxa
    #34129750
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такая вот проблемка:
Идет процесс - много селектов и апдейтов. Иногда что-то происходит и выдается сообщение об ошибке (см. картинку). Если нажать ОК, то процесс продолжается в полном порядке. Надо каким-то образом нажать на ОК и/или хотябы отловить момент, когда выскакивает это сообщение. Есть линейка с процентами выполнения. Можно через определенные промежутки времени проверять, меняются ли проценты или нет. Но проверка в простом таймере не помогает, т.к. таймер ждет нажатие на ОК и не работает. Что можно сделать?
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34129776
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно через API-шную FindWindowA
Только запускай в параллельном потоке через Yield
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34129777
Фотография AIZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окно с сообщением сами писали или оно открывается функцией MessageBox? А что касается таймера, есть замечательный объект Timing.
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34129789
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже как раз по таймеру что-то и пытаются сделать
Ясно же пишет - разрешен только cancel
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34129832
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. FindWindowA не поможет, т.к. в списке процессов это сообщение не записано. Т.е. оно часть всего приложения.
2. Сообщение не наше. Из-за чего вообще может происходить эта ошибка? 10 раз может работать нормально, а потом вдруг выскакивает эта зараза.
3. Объект Timing не помог. Опять-таки, пока не нажать на ОК, все заморожено.

Появилась такая идея:
1. Записивать проценты выполнения в текстовый файл.
2. Создать отдельную програмку, которая будет через определенные промежутки времени проверять этото текстовый файл. А перед выполнением всего процесса запустить эту маленькую програмку.
Но может быть можно сделать что-нибудь более простое?
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34129863
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIZОкно с сообщением сами писали или оно открывается функцией MessageBox? А что касается таймера, есть замечательный объект Timing.
это ошибка datawindow. это не MessageBox, и не "самописное" окно.
В dberror везде обработка прописана?
Можно попробовать поставить breakpoint в dberror и если туда попадем - посмотреть на Call Stack.

СУБД какая? MSSQL? Sybase?

Версия билдера какая? девятка или десятка?

Еще вариант - в событии sqlpreview фиксировать в Error object припомощи PopulateError местоположение и из аргументов события текст SQL и скидывать в файл. как только выскочит сообщение - посмотреть какой select и откуда.
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34129873
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идет обращение к БД пока не закончился Retrieve.
Такое бывает если используется retrieverow, а сам Retrieve при этом не отменяют соответствующей функцией (DBCancel?)

Зорин А.
"I love deadlines. I like the whooshing sound they make as they fly by."
-- Douglas Adams
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34129885
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю что это мессаж-бокс из вашей программы.
сообщение оч знакомое (скорее всего база Sybase ASE или MS SQL)

проблемы с курсором (он или не деастивируется или не закрывается)
может быть внутри процедуры.
--
надо-бы найти где ошибка, а не искать как закрывать мессаж-бокс
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34129908
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего так и есть, как сказал Андрей
Проверить events update-ов, retrieve-ов
либо у родительских объектов
Ошибка - есть ошибка, надо ее отловить
А так - видел где-то маленькую программульку которая только этим и занимается - гасит message
Можно конечно заглушить dberror, но это порочная практика
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34129941
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.думаю что это мессаж-бокс из вашей программы.
сообщение оч знакомое (скорее всего база Sybase ASE или MS SQL)

Это НЕ MessageBox. Это сообщение от datawindow engine. В коде он возникает сразу после вызова dw.Retrieve(...)

Dmitry.проблемы с курсором (он или не деастивируется или не закрывается)
может быть внутри процедуры.
маловероятно. это ошибка уровня драйвера БД. Клиент получает resultset и должен (прежде чем выполнять какой либо SQL) либо "выгрести" все строки до конца, либо ЯВНО отменить retrieve.
Но где-то происходит нежелательное "распараллеливание", т.е. одновременно с Retrieve выполняется что-то еще. Отследить сложно именно из-за того что ошибка вылетает не там где собственно проблема с незакрытым курсором, а на всех последующих попытках обращения к БД

Dmitry.надо-бы найти где ошибка, а не искать как закрывать мессаж-бокс
ну да. чем мы собственно и пытаемся тут заниматься.
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34129976
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. РВ 6.5
2. Курсоры не используются вообще.
3. Селекты и Апдейты очень большие. Запускаются на несколько часов. В это время идет работа с базой данных (MS SQL). Ошибка возникает не всегда. Отследить в дебаггере такое дело сложно. При нажатии на ОК и все продолжается нормально. Т.е. это даже не ошибка, а просто какое-то сообщение. Хотелось бы просто нажать на ОК и все.
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34130048
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как процентики выполнения считаются?
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34130067
Фотография AIZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не хочешь отлавливать, напиши в Event DBError RETURN 1. Но, на всякий случай, записывай куда-нибудь передаваемые в событие параметры.
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34130103
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага
Только они ведь продолжают работать
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34130107
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А DBerror он глобальный
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34130114
Фотография AIZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, непонятно, почему Timing не помог? Response на него не влияет никак
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34130120
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001А как процентики выполнения считаются?
В цикле. Изначально знаем, сколько строк надо обновить.
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34130130
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIZЕсли не хочешь отлавливать, напиши в Event DBError RETURN 1. Но, на всякий случай, записывай куда-нибудь передаваемые в событие параметры.
Практически все происходит без DW.
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34130160
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIZКстати, непонятно, почему Timing не помог? Response на него не влияет никак
А можно примерчик?
Вот, что было у меня:
Код: plaintext
1.
inv_timing.Start( 3 )
messagebox('', 'stop')
inv_timing - nvuo_timer объект Timing в нем MessageBox('', 'Timing')
При запуске этого скрипта получаю MessageBox('', 'stop'). И только после его закрытия - MessageBox('', 'Timing')
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34130305
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Месаджик не там написал
Правильно, ты его пусканул и сразу месага
а надо было в событиях
и потом время -то не в секундах
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34130339
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь
Interval The number of seconds that you want between Timer events. interval can be a whole number or fraction greater than 0 and less than or equal to 4,294,967 seconds. If interval is 0, Timer turns off the timer so that it no longer triggers Timer events.
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34130357
Фотография AIZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример того, как не надо писать (перекрестные ссылки), но для демонстрации Timing подойдет.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
forward
global type n_cst_timing from timing
end type
end forward

global type n_cst_timing from timing
end type
global n_cst_timing n_cst_timing

type variables
w_test2	iw
String	is_message
//Long		il_number
end variables
on n_cst_timing.create
call super::create
TriggerEvent( this, "constructor" )
end on

on n_cst_timing.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on

event timer;
iw.st_message.Text = is_message//"Timer № " + String(il_number) //+ String(Now(), "hh:mm:ss")
end event



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
forward
global type w_test2 from window
end type
type st_message from statictext within w_test2
end type
type sle_count from singlelineedit within w_test2
end type
type cb_stop from commandbutton within w_test2
end type
type cb_start from commandbutton within w_test2
end type
end forward

global type w_test2 from window
integer width =  1440 
integer height =  444 
boolean titlebar = true
string title = "Untitled"
boolean minbox = true
boolean maxbox = true
boolean resizable = true
long backcolor =  67108864 
string icon = "AppIcon!"
boolean center = true
st_message st_message
sle_count sle_count
cb_stop cb_stop
cb_start cb_start
end type
global w_test2 w_test2

type variables
n_cst_timing	inv_timing[]
end variables

on w_test2.create
this.st_message=create st_message
this.sle_count=create sle_count
this.cb_stop=create cb_stop
this.cb_start=create cb_start
this.Control[]={this.st_message,&
this.sle_count,&
this.cb_stop,&
this.cb_start}
end on

on w_test2.destroy
destroy(this.st_message)
destroy(this.sle_count)
destroy(this.cb_stop)
destroy(this.cb_start)
end on

type st_message from statictext within w_test2
integer x =  201 
integer y =  52 
integer width =  1125 
integer height =  92 
integer textsize = - 8 
integer weight =  400 
fontcharset fontcharset = russiancharset!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial CYR"
long textcolor =  33554432 
long backcolor =  67108864 
boolean border = true
borderstyle borderstyle = stylelowered!
boolean focusrectangle = false
end type

type sle_count from singlelineedit within w_test2
integer x =  55 
integer y =  44 
integer width =  96 
integer height =  100 
integer taborder =  10 
integer textsize = - 8 
integer weight =  400 
fontcharset fontcharset = russiancharset!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial CYR"
long textcolor =  33554432 
boolean enabled = false
string text = "10"
borderstyle borderstyle = stylelowered!
end type

type cb_stop from commandbutton within w_test2
integer x =  992 
integer y =  192 
integer width =  343 
integer height =  100 
integer taborder =  20 
integer textsize = - 8 
integer weight =  400 
fontcharset fontcharset = russiancharset!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial CYR"
string text = "Stop"
end type

event clicked;Long	ll_count, i, ll_ret

ll_count = Long(sle_count.Text)
IF ll_count <  1  THEN RETURN  0 

FOR i =  1  TO ll_count
	inv_timing[i].Stop()
	DESTROY inv_timing[i]
NEXT
Close(Parent)
RETURN  1 
end event

type cb_start from commandbutton within w_test2
integer x =  599 
integer y =  188 
integer width =  343 
integer height =  100 
integer taborder =  10 
integer textsize = - 8 
integer weight =  400 
fontcharset fontcharset = russiancharset!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial CYR"
string text = "Start"
end type

event clicked;Long	ll_count, i, ll_ret
n_cst_timing	lnv_timing


ll_count = Long(sle_count.Text)
IF ll_count <  1  THEN RETURN  0 

FOR i =  1  TO ll_count
	inv_timing[i] = CREATE n_cst_timing
	inv_timing[i].iw = Parent
	inv_timing[i].is_message = "Таймер № " + String(i, "00")
	inv_timing[i].Start(i +  1 )
NEXT
MessageBox("Все ли остановилось?","Подождем-с...")
RETURN  1 
end event

...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34130378
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001Месаджик не там написал
Правильно, ты его пусканул и сразу месага
а надо было в событиях
и потом время -то не в секундах
Ничего не понял :)
Идея такая:
есть объект inv_timing, который будет запускаться каждые 15 минут inv_timing(900) и проверять текущее значение процентов и предыдущее. Проблема в том, что если выскочит где-то сообщение, то inv_timing не сработает. Вопрос в том, как сделать, чтобы не зависимо ни от чего, inv_timing работал бы каждые 15 минут.
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34130621
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное самое простое на время исполнения заглушить ошибки DW
...
Рейтинг: 0 / 0
Отслеживание появления MessageBoxa
    #34130706
boogiman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Riska

По моему считать, что то на клиенте часами это бред!!! Нарисовали бы DTS - пакет нормальный ну и дёргали его по шедулеру (тем более что MSSQL), да и все бы проблемы ушли!!! Заодно бы новые технологии немножко подняли!!!!
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Отслеживание появления MessageBoxa
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]