Событие закрытия окна PowerBuilder

У меня есть окно MDI, содержащее несколько вкладок. Что я хочу сделать, так это отключить событие закрытия каждый раз, когда пользователь нажимает кнопку выхода на вкладке. Но я не знал, как их выполнить. Кто-нибудь может помочь мне с этим? Спасибо.

Вот пример вкладки и кнопки выхода, о которых я говорил в своем вопросе выше.

tab.png

и это то, что у меня есть до сих пор. Тем не менее окно закрывается каждый раз, когда я нажимаю кнопку выхода.

integer ext 
ext = MessageBox("","You are not allowed to close this tab",(Exclamation!),(OK!))

if (ext = 1) then
Open(w_main)
end if

person x'tian    schedule 17.09.2014    source источник


Ответы (3)


Это непросто. Вы должны работать с API user32.dll и удалять, изменять и рисовать строку меню.

Откройте вкладку Global External Functions и вставьте:

Функция uLong GetSystemMenu(object hwnd, boolean bRevert ) БИБЛИОТЕКА "user32.dll" Функция uLong RemoveMenu(object hMenu, long nPosition, long wFlags ) БИБЛИОТЕКА "user32.dll" Функция uLong DrawMenuBar(object hwnd) БИБЛИОТЕКА "user32.dll"

И сейчас:

menu = GetSystemMenu(window, false) // to disable X
RemoveMenu(menu, HF060, H0)
DrawMenuBar(window)
person Eric Draven    schedule 21.11.2014

Я удивлен, что ваш пример кода вообще работает. MessageBox может возвращать только одно значение, как вы его настроили. Если вы проверяете код возврата из MessageBox, у вас должен быть четвертый параметр как YesNo!, YesNoCancel!

Я думаю кто это делал не ведает что творит, смысла вообще нет в этой логике ноль вариантов.

Вы хотите, чтобы это был вопрос, на который пользователь может ответить? Если это так, то сделайте что-то вроде:

integer li_rc
li_rc = Messagebox("Confirm your intentions","Do you want to close the tab?",Question!,YesNo!,2) 
if li_rc = 1 then
  // user clicked YES because it is the first option of YesNo!
else
  // user clicked NO because it is the second option of YesNo!
end if

к вашему сведению: последний аргумент является кнопкой по умолчанию, если пользователь нажимает ввод

Окно имеет событие closequery, которое срабатывает при его закрытии, вы можете выполнить обработку этого события, чтобы окно НЕ закрывалось. Я не знаю, есть ли на вкладке что-то подобное, но вы, вероятно, могли бы решить этот вопрос, а затем запретить закрытие. Если вы просто хотите что-то сказать пользователю, просто сделайте MessageBox("Тема сообщения", "Тело сообщения", Exclamation!) Нет необходимости использовать OK! что по умолчанию

Вот идея:

Посмотрите в событии clicked элемента управления вкладкой. Вероятно, там есть код, который закрывает вкладку. Вы можете добавить дополнительную логику для проверки разрешений и обхода логики закрытия. Или вы можете установить для свойства ShowPicture значение false, если пользователь не может закрыть или, возможно, показать другое изображение отключенного X.

person Rich Bianco    schedule 17.09.2014
comment
Этот работает. но я хочу отключить событие закрытия. Я не хочу, чтобы пользователь мог закрыть вкладку. Как это сделать? Спасибо. знак равно - person x'tian; 17.09.2014
comment
Я вижу этот X на вкладке, который, должно быть, был помещен туда разработчиком. Может быть, найти этот код и добавить туда новый код, чтобы проверить, авторизован ли пользователь, а затем обойти код, который инициирует закрытие вкладки. На вкладке нет такого события, как closequery в окнах. ИЛИ еще лучше, не отображайте X, если у пользователя нет прав на закрытие..? - person Rich Bianco; 17.09.2014
comment
я узнал, что событие закрытия окна может вызвать кнопку закрытия. а вы знаете как отключить кнопку закрытия обычного окна? если да, можете ли вы сказать мне, как. Спасибо. Я действительно понятия не имею. - person x'tian; 17.09.2014

Невозможно «отключить событие закрытия», но вы можете запретить запрошенное закрытие, написав сценарий события CloseQuery окна. Скрипт для возврата 1 в тех случаях, когда вы хотите запретить закрытие, и 0 для случаев, когда вы хотите, чтобы закрытие продолжило обработку.

Удачи.

person Terry    schedule 17.09.2014
comment
Боюсь, я не понял логики запрета закрытия окна. Если не возражаете, можете привести пример? Спасибо =) - person x'tian; 18.09.2014