Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi popupmenu item hinzufügen und onClick ereignis definieren! (https://www.delphipraxis.net/11866-popupmenu-item-hinzufuegen-und-onclick-ereignis-definieren.html)

ixtreme 15. Nov 2003 14:14


popupmenu item hinzufügen und onClick ereignis definieren!
 
hi,

ich weiß, sowas wurde hier schon mal gestellt. habe aber bis jetzt nichts passendes gefunden...

ich brauche ein popupmenu das dynamisch eingebunden wird und dynamisch eine onclickprocedure für einen eintrag bekommen muss...

beide daten, für caption und onClick sollen aus einer dll geholt werden...

jemand nen ansatz?


gruß

ixtreme.de

P.S. auch antworten wenns ohne dll beschreibung ist

Luckie 15. Nov 2003 14:21

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
Such mal danach wie man einen Button dynamisch erzeugt. Geht entsprechend mit dem Menü.

Da das wohl eine Plugin Scxhnittstelle werden soll, such auch mal nacvh Plugin.

ixtreme 15. Nov 2003 14:31

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
finde nix...wobei die procedure ja auch dynamisch ist...das erzeugen des popupmenus ist also kein problem mehr...

gruß

ixtreme.de

Christian Seehase 15. Nov 2003 15:00

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
Moin ixtreme,

Zitat:

Zitat von ixtreme
finde nix...

wenn ich hier nach Hier im Forum suchenButton dynamisch suche, erhalte ich 20 Fundstellen und die hast Du innerhalb von 10 Minuten durchgesehen? :gruebel:

Dynamisch erzeugen, kannst Du die Prozedur nicht, nur eine bestehende Zuweisen, in der Du dann z.B. auch eine Funktion aus einer DLL aufrufen kannst.

ixtreme 15. Nov 2003 15:21

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
ja klar, bin doch ein ganz schneller..


aber dann sag mir bitte einer wie ich eine procedure in einer dll deklarieren muss, damit ich sie einem item eines popupmenus hinzufügen kann...

Christian Seehase 15. Nov 2003 15:44

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
Moin ixtreme,

Du solltest sie einfach so aufbauen wie ein TNotifyEvent.

Hier gibt's noch näheres dazu, wie der Header aufgebaut sein muss:

prozedur aufruf und sender

Dann musst Du Dich nur noch entscheiden, ob die Prozeduren statisch oder dynamisch eingebunden werden.

ixtreme 15. Nov 2003 15:52

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
Ok, ich habe jetzt folgenden Code in der Hauptanwendung:

Code:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, CheckLst, Menus;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    CheckListBox1: TCheckListBox;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    PopupMenu1: TPopupMenu;
    Beenden1: TMenuItem;
   

    procedure Beenden1Click(Sender: TObject);
   
    procedure xy1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);



  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure klickmich(sender:tObject)stdcall; external 'project2.dll';







procedure TForm1.Beenden1Click(Sender: TObject);
begin
   Close;
end;






procedure TForm1.Button4Click(Sender: TObject);
var
menu : TMenuItem;
begin
                 menu := TMenuItem.Create(self);
            menu.Caption := '123';
             menu.OnClick := Klickmich;

            form1.popupmenu1.Items.Add(menu);
end;

end.

und diesen in der dll, funzt aber nicht, wieso? hab da noch nicht so viel ahnung von!


Code:
library Project2;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  sharemem,
  SysUtils,
  Classes,
  idhttp,shellapi, windows;

{$R *.res}




procedure Klickmich(Sender: TObject);
begin
hallo123;
end;

exports
  klickmich;

begin
end.

Luckie 15. Nov 2003 15:57

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
Zitat:

und diesen in der dll, funzt aber nicht
Ich habe mich so eben entschieden, bei solchen Fehlerbeschreibungen grundsätzlich nicht mehr zu helfen. :evil:

Christian Seehase 15. Nov 2003 16:08

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
Moin ixtreme,

lies Dir bitte mal den von mir genannten Thread genau durch. Dann müsstest Du den Fehler finden.

ixtreme 15. Nov 2003 20:07

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
sorry, ich komm nicht auf den fehler!


wer kann mir helfen?


gruß

ixtreme.de

Christian Seehase 15. Nov 2003 21:07

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
Moin ixtreme,

dann noch einmal in Kurzfassung:

Das OnClick Event ist vom Typ TNotifyEvent.
Diese ist folgendermassen deklariert:

Delphi-Quellcode:
type
  TNotifyEvent = procedure(Sender: TObject) of object;
Durch dieses of object hat es einen unsichtbaren Parameter self, so dass eigentlich

Delphi-Quellcode:
procedure ButtonClick(self: TComponent;Sender: TObject);
aufgerufen wird, wenn das OnClick Event aufgerufen wird.

Jetzt vergleich das mal mit Deiner "KlickMich" Prozedur.

ixtreme 16. Nov 2003 14:35

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
ja aber ich kann die prcedure doch aus einer dll nicht so deklarieren?

Gruß

ixtreme.de

Christian Seehase 16. Nov 2003 14:35

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
Moin ixtreme,

Zitat:

Zitat von ixtreme
ja aber ich kann die prcedure doch aus einer dll nicht so deklarieren?

und warum nicht?

[EDIT]
Besser gesagt: Was spricht dagegen?
[/EDIT]

ixtreme 16. Nov 2003 15:16

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
ok, habs versucht, dann findet er die procedure nicht mehr....


fehler: prcedure klickmich in datei.dll nicht vorhanden/gefunden!

ixtreme 16. Nov 2003 15:21

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
oder es kommt beim aufruf die meldung:

calling conventions differ

scp 16. Nov 2003 16:46

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
Das hier geht, ist aber nicht sehr elegant:

Delphi-Quellcode:
type
  TNotifyEventMP = record
    Proc : procedure(self : TComponent; Sender: TObject);
    self : TComponent;
  end;

procedure KlickMich(self : TComponent; Sender: TObject); // Diese hier kann external, also in der DLL sein
begin
  ShowMessage('Sender: ' + Sender.ClassName);
end;

const
  KlickMichMP : TNotifyEventMP =
    (
    Proc : KlickMich;
    self : nil;
    );

procedure TForm1.Button2Click(Sender: TObject);
begin
  MenuItem1.OnClick := TNotifyEvent(KlickMichMP);
end;

Christian Seehase 16. Nov 2003 17:35

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
Moin ixtreme,

Zitat:

Zitat von ixtreme
fehler: prcedure klickmich in datei.dll nicht vorhanden/gefunden!

Das dürfte daran liegen, dass man beim Import exakt auf die Gross-/Kleinschreibung achten muss.
Wenn die Prozedur als KlickMich exportiert wird, und Du beim Import klickmich angibst, geht das schief.

Zitat:

Zitat von ixtreme
calling conventions differ

Beim Import gibst Du als Aufrufkonvention stdcall an, in der DLL nicht.
Also entweder immer oder gar nicht.

Alter Mann 16. Nov 2003 18:19

Re: popupmenu item hinzufügen und onClick ereignis definiere
 
Hallo,

ich würde die sichere Art und Weise bevorzugen, etwa in der Art:

Code:
implementation

{$R *.dfm}

var
  _DynButton : function(): TMenuItem; stdcall;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  LH := LoadLibrary('test.dll');
  if LH <> 0 then
  begin
    @_GetDynButton := GetProcAddress(LH, 'CreateButton');
    PopupMenu.Items.Insert(PopupMenu.Items.Count, _GetDynButton);
  end
  else MessageDlg('Fehler-Nr.: ' + IntToStr(GetLastError), mtError, [mbOk], 0);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz