![]() |
Bräuchte dringen Hilfe bei selbstgeschriebener Komponente
Also: ich hab von TPaintBox eine Komponente abgeleitet die ungefähr so aussieht wie die Instrumente in einem Flugzeug. Über ZeigerTest1.Wert := blablub lässt sich der Zeiger verändern, bei 0 steht er oben, bei 180 zeigt er nach unten und bei 360 zeigt er wieder nach oben.
Scheinbar funktioniert alles so wie es soll, in meinem Programm treten aber komische Zitat:
Zitat:
Delphi-Quellcode:
unit ZeigerTest;
interface uses SysUtils, Classes, Controls, ExtCtrls, Graphics, Messages, Types; type TZeigerTest = class(TPaintBox) private FAktZeiger, FOldZeiger: Real; FDurchmesser: Integer; FRadius: Integer; FFirst: Boolean; FBackground: TBitmap; procedure FSetWert(f: Real); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure paint; override; procedure Resize; override; procedure DrawBG; procedure ZeichneZeiger; published property Wert: Real read FAktZeiger write FSetWert; end; procedure Register; implementation constructor TZeigerTest.Create(AOwner: TComponent); begin FBackground := TBitmap.Create; inherited Create(AOwner); FFirst := true; DrawBG; end; destructor TZeigerTest.Destroy; begin inherited Destroy; FBackground.Free; end; procedure TZeigerTest.Resize; begin inherited Resize; DrawBG; end; procedure TZeigerTest.Paint; begin // beim ersten paint muss komischerweise einmal Drawbg aufgerufen werden ????? if FFirst then begin DrawBg; FFirst:=false; end; Canvas.Draw(0,0,FBackground); ZeichneZeiger; end; procedure TZeigerTest.ZeichneZeiger; var temp: real; Zahl: String; begin with Canvas do begin Pen.Color := clBlack; Pen.Width := 2; //alten zeiger übermalen temp := round(FOldZeiger-90)*Pi/180; Moveto( FRadius, FRadius); Lineto( Round(Cos(temp)*(FRadius - 15))+FRadius, round(Sin(temp)*(FRadius - 15))+FRadius); FOldZeiger := FAktZeiger; Pen.Color := clWhite; //neuen zeiger malen temp := round(FAktZeiger-90)*Pi/180; Moveto( FRadius, FRadius); lineto( round(Cos(temp)*(FRadius - 15))+FRadius, round(Sin(temp)*(FRadius - 15))+FRadius); Brush.Color := clBlack; end; // with end; procedure TZeigerTest.DrawBG; var i: integer; begin // auf quadratische form bringen... if width < Height then FDurchmesser := width else FDurchmesser:= Height; FRadius:= FDurchmesser div 2; FBackground.Width :=width; FBackground.height :=height; with FBackground.Canvas do begin brush.Color:=clBtnFace; pen.Color:=clBtnFace; // hintergrund grau malen Rectangle(0,0,width,height); Brush.Color:= clBlack; pen.Color := clBlack; pen.Width:=1; // schwarzen kreis malen ellipse(0,0,FDurchmesser,FDurchmesser); pen.Color := clWhite; pen.Width:=2; // Skale an den Rand malen for i:= 0 to 360 do begin if i mod 30 = 0 then begin moveto(round(sin(i/360*2*Pi)*FRadius +FRadius), round(cos(i/360*2*Pi)*FRadius +FRadius)); lineto(round(sin(i/360*2*Pi)*(FRadius - 10)+FRadius), round(cos(i/360*2*Pi)*(FRadius - 10)+FRadius)); end // if else if i mod 10 = 0 then begin moveto(round(sin(i/360*2*Pi)*FRadius +FRadius), round(cos(i/360*2*Pi)*FRadius +FRadius)); lineto(round(sin(i/360*2*Pi)*(FRadius - 5)+FRadius), round(cos(i/360*2*Pi)*(FRadius - 5)+FRadius)); end; // else if end; //for end; end; procedure TZeigerTest.FSetWert(f: Real); begin FAktZeiger:=f; ZeichneZeiger; end; procedure Register; begin RegisterComponents('Beispiele', [TZeigerTest]); end; end. |
Hallo janjan
ich sehe gerade, dass du die paint-methode überschrieben hast, aber die Vorgängermethode nicht wieder aufrufst. Vielleicht liegt es daran. Du solltest grudsätzlich beim überschreiben von Methoden die ursprügliche Methode aufrufen. Außerdem reicht es wenn du inherited ohne den Methodennamen aufrufst, denn Delphi setzt den Namen automatisch ein. |
Bei der Paint Methode ist es nicht nötig, den Vorgänger aufzurufen, oft sogar nachteilig (Performance, Flackern, etc.)
Kann es sein, dass Du der Komponente kein Parent-Objekt zugewiesen hast (trifft nur zu, wenn Du die Komponente dynamisch/im Quelltext erstellst). Oder versuchst Du die Paint-Methode aufzurufen, wenn das Parent-Object (z.B. das Form) nicht sichtbar ist? ...:cat:... |
Hallo janjan,
ich habe gerade Deinen Code unter D5 getestet. Läuft bei mir ohne Probleme. |
@Gollum
Genau das ist mein Problem, die Komponenten alleine laufen super, nur alle zusammen machen Probleme, ich wollt nur mal wissen ob ich irgendwelche Fehler gemacht habe, da ich vorher noch nie mit Komponenten programmiert habe. @Sakura Die Komponente wird nicht dynamisch erzeugt, daran sollte es nicht liegen. Ich glaube ich hab da eine Idee woran es liegen könnte: Ich habe eine Prozedur A die auf das Canvas malt und die Prozedur Paint die, wenn nötig, auf dasselbe Canvas malen soll. Kann es sein, dass sich diese beiden Prozeduren in die Quere kommen? Wenn ja, wie kann ich die eine Prozedur am Zeichnen hindern wenn die andere gerade malt? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:59 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-2025 by Thomas Breitkreuz