Delphi-PRAXiS
Seite 1 von 3  1 23      

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)

thomas274 22. Sep 2010 22:21

Frage zur Komponentenerstellung graphisch
 
Hallo,

wir sollen in der Schule graphische Komponenten erstellen ( z.B. Ellipse,Dreieck oder eine Linie). Diese wird indirekt von TGraphicControl abgeleitet ( eine Klasse ist noch dazwischen als Grundlage für unsere Objekte, die uns bereitgestellt wurde).

Nun ist es mir auch gelungen , diese anzeigen zu lassen über eine kennt-beziehung. Ich habe also dem Constructor das Formular übergegeben auf dem gezeichnet werden soll. Mein Lehrer meinte aber das dies nicht nötig ist, ich verstehe bloß nicht warum. Außerdem besteht das nächste Ziel darin ein Ziehen der Komponente zu ermöglichen, durch die properties OnMouseDown etc. Dies will bei mir nicht funktionieren und mein Verdacht besteht darin, dass das Formular in irgendeiner Weise aufgrund der reinen Kennt beziehung nicht richtig mit der Komponente verbunden ist.

Viel Text - > kurzer Sinn -> Mir würde vll. schon eine kleine graphische Komponente reichen, die ohne kennt beziehung angezeigt werden kann, damit ich dann mit den Maus Ereignissen weiterarbeiten kann.

In hoffnung auf hilfreiche Antworten

Thomas

Satty67 22. Sep 2010 22:46

AW: Frage zur Komponentenerstellung graphisch
 
Kennt-Beziehung ist etwas seltsam ausgedrückt. Eine sichbare Komponente hat zwei derartige Beziehungen:

Den Owner (Besitzer) der im Create angegeben wird. Der ist nicht zwingend nötig, aber dieser Owner löscht das Objekt wenn er selbst beendet wird (meist die Application oder ein Formular)

Das Parent (-Fenster), welches wichtig ist, damit die Komponente angezeigt werden kann. Wenn Dein Objekt angezeigt wird, dann sollte da aber der richtige Wert gesetzt sein.

Zum ziehen mit der Mouse... soll das Objekt das von sich aus regeln oder soll es quasi von aussen über Objekt-Ereignisse gelöst werden?

...und wie immer... etwas Beispielcode, was Du schon versucht hast hilft manchmal.

thomas274 23. Sep 2010 19:34

AW: Frage zur Komponentenerstellung graphisch
 
Also mit kennt-beziehung meinte ich, das das formular auf dem es erscheinen soll als parameter an den constructor übergeben werden soll.

Hier mal der Code der Componente

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(f:Tform);reintroduce;
    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(f:Tform);
begin
//inherited create(self);
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
zeichenflaeche.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;
zeichenflaeche.Canvas.Brush.Color := vFuellfarbe;
zeichenflaeche.Canvas.Pen.Color := vRandfarbe;
zeichenflaeche.Canvas.Pen.Width := 3;
zeichenflaeche.Canvas.Ellipse(x1,y1,x2,y2);

end;

end.
Der nächste schritt sollte sein über die Ereignisse MyMouseDown,Move und Up das Bewegen des Objektes zu realisieren. Allerdings reagiert es bis jetzt nicht wenn ich einfach drauf klicke.

stahli 23. Sep 2010 20:09

AW: Frage zur Komponentenerstellung graphisch
 
Hi Thomas,

also das wirkt alles etwas unausgegoren...

Sofern TGeoForm bzw. im weiteren TOval von TGraphicControl abgeleitet ist, hat es ja einen eigenen Canvas, auf den Du zeichnen kannst (und solltest).
Der geht von "0,0" bis "Width, Height" und in dem Bereich kannst Du zeichnen.

Mit Oval.Parent := MyForm setzt Du es auf das Formular
und mit Oval.Top und Oval.Left legst Du die Position auf dem Form fest.

Wenn Du direkt auf das Formular zeichnest, sind dort zwar entsprechende Farben zu sehen, aber es ist dort ja kein Control, das auf Deine Mausereignisse reagieren kann.

Zum Testen, ob bestimmte Stellen abgearbeitet werden bietet sich gern mal ein "Beep;" an, dann hat man schnell eine Rückmeldung.
Oder natürlich auch Haltepunkte.

Gruß Stahli

Bummi 23. Sep 2010 20:22

AW: Frage zur Komponentenerstellung graphisch
 
