Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Frage zur Komponentenerstellung graphisch (https://www.delphipraxis.net/154729-frage-zur-komponentenerstellung-graphisch.html)

Satty67 23. Sep 2010 20:53

AW: Frage zur Komponentenerstellung graphisch
 
Zitat:

Zitat von stahli (Beitrag 1051599)
Also TGraphicControl kennt im Constructor kein OwnerControl.
Sicherlich ist Euer TGeoForm also von TCustomControl abgeleitet.

Ich behaupte mal frech, doch.. denke aber das wird nicht die Ursache des aktuellen Problems sein.

..oder meist Du TControl <> TComponent, dann OK. Ist aber bei ihm als TComponent deklariert.

thomas274 23. Sep 2010 20:54

AW: Frage zur Komponentenerstellung graphisch
 
Ok, ich poste hier nochmal den kompletten code des Ovals und der Oberklasse Tgeoform, die von Tgraphiccontrol abgeleitet ist

Delphi-Quellcode:
unit GraphicControl1;

interface

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

type
  toval = class(tgeoform)
  private
 

  public

    x1,x2,y1,y2:integer;
    zeichenflaeche:tform;
    constructor Create(AOwner:Tcomponent);override;
    procedure paint();override;
  procedure MyMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftstate;x,y : integer); override;
  procedure MyMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);   override;
  procedure MyMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer) ; override;
  end;

implementation

constructor toval.Create(AOwner:Tcomponent);
begin
inherited ;

x1:=50;
y1:=50;
x2:=150;
y2:=100;
//zeichenflaeche:=f;
{OnMouseDown := MyMouseDown;
OnMouseMove := MyMouseMove;
OnMouseUp := MyMouseup; }

end;

procedure toval.MyMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer) ;
begin

//  end;


end;
procedure toval.MyMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin

end;

procedure toval.MyMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer) ;
  begin
Canvas.Ellipse(x1+40,y1+40,x2+40,y2+40);
  end;

procedure toval.paint();
var vFuellfarbe,vRandfarbe : Tcolor;
begin
vFuellfarbe := self.Fuellfarbe;
vRandfarbe := self.Randfarbe;
Canvas.Brush.Color := vFuellfarbe;
Canvas.Pen.Color := vRandfarbe;
Canvas.Pen.Width := 3;
Canvas.Ellipse(x1,y1,x2,y2);

end;

end.
und hier der quellcode der oberklasse tgeoform


Delphi-Quellcode:
unit mGeoForm;

interface

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

type
  TGeoForm = class(TGraphicControl)
  // Basis aller graphischen Komponenten ohne eigenes Fenster.
  // Sie kapselt ein Canvasobjekt und eine paint-Methode.
  private
    FRandfarbe: TColor;
    FFuellfarbe: TColor;
    procedure SetFuellfarbe(const Value: TColor);
    function GetFuellfarbe: TColor;
    procedure SetRandfarbe(const Value: TColor);
    function GetRandfarbe: TColor;
  protected

    procedure MyMouseDown(Sender: TObject; Button: TMouseButton;
   Shift: TShiftstate;x,y : integer); virtual;

  procedure MyMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); virtual;

  procedure MyMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer) ;          virtual;

    const ZIEH_RECT_LAENGE = 10;
    procedure Paint; virtual;
    function PunktZiehen(Punkt: TPoint): Boolean; virtual;
    function PunktBewegen(Punkt: TPoint): Boolean; virtual;
  public
  x1,x2,y1,y2:integer;
  zeichenflaeche:tform;
    constructor Create(AOwner: TComponent);virtual;

  published
  property Fuellfarbe : TColor read GetFuellfarbe write SetFuellfarbe;
  property Randfarbe : TColor  read GetRandfarbe write SetRandfarbe;
  property OnMouseDown ;
  property OnMouseMove;
  property OnMouseUp;
end;

procedure Register;  // registrieren der Komponente

implementation

procedure Register;
begin
  RegisterComponents('GeoForm', [TGeoForm]);
  // erster Parameter: Name des Registers der Componentenpalette, in das die Komponente eingefügt werden soll.
  // zweiter Parameter: Aufführen der Komponentenklassen, die registriert werden sollen.
end;

constructor TGeoForm.Create(AOwner: TComponent);
begin
  FFuellfarbe:=clWhite;
  FRandfarbe:=clBlack;
  Top:=0;
  Left:=0;
  Width:=100;
  Height:=50;
  OnMouseDown := MyMouseDown;
OnMouseMove := MyMouseMove;
OnMouseUp  := MyMouseUp ;
end;

function TGeoForm.GetFuellfarbe: TColor;
begin
result:= FFuellfarbe;
end;

function TGeoForm.GetRandfarbe: TColor;
begin
result:= FRandfarbe;
end;

procedure TGeoForm.Paint;
begin
  inherited;
end;

function TGeoForm.PunktBewegen(Punkt: TPoint): Boolean;
begin
  Result := True;

end;

function TGeoForm.PunktZiehen(Punkt: TPoint): Boolean;
begin

  if (Punkt.X > Width -ZIEH_RECT_LAENGE) and (Punkt.X < Width)
  and (Punkt.Y > Height -ZIEH_RECT_LAENGE) and (Punkt.Y < Height) then
    Result := True
  else
    Result := False;
end;
{function TGeoForm.GetFuellfarbe : TColor;
begin
  result := FFuellfarbe;
end;       }
procedure TGeoForm.SetFuellfarbe(const Value: TColor);
begin
  FFuellfarbe := Value;
end;

procedure TGeoForm.SetRandfarbe(const Value: TColor);
begin
  FRandfarbe := Value;
end;

procedure tGeoform.MyMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer) ;

begin

//ShowMessage('Hallo');

end;

procedure tGeoform.MyMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);


begin

end;

procedure tGeoform.MyMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer) ;

begin

end;


end.
und zum schluss der aufruf im formular ( da kann es ja nur, wenn überhaupt, an dem aufruf liegen)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
oval:=toval.create(self);
oval.Parent := Form1;
oval.Fuellfarbe := Colorbox1.Selected;
oval.Randfarbe := Colorbox2.Selected;
oval.Paint;

end;

stahli 23. Sep 2010 20:56

AW: Frage zur Komponentenerstellung graphisch
 
:oops: Ist gar nicht sooo frech!
Ich lege mich jetzt erst mal aufs Ohr ;-)

stahli 23. Sep 2010 21:05

AW: Frage zur Komponentenerstellung graphisch
 
Das ist von der Ferne etwas schwierig...

Sind die ColorBoxen instanziiert?
Hast Du mal einen Haltepunkt in der ClickBehandlung gesetzt?
Dann siehst Du doch, wie weit er kommt...

thomas274 23. Sep 2010 21:13

AW: Frage zur Komponentenerstellung graphisch
 
Zitat:

Zitat von stahli (Beitrag 1051604)
Das ist von der Ferne etwas schwierig...

Sind die ColorBoxen instanziiert?
Hast Du mal einen Haltepunkt in der ClickBehandlung gesetzt?
Dann siehst Du doch, wie weit er kommt...

Also an den ColorBoxen liegt es nicht, das hat alles so geklappt mit der alten Methode (Übergabe des Formulars in den Constructor).

Ich weiß nicht genau wie das mit den Haltepunkten funktionieren soll, da er es ja kompiliert und dann erst beim Klick der Fehler kommt. Habe trotzdem mal welche in die Click Prozedur gesetzt ( mit F5) aber da kommt der Error auch schon wenn der Haltepunkt beim Create gesetzt ist ( = Create ist das Problem ??)

Satty67 23. Sep 2010 21:15

AW: Frage zur Komponentenerstellung graphisch
 
Delphi-Quellcode:
oval.Parent := Form1;
.
löst das Chaos aus, bin gerade noch am suchen...

stahli 23. Sep 2010 21:25

AW: Frage zur Komponentenerstellung graphisch
 
Aahh!

Delphi-Quellcode:
constructor TGeoForm.Create(AOwner: TComponent);
begin
  FFuellfarbe:=clWhite;
  FRandfarbe:=clBlack;
  Top:=0;
  Left:=0;
  Width:=100;
  Height:=50;
  OnMouseDown := MyMouseDown;
OnMouseMove := MyMouseMove;
OnMouseUp := MyMouseUp ;
end;
Hier fehlt das inherited.
Das Control wird nicht korrekt erzeugt.

thomas274 23. Sep 2010 21:32

AW: Frage zur Komponentenerstellung graphisch
 
Zitat:

Zitat von stahli (Beitrag 1051612)
Aahh!

Delphi-Quellcode:
constructor TGeoForm.Create(AOwner: TComponent);
begin
  FFuellfarbe:=clWhite;
  FRandfarbe:=clBlack;
  Top:=0;
  Left:=0;
  Width:=100;
  Height:=50;
  OnMouseDown := MyMouseDown;
OnMouseMove := MyMouseMove;
OnMouseUp := MyMouseUp ;
end;
Hier fehlt das inherited.
Das Control wird nicht korrekt erzeugt.

Stimmt ! Danke schonmal :) Jetzt stürzt er schonmal nicht mehr ab beim Klicken des Button. Bloß wird die Ellipse dann nicht richtig gezeichnet.

Kann das sein, dass man auf die canvas anders zugreifen muss als in meiner paint methode ?

Delphi-Quellcode:
procedure toval.paint();
var vFuellfarbe,vRandfarbe : Tcolor;
begin
vFuellfarbe := self.Fuellfarbe;
vRandfarbe := self.Randfarbe;
Canvas.Brush.Color := vFuellfarbe;
Canvas.Pen.Color := vRandfarbe;
Canvas.Pen.Width := 3;
Canvas.Ellipse(x1,y1,x2,y2);

end;

stahli 23. Sep 2010 21:43

AW: Frage zur Komponentenerstellung graphisch
 
Kann ich jetzt ad hoc nicht sagen.
Und was heißt "nicht richtig gezeichnet"?

Ggf. teste Dich langsam heran.
Z.B. erst mal Fillrect und eine Line zeichnen.

thomas274 23. Sep 2010 21:47

AW: Frage zur Komponentenerstellung graphisch
 
Also momentan zeichnet er halt nichts, bzw. zeigt nichts an. Auch kein einfaches LineTo
Es wird wohl irgendwie daran liegen, dass nicht richtig klar gezeigt ist, wo gezeichnet werden soll.
Ich dachte, das wäre durch
Delphi-Quellcode:
oval.parent := Tform1
schon geschehen. Wenn also die Paint Methode aufgerufen, wird vll. eine andere Canvas benutzt, als die die auch angezeigt wird auf dem Formular, wie gesagt das weiß ich nicht genau.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr.
Seite 2 von 3     12 3      

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 by Thomas Breitkreuz