Продолжаем писать биржевой симулятор (TMainMenu, TEdit).
Исходники к уроку можно скачать здесь.
Сегодня мы начнем писать симулятор биржевого счета. Для начала создадим заготовку класса (потом будем наращивать функционал):
//класс симулции состояния биржевого счета TESBAccount=class(TESBBaseClass) protected FCash:double; FExceptionCash:boolean; public property Cash:double read FCash; //состояние счета можно изменить только методами property ExceptionCash:boolean read FExceptionCash write FExceptionCash; constructor Create; procedure Replenish(ACash:double); //пополнить procedure Withdraw(ACash:double); //снять procedure Serialize(AStream:TStream); override; procedure Unserialize(AStream:TStream); override; end; |
Как видим, наша первая версия класса эмулятора счета сможет только эмулировать операцию пополнения и снятия счета. Так же мы предусмотрим функции сохранения и загрузки эмулятора из файла. И так, с первоначальным функционалом определились, теперь будем его реализовывать:
constructor TESBAccount.Create; begin inherited Create; FCash:=0; FExceptionCash:=true; end; procedure TESBAccount.Replenish(ACash:double); begin FCash:=FCash+ACash; end; procedure TESBAccount.Withdraw(ACash:double); begin if FCash begin if FExceptionCash then raise Exception.Create(ClassName+': TESBAccount.Withdraw - недостаточно средств для вывода') else FCash:=0; end else FCash:=FCash-ACash; end; procedure TESBAccount.Serialize(AStream:TStream); begin inherited Serialize(AStream); AStream.Write(FCash,sizeof(FCash)); AStream.Write(FExceptionCash,sizeof(FExceptionCash)); end; procedure TESBAccount.Unserialize(AStream:TStream); begin inherited Unserialize(AStream); AStream.Read(FCash,sizeof(FCash)); AStream.Read(FExceptionCash,sizeof(FExceptionCash)); end; |
Думаю, не лишним будет напомнить, что библиотека должна быть оформлена по всем правилам Delphi, а именно, начинаться со слова unit, в разделе interface нужно подключить все модулю и объявить типы, в данном случае TESBBaseClass и TESBAccount*:
Соответственно, методы классов, а так же глобальные процедуры и функции мы уже реализуем в разделе implementation*:
Если по какой то причине вы затрудняетесь скомпоновать реализованные на этом и прошлом уроке классы то найти уже готовый модуль можете в исходниках к уроку, которые можно скачать здесь.
И так, мы подключили модуль. Теперь добавим к форме проекта меню (TMainMenu), оно находиться на закладке Standard*:В меню добавим два пункта "сохранить" и "открыть"*
обзовем их itSave и itOpen соответственно*:
еще нам потребуется добавить к форме компонент TMemo, он находиться так же на закладке Standard*:
Обзовем мы этот компонент mmAccount.
Так же добавим поле ввода (TEdit) - edSumma и две кнопочки (TButton) - btnAdd и btnWithdraw - соответственно.
Кроме того, добавим флажок (TcheckBox) - cbExceptionCash. Все эти компоненты у нас тоже на закладке Standard.
Осталось с закладки dialogs добавить диалог сохранения в файл (TSaveDialog) и открытия файла (TOpenDialog)*:
Вот так примерно у нас должна выглядеть форма проекта*:
Теперь начнем реализацию тестировочной программы. Сначала добавим в класс TfrmStockBot (главная форма проекта) приватное поле и метод (добавленное выделено красным):
TfrmStockBot = class(TForm) MainMenu: TMainMenu; itFile: TMenuItem; itSave: TMenuItem; itOpen: TMenuItem; mmAccount: TMemo; edSumma: TEdit; btnAdd: TButton; btnWithdraw: TButton; SaveDialog: TSaveDialog; OpenDialog: TOpenDialog; cbExceptionCash: TCheckBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btnAddClick(Sender: TObject); procedure btnWithdrawClick(Sender: TObject); procedure itSaveClick(Sender: TObject); procedure itOpenClick(Sender: TObject); procedure cbExceptionCashClick(Sender: TObject); private { Private declarations } Account:TESBAccount; procedure ShowAccountCash; public { Public declarations } end; |
procedure TfrmStockBot.FormCreate(Sender: TObject); begin Account:=TESBAccount.Create; cbExceptionCash.Checked:=Account.ExceptionCash; end; procedure TfrmStockBot.FormDestroy(Sender: TObject); begin FreeAndNil(Account); end; procedure TfrmStockBot.ShowAccountCash; begin mmAccount.Lines.Add(FloatToStr(Account.Cash)); end; procedure TfrmStockBot.btnAddClick(Sender: TObject); begin Account.Replenish(StrToFloat(edSumma.Text)); ShowAccountCash; end; procedure TfrmStockBot.btnWithdrawClick(Sender: TObject); begin Account.Withdraw(StrToFloat(edSumma.Text)); ShowAccountCash; end; procedure TfrmStockBot.itSaveClick(Sender: TObject); var Stream:TFileStream; begin if SaveDialog.Execute then begin Stream:=TFileStream.Create(SaveDialog.FileName,fmCreate); Account.Serialize(Stream); FreeAndNil(Stream); end; end; procedure TfrmStockBot.itOpenClick(Sender: TObject); var Stream:TFileStream; begin if OpenDialog.Execute then begin Stream:=TFileStream.Create(OpenDialog.FileName,fmOpenRead); FreeAndNil(Account); Account:=TESBAccount.Create; Account.Unserialize(Stream); FreeAndNil(Stream); mmAccount.Lines.Clear; ShowAccountCash; end; end; procedure TfrmStockBot.cbExceptionCashClick(Sender: TObject); begin Account.ExceptionCash:=cbExceptionCash.Checked; end; |
Теперь запустим нашу программу, и убедимся, что методы класса эмулятора счета отрабатывают правильно (Replenish - увеличивает состояние счета, Withdraw уменьшает, при нехватке средств выскакивает сообщение об ошибке, если установлена соответствующая опция)
Исходники к уроку можно скачать здесь.
Скриншоты, помеченные знаком * , являются цитатами и иллюстрациями в соответствии со ст. 1274 ГК РФ программного продукта "Delphi", авторское право на который принадлежит "Borland Software Corporation, (a Micro Focus Company).
Источник: http://easyprog.ru/index.php?option=com_content&task=view&id=227&Itemid=44