powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
13 сообщений из 13, страница 1 из 1
Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
    #33215904
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леди и джентельмены!
Пример в вопросе, как всегда, постараюсь упростить до минимума.
Имеется форма, в которой пользователь может через txtbox'ы отредактировать выбрнную запись (ControlSourse в них не поля, а приравненные им переменные), либо просто закрыть ее. Это реализовано кнопками ОК и Отмена. Хотелось бы, чтобы кнопка ОК по умолчанию была ENABLED=.f., а становилась =.t. при изменении в любом txtbox. Каков должен быть алгоритм?
Благодарю.
...
Рейтинг: 0 / 0
Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
    #33215934
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в каждом txt.Init() вписать
Код: plaintext
this.Comment=this.Value
в каждом txt.InteractiveChange() пробить
Код: plaintext
thisform.cmdOK.Enabled=this.Value#this.Coment
ЗЫ лутше ессна эти txt в один класс выделить
...
Рейтинг: 0 / 0
Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
    #33216066
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это достаточно сложно, ведь тебе придется проверить факт наличия данных во ВСЕХ TextBox. Т.е. контроль в каком-то одном TextBox - недостаточно. Нужно какое-то синтетическое свойство, которое учитывало бы факт модификации данных во всех TextBox.

Если бы ты использовала буферизацию и прямое редактирование буфера, то все было бы просто.

Т.е. просто во всех TextBox.Valid()

ThisForm.CmdOk.Enabled = NOT EMPTY(ChrTran(GetFldState(-1),"1",""))

А с переменными памяти придется симулировать работу функции GetFldState(). Это целая история:

1) Заводим пропертю формы

ThisForm.strModify = SPACE(10)

здесь число 10 - условно. Надо указать число равное количеству TextBox в твоей форме.

2) На эту пропертю вешается метод ASSIGN в котором примерно такой код

Код: plaintext
1.
2.
3.
4.
*strModify_ASSIGN
LPARAMETERS vNewVal
*To do: Modify this routine for the Assign method
THIS.strModify = m.vNewVal
ThisForm.CmdOk.Enabled = NOT EMPTY(m.vNewVal)

3) Теперь в форме завдим еще один метод, который будет модифицировать эту самую пропертю. Например, ThisForm.MakeModify

Код: plaintext
1.
2.
3.
4.
5.
* MakeModify
LPARAMETERS tnPosition, tlModify
IF m.tnPosition > LEN(ThisForm.strModify)
	ThisForm.strModify = PADR(m.tnPosition)
ENDIF
ThisForm.strModify = STUFF(ThisForm.strModify,m.tnPosition, 1 ,IIF(m.tlModify,"1"," "))

4) Ну, и наконец во всех TextBox.Valid() пишем что-то вроде

ThisForm.MakeModify(1,NOT EMPTY(This.Value))

Здесь первый параметр - это порядковый номер, который следует присвоить данному TextBox. Важно не перепутать. Т.е. чтобы разные TextBox не входили с одинм и тем же параметром. К сожалению, невозможно воспользоваться никаким свойством собственно TextBox. Нет никаких уникальных числовых идентификаторов. Они все уникальны в пределах одного контейнера.

PS:

