AGB  ·  Datenschutz  ·  Impressum  







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

Frage zur Komponentenerstellung graphisch

Ein Thema von thomas274 · begonnen am 22. Sep 2010 · letzter Beitrag vom 24. Sep 2010
Antwort Antwort
Seite 2 von 3     12 3      
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#11

AW: Frage zur Komponentenerstellung graphisch

  Alt 23. Sep 2010, 20:53
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.

Geändert von Satty67 (23. Sep 2010 um 20:56 Uhr)
  Mit Zitat antworten Zitat
thomas274

Registriert seit: 22. Sep 2010
10 Beiträge
 
#12

AW: Frage zur Komponentenerstellung graphisch

  Alt 23. Sep 2010, 20:54
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;
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Frage zur Komponentenerstellung graphisch

  Alt 23. Sep 2010, 20:56
Ist gar nicht sooo frech!
Ich lege mich jetzt erst mal aufs Ohr
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Frage zur Komponentenerstellung graphisch

  Alt 23. Sep 2010, 21:05
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...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
thomas274

Registriert seit: 22. Sep 2010
10 Beiträge
 
#15

AW: Frage zur Komponentenerstellung graphisch

  Alt 23. Sep 2010, 21:13
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 ??)
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#16

AW: Frage zur Komponentenerstellung graphisch

  Alt 23. Sep 2010, 21:15
oval.Parent := Form1; .
löst das Chaos aus, bin gerade noch am suchen...
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Frage zur Komponentenerstellung graphisch

  Alt 23. Sep 2010, 21:25
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
thomas274

Registriert seit: 22. Sep 2010
10 Beiträge
 
#18

AW: Frage zur Komponentenerstellung graphisch

  Alt 23. Sep 2010, 21:32
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;
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: Frage zur Komponentenerstellung graphisch

  Alt 23. Sep 2010, 21:43
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
thomas274

Registriert seit: 22. Sep 2010
10 Beiträge
 
#20

AW: Frage zur Komponentenerstellung graphisch

  Alt 23. Sep 2010, 21:47
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
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 00:44 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