Ich habe eine App, die mehrere Formen hat. Alle diese Formen haben ein PopupMenu. Ich erstelle die Menüpunkte programmatisch, alles unter einem gemeinsamen Wurzelmenüpunkt. Ich möchte, dass ALLE Menüpunkte die gleiche Prozedur aufrufen, und der Menüeintrag selbst dient im Grunde als Argument.Methodenzeiger und reguläre Prozedur inkompatibel
Ich hatte dies funktioniert, wenn ich nur ein Formular hatte, diese Funktionalität zu tun. Ich habe jetzt mehrere Formulare, die dies tun müssen. Ich verschiebe meinen gesamten Code in eine gemeinsame Einheit.
Example.
Form A has PopupMenu 1. When clicked, call code in Unit CommonUnit.
Form B has PopupMenu 2. When clicked, call code in unit CommonUnit.
Wenn ich brauche, um meine Pop-up von jeder Form zu nennen, nenne ich mein Top-Level-Verfahren (die in Einheit CommonUnit ist), von jeder Form den Namen des oberen Menüpunkt vorbei auf die oberste Ebene Verfahren in der gemeinsame Einheit.
Ich füge Elemente zu meinem PopupMenu mit Code hinzu.
M1 := TMenuItem.Create(TopMenuItem);
M1.Caption := FieldByName('NAME').AsString;
M1.Tag := FieldByName('ID').AsInteger;
M1.OnClick := BrowseCategories1Click;
TopMenuItem.Add(M1);
Ich erhalte eine Fehlermeldung, wenn ich kompiliere. Insbesondere beschwert sich die OnClick-Zeile über
Inkompatible Typen: "Methodenzeiger und reguläre Prozedur".
Ich habe BrowseCategories1Click genau wie zuvor definiert, als ich dies auf einem einzigen Formular getan habe. Der einzige Unterschied besteht darin, dass es jetzt in einer gemeinsamen Einheit und nicht als Teil eines Formulars definiert ist.
Es ist definiert als
procedure BrowseCategories1Click(Sender: TObject);
begin
//
end;
Was ist der einfachste Weg, dies zu umgehen?
Dank GS
Machen Sie es zu einer Klassenprozedur und Sie müssen kein Objekt instanziieren –
Aber was, wenn ich auf den 'self' Parameter (d. H. Das besitzende Formular) innerhalb des Click-Handlers zugreifen möchte? – Johan