powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
18 сообщений из 18, страница 1 из 1
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35062524
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!

Собственно вопрос - если установить на форме кнопке ("Выход") свойство CANCEL (.Т.), то при нажатии ESC будет автоматом нажиматься эта кнопка.
А есть ли стандартный способ узнать была ли эта кнопка нажата? Или это только ручными методами можно расписать, к примеру создать класс? Это нужно для некоторых объектов - на их дестрое от того была нажата кнопка CANCEL или нет зависит дальнейшее действие.

вфп9

спасибо!
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35062648
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lastkey() = 27
но тут подводные камни при работе клавой и мышей одновременно.

Проще свойство-флаг завести и в форме KeyPress() прописать
Код: plaintext
1.
2.
3.
if nKeyCode =  27 
   thisform.lEscapeFlag = .T. && Устанавливаем флаг для игнориривания ошибок
   thisform.CmdClose.Click()
endif
thisform.lEscapeFlag = .T. на QueryUnload() (это закрытие окна крестиком) можно прописать
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35063678
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нажатие Esc вызовет именно нажатие кнопки со свойством Cancel=.T. Разумеется, программное. Т.е. нажатие кнопки произойдет в любом случае, просто оно может предваряться нажатием Esc.

Поэтому, не вполне понятна необходимость как-то различать эти режимы. Все события будут одинаковыми. Собственно, Esc в данном случае, интерпретируется как "горячая клавиша" для нажатия кнопки.

Если Вы пытаетесь реализовать различную функциональность при разном способе "нажатия" кнопки, то это не лучший путь. Вы скорее получите дополнительные проблемы. Причем не в смысле программирования, а с пользователями. Они будут задавать вполне резонные вопросы: почему получается разный результат при выполнении одних и тех же действий?
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35063902
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функциональность следующая:
юзеру выводицо форма, на ней текстбоксы. Один из них Имя. На его методе Release я пытаюсь пополнять бд имен, если введено какое-то новое. Но если юзер наберет в этом текстбоксе какой-нить бред и затем тупо нажмет Выход (неважно как, мышкой, клавой, но именно кнопку с CANCEL(.T.)) то бд имен будет обновлена этим бредом, а я этого не хочу.

Выходит что ради такого функционала необходимо добавлять форме содержащей такой текстбокс пропертя типа CancelPressed и потом его обрабатывать - в клике кнопы Выхода ставить туды .Т. либо создать класс формы с таким свойством и кнопкой - вроде как не помешает в любом случае... Если добавлять в ините текстбокса (что по ходу мне все равно не подходит), то как уследить за тем чтобы не попытаццо добавить такое св-во форме несколько раз, т.к. таких текстбоксов может быть не 1 на одной форме? Короче либо класс формы, либо на ините формы добавлять пропертя, а тексбоксы научить это св-во проверять перед апдейтом...
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35063911
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, забыл добавить, у формы 2 кнопки - первая Применить/Записать а вторая Выход. Обе заканчиваются одной строчкой Thisform.Release после чего срабатывает метод Release и у всех объектов формы. Поэтому-то и важно что нажал юзер - Выход или Применить. А заранее я не знаю сколько на форме объектов типа текстбокса Имя чтобы прописать это в кнопке Применить
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35063995
BlackFoxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"CTAC-KO" <nospam@sql.ru>; wrote in message news:5157067@sql.ru...
Автор: CTAC-KO
да, забыл добавить, у формы 2 кнопки - первая Применить/Записать а вторая
Выход. Обе заканчиваются одной строчкой Thisform.Release после чего
срабатывает метод Release и у всех объектов формы. Поэтому-то и важно что
нажал юзер - Выход или Применить. А заранее я не знаю сколько на форме
объектов типа текстбокса Имя чтобы прописать это в кнопке Применить

Так не делается. Для чего тогда кнопка Применить ? Вот в ней и надо делать
обновление базы с выходом, а в кнопке Выход - откат всех значений. Тогда и
проблем таких не будет.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35064039
fm32yo______
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
никогда так не делал..
на кнопке ВЫХОД просто релиз и все - форма закрылась..
а на кнопке применить - пошли задачи по вводу того, что на форме в БД...
если применить не нажали - то ничего в БД и не изменится... вот и все дела....
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35064069
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, Вам уже "намекнули", что "Выход" - это выход БЕЗ сохранения. Не важно, что там пользователь наизменял. Откат изменений - и все.

