Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабы / gorev_akhajan_makakshiripov_ehffektivnaja_rabota_s_subd

.pdf
Скачиваний:
52
Добавлен:
26.04.2015
Размер:
3.17 Mб
Скачать

Перед тем как вы начнете разрабатывать формы для своего приложения, не поленитесь заглянуть в диалоговое окно Options меню Tools. Выберите вкладку Forms и установите на ней требуемые значения для расположенных там параметров (рис. 9.5). Для облегчения расположения элементов управления на форме включите вывод координатной сетки. Наиболее удобный шаг координатной сетки - от 6 до 10. В качестве единицы измерения установите пикселы - Pixels. В опции Maximum Design Area установите разрешение 640x480 - это означает, что разработанная вами форма наверняка поместится на экране, имеющем стандартное разрешение VGA. Если вы установите более высокое разрешение, то форма может прекрасно выглядеть на вашем компьютере, но окажется слишком большой на экране компьютера у пользователя вашей программы.

Рис. 9.5.

Если какие-либо свойства проектируемого объекта по умолчанию имеют отличные от требуемых значения, то нужные значения свойств можно установить в окне Properties, которое для удобства поиска требуемого свойства или метода разбито на пять вкладок: "All", "Data", "Methods", "Layout", "Other". Элементы окна Properties показаны на рис. 9.6.

Ⱦɚɧɧɚɹ ɜɟɪɫɢɹ ɤɧɢɝɢ ɜɵɩɭɳɟɧɚ ɷɥɟɤɬɪɨɧɧɵɦ ɢɡɞɚɬɟɥɶɫɬɜɨɦ %RRNV VKRS Ɋɚɫɩɪɨɫɬɪɚɧɟɧɢɟ ɩɪɨɞɚɠɚ ɩɟɪɟɡɚɩɢɫɶ ɞɚɧɧɨɣ ɤɧɢɝɢ ɢɥɢ ɟɟ ɱɚɫɬɟɣ ɁȺɉɊȿɓȿɇɕ Ɉ ɜɫɟɯ ɧɚɪɭɲɟɧɢɹɯ ɩɪɨɫɶɛɚ ɫɨɨɛɳɚɬɶ ɩɨ ɚɞɪɟɫɭ piracy@books-shop.com

Рис. 9.6. Список свойств в Конструкторе формы (окно Properties)

Вкладка "All" содержит все элементы, включенные в остальные разделы окна. Убедимся с помощью окна Properties, что форма имеет следующие свойства: AutoCenter = .T. - определяем автоматическое центрирование объекта Form;

BackColor = RGB(176,176,176) - задаем цвет фона;

Caption = Прием заказов - задаем текст, отображаемый в названии объекта;

Closable = .F. - ликвидируем возможность закрытия объекта Form, двойным щелчком кнопки управляющего меню, или выбора в этом меню команды Close;

Height = 300 - задаем ширину объекта на экране;

Icon = "c:\mybook\sample\net13.ico" - задаем значок, который отображается на этапе выполнения для объекта Form при его свертывании;

MaxButton = .F. - ликвидируем доступ к кнопке Maximize; MinButton = .F. - ликвидируем доступ к кнопке Minimize;

ShowTips = .T. - определяем возможность вывода подсказки для элементов управления заданного объекта;

Width = 540 - задаем ширину объекта.

Следующим этапом мы включаем необходимые элементы управления, такие как Label, Text Box, Command Button, Combo Box, Shape, и определяем уже для вновь созданных элементов их свойства.

Для управления работой формы создадим специальный элемент управления. Скорее всего мы будем использовать его и в других формах. В этом случае самым лучшим решением будет создание нового класса mygo на базе класса Container (контейнера). После этого мы сможем легко включить в нашу форму собственный объект mygo1, который основан на базе класса mygo. Прервем ненадолго описание процесса создания формы, чтобы уделить необходимое внимание новому классу.

