Читайте также:
|
|
Лабораторная работа №2 "События ".
Свойства – имя, значение, числитель и знаменатель.
Методы – процедуры: обратить дробь (Swap), добавить значение другой дроби (Add);
– функции: информация (Info);
– конструктор (Create).
События – дробь изменилась (OnChange), стандартное;
– знаменатель стал равен нулю (OnZero), параметры - старое значение.
Модуль:
unit Drobs;
interface
uses SysUtils,Classes;
type
TMyEvent=procedure(Sender:TObject;OldP,OldQ:longint) of Object;
TDrob=class
private
fName:string;
fp,fq:longint;
fOnChange:TNotifyEvent;
fOnZero:TMyEvent;
procedure SetP(NewP:longint);
procedure SetQ(NewQ:longint);
public
constructor Create(aName:string);
procedure Swap;
procedure Add(a:TDrob);
function Info:string;
function GetValue:real;
procedure SetValue(NewValue:real);
procedure SetPQ(NewP,NewQ:longint);
property Name:string read fName write fName;
property Value:real read GetValue write SetValue;
property p:longint read fp write SetP;
property q:longint read fq write SetQ;
property OnChange:TNotifyEvent read fOnChange write fOnChange;
property OnZero:TMyEvent read fOnZero write fOnZero;
end;
implementation
procedure TDrob.SetPQ(NewP, NewQ: longint);
var pp,qq: longint;
begin
if (NewP<>p) or (NewQ<>q) then begin
pp:=p; qq:=q;
if NewQ<>0
then begin fp:=NewP; fq:=NewQ; Normalization; end
else begin
fp:=NewP; fq:=1;
if assigned(fOnZero) then OnZero(Self,pp,qq)
end;
if assigned(fOnChange) then OnChange(Self);
end;
end;
constructor TDrob.Create;
begin
inherited Create;
Name:=aName;
SetPQ(1,1);
end;
function TDrob.Info: string;
begin
Result:='Дробь '+Name+'= '+IntToStr(p)+'/'+IntToStr(q)+'='
+FloatToStrF(Value,ffFixed,9,5);
end;
procedure TDrob.Swap;
begin
SetPQ(q,p);
end;
procedure TDrob.Add(a: TDrob);
begin
SetPQ(p*a.q+q*a.p,q*a.q);
end;
procedure TDrob.SetP(NewP:longint);
begin
SetPQ(NewP,q);
end;
procedure TDrob.SetQ(NewQ: longint);
begin
SetPQ(p,NewQ);
end;
function TDrob.GetValue: real;
begin
Result:=p/q;
end;
procedure TDrob.SetValue(NewValue: real);
begin
SetPQ(round(NewValue*10000),10000);
end;
end.
Демонстрационная программа на Delphi:
– подключается модуль Drobs:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Drobs;
– описываются переменные для двух дробей:
var
Form1: TForm1;
a,b: TDrob;
– на форме располагаются объекты:
GroupBox1, GroupBox2 | для демонстрации первой и второй дробей; |
Label1, Edit1 | числитель первой дроби |
Label2, Edit2 | знаменатель первой дроби |
Label3, Edit3 | значение первой дроби |
Label4, Edit4 | числитель второй дроби |
Label5, Edit5 | знаменатель второй дроби |
Label6, Edit6 | значение второй дроби |
Button1 | "Обмен" |
Button2 | "+" |
Button3 | "INFO" для первой дроби |
Button4 | "INFO" для второй дроби |
– добавляются три процедуры–обработчика для дробей:
procedure TForm1.AChange(Sender: TObject);
begin
GroupBox1.Caption:=a.Name;
Edit1.Text:=IntToStr(a.p);
Edit2.Text:=IntToStr(a.q);
Edit3.Text:=FloatToStrF(a.Value,ffFixed,9,5);
end;
procedure TForm1.BChange(Sender: TObject);
begin
GroupBox2.Caption:=b.Name;
Edit4.Text:=IntToStr(b.p);
Edit5.Text:=IntToStr(b.q);
Edit6.Text:=FloatToStrF(b.Value,ffFixed,9,5);
end;
procedure TForm1.ZeroEvent(Sender: TObject;OldP,OldQ:longint);
begin
with sender as TDrob do
if MessageDlg('Дробь '+Name+' получила нулевой знаменатель,'+
' который бы заменен единицей. Восстановить прежнее значение?',
mtWarning,[mbYes,mbNo],0) = mrYes then SetPQ(OldP,OldQ);
end;
– прописываются процедуры–обработчики визуальных компонент для управления дробями:
a:=TDrob.Create('a');
a.OnChange:=AChange; a.OnChange(a);
a.OnZero:=ZeroEvent;
b:=TDrob.Create('b');
b.OnChange:=BChange; b.OnChange(b);
b.OnZero:=ZeroEvent;
var st:string;
begin
with Sender as TEdit do begin
st:=text;
if Key='-' then begin
if st[1]='-' then Delete(st,1,1)
else st:='-'+st;
Text:=st;
end;
if not (Key in ['0'..'9',#8]) then Key:=#0;
if Key=#8 then if Length(st)<2 then Key:=#0;
end;
end;
a.Swap;
a.Add(b);
Button3.Hint:=a.info;
Button4.Hint:=b.info;
Задание для самостоятельной работы:
– добавить к данному классу (TDrob).
Свойства – Simple, простота (числитель меньше знаменателя), для чтения;
– Changable, разрешение на изменение, для чтения и записи.
Методы – процедуры: операции "–" (Sub), "*" (Mult), "/" (Div) с другой дробью;
– процедура Assign(d:TDrob), копирующая информационные поля другой дроби;
– функция Compare(d:TDrob), сравнивающая текущую дробь с другой (результат 0, +1, –1 для случаев Self=d, Self>d, Self<d, соответственно).
Событие – OnChanging (дробь будет изменена), в интерфейсе процедуры-обработчика которого (по аналогии с var Accept: Boolean для события OnDragOver) находилась булевская переменная, которая определяла бы корректность нового значения: (по умолчанию TRUE, в случау FALSE восстанавливается предыдущее значение). Используя данную возможность запретить одной дроби принимать значения большие 100 по модулю, а другой – четный знаменатель.
Слайд 1
Дата добавления: 2015-11-26; просмотров: 118 | Нарушение авторских прав