Zuordnung von Notify-Events [gelöst]

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
RudiRatlos
Beiträge: 26
Registriert: Sa 21. Sep 2019, 13:02
OS, Lazarus, FPC: Windows 11, lazarus 3.8, FPC: 3.2.2
CPU-Target: 64Bit
Wohnort: München

Zuordnung von Notify-Events [gelöst]

Beitrag von RudiRatlos »

Hallo,

ich habe ein Problem mit Notify-Events und wollte das an einem einfachen Programm studieren. Das Programm besteht aus 2 Units (uMainForm, uSpecialForm) mit jeweils einer Form gleichen Namens (MainForm, SpecialForm).
  • MainForm hat einen Button und ein Edit-Feld Edit
  • SpecialForm nur das Edit-Feld SpecialEdit
  • Ein Klick auf den Button von MainForm öffnet die SpecialForm - das klappt

Ein Ändern im SpecialEdit-Feld sollte in MainForm.Edit gespiegelt werden. Das klappt aber nicht, weil es bei der Zuordnung des Edit.OnChange-Events zu einem Notify-Event
in Mainform den Fehler gibt
"Wrong Number of parameters specified for call to xyz"

Code: Alles auswählen

unit uMainform;

{$mode objfpc}{$H+}

interface

uses
  Classes
  , uSpecialForm
  , SysUtils
  , Forms
  , StdCtrls
  ;

type

  { TMainForm }

  TMainForm = class(TForm)
    Button      : TButton;
    Edit        : TEdit;

    procedure FormShow(Sender: TObject);
    procedure ButtonClick(Sender: TObject);

  private
    procedure SpecialFormEditChange (Sender:TObject); // TNotify-Event
  public

  end;

var
  MainForm: TMainForm;

implementation

{$R *.lfm}

procedure TMainForm.FormShow(Sender: TObject);
begin
  SpecialFormEditChange := SpecialForm.SpecialEdit.OnChange; //<-------
{  Hier passiert der Fehler: Wrong Number of Parameters
   specified to call to "SpecialFormEditChange"}
end;


procedure TMainForm.ButtonClick(Sender: TObject);
var
  SpecialForm : TSpecialForm;
begin
  SpecialForm := TSpecialForm.Create(nil);
  try
    SpecialForm.ShowModal;
  finally
    SpecialForm.Free;
  end;
end;

procedure TMainForm.SpecialFormEditChange ( Sender  : TObject );
begin
  Edit.Text:=SpecialForm.SpecialEdit.Text;
end;
end.
und

Code: Alles auswählen

unit uSpecialForm;

{$mode delphi}
interface
uses
  Classes
  , SysUtils
  , Forms
  , StdCtrls
  ;

type
    TSpecialForm = class(TForm)
    SpecialEdit   : TEdit;
  end;

var
  SpecialForm: TSpecialForm;

implementation
{$R *.lfm}
end.
Was hab ich da wieder für einen Fehler gemacht??

Vielen Dank für Eure Hilfe
RudiRatlos

PS Das Programm ist eine vereinfachte Version von
https://www.delphipraxis.net/154363- ... agen.html

aber da sehe ich unter Lazarus den gleichen Fehler
Zuletzt geändert von RudiRatlos am Sa 15. Okt 2022, 23:00, insgesamt 1-mal geändert.

wennerer
Beiträge: 607
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Zuordnung von Notify-Events

Beitrag von wennerer »

Hallo RudiRatlos,
schau mal in das kleine Beispiel. Ich habe die zweite Form einfach mit Datei, Neues Formular eingefügt.
Beachte diese Zeile, das @ ist wichtig :

Code: Alles auswählen

Form2.Edit1.OnChange:= @Form1.EditInUnit2Change;
Viele Grüße
Bernd
Dateianhänge
project1.zip
(106.01 KiB) 38-mal heruntergeladen

wp_xyz
Beiträge: 5142
Registriert: Fr 8. Apr 2011, 09:01

Re: Zuordnung von Notify-Events

Beitrag von wp_xyz »

Die Grundidee ist, das eine Änderung im SpecialEdit über ein Event ans Hauptformular weitergereicht wird. Das heißt, dass das Hauptformular den Handler für das OnChange-Ereignis des SpecialEdit bereitstellen muss. Du hast den Handler dafür schon geschrieben (SpecialFormEditChange(..)), aber nicht richtig zugewiesen. Das machst du genauso, wie wenn Handler und Control auf demselben Formular wären: Control.OnChange := @Handler:

Code: Alles auswählen

procedure TMainForm.Button1Click(Sender: TObject);
var
  SpecialForm : TSpecialForm;
begin
  SpecialForm := TSpecialForm.Create(nil);
  try
    SpecialForm.Left := Left + Width;   // zum Prüfen, damit ich beide Formulare nebeneinander habe...
    SpecialForm.SpecialEdit.OnChange := @SpecialFormEditChange;  // Hier wird dem SpecialEdit der OnChange-Handler zugewiesen
    SpecialForm.ShowModal;
  finally
    SpecialForm.Free;
  end;
end;

// Das ist der OnChange-Handler für SpecialForm.SpecialEdit.OnChange, also der Code der ausgeführt wird, wenn sich SpecialEdit ändert.
procedure TMainForm.SpecialFormEditChange(Sender: TObject);
begin
  if Sender is TEdit then
    Edit1.Text := TEdit(Sender).Text;
end; 

Wie du vielleicht erkennst, habe ich den Handler etwas allgemeiner geschrieben, also SpecialForm.SpecialEdit dort gar nicht erwähnt, sondern nur geprüft, ob das sendende Objekt ein TEdit ist und dann dessen Text ins Edit1 kopiert. Das hat den Vorteil, dass du denselben Handler auch ohne die Namen des Senders kennen zu müssen mit anderen Controls im SpecialForm verwenden könntest.

[EDIT]
Ah, wennerer war schneller...

RudiRatlos
Beiträge: 26
Registriert: Sa 21. Sep 2019, 13:02
OS, Lazarus, FPC: Windows 11, lazarus 3.8, FPC: 3.2.2
CPU-Target: 64Bit
Wohnort: München

Zuordnung von Notify-Events, gelöst!!

Beitrag von RudiRatlos »

Ganz herzlichen Dank für die schnellen, überzeugenden und sehr lehrreichen Antworten an wennerer und wp_xyz
Damit ist das Problem gelöst!!

Noch einmal, statt
SpecialFormEditChange := SpecialForm.SpecialEdit.OnChange;
muss es
SpecialForm.SpecialEdit.OnChange := @SpecialFormEditChange;
lauten

RudiRatlos

Antworten