В Вашей же постановке я по прежнему не вижу смысла. Ну, научились Вы как-то различать, что пользователь нажал именно Esc (проще всего для этого присвоить Cancel=.T. не кнопке "Выход", а кнопке "Применить"). А как Вы определите, что пользователь ввел "не бред" и этот "не бред" надо записать в базу?

Процесс сохранения - это довольно сложный и не однозначный процесс. Требует множества проверок и условностей. Возможен диалог с пользователем. Вешать этот процесс на событие уничтожения , как минимум, не осмотрительно! А вдруг пользователь решил уточнить значение? А Вы уже уничтожили объект, где он мог бы ввести исправления. Ведь отменить действие Release невозможно.
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35064110
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А не проще на queryunload повесить

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
WITH this 
	IF .checkchanges()
		lnAns=MESSAGEBOX('Сохранить изменения?', 3 + 32 ,'Выход')
		DO CASE
			CASE lnAns= 6 
				llCheck=.check()
				IF !llCheck
					NODEFAULT 
				ELSE 
					.mysave()
					.Release()
				ENDIF 	
			CASE lnAns= 7 
				.Release()
			OTHERWISE 
				NODEFAULT 
		ENDCASE  
	ELSE 
		.Release()
	ENDIF 

ENDWITH 

, на keypress формы
Код: plaintext
1.
2.
IF nKeyCode= 27 
	this.QueryUnload()
ENDIF 	
и у формы поставить keyprewiev=.t.
Вот и получаешь при нажатии эскейпа взов кверианлоад, а там уж проверяй в отдельном методе, для начала, вносились ли изменения в инфу на форме (checkchanges()) , корректно ли введена инфа (check()). Если правильно - сохраняй резы (mysave()) и выходи. Что еще нужно? Зачем придумывать велосипед?
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35064133
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, не, не!!! Вы все неправильно меня поняли. Вернее не совсем правильно!!! Это, безусловно, моя проблема...
Все правильно, вопрос поставлен именно из-за нежелания изобретать велик, еси он уже...

Знач дело вот в чем - есть тектбокс Имя. Если пользователь нажал кнопку Применить, то в соотв. базы происходит заполнение всяких полей из текстбоксов, в том числе Имя. Но!!! Есть ОТДЕЛЬНАЯ БАЗА ИМЕН!!! Я туда пытаюсь какбы справочник заливать. Типа чел на вводе набирает Анд а ему предлагается ввести Андрей (а чтоб такое было возможно необходимо внести в этот справочник такое имя). А это означает существование справочника имен (фамилий, отчеств, городов, стран, улиц и тд)! Именно его я хочу на методе Release заполнять или не заполнять, отдельно от тех заполнений бд что идут по кнопке Применить. Именно потому и важно что выбрал юзер - Применить или Выход. Еси Применить, то ясно что на Release текстбокса его справочник необходимо обновить если данные новы.
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35064135
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и собственно весь сыр-бор из-за чего?
Я подумал так - раз есть такое св-во для кнопки как CANCEL то может быть есть и какой-то метод или системная переменная которые помогут определить сработало ли это самое CANCEL?
т.е. по ходу исключить создание велосипеда.
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35064160
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну ты даешь! :) Че ж сразу не объяснить по-русски :)

Вот и сделай себе на кейпрес формы
Код: plaintext
1.
2.
3.
4.
IF nKeyCode= 27 
        this.savetoarh()
	this.QueryUnload()
ENDIF

Здесь savetoarh() - это сохранение всех новых записей в твой архив или справочник, как хочешь, так и называй. А уже в этом методе формы для начала пробегись по всем нужным контролам на форме (типа for each ocontrol in thisform.objects), а потом проверяй есть уже такое значение в справочнике или нет. После чего или добавляй в отдельном методе или нет.
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35064221
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KOВсе правильно, вопрос поставлен именно из-за нежелания изобретать велик, еси он уже...
Извини, но все же твой вопрос читается "Как сделать велик не как все"

CTAC-KOЗнач дело вот в чем - есть тектбокс Имя. Если пользователь нажал кнопку Применить, то в соотв. базы происходит заполнение всяких полей из текстбоксов, в том числе Имя. Но!!! Есть ОТДЕЛЬНАЯ БАЗА ИМЕН!!! Я туда пытаюсь какбы справочник заливать. ...
Какая разница где что хранится. Сохраняться надо по кнопке "Применить/Сохранить", а не в методе Release()
Если текстбокс у тебя на основе своего класса, то сделай ему метод Save(), а далее несколько вариантов:
1. Дописать в кнопке "сохранить" на форме:
Код: plaintext
1.
thisform.txtName.Save()
return dodefault()

