![]() |
AW: OOP-Delphi-Anfänger
Zitat:
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:
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"...) |
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:
Das mit der Paintbox musste ich ändern , denn der hatte das als uncleared gesetzt.
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. 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"" |
AW: OOP-Delphi-Anfänger
Bleib lieber bei deiner Version, es ist nämlich nur noch mehr ein Schritt bis zum sehbaren Ergebnis!
|
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. |
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 ? |
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?
|
AW: OOP-Delphi-Anfänger
Okay , das wär abgehakt , dankeschön.
Was hat self.breite für eine Funktion ? |
AW: OOP-Delphi-Anfänger
Delphi-Quellcode:
ist immer die Referenz auf die Instanz der Methode.
Self
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; |
AW: OOP-Delphi-Anfänger
Alles klar vielen Dank.
Damit "erkennt" man sozusagen auf was sich diese "breite" bezieht , habe ich das richtig interpretiert ? |
AW: OOP-Delphi-Anfänger
Zitat:
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 01:35 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