При создании классов в Конструкторе класса необходимо определить базовый класс для нового класса и задать имя библиотеки, в которую этот класс будет записан. Для создания класса необходимо выбрать команду New из меню File главного меню Visual FoxPro. В открывшемся диалоговом окне New щелкаем на кнопке выбора Class и нажимаем кнопку New File. В окне New Class вводим имя класса (Class Name), выбираем имя класса, на котором будет

www.books-shop.com

основан создаваемый класс (Based On), и имя библиотеки (Store In), в которой будет храниться новый класс (рис. 9.7). Либо в Project Manager выбрать вкладку Classes и нажать кнопку New.

Рис. 9.7. Диалоговое окно New Class

Как видно из рис. 9.7, имя нашего класса mygo, базовый класс Container и имя библиотеки, в которую будет включен класс, - Roub.vcx

Вы можете включать в форму объекты своего класса прямо из панели инструментов Form Controls, если предварительно зарегистрируете класс.

Зарегистрировать библиотеку классов в Конструкторе формы можно следующим образом:

1.Нажмите кнопку View Classes панели инструментов Form Controls.

2.В открывшемся меню выберите команду Add.

3.В диалоговом окне Open укажите библиотеку классов и нажмите кнопку Open.

Класс mygo содержит кнопки для перемещения указателя записи на первую запись таблицы, на предыдущую запись таблицы, на следующую запись таблицы, на последнюю запись таблицы, а также кнопки поиска, добавления новой записи, удаления текущей записи, сохранения изменений, отмены изменений и кнопку выхода из формы. На рис. 9.8 показан внешний вид класса mygo. В табл. 9.1 приведены имена элементов управления в классе mygo и значения свойства ToolTipText для каждого объекта.

Рис. 9.8. Разработка нового класса в Конструкторе класса

Таблица 9.1. Назначение элементов класса mygo

Объект

Значение

Com1

Первая запись

Com2

Назад

Com3

Поиск

Com4

Вперед

Com5

Последняя запись

Com6

Добавить

Com7

Удалить

Com8

Сохранить

Com9

Отменить

Com10

Выход из формы

www.books-shop.com

Добавляем последовательно два новых метода для нашего класса, my_show_s_u и myrefresh, выбрав в меню Form команду New Method.

В код метода my_show_s_u запишем следующие строчки:

ThisForm.mygo1.Com8.Enabled = .F.

ThisForm.mygo1.Com9.Enabled = .F.

MyUpdate = 0

IF Del_ = 0

ThisForm.mygo1.Myrefresh

ELSE

Del_ = 0

ENDIF

Вкод метода myrefresh запишем: ThisForm.Text1.Refresh ThisForm.Text2.Refresh ThisForm.Text3.Refresh ThisForm.Text4.Refresh ThisForm.Refresh_list

Вкод события Click для кнопки Com1 запишем: GO TOP

ThisForm.mygo1.Com1.Enabled=.F.

ThisForm.mygo1.Com2.Enabled=.F.

ThisForm.mygo1.Com4.Enabled=.T.

ThisForm.mygo1.Com5.Enabled=.T.

ThisForm.mygo1.MyRefresh

Вкод события Click для кнопки Com2 запишем: IF BOF()=.F.

SKIP -1 ThisForm.mygo1.Com4.Enabled=.T. ThisForm.mygo1.Com5.Enabled=.T.

ELSE ThisForm.mygo1.Com1.Enabled=.F. ThisForm.mygo1.Com2.Enabled=.F. GO TOP

ENDIF ThisForm.mygo1.MyRefresh

Вкод события Click для кнопки Com3 запишем: DO FORM Find_ord.scx

Вкод события Click для кнопки Com4 запишем: IF EOF()=.F.

ThisForm.mygo1.Com1.Enabled=.T.

ThisForm.mygo1.Com2.Enabled=.T. SKIP 1

IF EOF()=.T. ThisForm.mygo1.Com4.Enabled=.F. ThisForm.mygo1.Com5.Enabled=.F. GO BOTTOM

ENDIF ELSE

ThisForm.mygo1.Com4.Enabled=.F.

ThisForm.mygo1.Com5.Enabled=.F. GO BOTTOM

ENDIF ThisForm.mygo1.MyRefresh

Вкод события Click для кнопки Com5 запишем: GO BOTTOM

ThisForm.mygo1.Com1.Enabled=.T.

ThisForm.mygo1.Com2.Enabled=.T.

ThisForm.mygo1.Com4.Enabled=.F.

ThisForm.mygo1.Com5.Enabled=.F.

ThisForm.mygo1.MyRefresh

Вкод события Click для кнопки Com6 запишем:

INSERT INTO order_view (key_salman, key_customer, key_model) ;

VALUES (order_view.key_salman, order_view.key_customer, order_view.key_model) MyUpdate=1

ThisForm.mygo1.Com8.Enabled=.T.

www.books-shop.com

ThisForm.mygo1.Com9.Enabled=.T.

ThisForm.Text1.Visible=.F.

ThisForm.mygo1.MyRefresh

В код события Click для кнопки Com7 запишем:

Answer_d = MESSAGEBOX("Удалить данную запись ?", 4+32+256, "Вопрос") IF Answer_d=6

DELETE

Del_=1

SKIP 1

IF EOF()=.T. GO BOTTOM

ENDIF MyUpdate=1

ThisForm.mygo1.Com8.Enabled=.T.

ThisForm.mygo1.Com9.Enabled=.T.

ThisForm.mygo1.MyRefresh ENDIF

Вкод события Click для кнопки Com8 запишем: =TABLEUPDATE(.T.,.T.) ThisForm.mygo1.My_Show_s_u

Вкод события Click для кнопки Com9 запишем: =TABLEREVERT(.T.) ThisForm.mygo1.My_Show_s_u

Вкод события Click для кнопки Com10 запишем: IF MyUpdate=1

Answer_s_u = MESSAGEBOX("Сохранить изменения ?", 4+32, "Вопрос") DO CASE

CASE Answer_s_u=6 &&Да =TABLEUPDATE(.T.,.T.)

CASE Answer_s_u=7 &&Нет =TABLEREVERT(.T.)

ENDCASE ThisForm.mygo1.My_Show_s_u

ENDIF ThisForm.Release

Далее приведен программный код для событий проектируемой формы. На рис. 9.9 показан внешний вид разрабатываемой формы и отношения между описанными ниже объектами, событиями и методами.

www.books-shop.com

Рис. 9.9. Отношения между объектами, событиями и методами в разрабатываемой форме Код для события Load формы:

&&В администраторе ODBC необходимо иметь соединение auto к БД Auto_store OPEN DATABASE Auto_store EXCLUSIVE

CREATE CONNECTION remote_01 DATASOURCE auto DO CASE

CASE LevDostup=1

=DBSETPROP('remote_01', 'CONNECTION', 'ConnectString', ; 'DSN=auto;UID=login_lev1;PWD=lev1')

CASE LevDostup=2

=DBSETPROP('remote_01', 'CONNECTION', 'ConnectString', ; 'DSN=auto;UID=login_lev2;PWD=lev2')

CASE LevDostup=3

=DBSETPROP('remote_01', 'CONNECTION', 'ConnectString', ; 'DSN=auto;UID=login_lev3;PWD=lev3')

CASE LevDostup=4

=DBSETPROP('remote_01', 'CONNECTION', 'ConnectString', ; 'DSN=auto;UID=login_lev4;PWD=lev4')

CASE LevDostup=5

=DBSETPROP('remote_01', 'CONNECTION', 'ConnectString', ; 'DSN=auto;UID=login_lev5;PWD=lev5')

ENDCASE

&&Создаем просмотры

a_v=ADBOBJECTS(a_view, 'VIEW') IF a_v>>0

prm=ASCAN(a_view, 'propmodel_view') lau=ASCAN(a_view, 'lauto_view')

www.books-shop.com

smn=ASCAN(a_view, 'sman_view') cus=ASCAN(a_view, 'cust_view') mod=ASCAN(a_view, 'model_view') ord=ASCAN(a_view, 'order_view')

ENDIF

IF prm=0

CREATE SQL VIEW propmodel_view CONNECTION remote_01 SHARE ;

AS SELECT model.key_model, model.name_model, model.swept_volume, ; model.quantity_drum, model.capacity, model.torgue, model.top_speed, model.starting, ; model.quantity_door, model.quantity_sead, model.length, model.width, ;

model.height, model.expense_90, model.expense_120, model.expense_town, ; firm.name_firm, country.name_country,fuel_oil.name_fuel_oil, ; tyre.name_tyre, body.name_body ;

FROM model ,firm, country, fuel_oil, tyre, body ; WHERE model.key_firm=firm.key_firm ;

AND firm.key_country=country.key_country ; AND model.key_fuel_oil=fuel_oil.key_fuel_oil ; AND model.key_tyre=tyre.key_tyre ;

AND model.key_body=body.key_body ENDIF

IF lau=0

CREATE SQL VIEW lauto_view CONNECTION remote_01 SHARE ;

AS SELECT automobile_passenger_car.key_model, automobile_passenger_car.date_issue, ; automobile_passenger_car.cost, account.selled ;

FROM automobile_passenger_car, account ;

WHERE automobile_passenger_car.key_auto=account.key_auto ENDIF

IF smn=0

CREATE SQL VIEW sman_view CONNECTION remote_01 SHARE ; AS SELECT salesman.key_salman, ;

salesman.last_name+' '+salesman.first_name+' '+salesman.patronymic as sman ; FROM salesman

ENDIF

SELECT * FROM sman_view INTO ARRAY Arcombo1 IF cus=0

CREATE SQL VIEW cust_view CONNECTION remote_01 SHARE ; AS SELECT customer.key_customer, customer.name_customer ; FROM customer

ENDIF

SELECT * FROM cust_view INTO ARRAY Arcombo2 IF mod=0

CREATE SQL VIEW model_view CONNECTION remote_01 SHARE ; AS SELECT model.key_model, model.name_model ;

FROM model ENDIF

SELECT * FROM model_view INTO ARRAY Arcombo3 IF ord=0

CREATE SQL VIEW order_view CONNECTION remote_01 SHARE ;

AS SELECT order_.key_order, order_.key_salman, order_.key_customer, order_.key_model ; FROM order_

&&Устанавливаем таблицу order_ обновляемой

=DBSETPROP('order_view', 'View', 'Tables', 'order_')

&&Устанавливаем имена для обновления

=DBSETPROP('order_view.key_order', 'Field', 'UpdateName', 'order_.key_order') =DBSETPROP('order_view.key_salman', 'Field', 'UpdateName', 'order_.key_salman') =DBSETPROP('order_view.key_customer', 'Field', 'UpdateName', 'order_.key_customer') =DBSETPROP('order_view.key_model', 'Field', 'UpdateName', 'order_.key_model')

&&Задаем простой уникальный ключ на основе одного поля таблицы Order_ =DBSETPROP('order_view.key_order', 'Field', 'KeyField', .T.)

&&Задаем обновляемые поля

=DBSETPROP('order_view.key_salman', 'Field', 'Updatable', .T.) =DBSETPROP('order_view.key_customer', 'Field', 'Updatable', .T.) =DBSETPROP('order_view.key_model', 'Field', 'Updatable', .T.)

&&Активизация процесса обновления

=DBSETPROP('order_view', 'View', 'SendUpdates', .T.)

&&Задаем сравнение временной метки всех полей записи,

www.books-shop.com

&& расположенной на удаленном источнике данных

=DBSETPROP('order_view', 'View', 'WhereType', 4) ENDIF

USE order_view =CURSORSETPROP("Buffering", 5)

Код для события Unload формы: CLOSE DATABASES ALL

CLOSE TABLES ALL

Добавим в форму метод Combo_init и запишем для него следующий код: nnAddItem="ThisForm.Combo"+ALLT(cNum)+".AddItem" nnArn="Arcombo"+ALLT(cNum)

FOR I=1 TO ALEN(&nnArn,1) &nnAddItem(allt(&nnArn(i,2))) ENDFOR

Добавим в форму метод Refresh_list и запишем для него следующий код: ThisForm.Combo1.Value=((ASCAN(Arcombo1,order_view.key_salman))+1)/2 ThisForm.Combo2.Value=((ASCAN(Arcombo2,order_view.key_customer))+1)/2 ThisForm.Combo3.Value=((ASCAN(Arcombo3,order_view.key_model))+1)/2

Добавим в форму метод Show_sav_und и запишем для него следующий код: MyUpdate=1

ThisForm.mygo1.Com8.Enabled=.T.

ThisForm.mygo1.Com9.Enabled=.T.

Для события Click кнопки Propmodel (характеристика модели автомобиля) запишем следующий код:

glkey_mod=order_view.key_model DO FORM prop_mod.scx

Для события Click кнопки Lauto (список автомобилей) запишем следующий код: glkey_mod=order_view.key_model glname_mod=ALLT(Arcombo3(ThisForm.Combo3.Value,2))

DO FORM listauto.scx

Для события Init всех элементов управления типа Combo Box (Combo1, Combo2 и Combo3) запишем следующий код:

cNum=RIGHT(This.Name,1) ThisForm.combo_init

Для события InteractiveChange элемента управления Combo1 запишем следующий код: REPLACE order_view.key_salman WITH Arcombo1(ThisForm.Combo1.Value,1) ThisForm.Text2.Refresh

ThisForm.Show_sav_und

Для события InteractiveChange элемента управления Combo2 запишем следующий код: REPLACE order_view.key_customer WITH Arcombo2(ThisForm.Combo2.Value,1) ThisForm.Text3.Refresh

ThisForm.Show_sav_und

Для события InteractiveChange элемента управления Combo3 запишем следующий код: REPLACE order_view.key_model WITH Arcombo3(ThisForm.Combo3.Value,1) ThisForm.Text4.Refresh

ThisForm.Show_sav_und

Как видно из кода события Click кнопки lauto, сначала мы определяем значения кода (glkey_mod) и наименования (glname_mod) выбранной модели для дальнейшей выборки списка автомобилей по данной модели. После чего запускаем форму LISTAUTO (Список автомобилей). Похожая ситуация и с событием Click кнопки propmodel, где мы определяем значение кода (glkey_mod) модели и запускаем форму PROP_MOD (Характеристика модели автомобиля).

Кратко опишем вызываемые формы.

Форма LISTAUTO (Список автомобилей).

Некоторые формы используют данные из одной или нескольких таблиц. Для включения требуемых таблиц в описание формы выберите команду Data Environment из меню View главного меню Visual FoxPro. Откроется окно Data Environment, напоминающее область просмотра таблиц Конструктора базы данных.

Для добавления таблицы следует выбрать команду Add в меню Data Environment, которое добавляется в главное меню Visual FoxPro, или в контекстном меню, появляющемся при нажатии правой кнопки мыши. После этого выберите требуемую таблицу из диалогового окна Add Table or View.

Обратите внимание, что можно либо использовать несколько таблиц и определять отношения между ними в самой форме, либо использовать готовые многотабличные представления данных.

Для установления отношения между двумя таблицами нажмите на имя поля в главной таблице

www.books-shop.com

и перенесите его в подчиненную таблицу. При этом между таблицами появится линия, как показано на рис. 9.10. Заметим, однако, что для этого необходимо заранее определить соответствующие индексы.

