AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OOP Variablen übergeben.

Ein Thema von DelphiNoob1.0 · begonnen am 8. Okt 2014 · letzter Beitrag vom 8. Okt 2014
Antwort Antwort
DelphiNoob1.0

Registriert seit: 23. Okt 2012
Ort: Berlin
13 Beiträge
 
Delphi 6 Personal
 
#1

OOP Variablen übergeben.

  Alt 8. Okt 2014, 19:47
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 ^^.
  Mit Zitat antworten Zitat
Dragon27

Registriert seit: 20. Nov 2003
Ort: Aßling
543 Beiträge
 
Delphi XE6 Enterprise
 
#2

AW: OOP Variablen übergeben.

  Alt 8. Okt 2014, 20:05
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
Delphi is ......... DELPHI!!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: OOP Variablen übergeben.

  Alt 8. Okt 2014, 20:09
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Dragon27

Registriert seit: 20. Nov 2003
Ort: Aßling
543 Beiträge
 
Delphi XE6 Enterprise
 
#4

AW: OOP Variablen übergeben.

  Alt 8. Okt 2014, 20:14
Mir fällt noch ein, dass du zum besseren Verständnis hier nachlesen kannst:

Klassen und Objekte
Delphi is ......... DELPHI!!
  Mit Zitat antworten Zitat
DelphiNoob1.0

Registriert seit: 23. Okt 2012
Ort: Berlin
13 Beiträge
 
Delphi 6 Personal
 
#5

AW: OOP Variablen übergeben.

  Alt 8. Okt 2014, 20:41
Oh Super danke, aber wie hole ich die Wert aus Unit2?

Code:
FBorder_Pattern(stylebox1.text);
?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: OOP Variablen übergeben.

  Alt 8. Okt 2014, 20:47
Garnicht, du übergibst den Wert in Unit2 an das Objekt.

<Objekt>.BorderPattern := Stylebox1.Text;
Markus Kinzler
  Mit Zitat antworten Zitat
DelphiNoob1.0

Registriert seit: 23. Okt 2012
Ort: Berlin
13 Beiträge
 
Delphi 6 Personal
 
#7

AW: OOP Variablen übergeben.

  Alt 8. Okt 2014, 20:50
Wozu brauch ich dann die property?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: OOP Variablen übergeben.

  Alt 8. Okt 2014, 21:03
Ja man könnte auf sie verzichten, ich finde aber

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

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.

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

obj.Top := 0; -> 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;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: OOP Variablen übergeben.

  Alt 8. Okt 2014, 21:09
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.
$2B or not $2B

Geändert von himitsu ( 8. Okt 2014 um 21:13 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:07 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