Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Konstruktor (https://www.delphipraxis.net/167288-konstruktor.html)

hotkey 21. Mär 2012 17:17

Konstruktor
 
Hallo , ich schreibe morgen eine Klausur und mir ist eingefallen , dass ich etwas nicht kann.

Wenn ich eine Klasse habe und zum Beispiel in dieser Klasse die Eigenschaften x,y :integer habe auf private und eine zweite Klasse erschaffe , die von der ersten diese Eigenschaften erben soll , kann ich keine Methoden aufrufen.

Also :

Delphi-Quellcode:
  tgeo_objects = class
end;

    TViereck = class(Tgeo_objects)
      private
     x,y:integer;
    public
      procedure setx;
      procedure sety;
      function getx:integer;
      function gety:integer;
 
   end;

  TDreieck = class(TViereck)
  private
   x,y:integer;
 
  public
   procedure setx;
   procedure sety;
   function getx:integer;
   function gety:integer;
Ich weiß , das ist nicht richtig OOP , ist aber auch nicht "wichtig" , in der Klausur wird auf was anderes mehr gesetzt.

Wenn ich jetzt zum Beispiel.

Delphi-Quellcode:
procedure tdreieck.setx
schreibe , dann erkennt er das nicht.

Ich habe ja auch noch keine Instanz von Tdreieck erzeugt , aber wie und wo erzeuge ich das , um x und y in der Dreieck Klasse zu manipulieren.

Für Tviereck hatte ich eine Instanz erzeugt. Ist aber die Oberklasse und die Eigenschaften müssen nicht vererbt werden.

Wo also muss ich
Delphi-Quellcode:
mydreieck := Tdreieck.create
raufklatschen , damit er
Delphi-Quellcode:
procedure tdreieck.setx
zum Beispiel erkennt ?

Danke schon im Voraus.

mkinzler 21. Mär 2012 17:27

AW: Konstruktor
 
Delphi-Quellcode:
tgeo_objects = class
end;

    TViereck = class(Tgeo_objects)
    private
      Fx,Fy:integer;
    public
      procedure setx( ax: Integer);
      procedure sety( ay: Integer);
      function getx:integer;
      function gety:integer;
    published
      property x: Integer read getx write setx;
      property y: Integer read gety write sety;
   end;

  TDreieck = class(TViereck)
  end;
...
  procedure TViereck.setx( ax: Integer);
  begin
      Fx = ax;
  end;
  ...

hotkey 21. Mär 2012 17:35

AW: Konstruktor
 
Das mit
Delphi-Quellcode:
procedure Tviereck.setx
funktioniert ja bei mir , aber sobald ich x,y von Viereck vererbe kann ich mit dem Punkt-Operator
Delphi-Quellcode:
Tdreieck.setx
diesen Befehl nicht ausführen , da er sagt , dass x nicht erkannt wird , obwohl es ja vererbt wird
Delphi-Quellcode:
Tdreieck = class(tviereck)
wie löse ich das blöde Problem ?

DeddyH 21. Mär 2012 18:01

AW: Konstruktor
 
Du weißt aber, was private, protected, virtual, override usw. bedeuten?

hotkey 21. Mär 2012 18:08

AW: Konstruktor
 
Bis jetzt hatten wir nur protected , private und public.

Spielt das eine Rolle für die Problemlösung , wenn ich fragen darf ?

DeddyH 21. Mär 2012 18:15

AW: Konstruktor
 
Ich denke schon, oder soll jede abgeleitete Klasse ihr eigenes SetX usw. haben? Wenn ja, wozu dann erben?

hotkey 21. Mär 2012 18:18

AW: Konstruktor
 
Naja , es muss doch möglich sein , wenn ich eine Klasse habe mit der Eigenschaft Bellen zum Beispiel , dass die zweite davon vererbte Klasse auch die Eigenschafte Bellen beeinhalten muss , oder ?

Peter1999 21. Mär 2012 18:23

AW: Konstruktor
 
Also zum Einen hat mkinzler natürlich recht, deine Setter-Methoden können nicht funktionieren, da sie keinen Wert zugewiesen bekommen. Was sollen sie dann an die Felder FX, FY weiterleiten? Schau dir also mal den Unterschied zu deinem Quelltext an. Oder handelt es sich um geerbte Methoden von TGeo_Objects, die du uns hier nicht zeigst?

Zum Zweiten wird dir hier niemand helfen können, wenn du uns nicht den Quelltext des Implementation-Teils deiner Unit zeigst. Wo versuchst du denn deine Methoden aufzurufen? Bzw. wo erzeugst du denn die Objekte von TDreieck, mit denen du auf die propertys (die dir noch fehlen) zugreifen willst?

Ja klar kannst du die Methoden vererben, dann solltest du dir aber mal die Begriffe virtual, dynamic und inherited anschauen.

Der Titel hier lautet "Konstruktor", wo ist bei dir ein Constructor???

hotkey 21. Mär 2012 18:28

AW: Konstruktor
 
Ich weiß wo das Problem liegt , aber ich weiß nciht wie ich es beheben kann.

Ich muss doch erst von Dreieck eine INSTANZ mit dem KONSTRUKTOR-AUFRUF erstellen , damit ich z.B
Delphi-Quellcode:
procedure tdreieck.setx
benutzen kann.
Und dieses x ist in der Viereckklasse und Dreieck erbt von dieser Viereckklasse , also muss Dreieck automatisch auch die Variable x auf Integer haben ?

Iwo Asnet 21. Mär 2012 18:33

AW: Konstruktor
 
Meinst Du sowas?

Delphi-Quellcode:
Var
  MeinDreieck : TDreiEck;

Begin
  MeinDreieck := TDreieck.Create; // Instantiiert

DeddyH 21. Mär 2012 18:37

AW: Konstruktor
 
Ich frage mich ernsthaft, was der Konstruktor mit der Setter-Methode zu tun haben soll und wieso man dazu eine Instanz haben muss, damit der Compiler das akzeptiert. Ich glaube, wir reden alle an einander vorbei.

hotkey 21. Mär 2012 19:00

AW: Konstruktor
 
Ja , das muss ich ja machen.
Aber wo ?

Wenn ich das unter einen Button-ON-Click Event raufklatsche kann ich ja vorher keine Methoden benutzen :(

Peter1999 21. Mär 2012 19:27

AW: Konstruktor
 
Also nochmal!

Wenn du uns nicht verrätst, was du machen willst und du uns keinen Quelltext zeigst, dann können wir dir auch nicht helfen.
Wo verwendest du denn deine Instanzen der Klasse TDreieck?

Bisher schreibst du uns nur, frei übersetzt: "Ich muss ein Programm schreiben, was mache ich falsch"
Du verlangst hellseherische Fähigkeiten von uns. Wir würden ja alle gern helfen.

hotkey 21. Mär 2012 19:59

AW: Konstruktor
 
Okay , seht selbst bitte :

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit3: TEdit;
    Edit4: TEdit;
    Button2: TButton;
    Button3: TButton;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Label4: TLabel;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;



  tgeo_objects = class
end;

   tpunkt = class(tgeo_objects)
   private
   x,y:integer;                           // HIER WIRD X UND Y DEKLARIERT AUF INTEGER NICHT RICHTIG OOP I KNOW
   end;

    TViereck = class(Tpunkt)

    public
      procedure setx;
      procedure sety;
      function getx:integer;
      function gety:integer;
    protected
     procedure zeichne;
   end;

  TDreieck = class(Tpunkt)
  protected
  procedure zeichnen;

  public
   procedure setx;
   procedure sety;
   function getx:integer;
   function gety:integer;
end;




TKreis = class (TDreieck)
procedure Kreiszeichnen;
private
x1,y1,x2,y2:integer;
public
procedure setx1;
procedure sety1;
procedure setx2;
procedure sety2;

function getx1:integer;
function gety1:integer;
function getx2:integer;
function gety2:integer;

end;

Tgeo_objectsArray = Array of Tgeo_objects;



var
  Form1: TForm1;
  lange,breite:integeR;
  myviereck : Tviereck;
  mydreieck : Tdreieck;
  mykreis : Tkreis;
 GeoArray :Tgeo_objectsarray;

implementation




 procedure addtoarray(Geoobject:tgeo_objects);
 begin
   SetLength(GeoArray, Length(GeoArray) + 1);
   GeoArray[High(GeoArray)] := GeoObject;
 end;

procedure tviereck.setx; //setzen
begin
 x:= strtoint(form1.Edit1.text);

end;

procedure Tviereck.sety;  //setzen
begin
y:= strtoint(form1.edit2.Text);
end;

function Tviereck.getx;
begin

result :=x;

end;

function tviereck.gety;
begin
result:=y;
end;


procedure tdreieck.setx; //setzen
begin
 x:= strtoint(form1.Edit3.text);

end;

procedure Tdreieck.sety;  //setzen
begin
y:= strtoint(form1.edit4.Text);
end;

function Tdreieck.getx;
begin

result :=x;

end;

function tdreieck.gety;
begin
result:=y;
end;


procedure Tkreis.setx1;
begin
x1 := strtoint(form1.Edit5.Text);
end;

procedure Tkreis.sety1;
begin
y1 := strtoint(form1.edit6.text);
end;

procedure Tkreis.setx2;
begin
x2 := strtoint(form1.edit7.text);
end;

procedure Tkreis.sety2;
begin
y2:= strtoint(form1.Edit8.text);
end;


function tkreis.getx1;
begin
result := x1;
end;

function tkreis.gety1;
begin
result := y1;
end;

function tkreis.getx2;
begin
result := x2;
end;

function tkreis.gety2;
begin
result := y2;
end;



procedure TViereck.zeichne;
begin
  form1.PaintBox1.Canvas.MoveTo(myviereck.getx,myviereck.gety);
  form1.paintbox1.canvas.LineTo(myviereck.getx+100,myviereck.gety);

  form1.paintbox1.canvas.lineto(myviereck.getx+100,myviereck.gety+100);

  form1.paintbox1.canvas.lineto(myviereck.getx,myviereck.gety+100);

  form1.paintbox1.Canvas.MoveTo(myviereck.getx,myviereck.gety);
  form1.PaintBox1.canvas.LineTo(myviereck.getx,myviereck.gety+100);
end;

 procedure Tdreieck.zeichnen;
begin
  form1.PaintBox1.Canvas.MoveTo(mydreieck.getx,mydreieck.gety);
  form1.PaintBox1.Canvas.LineTo(mydreieck.getx+100,mydreieck.gety);

  form1.PaintBox1.Canvas.MoveTo(mydreieck.getx,mydreieck.gety);
  form1.paintbox1.canvas.LineTo(mydreieck.getx,mydreieck.gety+100);

  form1.paintbox1.Canvas.MoveTo(mydreieck.getx,mydreieck.gety+100);
  form1.PaintBox1.Canvas.LineTo(mydreieck.getx+100,mydreieck.gety);
  end;

  procedure Tkreis.Kreiszeichnen;
  begin
  form1.PaintBox1.Canvas.Ellipse(x1,y1,x2,y2);
  end;


  procedure Farbe;
  begin
  if (form1.edit9.text) = ('rot')
   then
     begin
        form1.Color:=clred;
        end;
 end;


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   Myviereck := Tviereck.creatE;

   myviereck.setx;
   myviereck.sety;

   myviereck.zeichne;
   myviereck.free;

end;



procedure TForm1.Button2Click(Sender: TObject);
begin
   mydreieck := tdreieck.Create;

   mydreieck.setx;
   mydreieck.sety;

   mydreieck.zeichnen;
   mydreieck.Free;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
    mykreis := tkreis.Create;

    mykreis.setx1;
    mykreis.sety1;
    mykreis.setx2;
    mykreis.sety2;

    mykreis.Kreiszeichnen;
    mykreis.Free;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 farbe;
end;

end.
Hab den Fehler irgendwie behoben , x und y wird nur einmal bei TPunkt deklariert und die anderen Klassen kriegen x und y auch und können diese manipulieren mit set und get.

Luckie 21. Mär 2012 20:24

AW: Konstruktor
 
Überleg mal was wohl private bedeutet und was public.

hotkey 21. Mär 2012 20:31

AW: Konstruktor
 
private ist doch dazu da , um Variablen etc abzukapseln , damit keiner Zugriff auf diese hat , damit keiner diese manipulieren kann.

Aber trotzdem müssen doch PRIVATE DEKLARIERTE VARIABLEN VERERBT WERDEN , oder nicht ?
Sieht man doch an meinem Quellcode.

Bummi 21. Mär 2012 21:50

AW: Konstruktor
 
Äaehmmm, irgendwie hat das ganz so gar nichts mit Objektorientierung zu tun ...

Designe Deine Klassen doch mal unabhängig von äußeren Einflüssen wie Form1, verpasse Ihnen eine Property Canvas oder übergebe diese beim Zeichenaufruf. Die Vererbung scheint mir auch etwas wild.

Sir Rufo 21. Mär 2012 21:55

AW: Konstruktor
 
Zitat:

Zitat von Bummi (Beitrag 1157855)
Äaehmmm, irgendwie hat das ganz so gar nichts mit Objektorientierung zu tun ...

Designe Deine Klassen doch mal unabhängig von äußeren Einflüssen wie Form1, verpasse Ihnen eine Property Canvas oder übergebe diese beim Zeichenaufruf. Die Vererbung scheint mir auch etwas wild.

Vergebene Liebesmüh ... das habe ich ihm schon n mal in m Threads gesagt.
So viel Beratungsresistenz bekommt man bis zur Klausur nicht mehr weg.

Ausserdem ist alles falsch was wir sagen, sieht man ja an seinem Quelltext.

Ich wünsche viel Glück bei der Klausur, vielleicht kommt ja nur "Singen und Klatschen" dran :mrgreen:

himitsu 21. Mär 2012 23:27

AW: Konstruktor
 
Zitat:

Zitat von Bummi (Beitrag 1157855)
Äaehmmm, irgendwie hat das ganz so gar nichts mit Objektorientierung zu tun ...

Nicht nur das.
Wie schon gesagt wurde, ist die Qodeformatierung zwar grauenhaft, aber egal.

Schlimmer ist sowas.
Das hab ich vor 'ner Weile schonmal gesehn.
Selber Lehrer oder Dergleichen?
Zitat:

So viel Beratungsresistenz bekommt man bis zur Klausur nicht mehr weg.
Oder war das auch schon der Selbe. :gruebel:

Zitat:

Delphi-Quellcode:
procedure Tkreis.sety1;
begin
y1 := strtoint(form1.edit6.text);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
    mykreis := tkreis.Create;

    mykreis.setx1;
    mykreis.sety1;
    mykreis.setx2;
    mykreis.sety2;

    mykreis.Kreiszeichnen;
    mykreis.Free;
end;

Wenn man sich das mal ansieht, dann bekommt man in Button3Click garnicht mit, was gemacht wird.
z.B. wo kommen die Werte für setx1 her?

Kein Resourcenschutzblock.

Das Zeichnen auf einen Form-Canvas ist nicht resistent/haltbar,
also ist das, was da gemacht wird, sinnlos und es müßte auch ins TForm.OnPaint nochmal mit rein.
Die Ganze ausgeführte Routine würde so auch ganz gut in eine
Delphi-Quellcode:
prozedur ZeichneKreis(x1, y1, x2, y3: Integer; Canvas: TCanvas);
oder
Delphi-Quellcode:
prozedur ZeichneKreis(Rect: TRect; Canvas: TCanvas);
passen. (was auch gut erkennbar macht, daß hier mit OOP eigentlich nicht viel los ist)

Iwo Asnet 22. Mär 2012 06:04

AW: Konstruktor
 
Wie ich siehe, sind hier die meisten sehr gut in "destruktiver Kritik". Das bedeutet aber auch, das man das Problem nicht verstanden hat. Am OOP rumzumängeln (weiss er selbst, siehe Post #1) oder an der Codeformatierung, kommt dem Rauspicken von Rechtschreibfehlern gleich.

Das können die meisten der hier Anwesenden besser!

Zumindest bei C# ist es so, das private Felder und Methoden in geerbten Klassen nicht verfügbar sind. Will man das, muss man sie als protected deklarieren. Meiner Meinung nach warst Du mit der Suche nach einem Konstruktor auf dem Holzweg.

Aber nun ist ja die Klausur und es ist zu spät.

cookie22 22. Mär 2012 06:18

AW: Konstruktor
 
Zitat:

Zitat von Iwo Asnet (Beitrag 1157867)
Wie ich siehe, sind hier die meisten sehr gut in "destruktiver Kritik". Das bedeutet aber auch, das man das Problem nicht verstanden hat. Am OOP rumzumängeln (weiss er selbst, siehe Post #1) oder an der Codeformatierung, kommt dem Rauspicken von Rechtschreibfehlern gleich.

Wenn man sich eine schlechte Formatierung angewöhnt wird man das so schnell nicht wieder los. Außerdem ist der Code für einen selbst und andere besser lesbar. ;) Das hat nichts mit "rumzumängeln" zu tun.

mz23 22. Mär 2012 06:40

AW: Konstruktor
 
Einen schönen guten Morgen liebe DP-Gemeinde,

erstmal zu HotKey, warum funktioniert 'seine' Vererbung nicht?

Dazu eine kurze Anleitung, 'was' Vererbung ist:

http://www.delphi-treff.de/object-pascal/vererbung/

Allgemein möchte ich mit leiser Stimme vorschlagen, daß wir

erstens:
keine Hausaufgaben lösen,
zweitens:
nicht Retter in allerletzter Not spielen wollen,
drittens:
unsere Hilfe nicht erbeten werden sollte mit der
Klausel: morgen habe ich eine Klausur zu schreiben, etc.
viertens:
ich denke, daß es Sinn macht, wenn die Fragenden
ein kleines Beispielprogramm erzeugen, indem sie ihr
Problem festmachen.
fünftens:
Fakt ist doch, wenn ich das, was nicht funktioniert
auch nicht erklären kann, dann kann man doch nur das
erklären, was nicht verstanden wird.

Jetzt wieder mit normaler Stimme,

Schöne Grüße aus Nürnberg,
Manfred

PS: Auch für mich war der Artikel von Delphi-Treff/Vererbung
eine abwechslungsreiche Auffrischung.

DeddyH 22. Mär 2012 07:03

AW: Konstruktor
 
Zu dem gerade Angesprochenen hatte ich mir vor einiger Zeit auch schon Gedanken gemacht: http://www.delphipraxis.net/125006-w...n-richtig.html

Bummi 22. Mär 2012 07:09

AW: Konstruktor
 
@mz23

wobei das Beispiel in o.g. Link unter Umständen mehr zur Verwirrung als zur Erhellung beitragen könnte da
Zugriffe wie:
Delphi-Quellcode:
Chef.FNachname := 'Schmidt';
Chef.FBankleitzahl := 12345670;
Chef.FGehalt := 10000;
in diesem Beispiel funktionieren, vielen Neulingen aber nicht bekannt sein dürfte, daß dies eine Ausnahme (imho ungerechtfertigterweise) ist welche nur funktioniert weil die Klassen in der selben Unit deklariert sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:41 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