PopupMenu Procedure mit Parameter zuweisen

Hallo,

ich erstelle zur Laufzeit einen neuen PopupMenu Eintrag:

newMenuItem := TMenuItem.Create(Self);
newMenuItem.Caption := ‚klick hier‘;
newMenuItem.name:=‚testname‘;
newMenuItem.OnLick=ProcedureXYZ;

Das klappt problemlos soweit problemlos, beim Klick darauf wird brav die Procedure ProcedureXYZ ausgeführt.

Mein Problem ist aber folgendes:

ich möchte der Prozedur einen Parameter mitgeben, in dem Fall einen String, der eine URL enthält, die dann in der Procedure aufgerufen wird. Wenn ich aber in meiner ProcedureXYZ eine Variable in der Deklaration hinzufüge, kann sie nicht mehr durch das Popupmenu aufgerufen werden.

meine deklaration : Procedure ProcedureXYZ(Sender : TObject; url : string);

Als Fehler kommt : [Error] Unit1.pas(53): Incompatible types: ‚TNotifyEvent‘ and ‚procedure, untyped pointer or untyped parameter‘

Ich versuche sie so aufzurufen : procedureXYZ(MainWindow,‚url‘);

Wenn ich keinen zusätzlichen Parameter in der procedure habe, will delphi nicht, dass ich den Sender, also das TObject (in meinem Fall MainWindow) angebe. Wieso macht Delphi so einen Mist? Es sollte doch wohl möglich sein einen Parameter zu übergeben!

Danke für jede Hilfe!

Daniel

Hi,

Wenn ich richtig verstehe, willst du, dass deine Url geöffnet wird, wenn man auf den Menüpunkt klickt.

