Ответы на некоторые вопросы, связанные с созданием баз данных в MS Visual Fox Pro:
Подскажите пожалуйста как создать в Visal Fox Pro. Заблокировать вход в форму (чтобы никто не мог попасть без пароля).
1. Создайте таблицу с названием users.dbf с полями userid,
password, level
2. Создайте форму, назовите ее login, в Data Environment
добавьте таблицу users
3. В ней создайте 2 текстовых поля txtUserName и txtPassword
(свойство Name в Prorerties), рядом напишите, что это имя
пользователя и пароль.
4. Поместите в форму 2 кнопки - ОК и Выход
5. В кнопке ОК разместите следующий код
public usid
LOCATE FOR UPPER(users.userid) = UPPER(ALLTRIM(THISFORM.txtUserName.Value))
IF FOUND() AND ALLTRIM(password) == ALLTRIM(THISFORM.txtPassword.Value)
usid=UPPER(ALLTRIM(THISFORM.txtUserName.Value))
nAL=1
lev=ALLTRIM(users.level)
THISFORM.cUser = ALLTRIM(users.userid)
THISFORM.Release
ELSE
#DEFINE MISMATCH_LOC "паpоль не веpен."
WAIT WINDOW MISMATCH_LOC TIMEOUT 1.5
THISFORM.txtUserName.Value = ""
THISFORM.txtPassword.Value = ""
THISFORM.txtUserName.SetFocus
ENDIF
6. В кнопке Выход разместите следующий код
nAL=0
THISFORM.cUser = ""
THISFORM.Release
7. При запуске программы (например в файле main.prg)
разместите
следующий код
IF USED("login")
SELECT users
ELSE
USE users IN 0
ENDIF
nAL = 0
DO FORM login
if nAL = 0
QUIT
ENDif
Все.
Скачать исходник входа по паролю
Интересно как добавлять фото из разных
папок, а потом их смотреть в формах?
1. Создаем форму
2. Создаем таблицу table1 с полем foto тип character, длина
254
В этой таблице будем хранить путь к файлу.
2. Размещаем в форме четыре элемента Grid1 и Image1 и две
кнопки Button1 и Button2
На событие Init для Image1 вставляем код
public aa
select table1
aa=table1.foto
thisform.image1.picture=aa
Первая кнопка для добавления записи в таблицу - вставляем
код:
select table1
APPEND BLANK
THISFORM.GRID1.SetFocus
THISFORM.GRID1.REFRESH
вторая для занесения в таблицу пути к файлу фотки:
CREATE CURSOR textfile (filename c(254),mem m)
APPEND BLANK
REPLACE textfile.FileName WITH GETFILE("JPG")
IF EMPTY(textfile.FileName)
RETURN
ENDIF
aa=alltrim(textfile.FileName)
select table1
replace table1.foto with aa
thisform.image1.picture=aa
thisform.refresh
На событие AfterRowColChange в таблице вставляем следующий
код
select table1
aa=table1.foto
thisform.image1.picture=aa
thisform.refresh
При переходе в таблице со строки на строку в Image1 будут
отображаться фотки.
Скачать исходник привязки фото
1) Как мне в форме типа grid сделать
возможность сортировки данных по столбцам (когда кликаешь на
заголовок столбца он сортирует данные по нему, когда по
другому - сортирует по нему)?
2) Как мне в той же форме сделать переход на другую форму
(как в вашей программе входящие/исходящие сделан переход к
карточке документа)?
1) Как мне в форме типа grid сделать возможность
сортировки данных по столбцам (когда кликаешь на заголовок
столбца он сортирует данные по нему, когда по другому -
сортирует по нему)?
есть таблица table1 с полями n1, n2, n3
в project manager ставите курсор на таблицу и нажимаете
modify, откроется table designer , в закладке indexes
добавляете три индекса типа regular с любыми именами и в
поле expression привязываете к ним поля n1, n2 и n3
В форме привязываете grid1 к table1 и выбираете поля n1, n2
и n3
В header каждой колонки на событие Click вписываете код
select table
set order to A
thisform.grid1.refresh
где A - это цифры 1, 2 или 3 (у нас 3 индекса)
Номер индекса определяется по порядку сверху внииз в
закладке indexes в table designer и должен сответствовать
полю grid1
2) Как мне в тойже форме сделать переход на другую форму
(как в вашей программе входящие/исходящие сделан переход к
карточке документа)?
В grid1 в каждый column в text1 на DblClk вставляем код
public nomrec
select table1
nomrec=recno()
do form karta
где karta - загружаемая карточка
в карточке текстовые поля через билдер привязываем к полям
n1, n2 и n3
На Load формы karta ставим код
select table1
goto nomrec
1) Как мне сделать поле в форме
заполняемым из "справочника"?
2) У меня очень примитивно получается организовать поиск по
базе (мне приходится делать кнопку поиска и поле ввода для
каждого столбца отдельно). Как мне можно улучшить поиск?
по 1.
Есть поле Textbox1, привязанное к полю n1 таблицы t1
Его надо заполнить из справочника.
Создаете таблицу spr с полем p1
Создаете форму sprav в нее вставляете таблицу spr
в Textbox1 на событие Click ставите код
public nrec
select t1
nrec=recno()
do form sprav
В форме sprav делаете кнопку "вставить",
в нее пишете следующий код
select t1
goto nrec
replace t1.n1 with spr.p1
thisform.release
При нажатии на текстовое поле будет открываться справочник,
при выборе записи и нажатии на кнопку "вставить" текстовое
поле будет заполняться значением из справочника.
по 2. Можно сделать combo box , в котором можно будет
выбрать, по какому полю производится поиск.
Мне необходимо экспортировать данные из
двух реляционных таблиц. Выходной документ должен
представлять собой некое подобие школьного журнала. Мне
необходимо внести нанные из БД в ячейки таблицы в word'е.
Подскажите как это сделать.
Пример формирования таблички спецификации в ворде
данные берутся из таблицы table1
#DEFINE cr CHR(13)
********************************************
oWord = CreateObject("Word.Application")
oWord.Visible = .t.
oDocument = oWord.Documents.Add()
oRange = oWord.ActiveDocument.Range()
oRange.InsertAfter(cr)
counter=1
oRange.MoveEnd(6)
oRange.Collapse(0)
oTable = oWord.ActiveDocument.Tables.Add(oRange, 1, 7)
WITH oTable
select table1
m=2
.Cell[m-1,1].Range.InsertAfter("Наименование продукции")
.Cell[m-1,1].Borders(1).LineStyle = 1
.Cell[m-1,1].Borders(2).LineStyle = 1
.Cell[m-1,1].Borders(3).LineStyle = 1
.Cell[m-1,1].Borders(4).LineStyle = 1
.Cell[m-1,1].VerticalAlignment = 1
.Cell[m-1,2].Range.InsertAfter("Единица измерения")
.Cell[m-1,2].Borders(1).LineStyle = 1
.Cell[m-1,2].Borders(2).LineStyle = 1
.Cell[m-1,2].Borders(3).LineStyle = 1
.Cell[m-1,2].Borders(4).LineStyle = 1
.Cell[m-1,2].VerticalAlignment = 1
.Cell[m-1,3].Range.InsertAfter("Количество")
.Cell[m-1,3].Borders(1).LineStyle = 1
.Cell[m-1,3].Borders(2).LineStyle = 1
.Cell[m-1,3].Borders(3).LineStyle = 1
.Cell[m-1,3].Borders(4).LineStyle = 1
.Cell[m-1,3].VerticalAlignment = 1
.Cell[m-1,4].Range.InsertAfter("Цена без НДС")
.Cell[m-1,4].Borders(1).LineStyle = 1
.Cell[m-1,4].Borders(2).LineStyle = 1
.Cell[m-1,4].Borders(3).LineStyle = 1
.Cell[m-1,4].Borders(4).LineStyle = 1
.Cell[m-1,4].VerticalAlignment = 1
.Cell[m-1,5].Range.InsertAfter("Общая сумма без НДС")
.Cell[m-1,5].Borders(1).LineStyle = 1
.Cell[m-1,5].Borders(2).LineStyle = 1
.Cell[m-1,5].Borders(3).LineStyle = 1
.Cell[m-1,5].Borders(4).LineStyle = 1
.Cell[m-1,5].VerticalAlignment = 1
.Cell[m-1,6].Range.InsertAfter("НДС (18%)")
.Cell[m-1,6].Borders(1).LineStyle = 1
.Cell[m-1,6].Borders(2).LineStyle = 1
.Cell[m-1,6].Borders(3).LineStyle = 1
.Cell[m-1,6].Borders(4).LineStyle = 1
.Cell[m-1,6].VerticalAlignment = 1
.Cell[m-1,7].Range.InsertAfter("Общая сумма,включая НДС")
.Cell[m-1,7].Borders(1).LineStyle = 1
.Cell[m-1,7].Borders(2).LineStyle = 1
.Cell[m-1,7].Borders(3).LineStyle = 1
.Cell[m-1,7].Borders(4).LineStyle = 1
.Cell[m-1,7].VerticalAlignment = 1
.Cell[m-1,1].Range.font.size=8
.Cell[m-1,2].Range.font.size=8
.Cell[m-1,3].Range.font.size=8
.Cell[m-1,4].Range.font.size=8
.Cell[m-1,5].Range.font.size=8
.Cell[m-1,6].Range.font.size=8
.Cell[m-1,7].Range.font.size=8
.Cell[m-1,1].width=140
.Cell[m-1,2].width=60
.Cell[m-1,3].width=40
.Cell[m-1,4].width=60
.Cell[m-1,5].width=60
.Cell[m-1,6].width=60
.Cell[m-1,7].width=60
ENDWITH
oRange.MoveEnd(6)
oRange.MoveEnd(6)
oRange.Collapse(0)
WITH oTable
public colli, m
colli=reccount()
public xx
for i=1 to colli
select table1
goto i
.Rows.Add()
.Cell[m+1,1].Range.InsertAfter(alltrim(table1.namprod))
.Cell[m+1,1].VerticalAlignment = 1
.Cell[m+1,2].Range.InsertAfter(alltrim(table1.edizm))
.Cell[m+1,2].VerticalAlignment = 1
.Cell[m+1,3].Range.InsertAfter(alltrim(str(int(table1.kolvo))))
.Cell[m+1,3].VerticalAlignment = 1
.Cell[m+1,4].Range.InsertAfter(alltrim(str(int(table1.cena))))
.Cell[m+1,4].VerticalAlignment = 1
.Cell[m+1,5].Range.InsertAfter(alltrim(str(int(table1.obsbn))))
.Cell[m+1,5].VerticalAlignment = 1
.Cell[m+1,6].Range.InsertAfter(alltrim(str(int(table1.ndds)))
)
.Cell[m+1,6].VerticalAlignment = 1
.Cell[m+1,7].Range.InsertAfter(alltrim(str(int(table1.summ))))
.Cell[m+1,7].VerticalAlignment = 1
.Cell[m+1,1].Range.font.size=8
.Cell[m+1,2].Range.font.size=8
.Cell[m+1,3].Range.font.size=8
.Cell[m+1,4].Range.font.size=8
.Cell[m+1,5].Range.font.size=8
.Cell[m+1,6].Range.font.size=8
.Cell[m+1,7].Range.font.size=8
.Cell[m+1,1].width=140
.Cell[m+1,2].width=60
.Cell[m+1,3].width=40
.Cell[m+1,4].width=60
.Cell[m+1,5].width=60
.Cell[m+1,6].width=60
.Cell[m+1,7].width=60
m=m+1
endif
endfor
ENDWITH
oRange.MoveEnd(6)
Скачать исходник
экспорта таблицы в Word
Скачать исходник
экспорта таблицы в Excel
Как создать в таблице поле в котором
будет отображаться только время, без даты.
Как создать в таб. поле, которое бы выдавало записи
уникальный, единственный и не повторимый номер.
--> Как создать в таблице поле в котором будет
отображаться только время, без даты.
1-й вариант:
Создаете в таблице TABLE1 поле VREMJA тип Character
при создании записи пишете туда текущее время
replace table1.vremja with left(right(alltrim(ttoc(datetime())),
8),5)
2-й вариант
Создаете в таблице TABLE1 поле VREMJA тип DateTime, в него
будет вводится дата-время
В Grid добавляете колонку, и для нее пишете ControlSource
left(right(alltrim(ttoc(table1.vremja)), 8),5)
В таблице будет отображаться только время от даты-времени,
введенной в table1.vremja
--> Как создать в таб. поле, которое бы выдавало записи
уникальный, единственный и не повторимый номер.
Как вариант: делается счетчик, и при добавление записи в
таблицу в поле типа Numeric добавляется уникальное значение
счетчика.
Пример реализации счетчика можно посмотреть по адресу
https://www.araxgroup.ru/lesson1/les85.htm
столкнулся со следующей проблемой.
есть форма, в которой вводятся символьные данные. далее эти
данные передаются с помощью gather в таблицу. потом эта
таблица выводится на экран с помощью browse.
так вот, некоторые русские буквы введенные в форму почемуто
какимто образом меняются на англиские и записываются в
таблицу.
версия: VFP 8.
ктонить с этим сталкивался? если да, то почему это
происходит и как эту проблему решить?
Надо создать текстовый файл, дать ему имя и расширение
config.fpw а внутри написать
codepage=1251
кладем его в директорию с проектом,а впоследствии с
экзешником.
По первой части вопроса: можно сделать по разному, вопрос, что именно надо получить.
Можно на init делать выборку в представление (view)
select view
USE base!view
, а на событи activate другой формы подкачивать записи и thisform.refresh.
Хотелось в своей Б.Д. сделать
возможность быстрого доступа к калькулятору или
Web-страничке. Например, из пунка главного меню.
по первой части вопроса
создаете пункт меню, тип command, рядом пишите do calc.prg
ниже код, который должен быть в calc.prg
*DEFINE PAD Calculator OF _MSYSMENU PROMPT "\<Calculator"
KEY ALT+C
*ON SELECTION PAD Calculator OF _MSYSMENU DO NewCalculator
IN Calc.prg
*PROCEDURE NewCalculator
PRIVATE oCalculator
oCalculator = CreateObject("Calculator")
oCalculator.Show
*ENDPROC
DEFINE CLASS Calculator AS Form
BackColor = 12632256 && Gray
Borderstylе = 1 && Single line
Caption = "Калькулятор"
FontName = "MS Sans Serif"
FontSize = 12
MaxButton = .F. && No maximizable
ScaleMode = 3 && Pixels
Height = 179
Left = 153
Top = 68
Width = 160
Value = SPACE(80)
Self = .NULL.
Enter = .F. && Свойство, которое будет определять готовность
калькулятора
PROCEDURE Init
THIS.Self = THIS
ENDPROC
PROCEDURE Activate
SET CURSOR OFF
ENDPROC
PROCEDURE Deactivate
SET CURSOR ON
ENDPROC
ADD OBJECT ExpressionBox AS TextBox ;
WITH BackColor = 12632256, ;
FontName = "MS Sans Serif", ;
FontSize = 8, ;
Height = 25, ;
Left = 14, ;
Top = 25, ;
Width = 131
ADD OBJECT Button1 AS CalculatorButton ;
WITH Caption = "{", ;
Height = 23, ;
Left = 7, ;
Top = 65, ;
Width = 24
ADD OBJECT Button2 AS CalculatorButton ;
WITH Caption = "7", ;
Height = 23, ;
Left = 31, ;
Top = 65, ;
Width = 24
ADD OBJECT Button3 AS CalculatorButton ;
WITH Caption = "8", ;
Height = 23, ;
Left = 55, ;
Top = 65, ;
Width = 24
ADD OBJECT Button4 AS CalculatorButton ;
WITH Caption = "9", ;
Height = 23, ;
Left = 79, ;
Top = 65, ;
Width = 24
ADD OBJECT Button5 AS CalculatorButton ;
WITH Caption = "/", ;
Height = 23, ;
Left = 103, ;
Top = 65, ;
Width = 24
ADD OBJECT Button6 AS CalculatorButton ;
WITH Caption = '"', ;
Height = 23, ;
Left = 127, ;
Top = 65, ;
Width = 24
ADD OBJECT Button7 AS CalculatorButton ;
WITH Caption = "}", ;
Height = 23, ;
Left = 7, ;
Top = 91, ;
Width = 24
ADD OBJECT Button8 AS CalculatorButton ;
WITH Caption = "4", ;
Height = 23, ;
Left = 31, ;
Top = 91, ;
Width = 24
ADD OBJECT Button9 AS CalculatorButton ;
WITH Caption = "5", ;
Height = 23, ;
Left = 55, ;
Top = 91, ;
Width = 24
ADD OBJECT Button10 AS CalculatorButton ;
WITH Caption = "6", ;
Height = 23, ;
Left = 79, ;
Top = 91, ;
Width = 24
ADD OBJECT Button11 AS CalculatorButton ;
WITH Caption = "*", ;
Height = 23, ;
Left = 103, ;
Top = 91, ;
Width = 24
ADD OBJECT Button12 AS CalculatorButton ;
WITH Caption = "%", ;
Height = 23, ;
Left = 127, ;
Top = 91, ;
Width = 24
ADD OBJECT Button13 AS CalculatorButton ;
WITH Caption = "(", ;
Height = 23, ;
Left = 7, ;
Top = 117, ;
Width = 24
ADD OBJECT Button14 AS CalculatorButton ;
WITH Caption = "1", ;
Height = 23, ;
Left = 31, ;
Top = 117, ;
Width = 24
ADD OBJECT Button15 AS CalculatorButton ;
WITH Caption = "2", ;
Height = 23, ;
Left = 55, ;
Top = 117, ;
Width = 24
ADD OBJECT Button16 AS CalculatorButton ;
WITH Caption = "3", ;
Height = 23, ;
Left = 79, ;
Top = 117, ;
Width = 24
ADD OBJECT Button17 AS CalculatorButton ;
WITH Caption = "-", ;
Height = 23, ;
Left = 103, ;
Top = 117, ;
Width = 24
ADD OBJECT Button18 AS CalculatorButton ;
WITH Caption = "C", ;
Height = 23, ;
Left = 127, ;
Top = 117, ;
Width = 24, ;
Cancel = .T.
ADD OBJECT Button19 AS CalculatorButton ;
WITH Caption = ")", ;
Height = 23, ;
Left = 7, ;
Top = 143, ;
Width = 24
ADD OBJECT Button20 AS CalculatorButton ;
WITH Caption = "0", ;
Height = 23, ;
Left = 31, ;
Top = 143, ;
Width = 24
ADD OBJECT Button21 AS CalculatorButton ;
WITH Caption = ".", ;
Height = 23, ;
Left = 55, ;
Top = 143, ;
Width = 24
ADD OBJECT Button22 AS CalculatorButton ;
WITH Caption = "^", ;
Height = 23, ;
Left = 79, ;
Top = 143, ;
Width = 24
ADD OBJECT Button23 AS CalculatorButton ;
WITH Caption = "+", ;
Height = 23, ;
Left = 103, ;
Top = 143, ;
Width = 24
ADD OBJECT Button24 AS CalculatorButton ;
WITH Caption = "=", ;
Height = 23, ;
Left = 127, ;
Top = 143, ;
Width = 24, ;
Default = .T.
PROCEDURE ExpressionBox.KeyPress
LPARAMETERS nKeyCode, nShiftAltCtrl
IF This.Parent.Enter AND nKeyCode != 27
THIS.Parent.ExpressionBox.Value = SPACE(80)
ENDIF
This.Parent.Enter = .F.
ENDPROC
ENDDEFINE
DEFINE CLASS CalculatorButton AS CommandButton
PROCEDURE Click
PRIVATE e, t
IF This.Parent.Enter
THIS.Parent.ExpressionBox.Value = SPACE(80)
ENDIF
e = THIS.Parent.ExpressionBox.Value
t = TYPE(e)
This.Parent.Enter = .F.
IF THIS.Caption = "="
DO CASE
CASE t = "C"
e = '"' + &e + '"' + SPACE(80)
CASE t = "N"
e = LTRIM(STR(&e, 20, 7)) + SPACE(80)
CASE t = "D"
e = '{' + DTOC(&e) + '}' + SPACE(80)
CASE t = "L"
e = IIF(&e,".Y.",".N.") + SPACE(80)
ENDCASE
e = SUBSTR(e, 1, 80)
This.Parent.Enter = .T.
ELSE
IF THIS.Caption = "C"
e = SPACE(80)
ELSE
e = SUBSTR(TRIM(e) + THIS.Caption + SPACE(80), 1, 80)
ENDIF
ENDIF
THIS.Parent.ExpressionBox.Value = e
THIS.Parent.ExpressionBox.Refresh
THIS.Parent.ExpressionBox.SetFocus
ENDPROC
ENDDEFINE
Есть другой вариант: подыскать нужный ActiveX и использовать
его.
по второй части вопроса
например так:
lcFileName='IEXPLORE.EXE'
DECLARE INTEGER ShellExecute ;
IN SHELL32.DLL ;
INTEGER nWinHandle,;
STRING cOperation,;
STRING cFileName,;
STRING cParameters,;
STRING cDirectory,;
INTEGER nShowWindow
DECLARE SetForegroundWindow IN WIN32API integer
=ShellExecute(0,'open',lcFileName,'https://www.rambler.ru/','',1)
Запустится Explorer и откроет страницу https://www.rambler.ru/
Также в 9-м фоксе есть пример, как сделать собственный web
browser
Вдогонку еще вариант вызова калькулятора
lcFileName='calc.exe'
DECLARE INTEGER ShellExecute ;
IN SHELL32.DLL ;
INTEGER nWinHandle,;
STRING cOperation,;
STRING cFileName,;
STRING cParameters,;
STRING cDirectory,;
INTEGER nShowWindow
DECLARE SetForegroundWindow IN WIN32API integer
=ShellExecute(0,'open',lcFileName,'','',1)