AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Bräuchte dringen Hilfe bei selbstgeschriebener Komponente
Thema durchsuchen
Ansicht
Themen-Optionen

Bräuchte dringen Hilfe bei selbstgeschriebener Komponente

Ein Thema von janjan · begonnen am 19. Feb 2003 · letzter Beitrag vom 19. Feb 2003
Antwort Antwort
janjan

Registriert seit: 16. Jan 2003
Ort: Bonn ("links über Königswinter ")
240 Beiträge
 
Delphi 4 Standard
 
#1

Bräuchte dringen Hilfe bei selbstgeschriebener Komponente

  Alt 19. Feb 2003, 10:16
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:
Im Projekt xxx.exe ist eine Exception der Klasse EInvalidOperation aufgetreten. Meldung: 'Leinwand/Bild erlaubt kein Zeichnen'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
Fehler auf. Hier die Fehlermeldung auf Englisch:
Zitat:
Canvas doesn't allow drawing error
Ich hab meine Komponenten in Verdacht für diesen Fehler verantwortlich zu sein. Fehler hab ich keine gefunden,aber da das meine ersten Komponenten sind, bin ich nicht sicher ob ich alles richtig gemacht habe. Es wäre super wenn das mal jemand ankucken könnte

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.
  Mit Zitat antworten Zitat
lodda

Registriert seit: 6. Dez 2002
65 Beiträge
 
Delphi 5 Standard
 
#2
  Alt 19. Feb 2003, 11:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 19. Feb 2003, 12:03
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?

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Gollum
Gollum

Registriert seit: 14. Jan 2003
Ort: Boxberg
456 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4
  Alt 19. Feb 2003, 12:17
Hallo janjan,

ich habe gerade Deinen Code unter D5 getestet. Läuft bei mir ohne Probleme.
  Mit Zitat antworten Zitat
janjan

Registriert seit: 16. Jan 2003
Ort: Bonn ("links über Königswinter ")
240 Beiträge
 
Delphi 4 Standard
 
#5
  Alt 19. Feb 2003, 12:39
@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?
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:37 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