Autor Téma: System Popupmenu, odchytenie udalosti Ctrl + X  (Přečteno 239 krát)

Offline Miroslav Baláž

  • Plnoletý
  • ***
  • Příspěvků: 223
  • Karma: 6
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
System Popupmenu, odchytenie udalosti Ctrl + X
« kdy: 25-04-2018, 16:50:16 »
Pracujem so systémovým Popupmenu u TRichEdit. Zrejme by to bolo rovnaké aj pre TMemo.
Ide o odchytenie udalostí, ktoré sa reálne vykonajú, pri výbere položiek. Napríklad Cut, alebo Copy.
Nechcem použiť vlastné PopupMenu, pretože to systémové spľňa všetko, čo potrebujem.
Správne reaguje na rôzne udalosti. Jeho náhrada by bola zložitá.
Vyvolané udalosti z menu, by som potreboval evidovať, pre ďalšie účely.
Vopred ďakujem za prípadnú pomoc.
« Poslední změna: 25-04-2018, 16:52:01 od Miroslav Baláž »

Online Delfin

  • Guru
  • *****
  • Příspěvků: 781
  • Karma: 35
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:System Popupmenu, odchytenie udalosti Ctrl + X
« Odpověď #1 kdy: 25-04-2018, 17:09:28 »
Pokud to menu posila patricne zpravy, mohl bys:

Kód: Delphi [Vybrat]
  1. type
  2.   TRichEdit = class(Vcl.ComCtrls.TRichEdit)
  3.   protected
  4.     procedure WndProc(var Msg: TMessage); override;
  5.   end;
  6.  
  7. implementation
  8.  
  9. { TRichEdit }
  10.  
  11. procedure TRichEdit.WndProc(var Msg: TMessage);
  12. begin
  13.   inherited;
  14.   case Msg.Msg of
  15.     WM_CUT: ShowMessage('Cut');
  16.     WM_COPY: ShowMessage('Copy');
  17.     WM_PASTE: ShowMessage('Paste');
  18.   end;
  19. end;
I'm a soldier, so don't panic!

Offline Miroslav Baláž

  • Plnoletý
  • ***
  • Příspěvků: 223
  • Karma: 6
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:System Popupmenu, odchytenie udalosti Ctrl + X
« Odpověď #2 kdy: 25-04-2018, 18:03:07 »
Pokud to menu posila patricne zpravy, mohl bys:

Dík za fungujúci návod. Vyriešil som to na báze návrhu takto:
Kód: Delphi [Vybrat]
  1.     procedure WMCut(var msgCut: TWMCut); message WM_CUT;
  2.     procedure WMPaste(var msgPaste: TWMPaste); message WM_Paste;
  3. ..
  4. procedure TRichEdit.WMCut(var msgCut: TWMCut);
  5. begin
  6.   inherited;
  7.   with msgCut do
  8.     case msgCut.Msg of
  9.       WM_CUT:  begin
  10.                 // Vykonaj .. pre Cut
  11.                end;
  12.     end;
  13. end;
  14. ..
Zrejme stačí aj:
Kód: Delphi [Vybrat]
  1. procedure TRichEdit.WMCut(var msgCut: TWMCut);
  2. begin
  3.   inherited;
  4.   // Vykonaj .. pre Cut
  5. end;
  6.  

Online Delfin

  • Guru
  • *****
  • Příspěvků: 781
  • Karma: 35
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:System Popupmenu, odchytenie udalosti Ctrl + X
« Odpověď #3 kdy: 25-04-2018, 18:08:02 »
Handler konkretni zpravy nikdy nedostane zpravou jinou nez pro kterou je napsany, cili ptat se zda je napr. v handleru WM_CUT parametr Msg == WM_CUT je zbytecnost, protoze nikdy nebude jinak.

Metodu WndProc jsem navhl proto, ze ses ptal na odchyceni vicero akci (konkretne Cut anebo Copy).
I'm a soldier, so don't panic!

Offline Miroslav Baláž

  • Plnoletý
  • ***
  • Příspěvků: 223
  • Karma: 6
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:System Popupmenu, odchytenie udalosti Ctrl + X
« Odpověď #4 kdy: 25-04-2018, 18:11:55 »
Jasne. V prispevku som napisal ako alternativu, ze to zrejme staci bez case .. of.
Tiez som pouzil dve funkcie:
procedure WMCut(var msgCut: TWMCut); message WM_CUT;
procedure WMPaste(var msgPaste: TWMPaste); message WM_Paste;
Dík.

