Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Помогите с формами  [new]
Alekcei_dvo
Member

Откуда:
Сообщений: 4
Я еще новичек в foxpro, много не знаю
Пока тренируюсь сделать форму для простой несвязанной таблицы
Почему следущее не работает ?
В процедуре инициализации формы прописываю :
( Я так понимаю, что должно быть при запуске формы )
set deleted on
thisform.text1.enabled=.f.
thisform.text2.enabled=.f.
thisform.text3.enabled=.f.
thisform.text4.enabled=.f. // все текстовые поля нельзя изменять
thisform.command1.enabled=.f.
thisform.command2.enabled=.f.
thisform.command3.enabled=.f.
thisform.command4.enabled=.f.
/*Это первые 4 кнопки навигации- первая, следущая, предыдущая,последняя, по умолчанию считаю что в таблице нет записей, так что они неактивны */
thisform.command8.enabled=.t.// добавить- всегда возможно
thisform.command7.enabled=.f.//Редактировать, неактивно
thisform.command6.enabled=.f.//Удалить , неактивно
do case
/* В случае, если есть одна запись, можем ее редактировать и удалить */
case reccount()=1
thisform.command7.enabled=.t.
thisform.command6.enabled=.t.
case reccount()>1
/* В случае если записей больше можем перейти на следущую и последнюю , редактировать и удалить*/
thisform.command2.enabled=.t.
thisform.command4.enabled=.t.
thisform.command7.enabled=.t.
thisform.command6.enabled=.t.
endcase
thisform.buffermode=2
Когда запускаю, даже если одна запись , все равно кнопки следущая и последняя активны
Тоже самое если нет записей
25 дек 05, 00:46    [2206963]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с формами  [new]
Владимир СА
Member

Откуда:
Сообщений: 7882
Чувствуется, что ты изучал либо C, либо Delphi. Это видно по объявлению строки комментария. В Fox-е обычно это *. Посмотри Help по *; &&.
Команду:
SET DELETED ON
Я обычно оформляю в стартовом файле. Про стартовый файл можно посмотреть в статье Владимира Максимова Главный (стартовый) файл проекта. И вообще почитать его статьи Советы начинающим (Части I-V). И многое, что еще полезного найдешь.
Функция reccount() - возвращает число записей в текущей или заданной таблице. Но значение, возвращаемое функцией RECCOUNT(), не зависит от установок SET DELETED и SET FILTER. Т.е. если ты создал записи в таблице, а потом их удалил, то RECCOUNT() покажет общее количество записей и удаленных тоже. Может быть поэтому у тебя кнопки и активны. Лучше использовать функцию EOF(). Посмотри Help.
25 дек 05, 08:13    [2207081]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с формами  [new]
Alekcei_dvo
Member

Откуда:
Сообщений: 4
Владимир СА
SET DELETED ON
Я обычно оформляю в стартовом файле.

Да, так и сделал
Владимир СА
Функция reccount() - возвращает число записей в текущей или заданной таблице. Но значение, возвращаемое функцией RECCOUNT(), не зависит от установок SET DELETED и SET FILTER. Т.е. если ты создал записи в таблице, а потом их удалил, то RECCOUNT() покажет общее количество записей и удаленных тоже.

А нельзя ли сделать так, чтобы удаленные полностью исчезали и reccount()
возвращался истинное число записей ?
Владимир СА


Лучше использовать функцию EOF().


If eof()
thisform.command7.enabled=.t.
thisform.command6.enabled=.t
else
thisform.command2.enabled=.t.
thisform.command4.enabled=.t.
thisform.command7.enabled=.t.
thisform.command6.enabled=.t.
endif
Так вообще ошибку выдает и вылетает ...
26 дек 05, 01:01    [2207934]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с формами  [new]
Владимир СА
Member

Откуда:
Сообщений: 7882
Alekcei_dvo
А нельзя ли сделать так, чтобы удаленные полностью исчезали и reccount() возвращался истинное число записей ?
Для этого существует команда PACK
SELECT <My_table>
PACK
* Окончательно удаляет все записи, помеченные на удаление
* в текущей таблице
Alekcei_dvo

If eof()
thisform.command7.enabled=.t.
thisform.command6.enabled=.t
else
thisform.command2.enabled=.t.
thisform.command4.enabled=.t.
thisform.command7.enabled=.t.
thisform.command6.enabled=.t.
endif
Так вообще ошибку выдает и вылетает ...
Если хочешь посмотри код примера
LOCAL o_prim as Form
o_prim = CREATEOBJECT("prim1")
o_prim.Show()
READ EVENTS

