Lenta kotirovok

Some blogs or websites linked from this site may contain objectionable or uncensored content, www.mainru.com is not affiliated with these websites and makes no representations or warranties as to their content.

понедельник, 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

Поделится

Котировки

Идея