Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Verwirrung pur

  Alt 14. Nov 2011, 17:52
Ok vielen dank =) ... Ich frage mich nur wieso es bei meinem Lehrer funktioniert hat 0o
Weil du beim Abschreiben Fehler reingebracht hast?

Hier mal, wie man so etwas besser aufbaut:
Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  TKreis = class
  private
    fX,fY,fD: Integer;
  public
    constructor create ( aX, aY, aD: Integer );
    procedure erscheinen( aForm : TForm );
    procedure verschwinden( aForm : TForm );
    // Eigenschaften - readonly, weil auf eine externe Veränderung keine Reaktion implementiert ist
    property X : integer read fX;
    property Y : integer read fY;
    property D : integer read fD;
  end;

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click( Sender: TObject );
    procedure Button2Click( Sender: TObject );
  private
    { private declarations }
    fKreis : TKreis;
  public
    { public declarations }
    property Kreis : TKreis read fKreis;
  end;

var
  Form1: TForm1;
  // globale Variablen gehen ja gar nicht
  // Kreis: TKreis;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click( Sender: TObject );
begin
  // Wenn es eine Instanz von Kreis gibt, dann diese Instanz auch wieder freigeben, sonst Speicherleck!!!
  if Assigned( fKreis ) then
    fKreis.Free;

  // Das Form1.Edit... ist sowas von falsch, denn bei einer weiteren Instanz von TForm1 funktioniert das nicht mehr
  // Was noch gehen würde wäre Self.Edit1.Text
  fKreis := TKreis.Create( StrToInt( Edit1.Text ), StrToInt( Edit2.Text ), StrToInt( Edit3.Text ) );

  // Self ist die Referenz auf die aktuelle Klassen-Instanz und somit an dieser Stelle diese Formular-instanz
  Kreis.erscheinen( Self );
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  // Wenn es eine Instanz Kreis gibt, dann die Methode aufrufen, sonst gibt es Zugriffsverletzungen!!!
  if Assigned( Kreis )
    Kreis.verschwinden( Self );
end;

{ TKreis }

constructor TKreis.create ( aX, aY, aD: Integer );
begin
  inherited Create; // nur zur Vorsicht, falls TObject mal einen speziellen Constructor bekommt
  fX := aX;
  fY := aY;
  fD := aD;
end;

procedure TKreis.verschwinden( aForm : TForm );
begin
  aForm.Refresh;
end;

procedure TKreis.erscheinen( aForm : TForm );
begin
  verschwinden( aForm );
  aForm.Canvas.Ellipse( X, Y, X + D, Y + D );
end;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (14. Nov 2011 um 17:55 Uhr)
  Mit Zitat antworten Zitat