Jump to content

Plugin SetMenuHandle, InsertMenu


Portisch

Recommended Posts

Hi,

 

komm hier nicht weiter!

 

Ich benutze ja den Code:

procedure SetMenuHandle(Menu:HMenu);stdcall;
begin
MainMenu:= CreateMenu;
InsertMenu(MainMenu, $FFFFFFFF,
 (MF_BYPOSITION or MF_POPUP or MF_ENABLED),
 LoadMenu(hInstance,'EXTERN'),PluginName);

InsertMenu(Menu, $FFFFFFFF,
 MF_BYPOSITION or MF_POPUP or MF_ENABLED),
 MainMenu,PluginName);
end;

 

um das Plugin (PluginName) im Menü einzubinden. Das geht auch und es wird auch auf MenuItemClick reagiert.

 

Wie mache ich nun in meinem Hinzugefügtem Item Subitems?

 

z.B.:

Mein Plugin -> Options
		-> About

 

Da sind leider meine Delphi-Kenntnisse am ende. :)

 

Kann da jemand einen Sample Code posten!?

Link to comment

Du musst zusätzlich ein Submenü erzeugen

 

   MainMenu := CreateMenu;
  SubMenu := CreateMenu;

 

in dieses deine Untermenüpunkte einhängen, z.B.

 

   InsertMenu(SubMenu,$FFFFFFFF,
		  MF_BYPOSITION or MF_ENABLED,
		  SomeValue,SomeName);
  InsertMenu(SubMenu,$FFFFFFFF,
		  MF_SEPARATOR,
		  0,nil);
//...

 

und am Ende

 

	  InsertMenu(MainMenu, $FFFFFFFF,
			 MF_BYPOSITION or MF_POPUP or MF_ENABLED,
			 SubMenu,SomeName);
  InsertMenu(Menu, $FFFFFFFF,
			 MF_BYPOSITION or MF_POPUP or MF_ENABLED,
			 MainMenu,nil);

 

<edit> Korrigiert. Da war ein InsertMenu zu viel reingerutscht. </edit>

Edited by Griga
Link to comment

Jeder anwählbare Menüpunkt braucht eine eigene ID. Am besten nimmst du eine Basis-ID und zählst sie dann nach jedem neuen Menüpunkt um 1 hoch. Die Basis-ID legst du selbst fest und hoffst, dass sie mit keinem anderen Plugin kollidiert :)

 

Ich verwende immer IDs im Bereich 59xxx und Lars 39xxx (dezimal). Da hälst du dich also besser raus.

Link to comment

Hat Funktioniert!

 

Nun kann ich SubItems anlegen.

 

Da ich dann noch eine Form anzeigen will hätte ich da noch eine Frage:

 

procedure ShowDllMainForm;
begin
try

 MainForm.Free;

 Application.Handle := DVBViewerHandle;

 MainForm := TMainForm.Create(Application);

 MainForm.Show;
finally
 MainForm.Free;

 MainForm := nil;
end;
end;

 

Nun habe ich das Problem das die Form nur kurz Aufblitzt und dann nicht mehr zu sehen ist.

 

Wenn ich es mit Showmodal mache bleibt sie da.

 

Ich möchte aber während das Fenster offen ist im DVBViewer etwas verändern können.

Link to comment
Nun habe ich das Problem das die Form nur kurz Aufblitzt und dann nicht mehr zu sehen ist.

Wen wundert's... wenn du die Form nach Create und Show sofort wieder freigibst, was erwartest du? :bye:

 

Der Aufruf von ShowModal kehrt erst zurück, wenn du das Fenster schließt. Show prinzipbedingt sofort. Oder sollte es vielleicht except statt finally heißen?

 

Wie auch immer... wenn du möchtest, dass ein nicht-modal angezeigtes Fenster beim Schließen automatisch freigegeben wird, musst du im OnClose-Event nur folgendes machen:

 

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
end;

 

und vielleicht noch im OnDestroy-Event

 

procedure TMainForm.FormDestroy(Sender: TObject);
begin
 MainForm := nil;  
end;

Link to comment

:bye:o:)

 

Manchmal sieht man den Wald vor lauter Bäumen nicht!

 

Danke!

 

edit:

 

Jetzt muss ich aber noch einmal kurz nachfragen!

 

Wenn die Form offen ist und DVBViewer beendet wird stürzt ja alles ab. D.h. die Form muss vorher geschlossen werden!

 

Ich habe es über EventMsg probiert:

  case EventType of
evUnload:
  Terminate;

 

Jedoch wird diese nicht aufgerufen, da es schon vorher hängt. Wenn die Form zu ist wird sie schon aufgerufen.

Wie kann ich meiner DLL sagen sie soll jetzt die Form zumachen?

 

EDIT

 

Hat sich erledigt. Es scheint ein Bug im Plugin Code gewesen zu sein!

Edited by Portisch
Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...