![]() |
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:
Dann in Unit3
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;
Code:
und schließlich die Neuen Variablen an Unit1 übergeben
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;
Code:
Und alles so das es auch so nach dem Prinzip der Objektorientiereung "SICHER" ist.
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 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 ^^. |
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:
Beste Grüße
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; |
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:
Voor der Verwendung musst Du eine Instanz erzeugen
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;
Delphi-Quellcode:
Der Aufruf:
var
Aussehen: TAussehen; ... Aussehen := TAussehen.Create; ...
Delphi-Quellcode:
Aussehen.SetBorderWidth( 10); // wenn public
// oder Aussehen.Borderwidth := 10; // Durch Setzen der Property wird der Setter aufgerufen. |
AW: OOP Variablen übergeben.
|
AW: OOP Variablen übergeben.
Oh Super danke, aber wie hole ich die Wert aus Unit2?
Code:
?
FBorder_Pattern(stylebox1.text);
|
AW: OOP Variablen übergeben.
Garnicht, du übergibst den Wert in Unit2 an das Objekt.
Delphi-Quellcode:
<Objekt>.BorderPattern := Stylebox1.Text;
|
AW: OOP Variablen übergeben.
Wozu brauch ich dann die property?
|
AW: OOP Variablen übergeben.
Ja man könnte auf sie verzichten, ich finde aber
Delphi-Quellcode:
Besser lesbar als
obj.Top := 0; obj.Left := 0; obj.Width := 100; obj.Height := 100;
Delphi-Quellcode:
Bei einer property ohne Setter/Getter wird im Kompilat, dann direkt auf die privaten Felder zugegriffen.
obj.SetTop(0); obj.SetLeft(0); ...
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:
In diesem Fall wird statt der Zuweisung der setter augerufen
obj.FTop := 0;
Delphi-Quellcode:
->
obj.Top := 0;
Delphi-Quellcode:
Für eine propery muss auch kein privates Feld existieren oder sie kann read oder writeonly sein
obj.SetTop(0);
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; |
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 13:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz