Einzelnen Beitrag anzeigen

EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Interface richtig verstanden?

  Alt 4. Mai 2019, 11:14
Danke für eure Hinweise. Ich habe es also etwas verändert und es läuft gut. Nun möchte ich noch etwas tiefer in die Problematik Interface einsteigen.
Delphi-Quellcode:
unit logic;

interface

uses Vcl.Dialogs;

Type
IFigur = interface
 ['{921A6F17-0D63-40EC-82FD-F60CB5F66DC3}']
   function Umfang:double;
   Function Flaecheninhalt:double;
end;

type
  TFigure = class abstract(TInterfacedObject, IFigur)//Basis_Class
  private
   FSeiteA : Double;
   FSeiteB : Double;
  strict protected
   function Umfang: Double;virtual;
   function Flaecheninhalt: Double;virtual;
  public
    property SeiteA: Double read FSeiteA write FSeiteA;
    property SeiteB: Double read FSeiteA write FSeiteB;
 end;

type
 TQuadrat = class (TFigure, IFigur) //class Decleration mit Hinweis auf IFigur
  strict protected //TInterfacedObject übernimmt die Freigabe d. Objects
    function Umfang:double;override;
    function Flaecheninhalt:Double;override;
  public
    property Umfangber: Double read Umfang;
    property Flaechenber: Double read Flaecheninhalt;
 end;

type
 TDreieck = class(TFigure, IFigur)
  private
   FSeiteC : double;
   FHoehe : Double;
  strict protected
   function Umfang:double;override;
   function Flaecheninhalt:double;override;
  public
   property SeiteC: Double read FSeiteC write FSeiteC;
   property Hoehe: Double read FHoehe write FHoehe;
   property Umfangber: Double read Umfang;
   property Flaechenber: Double read Flaecheninhalt;
 end;

type
 TTrapez = class(TFigure, IFigur)
  private
   FSeiteC : Double;
   FSeiteD : Double;
   FHoehe : double;
  strict protected
   function Umfang:double;override;
   function Flaecheninhalt:double;override;
  public
    property SeiteC: Double read FSeiteC write FSeiteC;
    property SeiteD: Double read FSeiteD write FSeiteD;
    property Hoehe: Double read FHoehe write FHoehe;
    property Umfangber: Double read Umfang;
    property Flaechenber: Double read Flaecheninhalt;
 end;

implementation

  { TQuadrat }

function TQuadrat.Flaecheninhalt: double;
begin
  Result:=FseiteA*FSeiteB;
end;

function TQuadrat.Umfang: double;
begin
  Result:=2*FseiteA+2*FseiteB;
end;

{ TDreieck }

function TDreieck.Flaecheninhalt: double;
begin
 Result:=FSeiteA*FSeiteB/2;
end;

function TDreieck.Umfang: double;
begin
   Result:=FSeiteA+FSeiteB+FSeiteC;
end;

 { TTrapez }

function TTrapez.Flaecheninhalt: Double;
begin
  result:=(FSeiteA+FSeiteC)/2*FHoehe;
end;

function TTrapez.Umfang: Double;
begin
  Result:=FSeiteA+FSeiteB+FSeiteC+FSeiteD;
end;

{ TFigure }

function TFigure.Flaecheninhalt: Double;
begin
  Result:=Flaecheninhalt;
end;

function TFigure.Umfang: Double;
begin
  Result:=Umfang;
end;

end.
und das MainForm:
Delphi-Quellcode:
unit uMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, logic, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    lbl1: TLabel;
    btn1: TButton;
    edt1: TEdit;
    btn2: TButton;
    edt2: TEdit;
    lbl2: TLabel;
    lbl3: TLabel;
    btn3: TButton;
    edt3: TEdit;
    lbl4: TLabel;
    lbl5: TLabel;
    lbl6: TLabel;
    lbl7: TLabel;
    btn4: TButton;
    lbl9: TLabel;
    edt4: TEdit;
    edt5: TEdit;
    lbl10: TLabel;
    lbl11: TLabel;
    procedure btn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.btn2Click(Sender: TObject);
var MyFigure: TQuadrat;
begin
  MyFigure:=TQuadrat.Create; //Freigabe nicht erf., da TInterfacedObject dies übernimmt
  try
  MyFigure.SeiteA:=strtoint(edt1.Text);
  MyFigure.SeiteB:=StrToInt(edt2.text);
  lbl2.Caption:=FloatToStr(MyFigure.Umfangber);
  lbl3.Caption:=FloatToStr(MyFigure.Flaechenber);
  except
    on E:Exception do
    begin
       ShowMessage('Exception class name = '+E.ClassName);
       ShowMessage('Exception message = '+E.Message);
    end;
  end;
end;

procedure TForm1.btn3Click(Sender: TObject);
var MyFigure: TDreieck;
begin
  MyFigure:=TDreieck.Create;
  try
  MyFigure.SeiteA:=StrToFloat(edt1.Text);
  MyFigure.SeiteB:=StrToFloat(edt2.text);
  MyFigure.SeiteC:=StrToFloat(edt4.text);
  lbl2.Caption:=FloatToStr(MyFigure.Umfangber);
  lbl3.Caption:=FloatToStr(MyFigure.Flaechenber);
  except
    on E:Exception do
    begin
       ShowMessage('Exception class name = '+E.ClassName);
       ShowMessage('Exception message = '+E.Message);
    end;
  end;
end;

procedure TForm1.btn4Click(Sender: TObject);
var MyFigure: TTrapez;
begin
  MyFigure:=TTrapez.Create;
  try
  MyFigure.SeiteA:=StrToFloat(edt1.Text);
  MyFigure.SeiteB:=StrToFloat(edt2.text);
  MyFigure.Hoehe:=StrToFloat(edt3.text);
  MyFigure.SeiteC:=StrtoFloat(edt4.Text);
  MyFigure.SeiteD:=StrtoFloat(edt5.Text);
  lbl2.Caption:=FloatToStr(MyFigure.Umfangber);
  lbl3.Caption:=FloatToStr(MyFigure.Flaechenber);
  except
    on E:Exception do
    begin
       ShowMessage('Exception class name = '+E.ClassName);
       ShowMessage('Exception message = '+E.Message);
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  edt1.Clear;
  edt2.Clear;
  edt3.Clear;
  edt4.Clear;
  edt5.Clear;
  lbl2.Caption:='';
  lbl3.Caption:='';
end;

end.
Norbert
  Mit Zitat antworten Zitat