On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение



Пост N: 25
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 19.10.07 01:52. Заголовок: баг/фича закрытия-открытия окна


Тут как-то говорили о том, что харбор идет только одним потоком.
Тогда объясните мне следующее явление -
последовательное закрытие-открытие окна без некоторого периода ожидания
приводит к ошибке
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



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 5 [только новые]





Пост N: 26
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 19.10.07 02:11. Заголовок: IsWIndowDefined() vs CHILD


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

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 600
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 19.10.07 10:46. Заголовок: Re:


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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 21
Зарегистрирован: 29.05.06
ссылка на сообщение  Отправлено: 19.10.07 11:38. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 32
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 29.10.07 02:43. Заголовок: Re:


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>.
Думаю - это не логично - путать честную функцию и тэг в команде.



Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 622
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 29.10.07 12:35. Заголовок: Re:


SADSTAR2 пишет:

 цитата:
В процессе дальнейшей отладки и развития программы вдруг перестало нормально закрываться одно из дочерних окон.


Для помощи в этом случае необходим простой пример, иллюстрирующий проблему (по типу того, что Вы рассматривали в своем первом сообщении).

SADSTAR2 пишет:

 цитата:
программа выпадает на ошибку - "wObjInsp is already defined"
причем не на строке "load window wObjInsp"
а на строке "activate window wObjInsp,Form_1"


Это нормально, поскольку проверка существования окна выполняется при его активации, а не определении

SADSTAR2 пишет:

 цитата:
Думаю - это не логично - путать честную функцию и тэг в команде.


Это претензии к работе препроцессора компилятора Харбор, а не библиотеки MiniGUI

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 11
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет