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

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 374
  • Karma: 14
    • 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ů: 1117
  • Karma: 52
  • 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! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 374
  • Karma: 14
    • 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ů: 1117
  • Karma: 52
  • 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! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 374
  • Karma: 14
    • 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ů: 1117
  • Karma: 52
  • 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! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 374
  • Karma: 14
    • 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ů: 1117
  • Karma: 52
  • 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! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 864
  • Karma: 25
    • Verze Delphi: XE8, Seattle
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ů: 1117
  • Karma: 52
  • 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! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 864
  • Karma: 25
    • Verze Delphi: XE8, Seattle
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 miroB

  • Hrdina
  • ****
  • Příspěvků: 374
  • Karma: 14
    • 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ů: 1117
  • Karma: 52
  • 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! I know the underground! I like WTFPL license! No more Google, go duck, go!

 

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

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

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