AGB  ·  Datenschutz  ·  Impressum  







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

OOP-Delphi-Anfänger

Ein Thema von hotkey · begonnen am 11. Jan 2012 · letzter Beitrag vom 11. Jan 2012
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#21

AW: OOP-Delphi-Anfänger

  Alt 11. Jan 2012, 18:54
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"...)
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (11. Jan 2012 um 18:57 Uhr)
  Mit Zitat antworten Zitat
hotkey

Registriert seit: 20. Aug 2011
Ort: Berlin
113 Beiträge
 
Delphi 6 Personal
 
#22

AW: OOP-Delphi-Anfänger

  Alt 11. Jan 2012, 18:55
Vielen Dank für diese Richtungszuweisung

Das geht leider nciht so schnell , ich muss mich erstmal mit der OOP anfreunden 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""
Felix
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#23

AW: OOP-Delphi-Anfänger

  Alt 11. Jan 2012, 18:58
Bleib lieber bei deiner Version, es ist nämlich nur noch mehr ein Schritt bis zum sehbaren Ergebnis!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#24

AW: OOP-Delphi-Anfänger

  Alt 11. Jan 2012, 19:00
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.
Angehängte Dateien
Dateityp: zip OOP_Rechteck.zip (1,6 KB, 1x aufgerufen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (11. Jan 2012 um 19:03 Uhr) Grund: Komplettes Projekt angehängt
  Mit Zitat antworten Zitat
hotkey

Registriert seit: 20. Aug 2011
Ort: Berlin
113 Beiträge
 
Delphi 6 Personal
 
#25

AW: OOP-Delphi-Anfänger

  Alt 11. Jan 2012, 19:05
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 ?
Felix
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#26

AW: OOP-Delphi-Anfänger

  Alt 11. Jan 2012, 19:09
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?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (11. Jan 2012 um 19:11 Uhr)
  Mit Zitat antworten Zitat
hotkey

Registriert seit: 20. Aug 2011
Ort: Berlin
113 Beiträge
 
Delphi 6 Personal
 
#27

AW: OOP-Delphi-Anfänger

  Alt 11. Jan 2012, 19:11
Okay , das wär abgehakt , dankeschön.

Was hat self.breite für eine Funktion ?
Felix
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#28

AW: OOP-Delphi-Anfänger

  Alt 11. Jan 2012, 19:16
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
hotkey

Registriert seit: 20. Aug 2011
Ort: Berlin
113 Beiträge
 
Delphi 6 Personal
 
#29

AW: OOP-Delphi-Anfänger

  Alt 11. Jan 2012, 19:18
Alles klar vielen Dank.

Damit "erkennt" man sozusagen auf was sich diese "breite" bezieht , habe ich das richtig interpretiert ?
Felix
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#30

AW: OOP-Delphi-Anfänger

  Alt 11. Jan 2012, 19:18
Alles klar vielen Dank.

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


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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (11. Jan 2012 um 19:24 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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:11 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