Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi OOP Variablen übergeben. (https://www.delphipraxis.net/182196-oop-variablen-uebergeben.html)

DelphiNoob1.0 8. Okt 2014 18:47


OOP Variablen übergeben.
 
Hey In der Schule ist grade OBjektorientiertes Arbeiten dran, aber bis jetzt stande ich noch nicht vor dem Problem eine Variable zu übergeben, also wir hatten das schon mal mit Property, aber bei einem anderen Prjekt.. Egal naja ich bin voll überfordert grade!

Also mein Problem ist ich habe eine Klasse TAussehen (Unit3) Nun möchte ich Variablen aus der Unit2 an TAussehen übergeben und ein Shape1 in Unit1 mit diesen Variablen anpassen.


Beim Buttonklick auf Form2 (die einstellungen für das aussehen!
Code:
procedure TForm2.Button1Click(Sender: TObject);

begin

set4(stylebox1.text); // probiert mit procedure zu übergeben, hab // aber keine Ahnung wass ich davor schreiben soll. //TIrgendwas.set4 usw.

set2(colorbox1.Color);

set3(colorbox2.Color);

set1(strtoint(LabeledEdit1.text))



end;
Dann in Unit3

Code:
unit Unit3;

interface
uses Graphics;
type TAussehen= class(TObject)
 protected
   border_width:integer;
   bordercolor:Tcolor;
   color:Tcolor;
   border_pattern:string;
 public
 procedure set1(bw:integer);
 procedure set2(bc:TColor);
 procedure set3(clr:TColor);
 procedure set4(bp:string);
 end;
implementation
 procedure Taussehen.set1;
 begin
 border_width:=bw;
 end;
 procedure Taussehen.set2;
 begin
 bordercolor:=bc;
 end;
 procedure Taussehen.set3;
 begin
 color:=clr;
 end;
 procedure Taussehen.set4;
 begin
 border_pattern:=bp;
 end;
und schließlich die Neuen Variablen an Unit1 übergeben

Code:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.shape1.pen.width:=border_width;
if border_pattern = 'gepunktet' then
 shape1.pen.style:=psDot
 else if border_pattern = 'gestrichelt' then
 shape1.pen.style:=psDash
 else if border_pattern = 'punkt-strich' then
 shape1.pen.style:=psDashDot
 else if border_pattern = 'punkt-punkt-strich' then
 shape1.pen.style:=psDashDotDot
 else if border_pattern = 'solid' then
 shape1.pen.style:=psSolid
 else if border_pattern = 'keinen Rahmen' then
 shape1.pen.style:=psClear
Und alles so das es auch so nach dem Prinzip der Objektorientiereung "SICHER" ist.


Danke für eure Hilfe :)

Ach und ja also später kommt noch die Position und Größe des Objektes aus Unit 4 dazu, dazu gibt es Button auf Form1, die dann mit einer Procedur das ding vergrßert, also width und height ändert, aber das würde ich dann alleine hinkriegen glaub ich mal ^^.

Dragon27 8. Okt 2014 19:05

AW: OOP Variablen übergeben.
 
Hallo,

Also wenn ich deinen Code so lese, würde ich dir empfehlen ein paar "Regeln" einzuhalten. Diese sind vielleicht am Anfang nervig... aber sie erleichtern dir Vieles.

Zum ersten solltest du Felder immer mit einem Vorangestellten F deklarieren. Zum anderen deinen Settern einigermaßen eindeutige Namen geben... auf keinen Fall "set1 bis x".

Ich hab dir deinen Code mal ansatzweise sauber umgeschrieben. Bitte mach aber nicht den Fehler, diesen einfach zu kopieren. Er soll dir verdeutlichen, wie es besser geht...

Delphi-Quellcode:
type
  TAussehen = class(TObject)
  private
    FBorder_width: integer;
    FBorder_color: TColor;
    FColor: TColor;
    FBorder_Pattern: string;
    procedure SetBorder_color(const Value: TColor);
    procedure SetBorder_Pattern(const Value: string);
    procedure SetBorder_width(const Value: integer);
    procedure SetColor(const Value: TColor);
  public
    property Border_color: TColor read FBorder_color write SetBorder_color;
    property Border_Pattern: string read FBorder_Pattern write SetBorder_Pattern;
    property Border_width: integer read FBorder_width write SetBorder_width;
    property Color: TColor read FColor write SetColor;
  end;

implementation

procedure TAussehen.SetBorder_color(const Value: TColor);
begin
  FBorder_color := Value;
end;

procedure TAussehen.SetBorder_Pattern(const Value: string);
begin
  FBorder_Pattern := Value;
end;

procedure TAussehen.SetBorder_width(const Value: integer);
begin
  FBorder_width := Value;
end;

procedure TAussehen.SetColor(const Value: TColor);
begin
  FColor := Value;
end;
Beste Grüße

mkinzler 8. Okt 2014 19:09

AW: OOP Variablen übergeben.
 
Die Methodennamen set1 usw. sind recht nichtssagend, nimm besser etwas aussagekräftigeres wi z.b SetBorderWidth, dann weiss man auch ohe Doku was der Setter den setzt.

Da der Setter ja nichts macht ausser den Wert eines Feldes zu setzen, würde man ihn eigentlich nicht benötigen.

Felder sollten zudem privat sein. Im Allgemeinen stellt man dann einen F davor, bei Parametern von Settern ein A

Delphi-Quellcode:
type
 TAussehen = class
  private
    FBorderWidth:integer;
    FBorderColor:TColor;
    FColor:TColor;
    FBorderPattern:string;
  public // oder private
    procedure SetBorderWith(abw:integer);
    ...
  published
    property BorderWidth: Integer read FBorderWidth write SetBorderWidth;
    ...
end;
Voor der Verwendung musst Du eine Instanz erzeugen

Delphi-Quellcode:
var
  Aussehen: TAussehen;
  ...
  Aussehen := TAussehen.Create;
  ...
Der Aufruf:
Delphi-Quellcode:
  Aussehen.SetBorderWidth( 10); // wenn public
  // oder
  Aussehen.Borderwidth := 10; // Durch Setzen der Property wird der Setter aufgerufen.

Dragon27 8. Okt 2014 19:14

AW: OOP Variablen übergeben.
 
Mir fällt noch ein, dass du zum besseren Verständnis hier nachlesen kannst:

Klassen und Objekte

DelphiNoob1.0 8. Okt 2014 19:41

AW: OOP Variablen übergeben.
 
Oh Super danke, aber wie hole ich die Wert aus Unit2?

Code:
FBorder_Pattern(stylebox1.text);
?

mkinzler 8. Okt 2014 19:47

AW: OOP Variablen übergeben.
 
Garnicht, du übergibst den Wert in Unit2 an das Objekt.

Delphi-Quellcode:
<Objekt>.BorderPattern := Stylebox1.Text;

DelphiNoob1.0 8. Okt 2014 19:50

AW: OOP Variablen übergeben.
 
Wozu brauch ich dann die property?

mkinzler 8. Okt 2014 20:03

AW: OOP Variablen übergeben.
 
Ja man könnte auf sie verzichten, ich finde aber

Delphi-Quellcode:
obj.Top := 0; obj.Left := 0; obj.Width := 100; obj.Height := 100;
Besser lesbar als

Delphi-Quellcode:
obj.SetTop(0); obj.SetLeft(0); ...
Bei einer property ohne Setter/Getter wird im Kompilat, dann direkt auf die privaten Felder zugegriffen.
Später kann man dies dann einfach auf Setter/Getter umstellen ohne das der kosumierende Code geändert werden muss.

Delphi-Quellcode:
obj.Top := 0;
->
Delphi-Quellcode:
obj.FTop := 0;
In diesem Fall wird statt der Zuweisung der setter augerufen

Delphi-Quellcode:
obj.Top := 0;
->
Delphi-Quellcode:
obj.SetTop(0);
Für eine propery muss auch kein privates Feld existieren oder sie kann read oder writeonly sein

Delphi-Quellcode:
type
  Klasse = class
 private
  FGebDat: TDate;
  ...
  procedure CalcAlter: Integer;
 public
  property Alter: Integer read CalcAlter;
...
end;
...
procedure <Klasse>.CalcAlter: Integer;
begin
  result := (Today-FGebdat) DIV 364; // dirty implementation
end;

himitsu 8. Okt 2014 20:09

AW: OOP Variablen übergeben.
 
Und bevor die Frage kommt: Warum nicht die Felder public machen und einfach direkt drauf zugreifen?

A: Das wäre nicht OOP.
B: So verbaut man sich die Möglichkeit den Code zu trennen und vorallem später mal Getter und/oder Setter dazischenzuschalten.
C: Man kann den Zugriff steuern und prüfen. (übergebene Werte im Setter auf einen gültigen Bereich/Wert prüfen und im Getter prüfen ob und was gelesen wird)
D: Was die Klasse intern macht ist egal und sollte nicht nach außen getragen werden. Nur die öffentliche Schnittstelle hat externe Codes zu interessieren.
X: uvm.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz