Реклама

понедельник, 15 ноября 2010 г.

Пишем робота Урок №15

Продолжаем писать биржевой симулятор (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 FCashthen
   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, биржевой симулятор, робот
Исходники к уроку можно скачать здесь.

Скриншоты, помеченные знаком * , являются цитатами и иллюстрациями  в соответствии со ст. 1274 ГК РФ программного продукта "Delphi", авторское право на который принадлежит "Borland Software Corporation, (a Micro Focus Company). 


Источник: http://easyprog.ru/index.php?option=com_content&task=view&id=227&Itemid=44