powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема с thisform.Release()
18 сообщений из 18, страница 1 из 1
Проблема с thisform.Release()
    #36768387
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!

Столкнулся с такой непоняткой... - мелочь, но неприятно и уже замучало.
Значит есть форма с гридом и на форме есть кнопка "Редактировать", клик() которой вызывает другую форму (Do Form edit). У обоих форм есть классовая кнопка "Выход", в клик() которой прописано thisform.Release().
Теперь, если на форме с гридом нажать кнопку "Редактировать", то по нажатию в форме-редакторе кнопки "Выход" - форма-редактор уничтожается. Все как положено.
Но если в гриде нажать Ентер, то в его KeyPress срабатывает такой код (на nKeyCode = 13):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
			FOR EACH loCtrl IN this.parent.Controls
			  IF (UPPER(m.loCtrl.Class) == 'BTNEDIT' OR UPPER(m.loCtrl.Class) == 'COMMANDBUTTON';
			  AND PEMSTATUS(m.loCtrl,"myGrid_Action", 5 ) AND GETPEM(m.loCtrl,"myGrid_Action"));
			  AND m.loCtrl.Visible AND m.loCtrl.Enabled
				 m.loCtrl.Click()
				 EXIT
			  ENDIF 
			ENDFOR
т.е. ищется кнопка класса 'BTNEDIT' у которой выставлено св-во "myGrid_Action" и если таковая обнаруживается (таки да и это та самая кнопка "Редактировать") то запускается ее клик(). При этом форма-редактор появляется, но кнопка "Выход" тупо не работает, т.е. код thisform.Release() исполняется, но к уничтожению формы это не приводит. Выход тогда возможен только через стандартную кнопку "Закрыть" (которая вызывает QueryUnload).
Такая же картина если на DblClick() грида прописать вызов KeyPress(13), т.е. когда физически сам Ентер не нажимается.
Пробовал выносить m.loCtrl.Click() за тело цикла - не помогает. Пробовал перед этим добавлять NODEFAULT - не помогает.
Интересно - если в KeyPress грида жестко прописать на nKeyCode = 13
Код: plaintext
              this.parent.btnEdit1.Click()
то никаких проблем не возникает.

В чем мб дело?

вфп9
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36768414
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не учел еще одного ньюанса - KeyPress грида на самом деле выглядит немного сложнее:
Код: 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.
LPARAMETERS nKeyCode, nShiftAltCtrl
DO CASE 

   CASE nKeyCode =  13  && Enter
     DO CASE
        * Объект принадлежащий родителю
        CASE PEMSTATUS(this.Parent, "btnEdit", 5 )
           IF this.parent.btnEdit.Visible AND this.parent.btnEdit.Enabled
              this.parent.btnEdit.Click()
           ENDIF
        CASE PEMSTATUS(this.Parent, "btnEdit1", 5 )
           IF this.parent.btnEdit1.Visible AND this.parent.btnEdit1.Enabled
              this.parent.btnEdit1.Click()
           ENDIF
	OTHERWISE
	* Ищем у родителя такую кнопку
		FOR EACH loCtrl IN this.parent.Controls
		  IF (UPPER(m.loCtrl.Class) == 'BTNEDIT' OR UPPER(m.loCtrl.Class) == 'COMMANDBUTTON';
		  AND PEMSTATUS(m.loCtrl,"myGrid_Action", 5 ) AND GETPEM(m.loCtrl,"myGrid_Action"));
		  AND m.loCtrl.Visible AND m.loCtrl.Enabled
			 m.loCtrl.Click()
			 EXIT
		  ENDIF 
		ENDFOR
     ENDCASE


   CASE nKeyCode =  22  && Insert
...
ENDCASE
когда минуту спустя я переписал код вот так:
Код: 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.
LPARAMETERS nKeyCode, nShiftAltCtrl
LOCAL loBtn
DO CASE 

   CASE nKeyCode =  13  && Enter
     DO CASE
        * Объект принадлежащий родителю
        CASE PEMSTATUS(this.Parent, "btnEdit", 5 )
           IF this.parent.btnEdit.Visible AND this.parent.btnEdit.Enabled
*!*	              this.parent.btnEdit.Click()
              loBtn = this.parent.btnEdit
           ENDIF
        CASE PEMSTATUS(this.Parent, "btnEdit1", 5 )
           IF this.parent.btnEdit1.Visible AND this.parent.btnEdit1.Enabled
              loBtn = this.parent.btnEdit1
*!*	              this.parent.btnEdit1.Click()
           ENDIF
	OTHERWISE
	* Ищем у родителя такую кнопку
		FOR EACH loCtrl IN this.parent.Controls
		  IF (UPPER(m.loCtrl.Class) == 'BTNEDIT' OR UPPER(m.loCtrl.Class) == 'COMMANDBUTTON';
		  AND PEMSTATUS(m.loCtrl,"myGrid_Action", 5 ) AND GETPEM(m.loCtrl,"myGrid_Action"));
		  AND m.loCtrl.Visible AND m.loCtrl.Enabled
	              loBtn = m.loCtrl
