![]() |
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 |
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. |
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 |
Re: popupmenu item hinzufügen und onClick ereignis definiere
Moin ixtreme,
Zitat:
![]() 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. |
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... |
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: ![]() Dann musst Du Dich nur noch entscheiden, ob die Prozeduren statisch oder dynamisch eingebunden werden. |
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. |
Re: popupmenu item hinzufügen und onClick ereignis definiere
Zitat:
|
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. |
Re: popupmenu item hinzufügen und onClick ereignis definiere
sorry, ich komm nicht auf den fehler!
wer kann mir helfen? gruß ixtreme.de |
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:
Durch dieses of object hat es einen unsichtbaren Parameter self, so dass eigentlich
type
TNotifyEvent = procedure(Sender: TObject) of object;
Delphi-Quellcode:
aufgerufen wird, wenn das OnClick Event aufgerufen wird.
procedure ButtonClick(self: TComponent;Sender: TObject);
Jetzt vergleich das mal mit Deiner "KlickMich" Prozedur. |
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 |
Re: popupmenu item hinzufügen und onClick ereignis definiere
Moin ixtreme,
Zitat:
[EDIT] Besser gesagt: Was spricht dagegen? [/EDIT] |
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! |
Re: popupmenu item hinzufügen und onClick ereignis definiere
oder es kommt beim aufruf die meldung:
calling conventions differ |
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; |
Re: popupmenu item hinzufügen und onClick ereignis definiere
Moin ixtreme,
Zitat:
Wenn die Prozedur als KlickMich exportiert wird, und Du beim Import klickmich angibst, geht das schief. Zitat:
Also entweder immer oder gar nicht. |
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