Die OnClick Prozedur kannst du nicht einfach so verändern, weil sie eine Konstante ist.
(type OnClick = procedure(Sender: TObject):wink:

Stattdessen musst du den Aufruf in die Prozedur reinschreiben:

URLs kannst du mit der Funktion ShellExecute aus der Unit ShellAPI aufrufen.

und das geht so:

{Diese Prozedur muss noch im Deklarations Bereich deklariert sein
Type TMainForm = class(TForm);
procedure newMenuItemClick(Sender: TObject);
}

procedure TMainForm.newMenuItemClick(Sender: TObject);
const
MeineURL = ‚www.wer.weiss-was.de‘;
begin
ShellExecute(Application.Handle,
‚open‘,
PChar(MeineUrl),
nil,
nil,
SW_SHOWNORMAL);
{ sollte das nicht arbeiten, dann noch die Unit ExtActns einbinden}
end;

Diese Prozedur weist du dann deinem Menü Item zu:

newMenuItem.OnClick := newMenuItemClick;

Sollte eigentlich arbeiten, wenn nicht sag bescheid.

B^B

Hallo,

ich verstehe dein Problem nicht ganz:

Mein Problem ist aber folgendes:

ich möchte der Prozedur einen Parameter mitgeben, in dem Fall
einen String, der eine URL enthält, die dann in der Procedure
aufgerufen wird. Wenn ich aber in meiner ProcedureXYZ eine
Variable in der Deklaration hinzufüge, kann sie nicht mehr
durch das Popupmenu aufgerufen werden.

Warum mußt du einen weiteren Parameter mit der URL übergeben? Rufen unterschiedliche Buttons die selbe Ereignisprozedur (ProcedureXYZ) auf, sollen dort aber unterschiedliche URLS öffen? Sind das feste URLs oder können die sich im Laufe des Programms ändern?

Es gibt je nach konkretem Problem ganz unterschiedlich geeignete Lösung. Ein Vorschlag „ins Blaue“ wäre folgender:

Deklariere eine Typ „TUrlButton = Type(TButton)“ mit einer Eigenschaft „URL: String“ und überschreibe die Click-Methode.

oder:

Weise deinem Button einen definierten Wert für die Eigenschaft „Tag“ zu. Frage dann in der Ereignisprozedur ab, wer der Sender war mit

 var url: String;
 ...

 Case TButton(Sender).Tag of
 1: Url := 'http://....';
 2: ...
 ...
 end;

 ... // Url verwenden

Ich versuche sie so aufzurufen :
procedureXYZ(MainWindow,‚url‘);

Wenn ich keinen zusätzlichen Parameter in der procedure habe,
will delphi nicht, dass ich den Sender, also das TObject (in
meinem Fall MainWindow) angebe. Wieso macht Delphi so einen
Mist? Es sollte doch wohl möglich sein einen Parameter zu
übergeben!

Gib mal den Quellcode - mir ist schon wieder nicht klar, was du eigentlich meinst. Wenn procedureXYZ(Sender:TObject) deine Ereignisprozedur ist, kannst du die doch mit procedureXYZ(MainWindow) aufrufen. Eine Prozedur der Form procedureXYZ(Sender:TObject; Url:String) kannst du zwar deklarieren und auch aufrufen, das ist aber KEINE Ereignisprozedur. Die kannst du dann NICHT von dem TButton.OnClick-Ereignis aufrufen lassen.

Gruß
Jochen

Genauere Erklärung des Problems
Hallo,

danke für Deine schnelle Antwort.

Meine Prozedur soll eben verschiedene URLs aufrufen, die ich mit einem Parameter übergeben will. Diese URLs werden erst nachdem das Programm gestartet wurde eingelesen und daraus Menupunkte generiert. Es sind die Favoriten des Internet Explorers.

Allerdings kann ich, wie gesagt, keinen Parameter an meine Prozedur übergeben.

Wenn Du also eine gute Idee hast, wie ich diesen Menüpunkten (TMenuItem) beim OnClick Event einen Parameter mit übergeben kann, wäre ich sehr dankbar!

Dank im voraus!

Daniel

Hallo,

danke für Deine Antwort, ich glaube, ich habe mich etwas unverständlich ausgedrückt.

So wie Du vergeschlagen hast, mach eich das Ganze bereits. Mein Problem ist nbur, dass ich der Prozedur eine URL als Variable/Parameter übergeben möchte, die dann aufgerufen wird.

Also keine Konstante Url, sondern variable. Diese URLs werden nämlich erst nach Programmstart eingelesen und daraus Menüpunkte generiert. Es handelt sich um die Favoriten des Internet Explorers.

Das heißt, ich möchte für jeden der Favoriten einen Menupunkt im TPopupMenu generieren, der dann per ShellExecute den IE mit der entsprechenden URL startet.

Hoffe, ich habe mich jetzt klarer ausgedrückt!

Falls Du eine Lösung kennst oder eine Idee hast, zögere nicht sie mir mitzuteilen :wink:

Danke im voraus!

Daniel

Hallo Daniel,

Wenn Du also eine gute Idee hast, wie ich diesen Menüpunkten
(TMenuItem) beim OnClick Event einen Parameter mit übergeben
kann, wäre ich sehr dankbar!

Erstmal: vergiß die Extra-Parameter-Übergabe bei Events. Die Typen der Ereignisprozeduren sind festgelegt, die kannst du nicht ändern. Du mußt einen anderen Weg gehen. Wenn du ganz ganz unbedingt aber Ereignisprozeduren mit zusätzlichen Parametern verwenden willst, mußt du einen eigenen Typ erstellen/ableiten, der einen entsprechenden Ereignisprozedurtyp auch unterstützt. Aber es gibt für dein Problem einfachere Lösungen, also vergiß die Sache mit dem Extra-Parameter erst mal.

Meine Prozedur soll eben verschiedene URLs aufrufen, die ich
mit einem Parameter übergeben will. Diese URLs werden erst
nachdem das Programm gestartet wurde eingelesen und daraus
Menupunkte generiert. Es sind die Favoriten des Internet
Explorers.

Also hast du sowas wie eine String-Liste oder ein Array, sowas wie URL[1], URL[2], URL[3],… sagen wir n Einträge

und du generierst dazu n Menüeinträge, denen du allen als OnClick-Event deine „ProcedureXYZ“ zuweist. Dann ergänze dies doch noch um eine Zuweisung der Tag-Nummer, zB:

 for i := 1 to n do
 With TMenuItem.Create(self) do
 begin
 Caption := 'klick hier';
 Name := 'testname'+intToStr(i);
 OnClick := ProcedureXYZ;
**Tag := i;** 
 end;

und in der Ereignisprozedur kannst du dann die jeweiligen URL anhand des Tags bestimmen:

var SelectedURL: String;
...
 SelectedURL := URL[TMenuItem(Sender).Tag];
...

Das war’s.

Geht das so oder hilft dir das auch nicht weiter ?

Gruß
Jochen

Danke!
Hallo,

danke für Deine Hilfe!

So klappt’s genau wie ich mir das vorgestellt hatte!

Daniel