Problem beim Erstellen von Events-Zuweisungen

Rund um die LCL und andere Komponenten
Antworten
br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Problem beim Erstellen von Events-Zuweisungen

Beitrag von br_klaus »

Hallo,

ich habe ein Problem beim Erstellen eigener Kompnenten. Wenn ich, wie es bei vielen der examples im Lazarus-Verzeichnis geschieht, beim Kreieren einer Form bzw. Komponente einem Event im constructor MyForm.Create(TheOwner: TComponent) eine best. Prozedur zuweisen will (zB OnMouseMove := FormMouseMove), dann erhalte ich die Fehlermeldung: Error: Wrong number of parameters specified for call to "FormMouseMove". Beide sind doch vom Typ TMouseMoveEvent. Wieso gibt es dann diese Fehlermeldung?
Ich habe dann versucht, zB den Kopf der Unit TPopupNotifier vor meine eigene Form zu kopiern. Im gesamten Text habe ich "Notifier" durch "Notiz" ersetzt (also TPopupNotiz, TNotizForm, TNotizXButton etc.) und dann den Implementationsteil hinter implementation kopiert. Wenn ich dann kompilieren will, dann erscheint schon bei der ersten (originalen) Zuweisung:

Code: Alles auswählen

constructor TNotizXButton.Create(AOwner: TComponent);
begin
    inherited Create(AOwner);
 
    FState := nbsUp;
 
    OnMouseUp := HandleMouseUp;
    OnMouseDown := HandleMouseDown;
end;
wieder dieselbe Fehlermeldung (Wrong number ... call to "HandleMouseUp"), und das dann bei ALLEN folgenden Zuweisungen von Events. Woran kann das liegen? Beim Kompilieren der Original-Unit gibt es ja auch keine Fehlermeldungen.

Dasselbe Phänomen erscheint beim Erstellen einer eigenen Unit mit Form. Wenn ich im ObjektInspektor eine Zuweisung vornehme (zB OnKeyPress --> FormKeyPress), dann geht das ohne weiteres. Sobald ich aber diese Zuweisung "von Hand" machen will (im constructor Form.Create(TheOwner: TComponent), dann erscheint wieder obige Fehlermeldung.
Warum ist das bei all den vielen Lazarus-Programmbeispielen möglich, nur bei meinen Programmierversuchen nicht?
Was mache ich da verkehrt?

Herzlichen Dank für alle Hilfe!

P. Nikolaus

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Re: Problem beim Erstellen von Events-Zuweisungen

Beitrag von khh »

versuchs mal so:


OnMouseUp := @HandleMouseUp;


Gruss KHH

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Problem beim Erstellen von Events-Zuweisungen

Beitrag von br_klaus »

Bei meinen vielen fruchtlossen Versuchen, Events beim Kreieren einer Form zuzuweisen, habe ich schließlich einen Trick gefunden, mit dem ich belebig viele Formen, die jeweils eine eigene Unitdatei haben (und damit jweils mittels Objektinspektor verändert werden können), miteinander "kommunizieren" zu lassen: aus jeder Form kann bei jeder Routine jede beliebige andere Form aufgerufen werden. Ich nehme von allen übrigen Units nur die lrs-Dateien und aktiviere die Unit nur, wenn ich die entsprechende Form bzw. Komponente ändern will. Dabei enthalten diese Units nur Dummy-Code (nur begin end;). In der Hauptunit definiere ich die Routinen dann so, wie ich sie brauche (dann kann ich von da aus in den Routinen auch problemlos auf jede andere Form zugreifen).

Das sieht dann zB so aus
unit kalenderU;
.....
uses .....
// Popup, // bei Bedarf aktivieren, wenn die Tpopup-Form geändert werden soll
....;

Type Tform1 = class(TForm)
......
end;
type TPopup = class(Tform)
procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
procedure.... // beliebige andere Routinen, die jedoch keine Events sind
.....
end;

var
form1: Tform1;
popupform: TPopup;

implementation
......

Initialization
{$I KalenderU.lrs}
{$I Popup.lrs}

end.
Und die zugehörige Unit Popup sieht dann so aus:

unit Popup;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs;

type

{ TPopUp }

TPopUp = class(TForm)
procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
end;

implementation

{ TPopUp }
procedure TPopUp.FormCreate(Sender: TObject);
begin end;
procedure TPopUp.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin end;
procedure TPopup.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
begin end;

initialization
{$I Popup.lrs}

end.
Und das Hauptprogramm (Kalender.lpr), bei dem die Formen initialisiert werden, sieht so aus:
program KALENDER;

{$mode objfpc}{$H+}

uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, LResources, Kalenderu
{ you can add units after this };

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}

begin
{$I kalender.lrs}
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TPopUp, PopupForm);
Application.Run;
end.
Es hat bei mir ohne weiteres geklappt. Ich kan ja noch mein kleines Programm (für einen späteren Kalender) hochladen.
P. Nikolaus

Korkenkrone
Beiträge: 33
Registriert: Sa 18. Sep 2010, 20:33
OS, Lazarus, FPC: OpenSUSE 11.3 (L 0.9.28.2 Beta FPC 2.2.4)
CPU-Target: x86-64

Re: Problem beim Erstellen von Events-Zuweisungen

Beitrag von Korkenkrone »

Das verstehe ich leider nicht ganz. Du kannst doch auf alle Bezeichner einer Unit zugreifen, wenn du sie im Interface-Abschnitt deklarierst, wozu sollte man da irgendwelche Tricks anwenden? Falls du von einer anderen Unit aus in TPopup-Instanzen auf Private Elemente zugreifen willst, dann kannst du sie in TPopup doch im public Teil definieren, oder properties/accessors hinzufügen.

Wenn du ein Type zweimal in zwei verschiedenen Units definieren musst, solltest du schnell skeptisch werden. Sinn würde es vielleicht machen, wenn du anstatt TPopup der Unit KalenderU ein TKalenderPopup(TPopup) erstellst. Die Frage ist da, was du erreichen willst.

Antworten