Umlaute ersetzen, geht das schneller ?

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Umlaute ersetzen, geht das schneller ?

Beitrag von mk-soft »

Das geht aber doch anders...

Nur beim einfügen aus der Zwischenablage muss der Text einmal übersetzt werden.
Sonst ändert man die Zeichen schon beim schreiben.

Code: Alles auswählen

;-TOP

; Comment : Module SetGadgetCallback (Windows Only)
; Author  : mk-soft
; Version : v0.02
; Created : 10.06.2018
; Updated : 
;
; Syntax Callback:
;           Procedure GadgetCB(hWnd,uMsg,wParam,lParam)
;             Select uMsg
;               ;TODO
;             EndSelect
;             ; Call previous gadget procedure
;             ProcedureReturn CallGadgetProc(hWnd,uMsg,wParam,lParam)
;           EndProcedure
;
; *****************************************************************************

DeclareModule GadgetCallback
  
  Declare SetGadgetCallback(Gadget, *lpNewFunc) 
  Declare CallGadgetProc(hWnd, uMsg, wParam, lParam)
  
EndDeclareModule

Module GadgetCallback
  
  EnableExplicit
  
  Global NewMap *lpPrevFunc()
  Global MutexCB = CreateMutex()
  
  ; ---------------------------------------------------------------------------
  
  Procedure SetGadgetCallback(Gadget, *lpNewFunc)
    Protected GadgetID, GadgetKey.s
    
    GadgetID = GadgetID(Gadget)
    GadgetKey = Hex(GadgetID)
    
    ; Remove exists Callback
    If FindMapElement(*lpPrevFunc(), GadgetKey)
      SetWindowLongPtr_(GadgetID, #GWL_WNDPROC, *lpPrevFunc())
      DeleteMapElement(*lpPrevFunc())
    EndIf
    
    If *lpNewFunc
      If AddMapElement(*lpPrevFunc(), GadgetKey)
        *lpPrevFunc() = SetWindowLongPtr_(GadgetID, #GWL_WNDPROC, *lpNewFunc)
        ProcedureReturn *lpPrevFunc()
      EndIf
    EndIf
    
    ProcedureReturn 0
    
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure CallGadgetProc(hWnd, uMsg, wParam, lParam)
    Protected result
    
    LockMutex(MutexCB)
    If FindMapElement(*lpPrevFunc(), Hex(hWnd))
      result = CallWindowProc_(*lpPrevFunc(), hWnd, uMsg, wParam, lParam)
    EndIf
    UnlockMutex(MutexCB)
    
    ProcedureReturn result
    
  EndProcedure
  
EndModule

; *****************************************************************************

; Example

CompilerIf #PB_Compiler_IsMainFile
  
  UseModule GadgetCallback
  
  Procedure GadgetCB(hWnd,uMsg,wParam,lParam)
    Select uMsg
      Case #WM_CHAR
        Select wParam
          Case 'ä'
            SendMessage_(hwnd, #WM_CHAR, 'a', lParam)
            wParam = 'e'
          Case 'Ä'
            SendMessage_(hwnd, #WM_CHAR, 'A', lParam)
            wParam = 'e'
          Case 'ö'
            SendMessage_(hwnd, #WM_CHAR, 'o', lParam)
            wParam = 'e'
          Case 'Ö'
            SendMessage_(hwnd, #WM_CHAR, 'O', lParam)
            wParam = 'e'
          Case 'ü'
            SendMessage_(hwnd, #WM_CHAR, 'u', lParam)
            wParam = 'e'
          Case 'Ü'
            SendMessage_(hwnd, #WM_CHAR, 'U', lParam)
            wParam = 'e'
          Case 'ß'
            SendMessage_(hwnd, #WM_CHAR, 's', lParam)
            wParam = 's'
          Case #SYN
            Debug "Syn: Text wurde eingefügt"
            ;TODO
        EndSelect
        
    EndSelect
    ProcedureReturn CallGadgetProc(hWnd,uMsg,wParam,lParam)
  EndProcedure
  
  If OpenWindow(0,0,0,800,600,"Example SetGadgetCallback",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    EditorGadget(1,0,0,800, 600)
    
    SetGadgetCallback(1, @GadgetCB())
    
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
  
CompilerEndIf
Zuletzt geändert von mk-soft am 25.03.2019 14:57, insgesamt 2-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Umlaute ersetzen, geht das schneller ?

Beitrag von hjbremer »

mk-soft hat geschrieben:Das geht aber doch anders...

Nur beim einfügen aus der Zwischenablage muss der Text einmal übersetzt werden.
Und das ist eins der Probleme. Die Prozeduren sind in einem Modul. Text der gedropt wird liefert im Subclassing-Callback anscheinend kein Event.
Habe zumindest keines gefunden.
Außer WM-Paint. Aber diese Message wird natürlich immer und andauernd geliefert. Alles was da passiert muß schnell gehen.

Natürlich könnte man eine Prozedur schreiben in der umgewandelt wird und diese in in den Main-Callback hängen.
Aber diesen Extraschritt möchte ich mir ersparen. Werden Zeichen schnell genug verändert, kann man auch WM-Paint nehmen.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Umlaute ersetzen, geht das schneller ?

Beitrag von mk-soft »

Ich habe mal geschaut was da ankommt.

Beim einfügen oder Drop kommt ein Steuerzeichen "SYN" (22) an.
Mit diesen könnte man den Text überarbeiten.

P.S. Beispiel angepasst
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Umlaute ersetzen, geht das schneller ?

Beitrag von hjbremer »

#syn kommt bei mir leider nicht (Win10 x64 PB541 oder 570) Laptop

ansonsten funktioniert der Code gut

meine Callbacks sind allerdings etwas old school

Code: Alles auswählen

Procedure.i StringGadgetX_StrgCB(hwnd, msg, wParam, lParam)   
      
      Protected *sgx.sgxMemory = GetProp_(hwnd, #propname_strgx)
      Protected oldproc = *sgx\oldproc
     
      usw

      ProcedureReturn CallWindowProc_(oldproc, hwnd, msg, wParam, lParam)     
EndProcedure
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten