2.6.4.3 ОБРАБОТКА КОМАНД
Теперь нужно сделать так, чтобы при выборе какого-либо пункта меню выполнялась соответсвующая процедура. При выборе пунктов меню генерирует событие, которое обрабатывается подпрограммой - обработчиком событий. Для этого ч перекрыл стандартный обработчик событий HandleEvent объекта TApplication. Для этого в описании объекта TSklVks добавил еще одну строку ...
Type
TSklVks = Object(TApplication)
......
Procedure HandleEvent(var Event : Tevent); virtual;
End;
и поместил в раздел объявлений текс новой подпрограммы :
Procedure TSklVks.HandleEvent(var Event : TEvent);
Begin
TApplication.HandleEvent(Event);
if Event.What = evCommand then
case Event.Command of
cmPrnSklad : Begin
PrintSklad;
End;
cmSklad : begin
Sklad;
end;
cmZak : Begin
Zak;
End;
cmHelp_About : Begin
Help_About;
End;
cmPrihod : Begin
Prihod;
End;
cmPrih : Begin
Prih;
End;
cmDostup : begin
Dostup;
end;
cmRekviz : begin;
rekviz;
end;
cmKurs : Begin
Kurs;
end;
cmPriceList : Begin
GetDate(yyyy,mm,dd,ww);
PriceList(dd,mm,yyyy);
ClearEvent(Event);
end;
cmSdelka : Begin
Sdelki;
End;
cmVozvrat : Begin
Vozvrat;
End;
cmKorPrihod : Begin
KorPrihod;
End;
cmDolgi : Begin
Dolgi;
End;
cmMoney : Begin
Money;
End;
cmArchive : Begin
Arc_;
End;
else
ClearEvent(Event);
end;
ClearEvent(Event)
End;
2.6.4.4 ПРОГРАММИРОВАНИЕ ДИАЛОГОВЫХ ЗАПРОСОВ
В обработчике событий TSklVks.HandleEvent я предусмотрел вызов нескольких процедур, с помощью которых реализуются конкретные действия. Начну с процедуры Prih. Ее задача - ввести данные о новом приходе. Очевидно, что данные будут храниться в файле, поэтому опишу сразу структуру данных. Данные выглядят в виде записи, которые состоят из полей. Например структура данных для приходов выглядит следующим образом :
(* Структура приходов *)
Type PPP = record
Number : LongInt; { номер прихода}
FirmName : String[22]; { фирма поставщик }
Date : String[10]; { дата прихода }
Kurs : Real; { курс доллара ЦБ РФ на день прихода}
TotalItems : LongInt; { кол-во пришедших наименований}
SebSumma : Real; { общая сумма прихода }
End;
(* Структура приходов для наименования}
Type PPPItems = Record
Number : LongInt; {ноиер наименования }
PrihodNum : LongInt; {номер прихода}
SkladNum : LongInt; {номер наименования на складе}
Name : String[lpname]; {наименование}
Rasf : String[lprasf]; {расфасовка}
Box : Integer; {кол-во штук в упаковке}
Kolvo : LongInt; {кол-во поступившего наименования}
SebPrice : Real; {себестоимость наименования}
Price : Real; {стоимость наименования}
SellTimes : Boolean; {зарезервировано}
End;
Эти строки находятся в модуле SKLTYPES.PAS. В нем же находится описание всех структур данных, а так же их связь с файлами и основной программой :
Var {ТИП ДАННЫХ}
PrihodData : PPP;
PrihodItemsData : PPPItems;
....{ТИП ДАННЫХ В ФАЙЛЕ}
PrihodFile : File of PPP;
PrihodItemsFile : File of PPPItems;
....
Теперь, надо ввести данные. Для этого сначала появляется панель диалога для ввода даты прихода, курса прихода и реквизитов фирмы поставщика. Ее я создавал при помощи небольшой программы Dialog Designer 4.0. При создании панелей диалога при помощи это программы генерируется модульный файл в котором реализован код для отображения окна, его закрытия, так же содержится обработчик событий.
Ниже приведу текст модуля, cодержащего код для создания диалогового окна.
unit PRIHOD1;
interface
uses Drivers, Objects, Views, Dialogs, Validate;
type
PrihodDataRec = record
Field1 : String[10];
Field3 : String[13];
Field2 : String[22];
end;
PPrihodDataRec = ^PrihodDataRec;
{ TPrihodDataDialog }
PPrihodDataDialog = ^TPrihodDataDialog;
TPrihodDataDialog = object(TDialog)
constructor Init;
constructor Load(var S: TStream);
procedure HandleEvent(var Event: TEvent); virtual;
procedure Store(var S: TStream);
function Valid(Command : word): boolean; virtual;
destructor Done; virtual;
end;
Var
PRD : PrihodDataRec;
Const
RPrihodDataDialog : TStreamRec = (
ObjType: 12345; {= 100 here!!}
VmtLink: Ofs(Typeof(TPrihodDataDialog)^);
Load : @TPrihodDataDialog.Load;
Store : @TPrihodDataDialog.Store);
implementation
{ TPrihodDataDialog }
constructor TPrihodDataDialog.Init;
var
R: TRect;
Control : PView;
begin
R.Assign(13, 3, 66, 17);
inherited Init(R, 'Приход / Ввод данных');
Flags := Flags and not wfMove;
R.Assign(24, 3, 36, 4);
Control := New(PInputLine, Init(R, 10));
Insert(Control);
PInputLine(Control)^.Validator := New(PPXPictureValidator, Init('{##}/{##}/{####}', true));
R.Assign(5, 3, 24, 4);
Insert(New(PLabel, Init(R, 'Дата : ', Control)));
R.Assign(24, 5, 39, 6);
Control := New(PInputLine, Init(R, 13));
Insert(Control);
PInputLine(Control)^.Validator := New(PPXPictureValidator, Init('*#[.#][#]', False));
R.Assign(5, 5, 24, 6);
Insert(New(PLabel, Init(R, 'Курс прихода : ', Control)));
R.Assign(24, 7, 48, 8);
Control := New(PInputLine, Init(R, 22));
Insert(Control);
R.Assign(5, 7, 24, 8);
Insert(New(PLabel, Init(R, 'Фирма поставщик : ', Control)));
R.Assign(7, 10, 18, 12);
Control := New(PButton, Init(R, '~С~брос', cmCancel, bfNormal));
Insert(Control);
R.Assign(23, 10, 41, 12);
Control := New(PButton, Init(R, '~Н~аименования', cmOK, bfDefault));
Insert(Control);
R.Assign(37, 3, 51, 4);
Control := New(PStaticText, Init(R, '[ ДД/ММ/ГГГГ ]'));
Insert(Control);
SelectNext(False);
end;
constructor TPrihodDataDialog.Load(var S: TStream);
begin
inherited Load(S);
end;
procedure TPrihodDataDialog.HandleEvent(var Event: TEvent);
begin
(*---
if Event.What = evMessage then
case Event.Command of
end; --*)
inherited HandleEvent(Event);
(*---
if Event.What = evMessage then
case Event.Command of
end; --*)
end;
procedure TPrihodDataDialog.Store(var S: TStream);
begin
inherited Store(S);
end;
function TPrihodDataDialog.Valid(Command : word): boolean;
var
Result : boolean;
begin
Result := inherited Valid(Command);
Valid := Result;
end;
destructor TPrihodDataDialog.Done;
begin
inherited Done;
end;
end.
Для отображения этого диалогового окна в процедуре PRIH испльзовался следующий код :
PRD.Field1:=ShowDate; { Дата прихода - текущая дата}
Str(GetKurs:-1:2,PRD.Field3); { Курс прихода - текущий курс }
FillChar(PRD.Field2[1],22,' '); {Онулить фирму поставщика}
c1:=ExecuteDialog(New(PPrihodDataDialog,Init),@PRD);1 { Ввести на экран панель диалога}
После ввода курса, даты и фирмы поставщика нужно ввести собственно наименования. Для этого я создал диалоговое окно (см. модуль PRIH2.PAS), где вводится информации о наименовании (название, расфасовка, стоимость, себестоимость и т.д.). (см. рис. 3)
(рис.3)
Введя данные, их надо сохранить. Чтобы это сделать надо сначала открыть файл, затем в его конец записать данные и в конце этот файл закрыть. Это делается приблизительно так ( подробно см. файл FIRMA.PAS) :
OpenPrihodFile; { Процедура открытия файла см.модуль SklFiles.Pas}
Seek(PrihodFile,FileSize(PrihodFile)-1);
Write(PrihodFile,PrihodData);
ClosePrihodFile; { см. модуль SklFiles.Pas}
Если нажимается кнопка СБРОС, то вызывается процедура сброса прихода в которой все задействованные файлы данных усекаются до предыдущей длина (в начале процедуры PRIH запоминаются текущие длины файлов) при помощи стандартной процедуры TRUNCATE.
После успешного ввода данных появляется запрос о печати приходной накладной. Печать осуществляется стандартными средствами (см. процедуры PrintPrihodNakl и PrintEndOfPrihodNakl в модуле SklUnit). С помощью константы LST, компьютер связывается с печатающим устройством на LPT1, затем процедурами Writeln(LST,‘строка для печати’) данные выводятся на принтер. Все введенные данные помещаются в файлы данных : SKLAD.001 (Товар на складе) , PRIHOD.001 (Заголовки приходов), PRIHOD.002 (Пришедшие наименования). Затем пользователь получает доступ к следующим командам меню : Данные-Склад, Данные-Приходы, Печать-Прайс-Лист, Печать-Отчет о наличии товара на складе, Клиент-Продажа. Основной из вышеперечисленных команд является Клиент-Продажа. При помощи этой команды пользователь должен выписать накладную по заказу клиента. Реализовал эту команду так : Появляется диалоговое окно со списком наименований, имеющихся на складе (В нем пользователь выбирает продаваемые наименования и их количества). Затем при нажатии на кнопку ОПЛАТА появляется окно со списком всех выбранных наименований (накладная) в котором предоставляется возможность отредактировать введенные данные (изменить количество каждого наименования, его стоимость и курс доллара). Далее после нажатия на ОПЛАТА на экране появляется диалоговое окно для ввода следующей информации : реквизиты клиента, форма сделки (реализация), округление суммы накладной, дата накладной. После нажатия на ВЫПИСАТЬ НАКЛАДНУЮ у пользователя программы спрашивает, нужно ли печатать накладную и если товар дается клиенту не на реализацию, то спрашивается, нужно ли печатать приходный кассовый ордер. Все введенные данные помещаются в файлы данных : SDELKA.001 (Заголовки сделок), SDELKA.002 (Наименования сделок), в файле SKLAD.001 делаются соответствующие изменения по количеству оставшегося товара.
Для реализации диалогового окна со списком я создал коллекцию строк наименований имеющихся на складе, причем если товара на складе не осталось то это наименование не помещаеся в коллекцию.
Data1:=New(PStrSor,Init(10,1)); {Указатель на коллекцию }
For N:=0 to FileSize(DataFile)-1 do {Каждую позицию проверить, если нулевая то не вносить в коллекцию)
begin {1}
Seek(DataFile,n);
Read(DataFile,Data); {Считываем данные}
val(Data.ProductOst,tempccc,code);
Str(Data1^.Count+1,Numm);
if tempccc=0 then goto ccc; { Если нулевая позиция, то не вносить в коллекцию }
o[0]:=chr(57);
FillChar(o[1],57,' ');
with data do
begin {Создание строки типа : Номер, Наименование, Расфасовка}
move(Numm[1],o[2],Length(Numm));
move(ProductName[1],o[succ(lpnum-1)+4],Length(Data.ProductName));
move(ProductRasf[1],o[succ(lpnum+lpname)+5],Length(Data.ProductRasf));
move(ProductNumber[1],o[50],Length(Data.ProductNumber));
end;
Data1^.Insert(NewStr(o)); {Помещаю ее в коллекцию строк}
ccc:
end; {1}
Для реализации списка строк в Turbo Vision предусмотрен объект TListBox. Это объект создает специальное окно скроллера с указателем на текущий элемент. Наименования я поместил в вышеописанную коллекцию строк, указатель на которую передал объекту с помощью метода TListBox.NewList.
Var
SCR : PScrollBar ;
LIST : PLitstBox;
.....
Begin
.....
RR.Assign(50,05,51,17); {Координаты скроллера}
Scr:=New(PscrollBar,Init(RR)); {Указатель на полосу скроллера}
Insert(Scr); {Создаем скроллер}
R.Assign(03,05,50,17); {Координаты окна со списком}
List:=New(PMyListBox,Init(R,1,scr)); {Указатель на окно со списком}
List^.NewList(Data1); {Связывание окна со коллекцией строк}
Insert(list); {Создаем окно со списком }
....
End;
Диалоговое окно выбора наименований выглядит следующим образом :
Перейду теперь к описанию процедуры Данные-Сделки. При выборе соответствующего пункта меню на экране почвляется диалоговое окно выбора периода для просмотра сделок. В нем нужно ввести нижнюю и верхнюю границы периода.
После ввода при нажатии на кнопку ПОКАЗАТЬ ЗА ПЕРИОД разворачивается окно со списком сделок (накладных) относящихся к введенному периоду. Это реализованно следующим образом. При соэдании коллекции строк с накладными сравниваютя дата сделки, нижняя и верхняя границы периода при помощи написанной прцедуоы DATECOMP из модуля DATES.PAS. Но для того, чтобы накладные распологались по порядку (по дате) мне пришлось перекрыть метод сортировки коллекции (см. модуль SKLSTR.PAS). После того, как создано диалоговое окно, пользователю предоставляется возможность распечатать выбранную накладную, соответствующую накладную по себестоимости и если накладная оплачена, то и приходный кассовый ордер.
... » анализ платежеспособности показал, что предприятие на 01.10.97 является неплатежеспособным, но прогноз платежеспособности положительный. 4. Маркетинговые исследования предприятия и разработка системы управления продвижения изделий фирмы на рынок 4.1. Маркетинговые исследования предприятия ОАО «Волжское Химволокно» производит полиамидные (капроновые) нити текстильного и технического назначения, ...
... каждом последующем уровне управления. Изучение отечественного опыта показало, что, как правило, специальной службы, которая бы занималась вопросами адаптации в организациях, не существует. 2 Разработка системы адаптации персонала ООО «Радио 2.1 Анализ деятельности компании ООО «Радио СИ» 2.1.1 Характеристика компании ООО «Радио СИ» Общество с ограниченной ответственностью «Радио СИ». ...
... товарного предложения: качество и ремонтоспособность продукции, а также уровень сервиса и др. 3. Влияние уровня компьютеризации на работу систем управления предприятием Управленческая деятельность выступает в современных условиях как один из важнейших факторов функционирования и развития промышленных фирм. Эта деятельность постоянно совершенствуется в соответствии с объективными требованиями ...
... структур, осуществляющих эти функции, формирования банков данных, организации коммуникаций, организации сервисного обслуживания автоматизированных рабочих мест менеджеров и т. д. 4. Структура и компетенция органов управления акционерным обществом Состав, компетенция и правила организации высших звеньев управления акционерным обществом установлены законодательством. Этими звеньями управления, ...
0 комментариев