Форум » GUI » баг/фича закрытия-открытия окна » Ответить

баг/фича закрытия-открытия окна

SADSTAR2: Тут как-то говорили о том, что харбор идет только одним потоком. Тогда объясните мне следующее явление - последовательное закрытие-открытие окна без некоторого периода ожидания приводит к ошибке Error: Harbour MiniGUI 1.4 Extended Edition (Build 43) - 2007.09.24 Window: Form_1 is already defined. Program terminated Иллюстрация - ниже #include <minigui.ch> function Main() public lForm_1_Opened:=.f. //load window wMain DEFINE WINDOW wMain AT 123 , 318 ; WIDTH 631 HEIGHT 475 ; TITLE "Проба открытия-закрытия другого окна" ; MAIN ; ON INIT wInit() ; FONT "Arial" ; SIZE 9 DEFINE BUTTON BUTTON_1 ROW 18 COL 28 WIDTH 150 HEIGHT 29 CAPTION "Открыть Form_1" ACTION FormOpen() FONTNAME "Arial" FONTSIZE 10 END BUTTON DEFINE BUTTON BUTTON_2 ROW 63 COL 27 WIDTH 150 HEIGHT 31 CAPTION "Закрыть Form_1" ACTION FormClose() FONTNAME "Arial" FONTSIZE 10 END BUTTON DEFINE BUTTON BUTTON_3 ROW 110 COL 28 WIDTH 150 HEIGHT 43 CAPTION "Закрыть-Открыть Form_1" ACTION FormCloseOpen() FONTNAME "Arial" FONTSIZE 10 END BUTTON DEFINE CHECKBOX Check_1 ROW 170 COL 30 WIDTH 290 HEIGHT 30 CAPTION "Закрыть-открыть с задержкой 1 сек" VALUE .F. FONTNAME "Arial" FONTSIZE 9 END CHECKBOX END WINDOW activate window wMain return Nil //-------------------------------- static function wInit() wMain.Maximize return Nil //-------------------------------- static function FormOpen() if lForm_1_Opened //IsWIndowDefined('Form_1') msgbox('Form_1 уже существует') return Nil endif //load window Form_1 DEFINE WINDOW Form_1 AT 215,347 ; HEIGHT 300 ; WIDTH 550 ; TITLE "New Form" ; CHILD ; FONT "Arial" SIZE 9 END WINDOW lForm_1_Opened:=.t. activate window Form_1 return Nil //-------------------------------- static function FormClose() if !lForm_1_Opened //IsWIndowDefined('Form_1') msgbox('Form_1 не существует') return Nil endif Form_1.Release lForm_1_Opened:=.f. return Nil //-------------------------------- static function FormCloseOpen() local n:=Seconds() FormClose() if wMain.Check_1.Value do while (Seconds()-n)<1 //ждать 1 сек Do Events enddo endif FormOpen() return Nil 

Ответов - 5

SADSTAR2: И к тому же функция IsWIndowDefined() не работает с CHILD-окнами

