.
Биржевой робот на Delphi. Урок 15. Продолжаем писать биржевой симулятор (TMainMenu, TEdit).
Автор megabax   
04.03.2010 г.
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"*:

Продолжаем писать биржевой симулятор (TMainMenu, TEdit).

Думаю, не лишним будет напомнить, что библиотека должна быть оформлена по всем правилам Delphi, а именно, начинаться со слова unit, в разделе interface нужно подключить все модулю и объявить типы, в данном случае TESBBaseClass и TESBAccount*:

Продолжаем писать биржевой симулятор

Соответственно, методы классов, а так же глобальные процедуры и функции мы уже реализуем в разделе implementation*:

Биржевой робот

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

И так, мы подключили модуль. Теперь добавим к форме проекта меню (TMainMenu), оно находиться на закладке Standard*:

TMainMenu, TEdit

В меню добавим два пункта "сохранить" и "открыть"*

TMainMenu, TEdit

обзовем их itSave и itOpen соответственно*:

TMainMenu, TEdit

еще нам потребуется добавить к форме компонент TMemo, он находиться так же на закладке Standard*:

TMainMenu, TEdit

Обзовем мы этот компонент mmAccount.

Так же добавим поле ввода (TEdit) - edSumma и две кнопочки (TButton) - btnAdd и btnWithdraw - соответственно.

Кроме того, добавим флажок (TcheckBox) - cbExceptionCash. Все эти компоненты у нас тоже на закладке Standard.

Осталось с закладки dialogs добавить диалог сохранения в файл (TSaveDialog) и открытия файла (TOpenDialog)*:

TMainMenu, TEdit, биржевой симулятор

Вот так примерно у нас должна выглядеть форма проекта*:

TMainMenu, TEdit, биржевой симулятор

Теперь начнем реализацию тестировочной программы. Сначала добавим в класс 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 подключить модуль, где у нас объявлен класс симулятора счета*:

 http://easyprog.ru/index.php?option=com_content&task=view&id=235&Itemid=29

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

TMainMenu, TEdit, биржевой симулятор, робот

Исходники к уроку можно скачать здесь.


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

 

Последнее обновление ( 17.07.2013 г. )