Delphi-Quellcode:
procedure toval.MyMouseMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    FX := x;
    FY := Y;
end;



procedure toval.MyMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
    if ssLeft in Shift then
        begin
        x1 := x1 +  X - FX;
        x2 := x2 +  X - FX;
        y1 := y1 +  Y - FY;
        y2 := y2 +  Y - FY;
        FX := x;
        FY := Y;
        end;
end;

thomas274 23. Sep 2010 20:24

AW: Frage zur Komponentenerstellung graphisch
 
Genau das ist ja mein Problem. Ich möchte, dass das Objekt auf der Canvas gezeichnet wird, bloß gibt es da wohl probleme mit dem constructor.

Ich habe den jetzt mal so geschrieben, wie ich es mir vorstellen würde wie es ohne übergabe der Zeichenfläche funktionieren sollte (also vorher hat er es ja wenigstens gezeichnet, bloß ohne zugriff !? ). Allerdings wird alles zwar kompiliert,doch beim Klick auf den Button stürzt das Programm ab, ohne dass es die fehlerhaften Zeilen markiert :(

Hier der neue Constructor:
Delphi-Quellcode:
constructor toval.Create(AOwner:Tcomponent);
begin
inherited create(self);

x1:=50;
y1:=50;
x2:=150;
y2:=100;


end;
der Constructor der Oberklasse TGeoform :

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;
und der Befehl der beim Button Klick auf der Userform ausgeführt wird:

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;
hier evtl. noch die paint methode, falls es daran liegen könnte (jetzt ohne zeichenflaeche.canvas)

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);
Meine Frage ist halt, wie ich diesen Constructor oder dessen Aufruf genau schreiben muss, damit es dort nicht hakt :)

Edit:
@ bummi: da lag erstmal gar nicht mein problem, ich brauche halt erstmal den schritt, dass das objekt überhaupt auf einen klick reagiert. vll. kennt da ja jemand noch einen guten test-aufruf, weil ich hier im forum gelesen hatte, dass bei eventhandlern showmessage nicht verwendet werden sollte

gruß
thomas

Satty67 23. Sep 2010 20:41

AW: Frage zur Komponentenerstellung graphisch
 
Delphi-Quellcode:
constructor toval.Create(AOwner:Tcomponent);
begin
inherited;
Wenn Du
Delphi-Quellcode:
inherited Create(self);
.
aufrufst, dann sagst Du deinem Objekt, ich gehöre mir selbst und in der Folge: Ich bin mein Vater ;)

Nur inherited wird quasi ausgeführt wie
Delphi-Quellcode:
constructor toval.Create(AOwner:Tcomponent);
begin
inherited Create(AOwner);
sofern die Create-Methode vom Vorgänger-Object identisch deklariert ist.

thomas274 23. Sep 2010 20:44

AW: Frage zur Komponentenerstellung graphisch
 
Zitat:

Zitat von Satty67 (Beitrag 1051593)
Delphi-Quellcode:
constructor toval.Create(AOwner:Tcomponent);
begin
inherited;
Wenn Du
Delphi-Quellcode:
inherited Create(self);
.
aufrufst, dann sagst Du deinem Objekt, ich gehöre mir selbst und in der Folge: Ich bin mein Vater ;)

Ok, geändert :)

Jetzt zeigt er mir aber immer noch beim klick auf den button das fenster mit der aufschrift cpu und den vielen daten an

Satty67 23. Sep 2010 20:48

AW: Frage zur Komponentenerstellung graphisch
 
Poste doch nochmal den Code der TOval Klasse, wie er jetzt aussieht.

stahli 23. Sep 2010 20:49

AW: Frage zur Komponentenerstellung graphisch
 
Also TGraphicControl kennt im Constructor kein OwnerControl.
Sicherlich ist Euer TGeoForm also von TCustomControl abgeleitet.

Wo hast Du denn Dein Objekt "Oval" definiert?

Ansonsten kann ich jetzt aus den zitierten Ausschnitten nichts erkennen, was zu einem Absturz führen solle...

Meine Tipps:
- struturiere Deinen Quelltext übersichtlicher, dann liest er sich besser und Fehler lassen sich eher finden
- arbeite das Programm schrittweise ab (Haltepunkt + F7)
- zeig mal den gesamten Quelltext...



[Edit @Satty67]"Ich bin mein Vater" ... klar! Meine Ausrede: Ich bin Brillenträger ;-)[/Edit)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 Uhr.
Seite 1 von 3  1 23      

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