gfilatov: SADSTAR2 пишет: последовательное закрытие-открытие окна без некоторого периода ожидания Да, я подтверждаю такой косяк, необходимость которого была вызвана тонкостями реализации элемента управления GetBox. Этой проблемы НЕТ в официальной версии библиотеки SADSTAR2 пишет: функция IsWIndowDefined() не работает с CHILD-окнами Это не соответствует действительности. У вас ошибка при передаче параметра в эту функцию, д.б.: IsWIndowDefined(Form_1) либо _IsWIndowDefined('Form_1') Ниже Вы найдете рабочий пример, который нормально отрабатывает в официальной и расширенной версиях библиотеки. Конечно, при использовании расширенной версии необходимо в функции FormCloseOpen() добавить Do Events безо всякого цикла ожидания (для пользователя это практически незаметно) #include <minigui.ch> function Main() DEFINE WINDOW wMain; AT 0, 0; WIDTH 630 HEIGHT 475; TITLE "Проба открытия-закрытия другого окна"; MAIN DEFINE BUTTON BUTTON_1 ROW 18 COL 28 WIDTH 150 HEIGHT 29 CAPTION "Открыть Form_1" ACTION FormOpen() FONTNAME "Arial" FONTSIZE 10 END BUTTON DEFINE BUTTON BUTTON_2 ROW 63 COL 27 WIDTH 150 HEIGHT 31 CAPTION "Закрыть Form_1" ACTION FormClose() FONTNAME "Arial" FONTSIZE 10 END BUTTON DEFINE BUTTON BUTTON_3 ROW 110 COL 28 WIDTH 150 HEIGHT 43 CAPTION "Закрыть-Открыть Form_1" ACTION FormCloseOpen() FONTNAME "Arial" FONTSIZE 10 END BUTTON DEFINE CHECKBOX Check_1 ROW 170 COL 30 WIDTH 290 HEIGHT 30 CAPTION "Закрыть-открыть с задержкой" VALUE .F. FONTNAME "Arial" FONTSIZE 9 END CHECKBOX END WINDOW Maximize window wMain activate window wMain return Nil //-------------------------------- static function FormOpen() if IsWIndowDefined(Form_1) msgbox('Form_1 уже существует') return Nil endif DEFINE WINDOW Form_1 AT 215,347 ; WIDTH 550 ; HEIGHT 300 ; TITLE "New Form" ; CHILD ; FONT "Arial" SIZE 9 END WINDOW activate window Form_1 return Nil //-------------------------------- static function FormClose() if !IsWIndowDefined(Form_1) msgbox('Form_1 не существует') return Nil endif Form_1.Release return Nil //-------------------------------- static function FormCloseOpen() FormClose() if wMain.Check_1.Value Do Events endif FormOpen() return Nil

G-Serge: Очень актуальный аспект, у меня тоже назрело :) Неплохо бы узнать от знатоков общие рекомендации, как избежать ненужной многопоточности, не прибегая к циклам с проверкой существования объекта.


SADSTAR2: Help me pls!!! Всплыла непонятная проблема. В процессе дальнейшей отладки и развития программы вдруг перестало нормально закрываться одно из дочерних окон. Вот кусок кода с отладочными сообщениями function CloseForm() ... if IsWIndowDefined( wObjInsp ) msgbox('wObjInsp.Release()') wObjInsp.Release() do events msgbox(if(!IsWIndowDefined( wObjInsp ), 'wObjInsp Released', 'wObjInsp not Released!!!!')) endif ... Всегда выдает 'wObjInsp not Released!!!!', хотя окно исчезает с экрана. И при повторном выполнении функции OpenForm(p), где создается окно wObjInsp программа выпадает на ошибку - "wObjInsp is already defined" причем не на строке "load window wObjInsp" а на строке "activate window wObjInsp,Form_1" Что могло измениться в коде программы, что бы такое происходило? Я не представляю где искать. Может случайно перекрыл какие нибудь системные имена? Какие? Свежий пример на эту тему. Тут сделал функцию ShowGrid(). Так компиляция затыкалась на ее вызове пока не переименовал в ShowGrid2(). Предполагаю - конфликт с тэгом SHOWGRID в команде DRAW GRAPH IN WINDOW <WindowName>. Думаю - это не логично - путать честную функцию и тэг в команде.

gfilatov: SADSTAR2 пишет: В процессе дальнейшей отладки и развития программы вдруг перестало нормально закрываться одно из дочерних окон. Для помощи в этом случае необходим простой пример, иллюстрирующий проблему (по типу того, что Вы рассматривали в своем первом сообщении). SADSTAR2 пишет: программа выпадает на ошибку - "wObjInsp is already defined" причем не на строке "load window wObjInsp" а на строке "activate window wObjInsp,Form_1" Это нормально, поскольку проверка существования окна выполняется при его активации, а не определении SADSTAR2 пишет: Думаю - это не логично - путать честную функцию и тэг в команде. Это претензии к работе препроцессора компилятора Харбор, а не библиотеки MiniGUI



полная версия страницы