Рис. 9.10.

Вформе LISTAUTO мы используем данные из представления lauto_view, и одним из возможных вариантов решения задачи является включение представления lauto_view в окружение формы (Data Environment) вышеизложенным способом. И этот вариант был бы не худшим. Однако мы в своем примере поступаем по-другому. А именно, включаем в событие, имеющее место непосредственно перед созданием формы (Form.Load), запрос к представлению lauto_view с выборкой данных по текущей модели, поместив результат запроса в курсор lauto. Подобный вариант приемлем только для просмотра данных. Дело в том, что данные в курсоре редактированию не подлежат.

Всобытие Load формы запишем следующий код:

SELECT lauto_view.date_issue, lauto_view.cost, ; lauto_view.selled ;

FROM lauto_view ;

WHERE lauto_view.key_model=glkey_mod ;

INTO CURSOR lauto

Далее, посредством панели инструментов Form Controls, в форму LISTAUTO включаем объект - таблицу (Grid).

В свойство источника данных (RecordSource), к которому привязан элемент управления Grid, помещаем имя курсора - lauto. После чего форму уже можно запускать на выполнение. И результат будет положительным. Хотя мы думаем, наш читатель вряд ли из тех, кого удовлетворит подобный результат. Дело в том, что заголовки колонок примут значения наименований полей курсора, элемент управления для отображения значений во всех колонках будет текстовым, что не всегда удобно, и т. д.

Поэтому мы несколько усовершенствуем данную форму.

На вкладке Layout для элемента управления Grid задаем количество объектов Column (свойство ColumnCount = 3), ликвидируем отображение столбца маркеров удаления (свойство DeleteMark = .F.), задаем тип полос прокрутки (свойство ScrollBars = 2 - только вертикальная полоса), задаем высоту заголовков столбцов (свойство HeaderHeight = 25) и высоту строк в элементе управления Grid (свойство RowHeight = 25).

На вкладке Data для каждой колонки таблицы Grid.Column задаем источник данных, к которому привязывается объект:

Grid.Column1.ControlSours=lauto.date_issue

www.books-shop.com

Grid.Column2.ControlSours=lauto.cost

Grid.Column3.ControlSours=lauto.selled

Для третьей колонки указываем элемент управления в объекте Column - CurrentControl = CheckBox, который будет использоваться для отображения значений активной ячейки. Предварительно поместив его посредством перетаскивания элемента CheckBox из панели управления Form Control в колонку таблицы. Для этой же колонки позволяем свойству CurrentControl распространяться на все ячейки объекта Column (свойство Sparse = .F.).

На вкладке Layout для каждого заголовка колонки таблицы Grid.Column.Header, задаем текст

(свойство Grid.Column1.Caption = Дата выпуска, Grid.Column2.Caption = Стоимость, Grid.Column3.Caption = Продажа), а вид выравнивания текста задаем по центру (свойство

Alignment = 2).

После чего наша форма LISTAUTO будет иметь вид, показанный на рис. 9.11.

Рис. 9.11. Форма "Список автомобилей" в Конструкторе формы

Форма PROP_MOD (Характеристика модели автомобиля).

Вформе PROP_MOD мы используем данные из представления propmodel_view, предварительно включив в событие, имеющее место непосредственно перед созданием формы (Form.Load), запрос к данному представлению с выборкой данных по текущей модели и поместив результат запроса в курсор propmodel.

Всобытие Load Формы запишем следующий код:

SELECT * FROM propmodel_view ;

WHERE propmodel_view.key_model=glkey_mod ;

INTO CURSOR propmodel

Далее с помощью панели инструментов Form Controls в форму PROP_MOD последовательно включаем объекты TextBox для всех полей курсора propmodel. Для каждого из них задаем источник данных (свойство ControlSours = <<имя_курсора.имя_поля>>). На рис. 9.12. показана форма PROP_MOD.

www.books-shop.com

Соседние файлы в папке лабы