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 1 von 3  1 23      
thomas274

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

Frage zur Komponentenerstellung graphisch

  Alt 22. Sep 2010, 22:21
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
  Mit Zitat antworten Zitat
Satty67

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

AW: Frage zur Komponentenerstellung graphisch

  Alt 22. Sep 2010, 22:46
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.
  Mit Zitat antworten Zitat
thomas274

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

AW: Frage zur Komponentenerstellung graphisch

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

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

AW: Frage zur Komponentenerstellung graphisch

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

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: Frage zur Komponentenerstellung graphisch

  Alt 23. Sep 2010, 20:22
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
thomas274

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

AW: Frage zur Komponentenerstellung graphisch

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

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

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

AW: Frage zur Komponentenerstellung graphisch

  Alt 23. Sep 2010, 20:41
Delphi-Quellcode:
constructor toval.Create(AOwner:Tcomponent);
begin
inherited;
Wenn Du
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.

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

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

AW: Frage zur Komponentenerstellung graphisch

  Alt 23. Sep 2010, 20:44
Delphi-Quellcode:
constructor toval.Create(AOwner:Tcomponent);
begin
inherited;
Wenn Du
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
  Mit Zitat antworten Zitat
Satty67

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

AW: Frage zur Komponentenerstellung graphisch

  Alt 23. Sep 2010, 20:48
Poste doch nochmal den Code der TOval Klasse, wie er jetzt aussieht.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

AW: Frage zur Komponentenerstellung graphisch

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

Geändert von stahli (23. Sep 2010 um 20:53 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 08:25 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