2. Если хочешь один раз написать и забыть сделай в базовом классе формы метод SaveAll(), который вызовает метод Save() каждому объекту, который есть на форме. Метод SaveAll() вызывай из кнопки сохранить.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
PROC Form.SaveAll()
lpara toObj
local loC
if empty(toObj)
	toObj = thisform
endif
if pemstatus(toObj, 'Save',  5 )
	toObj.Save()
endif
do case
	case pemstatus(toObj, 'Controls',  5 )
		for each loC in toObj.Controls
			this.SaveAll(loC)
		endfor
	case pemstatus(toObj, 'Pages',  5 )
		for each loC in toObj.pages
			this.SaveAll(loC)
		endfor
	case pemstatus(toObj, 'Buttons',  5 )
		for each loC in toObj.Buttons
			this.SaveAll(loC)
		endfor
endcase
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35065165
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T CTAC-KOВсе правильно, вопрос поставлен именно из-за нежелания изобретать велик, еси он уже...
Извини, но все же твой вопрос читается "Как сделать велик не как все"
та да, есь маленько, но в сабже коротко и ясно вроде... :)

Короче как я понял вшитого велика нету, знач изобретаем свой. Решил просто все формы заменить на свою_классовую со свойством Canceled и кнопкой Выход в которой на клике свойство формы Canceled становиццо .Т. Ну а в классе текстбокса на дестрое обновляю справочнег только еси Canceled не тру :)
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35065617
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KOКороче как я понял вшитого велика нету, знач изобретаем свой. Решил просто все формы заменить на свою_классовую со свойством Canceled и кнопкой Выход в которой на клике свойство формы Canceled становиццо .Т. Ну а в классе текстбокса на дестрое обновляю справочнег только еси Canceled не тру :)
Тебе ВладимирМ уже писал, но я повторю: ты идеологически неправильное решение выбрал, поэтому и легкого решения не получается.
Два способа:
Твой: Запретить сохранение в текстбоксе отовсюду, кроме кнопки "сохранить"
Правильный: Сохранить в текстбоксе при нажатии кнопки "сохранить"
Чувствуешь разницу?

Стоить тебе пропустить одно место для установки флага и твоя прога начнет неправильно работать, а ты об существовании этого способа отработки Destroy() можешь даже не догадываться, а юзер придумает "неправильную" комбинацию действий, и скажет прога кривая. И прав будет.
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35066437
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К моему сожалению, мой метод решения поимел один минус. Я хотел по-любому избавиться от необходимости что-либо вносить в код кнопки Применить, если на форме присутствуют такие текстбоксы...

Минус заключается в нажатии на стандратную кнопку закрытия формы (или CTRL-F4). Тогда кнопка со свойством CANCEL "не срабатывает". В итоге я записую в бд текстбоксов бред, т.к. соотв. свойство формы Canceled никто не изменяет на .Т. ...

Пришлось установить форме изначально свойство Canceled = .T. и только в коде кнопки Применить изменять его на .F.

Так что в итоге можно было не изгаляццо (выдумывать велик), а юзать предложенное мне Вами :), особенно SaveAll
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35066466
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KOТак что в итоге можно было не изгаляццо (выдумывать велик)...
Изгаляцо можно, даже нужно. Для общего развития. Только потом (со временем) понимаешь что ерунда получилась.
Проверено, сам таким был :) Долго по началу не понимал зачем умные дядьки в книжках такую "ерунду" написали когда в десять раз проше все делается.
...
Рейтинг: 0 / 0
У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
    #35067751
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KO
Минус заключается в нажатии на стандратную кнопку закрытия формы (или CTRL-F4). Тогда кнопка со свойством CANCEL "не срабатывает". В итоге я записую в бд текстбоксов бред, т.к. соотв. свойство формы Canceled никто не изменяет на .Т. ...
от йолы-палы ! Ну написали же ш Вы мне в первом же ответе про QueryUnload, а я теперь тут жаловаццо давай про "стандратную кнопку закрытия формы (или CTRL-F4)"... Вот и решен вопрос с минусом и в Применить ничего теперь не надо вписывать.

А про изгаляццо - это да, я всегда стараюсь не просто взять что-то предложенное, но и попробовать создать что-то альтернативное, типа почему предложено так, а не эдак, если мне это сразу не понятно.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / У кнопок есть св-во CANCEL. А есть ли стандартный способ узнать что она была нажата?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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