Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Eigene Klasse, welche den Canvas verwenden soll. (https://www.delphipraxis.net/129105-eigene-klasse-welche-den-canvas-verwenden-soll.html)

Diamont 12. Feb 2009 19:31


Eigene Klasse, welche den Canvas verwenden soll.
 
Hallo,

ich möchte mir das OOP aneignen und ahbe mir dafür überlegt eine Klasse zu erstellen die Geometrische Figuren auf die Form zeichnet. Nun ist mein Problem das meine Klasse nicht weiss wo sie hinmalen soll...
Meine Unit 1 sieht so aus:





Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    la_flaeche: TLabel;
    ed_hoehe: TEdit;
    ed_breite: TEdit;
    bt_flaeche: TButton;
    Image1: TImage;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure bt_flaecheClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private

    { Private-Deklarationen }
  public
  rechteck: TRechteck;
    { Public-Deklarationen }
  end;
var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
var geomForm : TgeomForm;
begin
  rechteck := TRechteck.create(12, 12);
end;

Meine Klasse (in einer anderen Unit) sieht momentan so aus:

unit geomForm;
interface
uses Graphics;
 type
  TgeomForm = class(TCanvas)
  private
   Fx:Integer;
   Fy:Integer;
  public
   procedure verschieben(dx,dy :Integer);
   function flaeche:Integer; virtual; abstract;
   procedure zeichne(x,y:Integer) ; virtual; abstract;
  end;
implementation

procedure TgeomForm.verschieben(dx,dy: Integer);
begin
 self.Fx := self.Fx + dx;
 self.Fy := self.Fy + dy;
end;
end.


Von dieser Klasse leitet sich wiederrum die Klasse TRechteck ab:

unit rechteck;

interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,geomForm,Kreis, StdCtrls, ExtCtrls;
type
  TRechteck = class(TgeomForm)
  private
  Fhoehe:Integer;
  Fbreite:Integer;
  public
  constructor create(hoehe, breite: Integer);
  function flaeche : Integer; override;
  procedure zeichne(x,y:integer); override;
  end;

implementation

constructor TRechteck.create(hoehe, breite: Integer);
begin
  inherited create;

  FHoehe := hoehe;
  FBreite := breite;
end;

function TRechteck.flaeche: Integer;
begin
  result := Fhoehe*Fbreite;
end;

procedure TRechteck.zeichne(x,y:Integer);
var handle:hdc;
begin
 moveto(x,y);
 lineto(x+50,y+50);
end;
end.
Nun ist die Methode Zeichne der Knackpunkt, denn wie soll ich ihr Mitteilen wodrauf sie zeichnen soll?!

Vielen dank schonmal für die Hilfe.

[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen. Mfg, SirThornberry[/edit]

himitsu 12. Feb 2009 19:36

Re: Eigene Klasse, welche den Canvas verwenden soll.
 
wie wäre es, wenn du deine Klasse von TPaintBox ableitest?

ansonsten könntest du z.B. im Constructor (.Create) ein Canvas übergeben.

Diamont 12. Feb 2009 20:08

Re: Eigene Klasse, welche den Canvas verwenden soll.
 
okay dann versuch ichs mal von der paintbox abzuleiten.. aber wie kann ich im konstruktor einen canvas übergeben?

Fussball-Robby 12. Feb 2009 20:17

Re: Eigene Klasse, welche den Canvas verwenden soll.
 
Zitat:

Zitat von Diamont
aber wie kann ich im konstruktor einen canvas übergeben?

In dem du dir einen neuen Konstruktor schreibst;
Delphi-Quellcode:
type
  TMyClass = class
  private
    FCanvas: TCanvas;
  public
    constructor Create(ACanvas: TCanvas);
    procedure Draw;
  end;

implementation

constructor TMyClass.Create(ACanvas: TCanvas);
begin
  FCanvas := ACanvas;
end;

procedure TMyClass.Draw;
begin
  FCanvas.Ellipse(...);
end;
Dann gibst du den Canvas z.B. einer Paintbox an, und auf diesem wird dann gezeichnet.

Gruß

himitsu 12. Feb 2009 20:21

Re: Eigene Klasse, welche den Canvas verwenden soll.
 
wenn du von TPaintBox ableitest, dann brauchst du kein Canvas mehr übergeben ... das Canvas is dann ja schon eingebaut :zwinker:

Wenn du es nicht von einer anderen Komponente ableitest, welche ein Canvas schon mitbringt ... siehe Robby


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:27 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