![]() |
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 |
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. |
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:
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.
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. |
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 |
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; |
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:
der Constructor der Oberklasse TGeoform :
constructor toval.Create(AOwner:Tcomponent);
begin inherited create(self); x1:=50; y1:=50; x2:=150; y2:=100; end;
Delphi-Quellcode:
und der Befehl der beim Button Klick auf der Userform ausgeführt wird:
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;
Delphi-Quellcode:
hier evtl. noch die paint methode, falls es daran liegen könnte (jetzt ohne zeichenflaeche.canvas)
procedure TForm1.Button1Click(Sender: TObject);
begin oval:=toval.create(self); oval.Parent := Form1; oval.Fuellfarbe := Colorbox1.Selected; oval.Randfarbe := Colorbox2.Selected; oval.Paint; end;
Delphi-Quellcode:
Meine Frage ist halt, wie ich diesen Constructor oder dessen Aufruf genau schreiben muss, damit es dort nicht hakt :)
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); 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 |
AW: Frage zur Komponentenerstellung graphisch
Delphi-Quellcode:
Wenn Du
constructor toval.Create(AOwner:Tcomponent);
begin inherited;
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:
sofern die Create-Methode vom Vorgänger-Object identisch deklariert ist.
constructor toval.Create(AOwner:Tcomponent);
begin inherited Create(AOwner); |
AW: Frage zur Komponentenerstellung graphisch
Zitat:
Jetzt zeigt er mir aber immer noch beim klick auf den button das fenster mit der aufschrift cpu und den vielen daten an |
AW: Frage zur Komponentenerstellung graphisch
Poste doch nochmal den Code der TOval Klasse, wie er jetzt aussieht.
|
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. |
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