New Page 1
Продолжаем писать биржевой симулятор (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<ACash then
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; |
Теперь давайте протестируем наш класс. Создаем пустой проект, подключаем к
нему модуль с нашей библиотекой, это можно сделать через опцию "Project"
-> "Add to project"*:

Думаю, не лишним будет напомнить, что библиотека должна быть
оформлена по всем правилам 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; |
Ах да, и не забудьте в разделе uses
подключить модуль, где у нас объявлен класс симулятора счета*:

Теперь запустим нашу программу, и убедимся, что методы класса эмулятора счета
отрабатывают правильно (Replenish - увеличивает состояние счета, Withdraw
уменьшает, при нехватке средств выскакивает сообщение об ошибке, если
установлена соответствующая опция)

Исходники к уроку можно скачать
здесь.
Скриншоты, помеченные знаком * ,
являются цитатами и иллюстрациями программного
продукта "Delphi", авторское право на
который принадлежит "Borland Software Corporation".
|