Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема с thisform.Release() / 18 сообщений из 18, страница 1 из 1
30.07.2010, 13:22
    #36768387
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с thisform.Release()
Привет!

Столкнулся с такой непоняткой... - мелочь, но неприятно и уже замучало.
Значит есть форма с гридом и на форме есть кнопка "Редактировать", клик() которой вызывает другую форму (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
30.07.2010, 13:33
    #36768414
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с thisform.Release()
не учел еще одного ньюанса - 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
30.07.2010, 13:37
    #36768427
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с thisform.Release()
нет, таки проблема осталась!
просто кнопку находило по ссылке через btnEdit1, когда закаментил этот блок case, то опять та же фуйня...
Я просто не хочу привязываться к названию кнопки, оно мб и btnEdit1 и btnEdit2 и btnEdit и как угодно еще... и не выходит...
...
Рейтинг: 0 / 0
30.07.2010, 13:40
    #36768448
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с thisform.Release()
Проверь что есть:
Код: plaintext
local loCtrl 
Закрытие формы не работает если есть переменная-ссылка на объект формы
...
Рейтинг: 0 / 0
30.07.2010, 13:50
    #36768482
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с thisform.Release()
так в том-то и дело, что проверяю. оно есть ссылка на необходимую кнопку, т.е. btnEdit1, я выводил messagebox(loCtrl.Name) - все честно.
Ссылку на форму не создаю, запуск формы-редактора идет через DO FORM Edit в клике кнопки btnEdit1
...
Рейтинг: 0 / 0
30.07.2010, 13:51
    #36768484
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с thisform.Release()
аааа, допёр, нету. ща добавлю
...
Рейтинг: 0 / 0
30.07.2010, 13:55
    #36768495
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с thisform.Release()
Спасибо!

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

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

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

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

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

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

из дома вышлю приблуду.
...
Рейтинг: 0 / 0
30.07.2010, 15:42
    #36768803
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с thisform.Release()
http://sql.ru/forum/actualfile.aspx?id=3159115
...
Рейтинг: 0 / 0
30.07.2010, 15:46
    #36768816
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с thisform.Release()
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
30.07.2010, 15:47
    #36768818
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с thisform.Release()
+ locals6
...
Рейтинг: 0 / 0
30.07.2010, 15:49
    #36768823
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с thisform.Release()
и не пиши м дот - портит ауру.
...
Рейтинг: 0 / 0
09.08.2010, 22:55
    #36783075
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с thisform.Release()
спасибо
...
Рейтинг: 0 / 0
09.08.2010, 22:58
    #36783077
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с thisform.Release()
а какой смысл в объявлении типа lcValue AS String, lnvalue AS Number
я понимаю в таких типизированных языках как там делфи, си, ява.
Если б фокс хотя бы соответствующую инициализацию проводил, типа для намберов - 0, для стрингов "", для объектов - нул, а то ему в принципе пох, все равно все инициализирует как .F. Смысл чисто визуальный для чела?
...
Рейтинг: 0 / 0
10.08.2010, 09:47
    #36783398
Проблема с thisform.Release()
CTAC-KOСмысл чисто визуальный для чела?Это для Intellisence. Особенно удобно для объектов.
...
Рейтинг: 0 / 0
10.08.2010, 10:27
    #36783482
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с thisform.Release()
CTAC-KOа какой смысл в объявлении типа lcValue AS String, lnvalue AS Number
я у себя поправил LOCALS.PRG чтобы AS только для объектов писал.
он еще не замечает переменные из конструкции TEXT TO lcVar ...
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема с thisform.Release() / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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