Online Delfin

  • Guru
  • *****
  • Příspěvků: 781
  • Karma: 35
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:System Popupmenu, odchytenie udalosti Ctrl + X
« Odpověď #5 kdy: 25-04-2018, 18:25:46 »
Tiez som pouzil dve funkcie:
procedure WMCut(var msgCut: TWMCut); message WM_CUT;
procedure WMPaste(var msgPaste: TWMPaste); message WM_Paste;
Dík.

Neni zac! ;) A proto abys nemusel pro kazdou akci psat separatni handler zpravy jsem pretizil metodu WndProc.
I'm a soldier, so don't panic!

Offline Miroslav Baláž

  • Plnoletý
  • ***
  • Příspěvků: 223
  • Karma: 6
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:System Popupmenu, odchytenie udalosti Ctrl + X
« Odpověď #6 kdy: 26-04-2018, 09:36:20 »
Len akademicka otazka:
Nie su v tomto pripade tie dve funkcie rychlejsie?
Alebo je naopak efektivnejsia len ta jedna pretazena funkcia?

Online Delfin

  • Guru
  • *****
  • Příspěvků: 781
  • Karma: 35
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:System Popupmenu, odchytenie udalosti Ctrl + X
« Odpověď #7 kdy: 26-04-2018, 09:45:44 »
Len akademicka otazka:
Nie su v tomto pripade tie dve funkcie rychlejsie?
Alebo je naopak efektivnejsia len ta jedna pretazena funkcia?

Na vstupu je WndProc. Z nej pak dochazi k dispatchi zprav metodou TObject.Dispatch z niz se volaji (pokud existuji) implementace message handleru. A ta volani maji nejaky overhead, takze ne, o par instrukci rychlejsi je WndProc.
I'm a soldier, so don't panic!

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 852
  • Karma: 25
    • Verze Delphi: D2007, XE2, XE6
Re:System Popupmenu, odchytenie udalosti Ctrl + X
« Odpověď #8 kdy: 26-04-2018, 11:18:51 »
Pro inspiraci je v RxLibrary implementováno menu TRxRichPopUpMenu pro podporu v RichEditu, snad by to jako mustr stačilo :)

Online Delfin

  • Guru
  • *****
  • Příspěvků: 781
  • Karma: 35
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:System Popupmenu, odchytenie udalosti Ctrl + X
« Odpověď #9 kdy: 26-04-2018, 11:25:17 »
Pro inspiraci je v RxLibrary implementováno menu TRxRichPopUpMenu pro podporu v RichEditu, snad by to jako mustr stačilo :)

Spis bych sahnul po systemovem menu, byt i v pripade TRxRichPopUpMenu by navrhovane reseni fungovalo ;)
I'm a soldier, so don't panic!

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 852
  • Karma: 25
    • Verze Delphi: D2007, XE2, XE6
Re:System Popupmenu, odchytenie udalosti Ctrl + X
« Odpověď #10 kdy: 26-04-2018, 14:07:49 »
Připojuji obrázek náhledu popup nad richeditem

Offline Miroslav Baláž

  • Plnoletý
  • ***
  • Příspěvků: 223
  • Karma: 6
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:System Popupmenu, odchytenie udalosti Ctrl + X
« Odpověď #11 kdy: 26-04-2018, 15:19:53 »
Len akademicka otazka:
Nie su v tomto pripade tie dve funkcie rychlejsie?
Alebo je naopak efektivnejsia len ta jedna pretazena funkcia?

Na vstupu je WndProc. Z nej pak dochazi k dispatchi zprav metodou TObject.Dispatch z niz se volaji (pokud existuji) implementace message handleru. A ta volani maji nejaky overhead, takze ne, o par instrukci rychlejsi je WndProc.
Znie to logicky. Prepisem na verziu WndProc

Online Delfin

  • Guru
  • *****
  • Příspěvků: 781
  • Karma: 35
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:System Popupmenu, odchytenie udalosti Ctrl + X
« Odpověď #12 kdy: 26-04-2018, 17:53:06 »
Znie to logicky. Prepisem na verziu WndProc

Tak to je. Nicmene kvuli par strojovym cyklum bych se osobne netrapil. Spis mi ten kod v metode WndProc prijde prehlednejsi nez reseni separatnich message handleru.

Připojuji obrázek náhledu popup nad richeditem

A jo, tam jsou i polozky na formatovani. Pekne!
« Poslední změna: 26-04-2018, 17:58:02 od Delfin »
I'm a soldier, so don't panic!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: