Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   OOP-Delphi-Anfänger (https://www.delphipraxis.net/165688-oop-delphi-anfaenger.html)

Aphton 11. Jan 2012 17:54

AW: OOP-Delphi-Anfänger
 
Zitat:

// Das hier ist der Button , wenn ich auf den klicke , soll die Prozedur
// TRechteck.Zeichne aufgerufen werden , aber der Button " an sich " ist ja eine Procedure
// Ich weiß , wenn ich mit TRechteck.Zeichne arbeiten will die Parameter eingeben muss aber
// ich kann ja jetzt einfach unter Button-Procedu TRechteck.Zeichne(20,20) oder so eingeben
Also gut, du scheinst das vorherige Problem gelöst zu haben.
Nun zum Nächsten - Instanzierung.

Eine Klasse beschreibt etwas (~Designplan). Die Instanz selbst ist die "Umsetzung" (sozusagen).
Du musst dir vorher nun eine Instanz vom Typ "TRechteck" erstellen.

Definier einfach mal provisorisch global (dh. unter Form1: TForm1) MeinRechteck: TRechteck;

Nun muss Speicher für die Instanz alloziert werden -> MeinRechteck := TRechteck.Create;
das könntest du z.B. ins OnCreate() Ereignis der Form packen! Der Speicher muss natürlich wieder freigegeben werden, daher auch ein MeinRechteck.free aufrufen - am besten im OnDestroy() Ereignis der Form!

So, wenn du das dann hast, musst du nur noch mehr die Zeichenmethode der Klasse durch die Instanz aufrufen ->
MeinRechteck.Zeichne(Canvas). Übrigens, Canvas ist eine "Variable" der übergeordnetten Klasse (die TForm1 wäre).
Mein Vorschlag - hau das ins OnPaint() Ereignis der Form!

Sollte anschließend klappen

EDIT:
Ach zu dem hier noch etwas:
Zitat:

ich kann ja jetzt einfach unter Button-Procedu TRechteck.Zeichne(20,20) oder so eingeben
Zeichne() verlangt als Parameter einen Canvas, keine 2 Zahlen (Integer)!
Bevor zu zeichnest, musst du bei der Instanz die Werte für XPos, YPos, ... usw richtig setzen!
MeinRechteck.XPos := 100; (zb)
(und kein "TRechteck.Zeichne", sondern "MeinRechteck.Zeichne"...)

hotkey 11. Jan 2012 17:55

AW: OOP-Delphi-Anfänger
 
Vielen Dank für diese Richtungszuweisung :D

Das geht leider nciht so schnell , ich muss mich erstmal mit der OOP anfreunden :D nicht so einfach das Ganze.

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class( TForm )
    // Im Object-Inspector das Ereignis "OnClick" von "btn_Rechteck" mit "btn_RechteckClick" verbinden
    procedure btn_RechteckClick( Sender : TObject );
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TRechteck = class
    hoehe, breite : Integer;
   PaintBox1: TPaintBox;
    // Zeichnet relativ zur aktuellen Stiftposition auf "aCanvas" das Rechteck
    procedure ZeichneAuf( aCanvas : TCanvas );
  end;

var
  Form1 : TForm1;
    PaintBox1: TPaintBox;
implementation

{$R *.dfm}
{ TRechteck }

procedure TRechteck.ZeichneAuf( aCanvas : TCanvas );
begin
  // Jedes Zeichnen mit "LineTo" setzt auch die Stiftposition "PenPos"
  aCanvas.LineTo( aCanvas.PenPos.X + Self.breite, aCanvas.PenPos.y ); // Linie nach rechts   // Das verstehe ich nicht: Was macht diese Zeile hier genau ? Warum nach rechts ?
  aCanvas.LineTo( aCanvas.PenPos.X, aCanvas.PenPos.y + Self.hoehe ); // Linie nach unten
  aCanvas.LineTo( aCanvas.PenPos.X - Self.breite, aCanvas.PenPos.y ); // Linie nach links
  aCanvas.LineTo( aCanvas.PenPos.X, aCanvas.PenPos.y - Self.hoehe ); // Linie nach oben
end;

{ TForm1 }

procedure TForm1.btn_RechteckClick( Sender : TObject );
var
  MyRechteck : TRechteck;
begin
  // Diese Methode soll aufgerufen werden, wenn der Button "btn_Rechteck" gedrückt wurde

  // Die Stiftposition setzen
  PaintBox1.Canvas.MoveTo( 50, 40 );

  // Instanz erzeugen
  MyRechteck := TRechteck.Create;

  // Werte zuweisen
  MyRechteck.hoehe := 50;
  MyRechteck.breite := 80;

  // Zeichen-Methode aufrufen
  MyRechteck.ZeichneAuf( PaintBox1.Canvas );

  // Instanz wieder freigeben
  MyRechteck.Free;
end;



end.
Das mit der Paintbox musste ich ändern , denn der hatte das als uncleared gesetzt.
Bekomme trotzdem diese Fehlermeldung , aber nicht unter dem Quelltext , sondern als kleines Fensterchen:
""Exception EClassNotFound in Module Project1.exe at 00216D
Class TPaintBox not found""

Aphton 11. Jan 2012 17:58

AW: OOP-Delphi-Anfänger
 
Bleib lieber bei deiner Version, es ist nämlich nur noch mehr ein Schritt bis zum sehbaren Ergebnis!

Sir Rufo 11. Jan 2012 18:00

AW: OOP-Delphi-Anfänger
 
Liste der Anhänge anzeigen (Anzahl: 1)
Klatsche dir auf das Formular einen Button und vergib den Namen "btn_Rechteck"
Klatsche dir auf das Formular eine PaintBox und vergib den Namen "The_PaintBox"
Mach einen Doppelklick auf den Button.

Jetzt kopiere meinen QuellText dort hinein.

hotkey 11. Jan 2012 18:05

AW: OOP-Delphi-Anfänger
 
Okay , aber ich will ja verstehen was da vor sich geht :

aCanvas.LineTo( aCanvas.PenPos.X + Self.breite, aCanvas.PenPos.y ); // Linie nach rechts
Warum geht diese Linie nach rechts , woran erkenne ich das ?

Sir Rufo 11. Jan 2012 18:09

AW: OOP-Delphi-Anfänger
 
Wenn man zum aktuellen horizontalem Wert (x) etwas hinzufügt und zum aktuellen vertikalen Wert (y) nichts hinzufügt, wo kommt man dann wohl raus?

hotkey 11. Jan 2012 18:11

AW: OOP-Delphi-Anfänger
 
Okay , das wär abgehakt , dankeschön.

Was hat self.breite für eine Funktion ?

Sir Rufo 11. Jan 2012 18:16

AW: OOP-Delphi-Anfänger
 
Delphi-Quellcode:
Self
ist immer die Referenz auf die Instanz der Methode.
Hier also die Referenz auf die aktuelle TRechteck-Instanz.

Self ist zwar nicht zwingend erforderlich, kann aber den Code verständlicher machen, bzw. einem fehlerhaften Bezug vorbeugen :)

Hier in diesem Fall ist es egal, ob man es hinschreibt oder nicht
Delphi-Quellcode:
procedure TRechteck.ZeichneAuf( aCanvas : TCanvas );
begin
  aCanvas.LineTo( aCanvas.PenPos.X + {Self.}breite, aCanvas.PenPos.y );
end;

hotkey 11. Jan 2012 18:18

AW: OOP-Delphi-Anfänger
 
Alles klar vielen Dank.

Damit "erkennt" man sozusagen auf was sich diese "breite" bezieht , habe ich das richtig interpretiert ?

Sir Rufo 11. Jan 2012 18:18

AW: OOP-Delphi-Anfänger
 
Zitat:

Zitat von hotkey (Beitrag 1145477)
Alles klar vielen Dank.

Damit "erkennt" man sozusagen auf was sich diese "breite" bezieht , habe ich das richtig interpretiert ?

:thumb:

Achtung, jetzt nicht verwirren lassen ... das ist jetzt reine Spielerei, könnte einem aber mal unter die Füße kommen:
Delphi-Quellcode:
procedure TRechteck.ZeichneAuf( aCanvas : TCanvas );
// lokale Variablen
var
  hoehe, breite : integer;
begin
  // weil diese Methode gleichlautende lokale Variablen wie die Klasse Felder hat,
  // muss man in dieser Methode für den Zugriff auf die Klassen-Felder das Self voransetzen!
  // den lokalen Variablen wird ein Wert zugewiesen
  hohe := Self.hoehe - 10;
  breite := Self.breite - 10;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:02 Uhr.
Seite 3 von 4     123 4      

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