Paint-Ereignis für visuelle Komponente

Rund um die LCL und andere Komponenten
Antworten
lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Paint-Ereignis für visuelle Komponente

Beitrag von lzuser »

Ich habe zur Erstellung eines Koordinatensystems (KoSys) eine Komponente von TPaintbox abgeleitet:
Die Komponente zum Testen ist noch nicht in der LCL registriert.

Code: Alles auswählen

type
TKoSys=class(TPaintbox)
  private
    FOnPaint:TNotifyEvent;
    BkColor:TColor;          {Hintergrundfarbe des KoSys}
    procedure SetBackColor(c:TColor);
  protected
  public
    property Canvas;
    constructor Create(aOwner : TComponent ); override;
    destructor Destroy; override;
    procedure Paint; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
              X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X,Y: Integer);  override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
              X, Y: Integer);  override;
 
  published
    {Eigenschaften, die ggf. im Objectinspektor editierbar sind}
    property BackColor:TColor read BkColor write SetBackColor;
    property OnPaint:TNotifyEvent read FOnPaint write FOnPaint;
  end;
und möchte diese Komonente auf einem Testformular einsetzen:

Code: Alles auswählen

TKoSysKomponenteForm = class(TForm)
    MainMenu: TMainMenu;
    KoSysPanel: TPanel;
    TestMenuItem: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure TestMenuItemClick(Sender: TObject);
  private
    { private declarations }
    MyKoSys:TKoSys;
    procedure MyKoSysPaint(Sender:TObject);
 
 
procedure TKoSysKomponenteForm.FormCreate(Sender: TObject);
begin
MyKoSys:=TKoSys.Create(Self);
MyKoSys.Parent:=KoSysPanel;
MyKoSys.Align:=alClient;
MyKoSys.OnPaint:=MyKoSysPaint;     //Fehler: kompiliert aber in Delphi6 ohne Probleme
       {Error: Wrong number of parameters specified for call to "MyKoSysPaint"}
end;
 
procedure TKoSysKomponenteForm.MyKoSysPaint(Sender:TObject);
begin
with MyKoSys.Canvas do begin  MoveTo(100,100); LineTo(300,100);  end;
inherited Paint;
end;
Die letzte Prozedur ist mir wichtig, damit ich auch im Hauptprogramm noch Inhalte zur Paintbox
hinzufügen kann.
Warum kompiliert Delphi6 das ganze ohne Probleme?
Warum bekomme ich statt dessen bei Lazarus den obigen Fehler?
Wie könnte die Lösung hier aussehen?
Vielen Dank schon mal.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Paint-Ereignis für visuelle Komponente

Beitrag von Socke »

Hallo,
du hast einen typischen Fehler für Umsteiger von Delphi begangen (weiter Informationen für die Unterschiede findest du auf http://wiki.freepascal.org/Lazarus_For_Delphi_Users/de).

Da du mit Lazarus standardmäßig den FPC-eigenen objfpc Modus verwendest, müsstest du

Code: Alles auswählen

MyKoSys.OnPaint:=@MyKoSysPaint;
bei der Zuweisung von Prozedur-/Funktionsadressen schreiben.
Wenn das Programm sowohl von FPC als auch von Delphi kompiliert werden soll, musst du in der Quelltextdatei (oder in den Compileroptionen) den Modus auf delphi umstelllen. In der Quelltextdatei geht das mit dem Compilerschalter

Code: Alles auswählen

{$mode delphi}
ein evtl. vorhandenes {$mode objfpc} musst du dann aber löschen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Re: Paint-Ereignis für visuelle Komponente

Beitrag von lzuser »

Delphi-Umsteiger, stimmt!
Vielen Dank für deine ausführliche Erklärung.
Genauso funktioniert es jetzt.

Marius
Beiträge: 1
Registriert: Di 11. Jan 2011, 13:22

Re: Paint-Ereignis für visuelle Komponente

Beitrag von Marius »

Klasse, mit dem Tipp klappts jetzt auch endlich bei mir. Gehöre wohl auch zu den Dephi-Umsteiger, die solche Fehler machen :D
http://www.freewarenetz.de

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Paint-Ereignis für visuelle Komponente

Beitrag von pluto »

Ich würde nicht von TPaintBox ableiten sondern direkt von TCustomControl.
MFG
Michael Springwald

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Paint-Ereignis für visuelle Komponente

Beitrag von Bora4d »

Das:

Code: Alles auswählen

property OnPaint:TNotifyEvent read FOnPaint write FOnPaint;
Exitstiert schon in TPaintBox sogar als published wieso implementierst du das nochmal?

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Paint-Ereignis für visuelle Komponente

Beitrag von carli »

Bora4d hat geschrieben:Das:

Code: Alles auswählen

property OnPaint:TNotifyEvent read FOnPaint write FOnPaint;
Exitstiert schon in TPaintBox sogar als published wieso implementierst du das nochmal?
"Richtige" Komponenten überladen andere Methoden, um eine Draw-Routine einzubauen.

Antworten