AGB  ·  Datenschutz  ·  Impressum  







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

Viereck zeichnen OOP

Ein Thema von hotkey · begonnen am 22. Jan 2012 · letzter Beitrag vom 22. Jan 2012
Antwort Antwort
hotkey

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

Viereck zeichnen OOP

  Alt 22. Jan 2012, 13:39
Hallo , wir arbeiten jetzt im LK mit geometrischen Objekten und wir sollen mittels OOP jetzt Vierecke , Kreise , Rechtecke etc zeichnen lassen.

Ich habe jetzt mit dem Viereck angefangen.

Er compiliert ohne Fehler , aber ich bekomme es nicht gezeichnet.

Wir sollen erstmal zwei Punkte festlegen und dann diese mit Linien verbinden , damit ein Viereck entsteht.

Hier ist der Code :

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;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


  Tgeo_objects = class
  end;

   Tpunkt = class(Tgeo_objects)
   x,y:integer;
   procedure setx(r:integer);
   procedure sety(r:integer);
   end;

   TLinie = class(Tpunkt)
   p1,p2:TPunkt;
   end;

   TViereck = class(TLinie)
   procedure zeichne;
   end;





var
  Form1: TForm1;
  MyViereck : TViereck;
  Punkt : TPunkt;
implementation


 procedure TViereck.zeichne;
  begin
  form1.PaintBox1.Canvas.MoveTo(myviereck.x,myviereck.y);
  form1.PaintBox1.Canvas.LineTo(myviereck.x,myviereck.y);
  end;


  procedure tPunkt.setx(r:integer);
  begin
  x:=r;
  end;

  procedure Tpunkt.sety(r:integer);
  begin
  y:=r;
  end;







{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
MyViereck := TViereck.create;
myviereck.setx(7);
myviereck.sety(9);
Myviereck.zeichne;
myviereck.Free;
end;

end.
Felix
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Viereck zeichnen OOP

  Alt 22. Jan 2012, 13:56
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;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


  Tgeo_objects = class
  end;

  Tpunkt = class(Tgeo_objects)
    x,y:integer;
    procedure setx(r:integer);
    procedure sety(r:integer);
  end;

  TLinie = class(Tpunkt)
    p1,p2:TPunkt;
  end;

  TViereck = class(TLinie)
    procedure zeichne;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  MyViereck : TViereck;
  Punkt : TPunkt;

procedure TViereck.zeichne;
begin
  form1.PaintBox1.Canvas.MoveTo(myviereck.x, myviereck.y);
  form1.PaintBox1.Canvas.LineTo(myviereck.x + 100, myviereck.y);
end;


procedure tPunkt.setx(r:integer);
begin
  x:=r;
end;

procedure Tpunkt.sety(r:integer);
begin
  y:=r;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyViereck := TViereck.create;
  try
    myviereck.setx(7);
    myviereck.sety(9);
    Myviereck.zeichne;
  finally
    myviereck.Free;
  end;
end;

end.
  Mit Zitat antworten Zitat
hotkey

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

AW: Viereck zeichnen OOP

  Alt 22. Jan 2012, 14:02
Danke für die Hilfe , aber warum try ?

Könntest du mir das bitte erklären ?

Danke schon im Voraus.
Felix
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Viereck zeichnen OOP

  Alt 22. Jan 2012, 14:07
try - finally ist ein Schutzblock. Wenn innerhalb von try - finally ein Fehler auftritt, so wird trotzdem noch der Bereich finally - end ausgeführt.
Tritt also ein Fehler in deinen Objekt-Methoden auf, so wird das Objekt trotzdem richtig freigegeben und es entsteht kein Speicherleck.
  Mit Zitat antworten Zitat
hotkey

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

AW: Viereck zeichnen OOP

  Alt 22. Jan 2012, 14:09
Warum sollte in diesem Bereich ein Fehler entstehen ?

Braucht man sowas bei so einem Mickymaus-Programm ?
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
 
#6

AW: Viereck zeichnen OOP

  Alt 22. Jan 2012, 14:10
hmm, nee, so macht man das nicht
  1. Eine Klasse direkt mit einer globalen Variablen (hier Form1 bzw. Form1.PaintBox) zu verknüpfen, bzw. davon abhängig zu machen ist immer ein Schuss ins Knie ... Formualr umbenennen und schon knallt es
  2. Man kann ja nicht nur auf ein Formular, bzw. einer PaintBox zeichnen ... sondern auf einen Canvas
  3. Man muss sich überlegen, ob man die feste Verbindung zum Canvas wirklich zwingend braucht (kann sein, hängt davon ab, wie man das Objekt verwenden will)
Um per OOP etwas zu entwickeln, so schreibt man sich erst mal auf, was man für jede Klasse wissen muss.
Dann sucht man nach den Gemeinsamkeiten zwischen diesen Klassen.
Hier in diesem konkreten Fall wäre es z.B. die Zeichnen-Routine, die jede Klasse haben muss.
Vierecke, Rechtecke (das ist doch ein und dasselbe), Kreise, Linien haben zudem noch eins gemeinsam:
Alle lassen sich mit 2 Punkten beschreiben, und zwar durch das umschließende Rechteck

Somit hätten wir folgende Basisklasse:
Delphi-Quellcode:
Tgeo_object = class
private
  FRect : TRect;
  FCanvas : TCanvas;
  procedure SetRect( Value : TRect );
  procedure SetCanvas( Value : TCanvas );
protected
  procedure DoPaint; virtual; abstract;
public
  property Rect : TRect read FRect write SetRect;
  property Canvas : TCanvas read FCanvas write SetCanvas;
  procedure Paint;
end;

implementation

procedure Tgeo_object.SetRect( Value : TRect );
begin
  FRect := Value;
  Paint;
end;

procedure Tgeo_object.SetCanvas( Value : TCanvas );
begin
  FCanvas := Value;
  Paint;
end;

procedure Tgeo_object.Paint;
begin
  if Assigned( Canvas ) then
    DoPaint;
end;
Jetzt mal ein konkretes Objekt:
Delphi-Quellcode:
Tgeo_Line = class( Tgeo_object )
protected
  procedure DoPaint; override;
end;

implementation

procedure Tgeo_line.DoPaint;
begin
  Canvas.MoveTo( Rect.TopLeft );
  Canvas.LineTo( Rect.BottomRight );
end;
Jetzt sieht man auch, wieso OPP Vorteile bringt ... es kann helfen den Code zu reduzieren und insgesamt übersichtlicher zu machen

Um das jetzt in die richtige Paintbox zu bekommen macht man folgendes:
Delphi-Quellcode:
procedure TForm1.Button1Click( Sender : TObject );
var
  lObj : Tgeo_object;
begin
  lObj := Tgeo_Line.Create;
  try
    lObj.Rect.Left := 10;
    lObj.Rect.Top := 10;
    lObj.Rect.Width := 30;
    lObj.Rect.Heigth := 30;
    lObj.Canvas := PaintBox1.Canvas;
  finally
    lObj.Free;
  end;
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 (22. Jan 2012 um 14:15 Uhr)
  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
 
#7

AW: Viereck zeichnen OOP

  Alt 22. Jan 2012, 14:24
Warum sollte in diesem Bereich ein Fehler entstehen ?

Braucht man sowas bei so einem Mickymaus-Programm ?
Nein, man braucht auch keine Backups, Versicherungen, Freunde ... aber es ist immer gut, wenn man sie im Fall der Fälle doch hat
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
 
#8

AW: Viereck zeichnen OOP

  Alt 22. Jan 2012, 14:42
Alles klar , vielen Dank für die Antworten und Hilfen.


Schönen Sonntag noch.






hotkey
Felix
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:48 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