*!*			 m.loCtrl.Click()
			 EXIT
		  ENDIF 
		ENDFOR
     ENDCASE
    IF VARTYPE(loBtn)="O"
	m.loBtn.Click()
    ENDIF

   CASE nKeyCode =  22  && Insert
...
ENDCASE
то все нормально заработало.

Но все равно вопрос остается открытым и непонятно почему раньше не работало...
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36768427
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет, таки проблема осталась!
просто кнопку находило по ссылке через btnEdit1, когда закаментил этот блок case, то опять та же фуйня...
Я просто не хочу привязываться к названию кнопки, оно мб и btnEdit1 и btnEdit2 и btnEdit и как угодно еще... и не выходит...
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36768448
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверь что есть:
Код: plaintext
local loCtrl 
Закрытие формы не работает если есть переменная-ссылка на объект формы
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36768482
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так в том-то и дело, что проверяю. оно есть ссылка на необходимую кнопку, т.е. btnEdit1, я выводил messagebox(loCtrl.Name) - все честно.
Ссылку на форму не создаю, запуск формы-редактора идет через DO FORM Edit в клике кнопки btnEdit1
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36768484
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аааа, допёр, нету. ща добавлю
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36768495
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!

добавил - все порешилось!

Только непонятно все равно, ведь на стадии цикла форма еще не вызвана, соотв. ссылка на нее в loCtrl не может существовать, тем более что форма не child формы с гридом, а принадлежит среде. Видимо в чем-то другом проблема с этой переменной.
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36768526
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема стандартная. Переменная по умолчанию создается как PRIVATE и доступна во всех внутри вызванных методах и процедурах.

Где-то выше в коде, например в START.PRG - ты ее поюзал, а когда твой код отработал - ссылка осталась в той самой loCtrl и пока ты ее не обнулишь - форма не закрывается.

Возьми за правило в начале Каждого метода/процедуры писать LOCAL ... все локальные переменные.

Из-за этого много мистических вещей в коде бывает, а отловить такие косяки потом очень сложно.
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36768689
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое интересное - я такое давно взял за правило. Давно уже, прямо перед написанием любого кода юзающего какие-либо переменные я первым делом стараюсь описать их сверху как локальные. А именно тут профтыкал. Видишь, даже loBtn - прописал, а за loCtlr как-то забыл почему-то! Вот так всегда В 99 случаях из 100, я это сделал, хотя и без этого там бы проблем бы не было и так, а именно в этом, 1 из 100 - забыл и тут же грабли!
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36768792
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KOСамое интересное - я такое давно взял за правило. Давно уже, прямо перед написанием любого кода юзающего какие-либо переменные я первым делом стараюсь описать их сверху как локальные. А именно тут профтыкал. Видишь, даже loBtn - прописал, а за loCtlr как-то забыл почему-то! Вот так всегда В 99 случаях из 100, я это сделал, хотя и без этого там бы проблем бы не было и так, а именно в этом, 1 из 100 - забыл и тут же грабли!

в фокспро руками локалят переменные неудачники.

из дома вышлю приблуду.
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36768803
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://sql.ru/forum/actualfile.aspx?id=3159115
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36768816
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. прогнать код из приблуды

2. modi command c:\55555

3. в окошке пишем код

Код: plaintext
1.
2.
lcValue = '6666'
lnvalue = 555 

4. скачем вверх

5. тупо пишем

Locals и жмем энтир

6. вуаля
Код: plaintext
1.
2.
3.
4.
5.
LOCAL i, lcValue AS String, lnvalue AS Number


lcValue = '6666'
lnvalue = 555 



с Вас - пузырь
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36768818
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+ locals6
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36768823
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и не пиши м дот - портит ауру.
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36783075
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36783077
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а какой смысл в объявлении типа lcValue AS String, lnvalue AS Number
я понимаю в таких типизированных языках как там делфи, си, ява.
Если б фокс хотя бы соответствующую инициализацию проводил, типа для намберов - 0, для стрингов "", для объектов - нул, а то ему в принципе пох, все равно все инициализирует как .F. Смысл чисто визуальный для чела?
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36783398
CTAC-KOСмысл чисто визуальный для чела?Это для Intellisence. Особенно удобно для объектов.
...
Рейтинг: 0 / 0
Проблема с thisform.Release()
    #36783482
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KOа какой смысл в объявлении типа lcValue AS String, lnvalue AS Number
я у себя поправил LOCALS.PRG чтобы AS только для объектов писал.
он еще не замечает переменные из конструкции TEXT TO lcVar ...
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема с thisform.Release()
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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