Может, все-таки откажешся от редактирования через перменные памяти и перейдешь на работу с буферами? Честное слово - это значительно проще во всех смыслах. Работаешь как будто напрямую с полями таблицы, но запись идет не напрямую в таблицу, а в некий буфер. И ты только управляешь фактом сброса данных из этого буфера в исходную таблицу.
...
Рейтинг: 0 / 0
Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
    #33216067
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все бы хорошо, но он выдает на thisform.cmdOK.Enabled=this.Value#this.Coment, что member cmdOK ему не известен. У меня все эти txtbox'ы и кнопки загнаны в свой класс-контейнер, может поэтому и ссылка на объект не проходит (вместо cmdOK, конечно, стоит мое название, несколько раз перепроверяла, синтаксис объекта верен).
...
Рейтинг: 0 / 0
Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
    #33216072
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
thisform.cmdOK.Enabled=(this.Value#this.Coment)
...
Рейтинг: 0 / 0
Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
    #33216077
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛисонькаВсе бы хорошо, но он выдает на thisform.cmdOK.Enabled=this.Value#this.Coment, что member cmdOK ему не известен. У меня все эти txtbox'ы и кнопки загнаны в свой класс-контейнер, может поэтому и ссылка на объект не проходит (вместо cmdOK, конечно, стоит мое название, несколько раз перепроверяла, синтаксис объекта верен).
Ну, так если CmdOk находится в контейнер, то и надо писать всю иерархию

ThisForm.MyConteiner.cmdOk.enabled = ...

Причем это сработает, если MyContainer - это объект на базовом классе "Container".

Если же это объект на базовом классе "Control", то обращение к его вложенным объектам из вне Control в принципе невозможно. Нужно организовывать специальные методы у этого класса Control для модификации реквизитов вложенных объектов и вызывать эти самые методы.
...
Рейтинг: 0 / 0
Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
    #33216084
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛисонькаВсе бы хорошо, но он выдает на thisform.cmdOK.Enabled=this.Value#this.Coment, что member cmdOK ему не известен. У меня все эти txtbox'ы и кнопки загнаны в свой класс-контейнер, может поэтому и ссылка на объект не проходит (вместо cmdOK, конечно, стоит мое название, несколько раз перепроверяла, синтаксис объекта верен).
Все бы хорошо, но с типами буферизации на практике не работала. Это нужно поэксперементировать сначала, а я сейчас все наживую правлю при лимите времени. Да, уважаемый гуру, методику Вы прописали капитальную и навороченную. Над Вашим кодом обязательно посижу еще, разберу построчно.
А вообще сейчас подмала, подумала и решила: сделаю я все Enabled=.f., введу еще одну кнопку Редактировать, только после клика на ней станет Enabled=.t. и пользователь займется изменениями.
Эх, а хотела поизящнее и покрасивее...
Одно слово - женщина
...
Рейтинг: 0 / 0
Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
    #33216117
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМНу, так если CmdOk находится в контейнер, то и надо писать всю иерархию
Причем это сработает, если MyContainer - это объект на базовом классе "Container".
Гм, да, иерархическую азбуку я проморгала, прошу прощения. Базовый класс у меня - контейнер. Но теперь при выполнении строки Thisform.cont_РедБокс.cmd_ОК... неизвестным челном стал cont_РедБокс.
...
Рейтинг: 0 / 0
Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
    #33218108
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Цитирую саму себя.
Лисонька
Гм, да, иерархическую азбуку я проморгала, прошу прощения. Базовый класс у меня - контейнер. Но теперь при выполнении строки Thisform.cont_РедБокс.cmd_ОК... неизвестным челном стал cont_РедБокс.
Вот сейчас сидела разбиралась. Название cont_РедБокс прописано в проперти этого моего класса. А вот окно Locals в Debugger'е дает название cont_РедБокс1. В этом и заключалась у меня ошибка в ссылке на объект.
А почему проперти и дебаггер трактуют это название по разному?
...
Рейтинг: 0 / 0
Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
    #33218187
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛисонькаВот сейчас сидела разбиралась. Название cont_РедБокс прописано в проперти этого моего класса. А вот окно Locals в Debugger'е дает название cont_РедБокс1. В этом и заключалась у меня ошибка в ссылке на объект.
А почему проперти и дебаггер трактуют это название по разному?
Когда ты создаешь класс, то, естесственно, указываешь свойство Name.

НО! На форму ты кладешь не сам класс, а экземпляр этого класса. По сути - другой объект. Естесственно, что его имя (свойство Name), в общем случае, будет отлично от имени самого класса.

А если положишь на форму несколько экземпляров класса? Как отличить один экземпляр от другого? Только по разным именам (свойствам Name).

Вот FoxPro по умолчанию сам и формирует эти имена исходя из того соображения, что в одном контейнере (в данном случае в форме) не может быть 2 объектов с одинаковым свойством Name. Для этого он просто добавляет порядковый номер к значению Name того класса, на основании которого формируется объект.
...
Рейтинг: 0 / 0
Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
    #33218235
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю за разъяснение.
А чтобы подобный казус со ссылками на объект не вышел еще раз: название объекта нужно определять через дебаггер или его можно посмотреть еще где-то (если одинаковых классов на форме куча)?
...
Рейтинг: 0 / 0
Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
    #33218251
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛисонькаБлагодарю за разъяснение.
А чтобы подобный казус со ссылками на объект не вышел еще раз: название объекта нужно определять через дебаггер или его можно посмотреть еще где-то (если одинаковых классов на форме куча)?
Сама себе отвечаю - в форме класс просматривается под использующемся именем. Извините за беспокойство.
...
Рейтинг: 0 / 0
Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
    #33219334
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Лисонька!

Потому что имя класса это одно, а имя объекта - это совсем другое... По
умолчанию фокс новые объекты именует как имя класса + автоинкрементное
число.

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Изменение Value в txtbox и смена ENABLED=.f. на .t. у кнопки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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