DEFINE CLASS prim1 AS form

	Height = 240
	Width = 200
	DoCreate = .T.
	AutoCenter = .T.
	Caption = "Пример"
	Name = "Form1"

	ADD OBJECT cmd_add AS commandbutton WITH ;
		Top = 4, ;
		Left = 11, ;
		Height = 27, ;
		Width = 31, ;
		Caption = "Add", ;
		StatusBarText = "Добавить", ;
		TabIndex = 1, ;
		ToolTipText = "Добавить", ;
		Name = "Cmd_add"

	ADD OBJECT cmd_edit AS commandbutton WITH ;
		Top = 4, ;
		Left = 42, ;
		Height = 27, ;
		Width = 31, ;
		Caption = "Edit", ;
		StatusBarText = "Редактировать", ;
		TabIndex = 2, ;
		ToolTipText = "Редактировать", ;
		Name = "Cmd_edit"

	ADD OBJECT cmd_del AS commandbutton WITH ;
		Top = 4, ;
		Left = 73, ;
		Height = 27, ;
		Width = 29, ;
		Caption = "Del", ;
		StatusBarText = "Удалить текущий", ;
		TabIndex = 3, ;
		ToolTipText = "Удалить текущий", ;
		Name = "Cmd_del"

	ADD OBJECT cmd_quit AS commandbutton WITH ;
		Top = 4, ;
		Left = 152, ;
		Height = 27, ;
		Width = 41, ;
		Cancel = .T., ;
		Caption = "Close", ;
		StatusBarText = "Закрыть", ;
		TabIndex = 4, ;
		ToolTipText = "Закрыть", ;
		Name = "Cmd_quit"

	ADD OBJECT shape2 AS shape WITH ;
		Top = 4, ;
		Left = 6, ;
		Height = 0, ;
		Width = 190, ;
		BackStyle = 0, ;
		SpecialEffect = 0, ;
		Name = "Shape2"

	ADD OBJECT shape6 AS shape WITH ;
		Top = 32, ;
		Left = 6, ;
		Height = 0, ;
		Width = 190, ;
		BackStyle = 0, ;
		SpecialEffect = 0, ;
		Name = "Shape6"

	ADD OBJECT shape7 AS shape WITH ;
		Top = 3, ;
		Left = 4, ;
		Height = 30, ;
		Width = 5, ;
		BackStyle = 0, ;
		SpecialEffect = 0, ;
		Name = "Shape7"

	ADD OBJECT shape8 AS shape WITH ;
		Top = 4, ;
		Left = 196, ;
		Height = 28, ;
		Width = 0, ;
		BackStyle = 0, ;
		SpecialEffect = 0, ;
		Name = "Shape8"

	ADD OBJECT grid1 AS grid WITH ;
		DeleteMark = .F., ;
		Height = 199, ;
		Left = 6, ;
		ReadOnly = .T., ;
		RecordSource = "My_cur1", ;
		TabIndex = 5, ;
		Top = 36, ;
		Width = 188, ;
		Name = "Grid1"

	PROCEDURE Unload
		USE IN My_cur1
		CLEAR EVENTS
	ENDPROC

	PROCEDURE Load
		CREATE CURSOR My_cur1 ;
		  (n_recno I, c_name C(10))

		FOR i=1 TO 10
		  INSERT INTO My_cur1 ;
		      (n_recno, c_name);
		    VALUES ;
		      (i, SYS(2015))
		ENDFOR
		GO TOP IN My_cur1
	ENDPROC

	PROCEDURE Activate
		IF !EOF("My_cur1")
		  THIS.Cmd_edit.Enabled = .T.
		  THIS.Cmd_del.Enabled  = .T.
		ELSE
		  THIS.Cmd_edit.Enabled = .F.
		  THIS.Cmd_del.Enabled  = .F.
		ENDIF
	ENDPROC

	PROCEDURE Init
		IF !EOF("My_cur1")
		  THIS.Grid1.SetFocus()
		ENDIF
	ENDPROC

	PROCEDURE cmd_quit.Click
		THISFORM.Release()
	ENDPROC

ENDDEFINE
Запусти сначала эту программу, а затем закоментируй в процедуре LOAD
	PROCEDURE Load
		CREATE CURSOR My_cur1 ;
		  (n_recno I, c_name C(10))

*		FOR i=1 TO 10
*		  INSERT INTO My_cur1 ;
*		      (n_recno, c_name);
*		    VALUES ;
*		      (i, SYS(2015))
*		ENDFOR
*		GO TOP IN My_cur1
	ENDPROC
и запусти снова. Обрати внимание на процедуру Activate. Проанализируй.
26 дек 05, 08:29    [2208147]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с формами  [new]
Владимир СА
Member

Откуда:
Сообщений: 7882
Вот еще пример, там есть навигационные кнопки, но их Enabled = .F. при одной или крайних записях, я считаю, неследует. Скопируй форму и в окне Command запусти форму:
DO FORM form2.scx


К сообщению приложен файл (Forms2_.rar - 2Kb) cкачать
26 дек 05, 12:42    [2209071]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить