[Code] [Delphi] Problem: Klassenprogrammierung

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von m_Z_e_t, 16. Dezember 2008 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 16. Dezember 2008
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    [Delphi] Problem: Klassenprogrammierung

    Hi,
    ich habe im Moment leider etwas Probleme mit einer Aufgabe aus dem Informatikunterricht (12. Klases, 2. Jahr, Sprache: Pascal (/Delphi).

    Unsere Aufgabe ist es, ein Programm zu schreiben, welches später mit vorgegeben Maßen ein Dreick oder ein Kreis oder ein Rechteck zeichnen soll, je nach dem was ausgewählt wurde im Programm.

    Dies sollen wir mithilfe von 4 Klassen realisieren, wobei es eine Oberklasse gibt und 3 untergeordnete(/vererbte).
    Klasse1 : TFigur
    -> Klasse2: TKreis
    -> Klasse3: TRechteck
    -> Klasse4: TDreieck

    TFigur beinhaltet "Eigenschaften", die bei allen drei Klassen gleich sind beim Zeichen, wie z.B. rand_dicke, rand_farbe oder flaechen_farbe
    Die anderen 3 Klassen haben dann figurspezifische Sachen.

    Wir haben dann für jede Klasse bestimmte proceduren/functions die wir ausprogrammieren sollen um sie später in das Hauptprogramm einzubinden.

    Ich habe im Moment nur leider total den Hänger und habe KEINE AHNUNG, wie ich anfangen soll. Normal bin ich relativ gut in dem Fach (14Pkt im Zeugnis letztes Jahr), aber im Moment verzweifel ich richtig.
    Ich bräuchte also einen kleinen Denkansatz (weder ich noch ihr will/wollt das ihr mir das hier programmiert, brauch nur ne Hilfe)

    Hier das Übersichtsblatt mit den Klassen/Prozeduren: No File | xup.in

    Und hier mein bisheriger Code für die Klassen (alle 4 in einer Unit, aber getrennt von der Hauptunit): (nur alles schonmal in die Klassen geschrieben, noch nich wirklich was programmiert)
    Spoiler
    Code:
    unit figuren;
    
    {$mode objfpc}{$H+}
    
    interface
    
    uses
     Classes, SysUtils, Graphics;
    
     /////////// TFigur /////////////
    type TFigur = class
     private
     c_rand_dicke : real;
     c_rand_farbe : word;
     c_flaechen_farbe : word;
     public
     constructor create(rand_dicke : word; rand_farbe : TColor; flaechen_farbe : TColor);
     constructor destroy;
     
     procedure setRandDicke(rand_dicke : word);
     function getRandDicke : word;
     
     procedure setRandFarbe(rand_farbe : TColor);
     function getRandFarbe : TColor;
     
     procedure setFlaechenFarbe(flaechen_farbe : TColor);
     function getFlaechenFarbe : TColor;
     
     end;
     
     /////////// TKreis /////////////
     TKreis = class(TFigur)
     private
     c_radius : real;
     public
     constructor create(radius : real; rand_dicke : word; rand_farbe : Tcolor; flaechen_farbe : TColor);
     constructor destroy;
     
     
     procedure setRadius(radius : real);
     function getRadius : real;
     
     function berechneUmfang : real;
     function berechneFlaeche : real;
     
     procedure zeichneFigur();
     end;
     
     /////////// TRechteck /////////////
     TRechteck = class(TFigur)
     private
     c_laenge_1 : real;
     c_laenge_2 : real;
     public
     constructor create(laenge_1 : real; laenge_2 : real; rand_dicke : word; rand_farbe : TColor; flaechen_farbe : TColor);
     constructor destroy;
    
     procedure setLaenge1(laenge_1 : real);
     function getLaenge1 : real;
     
     procedure setLaenge2(laenge_2 : real);
     function getLaenge2 : real;
     
     function berechneUmfang : real;
     function berechneFlaeche : real;
     
     procedure zeichneFigur;
     end;
     
     /////////// TDreieck /////////////
     TDreieck = class(TFigur)
     private
     c_laenge_1 : real;
     c_winkel : real;
     c_laenge_2 : real;
     public
     constructor create(laenge_1 : real; winkel : real; laenge_2 : real; rand_dicke : TColor; rand_farbe : TColor; flaechen_farbe : TColor);
     constructor destroy;
     
     procedure setLaenge1(laenge_1 : real);
     function getLaenge1 : real;
     
     procedure setWinkel(winkel : real);
     function getWinkel : real;
     
     procedure setLaenge2(laenge_2 : real);
     function getLaenge2 : real;
     
     function berechneUmfang : real;
     function berechneFlaeche : real;
     
     procedure zeichneFigur;
     end;
     
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    implementation
     //////////////////////
     /////// TFigur////////
     //////////////////////
     constructor TFigur.create(rand_dicke : word; rand_farbe : Tcolor; flaechen_farbe : Tcolor);
     var dicke : word;
     begin
     inherited create;
     end;
     
     
     constructor TFigur.destroy;
     begin
     inherited Destroy;
     end;
    
    
     procedure TFigur.setRandDicke(rand_dicke : word);
     begin
    
     end;
     
    
     function TFigur.getRandDicke : word;
     begin
     
     end;
    
    
     procedure TFigur.setRandFarbe(rand_farbe : TColor);
     begin
     
     end;
     
     
     function TFigur.getRandFarbe : TColor;
     begin
     
     end;
     
    
     procedure TFigur.setFlaechenFarbe(flaechen_farbe : TColor);
     begin
     
     end;
    
     function TFigur.getFlaechenFarbe : TColor;
     begin
     
     end;
    
    
    
     //////////////////////
     /////// TKreis ///////
     //////////////////////
     constructor TKreis.create(radius : real; rand_dicke : word; rand_farbe : Tcolor; flaechen_farbe : TColor);
     begin
     
     end;
     
     
     constructor TKreis.destroy;
     begin
    
     end;
    
    
     procedure TKreis.setRadius(radius : real);
     begin
    
     end;
    
    
     function TKreis.getRadius : real;
     begin
    
     end;
    
    
     function TKreis.berechneUmfang : real;
     begin
    
     end;
    
    
     function TKreis.berechneFlaeche : real;
     begin
    
     end;
    
    
     procedure TKreis.zeichneFigur;
     begin
    
     end;
    
    
     //////////////////////
     ///// TRechteck //////
     //////////////////////
     constructor TRechteck.create(laenge_1 : real; laenge_2 : real; rand_dicke : word; rand_farbe : TColor; flaechen_farbe : TColor);
     begin
    
     end;
    
    
     constructor TRechteck.destroy;
     begin
    
     end;
    
    
     procedure TRechteck.setLaenge1(laenge_1 : real);
     begin
    
     end;
    
    
     function TRechteck.getLaenge1 : real;
     begin
    
     end;
    
    
     procedure TRechteck.setLaenge2(laenge_2 : real);
     begin
    
     end;
    
    
     function TRechteck.getLaenge2 : real;
     begin
    
     end;
    
    
     function TRechteck.berechneUmfang : real;
     begin
    
     end;
    
    
     function TRechteck.berechneFlaeche : real;
     begin
    
     end;
    
    
     procedure TRechteck.zeichneFigur;
     begin
    
     end;
    
    
     
     
     //////////////////////
     ///// TDreieck /////
     //////////////////////
     constructor TDreieck.create(laenge_1 : real; winkel : real; laenge_2 : real; rand_dicke : Tcolor; rand_farbe : TColor; flaechen_farbe : TColor);
     begin
    
     end;
    
    
     constructor TDreieck.destroy;
     begin
    
     end;
    
    
     procedure TDreieck.setLaenge1(laenge_1 : real);
     begin
    
     end;
    
    
     function TDreieck.getLaenge1 : real;
     begin
    
     end;
    
    
     procedure TDreieck.setWinkel(winkel : real);
     begin
    
     end;
    
    
     function TDreieck.getWinkel : real;
     begin
    
     end;
    
    
     procedure TDreieck.setLaenge2(laenge_2 : real);
     begin
    
     end;
    
    
     function TDreieck.getLaenge2 : real;
     begin
    
     end;
    
    
     function TDreieck.berechneUmfang : real;
     begin
    
     end;
    
    
     function TDreieck.berechneFlaeche : real;
     begin
    
     end;
    
    
     procedure TDreieck.zeichneFigur;
     begin
    
     end;
    
    
    //Umfang: l3 = Wurzel(l1² + l2² - 2*l1*l2*cos(w))
    //Fläche: h/l1 = sin(w) -> h = l1*sin(w)
    // A = 1/2*l2*h
    end.
    


    Also wenn ihr mir ein paar Tips/Anregungen was auch immer geben könntet wäre das sehr nett. Ich zerbrech mir seit einer Woche den Kopf dadrüber, am Freitag muss es abgegeben werden.
    Ich denke mein Hauptproblem liegt daran, das so "allgemein" ausdrücken in den Klassen, damit man es im Hauptprogramm einbinden kann. Das kann ich mir im Moment nicht vorstellen wie das gehen soll :/ Im Hauptprogramm hab ic hauch noch nichts.

    Jedoch sollen wir bis Freitag noch nicht alles machen, Kommentar dazu:
    Spoiler
    Die Pflichtabgabe bis zum 19.12.2008 soll aber noch nicht (bzw. muss
    aber noch nicht) das graphische Zeichnen der geometrischen Objekte
    beinhalten. Das richtige Zeichnen von Kreis, Rechteck, Dreieck muss also
    noch nicht programmiert werden. Das ist in der Exe-Datei, die ich euch
    hier schicke,, auch noch nicht realisiert. Stattdessen wird das Zeichnen
    mit ShowMessage "simuliert". Insbesondere sind die Eingabefelder
    Randdicke, Randfarbe und Flächenfarbe noch ohne Bedeutung. Bis nach den
    Weihnachtsferien sollt ihr aber in einer 2. Stufe der Pflichtabgabe das
    graphische Zeichnen der geometrischen Figuren umsetzen. Und auch die
    graphische Testumgebung nun viel schöner/besser/toller/usw. gestalten
    als in der 1. Stufe der Pflichtabgabe
    reicht aber trotzdem schon :/

    Bin für jede Hilfe dankbar + Renomee
     
  2. 16. Dezember 2008
    AW: [Delphi] Problem: Klassenprogrammierung

    Du solltest dir generell mal den Befehl Canvas anschauen. Damit kannst du Gegenstände zeichnen. Der Prozedur zeichneFigur(); sollte also ein Canvas-Objekt übergeben werden, damit die Prozedur weiß wohin sie zeichnen soll (zB. Form1.Canvas). Mit Canvas kann man auch die Dicke der Linien angeben, etc. ...einfach mal in der Hilfe schaun unter canvas.
    Hoffe das hilft dir ein wenig.
     
  3. 16. Dezember 2008
    AW: [Delphi] Problem: Klassenprogrammierung

    Vielen Dank für deine Hilfe, jedoch wusst ich das schon :> Hätte mich aber wahrscheinlich einfach deutlicher ausdrücken müssen.

    Mir gehts vor allem z.B. um sowas:
    constructor create(rand_dicke : word; rand_farbe : TColor; flaechen_farbe : TColor);
    constructor destroy;
    procedure setRandDicke(rand_dicke : word);
    function getRandDicke : word;
    procedure setRandFarbe(rand_farbe : TColor);
    function getRandFarbe : TColor;
    procedure setFlaechenFarbe(flaechen_farbe : TColor);
    function getFlaechenFarbe : TColor;


    Bewertung hast du
     
  4. 16. Dezember 2008
    AW: [Delphi] Problem: Klassenprogrammierung

    Naja das ist ein wenig blöd zu erklären:

    Ich denke mal, dass dein Problem darin besteht, den Klassenaufbau zu verstehen:

    Du musst halt Variablen aus der Unit sozusagen an die Klasse übergeben und dann mit diesen Werten weiterarbeiten. Dazu musst du erstmal "äquivalente" Variablen, die Attribute, erschaffen, was du ja teilweise schon erledigt hast:

    Code:
    type TFigur = class
     private
     c_rand_dicke : real;
     c_rand_farbe : word;
     c_flaechen_farbe : word;
    
    Dann musst du in der Methode die Variablen übergeben:, z.B. so:

    Code:
     procedure TFigur.setRandDicke(rand_dicke : word);
     begin
     c_rand_dicke := rand_dicke; // hier musst du noch word in real umwandeln
     end;
    
    rand_dicke musst du dann in deiner Unit definieren, z.B. so:

    Code:
    rand_dicke := edit1.text; (* whateva, kannst du machen wie du willst, das wird da ja sicherlich schon bekannt sein *)
    
    Bei solchen Methoden musst du ganz einfach nur eben den Flächeninhalt mit den übergebenen Attributen berechnen:

    Code:
     function TKreis.berechneFlaeche : real;
     begin
     berechneFlaeche := pi * sqr(TKreis.getRadius);
     end;
    
    Ich hoffe ich konnte dir helfen und es einigermaßen erklären, bin ja auch nur selber Schüler, der das hobbymäßig macht Ist aber lustig zu sehen, was für schöne Codes man noch so im Unterricht zu schreiben hat xD

    Edit: Bei den get-Methoden lieferst du einfach den Attributwert zurück ala getRadius := c_radius; , damit du dann auch im Hauptprogramm mit den Attributwerten arbeiten kannst.
     
  5. 16. Dezember 2008
    AW: [Delphi] Problem: Klassenprogrammierung

    Was mir gerade noch auffällt, ist dass es stilvoll schöner wäre wenn du Properties einsetzen würdest. Dazu musst du zB für "RandDicke" die Prozeduren setRandDicke und getRandDicke in den private Teil schieben und dann eine Property im public Teil einfügen. Sieht dann so aus:
    Code:
    type TFigur = class
     private
     c_rand_dicke : real;
     c_rand_farbe : word;
     c_flaechen_farbe : word;
     
     procedure setRandDicke(rand_dicke : word);
     function getRandDicke : word;
     
     procedure setRandFarbe(rand_farbe : TColor);
     function getRandFarbe : TColor;
     
     procedure setFlaechenFarbe(flaechen_farbe : TColor);
     function getFlaechenFarbe : TColor;
    
     public
     constructor create(rand_dicke : word; rand_farbe : TColor; flaechen_farbe : TColor);
     constructor destroy;
     property RandDicke: word read getRandDicke write setRandDicke;
     property RandFarbe: TColor read getRandFarbe write setRandFarbe;
     etc...
    
    
     end;
    Dann kannst du bei einer Instanz von TFigur einfach per whatever.RandDicke lesen und auch schreiben in einem.

    MfG firefuzy
     
  6. 17. Dezember 2008
    AW: [Delphi] Problem: Klassenprogrammierung

    vielen vielen dank euch beiden Besonders dir, Zius. Das war genau der Denkansatz den ich gebraucht hab, bin jetz schön nen Stükchen weiter, auch wenns noch nen ziemlich kleines is

    BW's sind selbstverstädnlich raus =)
     
  7. 17. Dezember 2008
    AW: [Delphi] Problem: Klassenprogrammierung

    [X] Erledigt!?

    ~closed~

    Mfg,

    Kolazomai
     
  8. 18. Dezember 2008
    AW: [Delphi] Problem: Klassenprogrammierung

    hab nochmal aufgemacht, da ich noch ne dringende Frage hab!

    Ich versuche jezte gerade den Umfang des Kreises auszurechnen.. aber egal was ich eingeb, es kommt immer 0 raus, also irgendwie wird wohl der radius nicht übergeben bzw wird als 0 übergeben.



    "Umfang-Ausrechnen-Button-Klick*
    Code:
    K := TKreis.Create(radius ,rand_dicke, rand_farbe, flaechen_farbe);
    K.setRadius(StrToFloat(edit2.text));
    Umfang := K.berechneUmfang;
    Showmessage('Der Umfang des Kreises beträgt '+ FloatToStr(Umfang));
    edit2.text ist das editfeld wo der radius eingetragen wird

    Create:
    Code:
    constructor TKreis.create(radius : real; rand_dicke : word; rand_farbe : Tcolor; flaechen_farbe : TColor);
     begin
     inherited Create(rand_dicke,rand_farbe, flaechen_farbe);
     end; 
    
    setRadius:
    Code:
    procedure TKreis.setRadius(radius : real);
     begin
     c_radius := radius;
     end; 
    berechne.Umfang:
    Code:
    function TKreis.berechneUmfang : real;
     var Umfang : real;
     begin
     Umfang := 2*pi*c_radius;
     end; 
    wenn ich das nicht gleich hinbekomme schreib ich dem lehrer ne email das ichs morgen leider nich abgeben kann :/
     
  9. 18. Dezember 2008
    AW: [Delphi] Problem: Klassenprogrammierung

    hab den fehler...close erstmal wieder
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.