Deutsch
Forum

Subclassing eines Edit-Feldes

 
- Seite 1 -



Stephan
Sonneborn
Hallo,

wieso wird die Message EM_GETMODIFY nicht ausgewertet, die Message WM_KEYUP aber schon?
'************************************************************************************************
'* SubClassing                                                                                  *
'************************************************************************************************
 $H MESSAGES.PH
DECLARE Edit&
DECLARE Ende%
'+----------------------------------------------------------------------------------------------+

SUBCLASSPROC

    IF SUBCLASSMESSAGE(Edit&, ~EM_GETMODIFY)

        'IF SUBCLASSMESSAGE(Edit&, ~WM_KEYUP)

        IF GETTEXT$(Edit&) = "Ende"

            LOCATE 10,1
            PRINT "Einfach klicken für "; GETTEXT$(Edit&)
            Ende% = 1

        ENDIF

        SET("WinProc", 0)

    ENDIF

ENDPROC

'+----------------------------------------------------------------------------------------------+
CLS
Edit& = CREATE("Edit",%HWND, "", 10,10,100,20)
SUBCLASS Edit&,1

WHILENOT Ende%

    WAITINPUT

WEND

SUBCLASS Edit&,0
END
 
XProfan X4
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
vor 20 Tagen  
 



« Dieser Beitrag wurde als Lösung gekennzeichnet. »


Matthias
Arlt

Wenn schon SubClassing, dann etwa so:
SUBCLASSPROC

    IF SUBCLASSMESSAGE(Edit&, ~WM_KEYUP) OR SUBCLASSMESSAGE(Edit&, ~WM_PASTE)

        SET("WinProc", 1)
        LOCATE 10,1
        PRINT "Subclassing erfolgreich"

    ENDIF

    IF SendMessage(Edit&,~EM_GETMODIFY,0,0)

        IF GETTEXT$(Edit&) = "Ende"

            PRINT "Einfach klicken für "; GETTEXT$(Edit&)
            waitinput
            Ende% = 1

        ENDIF

    ENDIF

ENDPROC


Mit solcher "Eingabeaufforderung" in der SubClassproc ist das aber keine sehr elegante Lösung... Und eigentlich braucht es dafür kein SubClassing, denn so geht es auch:
CLS
Edit& = CREATE("Edit",%HWND, "", 10,10,100,20)

WHILENOT Ende%

    WAITINPUT

    IF SendMessage(Edit&,~EM_GETMODIFY,0,0)

        IF GETTEXT$(Edit&) = "Ende"

            PRINT "Einfach klicken für "; GETTEXT$(Edit&)
            waitinput
            Ende% = 1

        ENDIF

    ENDIF

WEND

END

Es sei denn, Du brauchst das SubClassing noch für weitere, hier noch nicht enthaltene Funktionen...

Das EM_GETMODIFY ist in beiden Fällen entbehrlich und dient nur zur Demo, wo und wie man es anwendet.

Gruß Matthias
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
vor 17 Tagen  
 




Matthias
Arlt

lt. Win32hlp: An application sends an EM_GETMODIFY message to determine whether the content of an edit control has been modified.


EM_GETMODIFY müßte also zunächst an das Edit gesendet werden. Wie WM_KEYUP ja auch...durch Loslassen einer Taste...

Gruß Matthias
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
vor 20 Tagen  
 



EM_GETMODIFY  [...]  soll man (per SendMessage) an das Edit senden und am Rückgabewert erkennen, ob das Edit "modifiziert" wurde.

Subclassmessage wäre hierbei hilfreich wenn Windows die Nachricht ans Edit sendet, was aber nicht der Fall ist.

Es gibt aber auch EN_CHANGE (  [...]  ) - vlt. eher was Du suchst.
 
vor 20 Tagen  
 




Stephan
Sonneborn
iF (05.10.2020)
Es gibt aber auch EN_CHANGE (  [...]  ) - vlt. eher was Du suchst.


Hm. Nein. Geht auch nicht...
WM_KEYUP wäre ja OK, aber wenn man etwas per Zwischenablage und Kontextmenü einfügt, bekomme ich das nicht mit...
 
XProfan X4
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
vor 19 Tagen  
 




Matthias
Arlt

...wenn man etwas per Zwischenablage und Kontextmenü einfügt, bekomme ich das nicht mit...


Doch, einfach auf WM_PASTE reagieren...genau wie WM_KEYUP.
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
vor 19 Tagen  
 




Stephan
Sonneborn
Hm... Irgendwie kann ich dann gar nichts mehr einfügen per CTRL+V oder RMT+Einfügen...
'************************************************************************************************
'* SubClassing                                                                                  *
'************************************************************************************************
 $H MESSAGES.PH
DECLARE Edit&
DECLARE Ende%
'+----------------------------------------------------------------------------------------------+

SUBCLASSPROC

    'IF SUBCLASSMESSAGE(Edit&, ~EM_GETMODIFY)

    IF SUBCLASSMESSAGE(Edit&, ~WM_KEYUP) OR SUBCLASSMESSAGE(Edit&, ~WM_PASTE)

        IF GETTEXT$(Edit&) = "Ende"

            LOCATE 10,1
            PRINT "Einfach klicken für "; GETTEXT$(Edit&)
            Ende% = 1

        ENDIF

        SET("WinProc", 0)

    ENDIF

ENDPROC

'+----------------------------------------------------------------------------------------------+
CLS
Edit& = CREATE("Edit",%HWND, "", 10,10,100,20)
SUBCLASS Edit&,1

WHILENOT Ende%

    WAITINPUT

WEND

SUBCLASS Edit&,0
END
 
XProfan X4
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
vor 18 Tagen  
 




Matthias
Arlt
Der einzufügende String muß natürlich auch beim Edit ankommen. Also die Message nicht nur abfangen, sondern nach Eingang auch an die originale WindowProc vom Edit weiterreichen per 'SET("WinProc", 1)'. Oder aber selbst behandeln (bspw. 'settext'...)

Gruß Matthias
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
vor 18 Tagen  
 




Stephan
Sonneborn
Matthias Arlt (06.10.2020)
Der einzufügende String muß natürlich auch beim Edit ankommen. Also die Message nicht nur abfangen, sondern nach Eingang auch an die originale WindowProc vom Edit weiterreichen per 'SET("WinProc", 1)'. Oder aber selbst behandeln (bspw. 'settext'...)

Gruß Matthias


Vielen Dank für Deine Hilfe, Matthias!
Hab jetzt WinProc wieder eingeschaltet. Danach wollte ich dann das Edit-Feld auswerten... ohne Erfolg.
'************************************************************************************************
'* SubClassing                                                                                  *
'************************************************************************************************
 $H MESSAGES.PH
DECLARE Edit&
DECLARE Ende%
'+----------------------------------------------------------------------------------------------+

SUBCLASSPROC

    'IF SUBCLASSMESSAGE(Edit&, ~EM_GETMODIFY)

    IF SUBCLASSMESSAGE(Edit&, ~WM_KEYUP) OR SUBCLASSMESSAGE(Edit&, ~WM_PASTE)

        SET("WinProc", 1)
        LOCATE 10,1
        PRINT "Subclassing erfolgreich"

        IF GETTEXT$(Edit&) = "Ende"

            PRINT "Einfach klicken für "; GETTEXT$(Edit&)
            Ende% = 1

        ENDIF

    ENDIF

ENDPROC

'+----------------------------------------------------------------------------------------------+
CLS
Edit& = CREATE("Edit",%HWND, "", 10,10,100,20)
SUBCLASS Edit&,1

WHILENOT Ende%

    WAITINPUT

WEND

SUBCLASS Edit&,0
END
 
XProfan X4
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
vor 17 Tagen  
 




Matthias
Arlt

Wenn schon SubClassing, dann etwa so:
SUBCLASSPROC

    IF SUBCLASSMESSAGE(Edit&, ~WM_KEYUP) OR SUBCLASSMESSAGE(Edit&, ~WM_PASTE)

        SET("WinProc", 1)
        LOCATE 10,1
        PRINT "Subclassing erfolgreich"

    ENDIF

    IF SendMessage(Edit&,~EM_GETMODIFY,0,0)

        IF GETTEXT$(Edit&) = "Ende"

            PRINT "Einfach klicken für "; GETTEXT$(Edit&)
            waitinput
            Ende% = 1

        ENDIF

    ENDIF

ENDPROC


Mit solcher "Eingabeaufforderung" in der SubClassproc ist das aber keine sehr elegante Lösung... Und eigentlich braucht es dafür kein SubClassing, denn so geht es auch:
CLS
Edit& = CREATE("Edit",%HWND, "", 10,10,100,20)

WHILENOT Ende%

    WAITINPUT

    IF SendMessage(Edit&,~EM_GETMODIFY,0,0)

        IF GETTEXT$(Edit&) = "Ende"

            PRINT "Einfach klicken für "; GETTEXT$(Edit&)
            waitinput
            Ende% = 1

        ENDIF

    ENDIF

WEND

END

Es sei denn, Du brauchst das SubClassing noch für weitere, hier noch nicht enthaltene Funktionen...

Das EM_GETMODIFY ist in beiden Fällen entbehrlich und dient nur zur Demo, wo und wie man es anwendet.

Gruß Matthias
 
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
vor 17 Tagen  
 




Stephan
Sonneborn
Hallo Matthias,

vielen Dank für Dein Beispiel!

Das macht es klarer! Ich wollte mich einfach mal an die "neuen" Funktionen wagen. Als Ziel soll es ja ein Vokabeltrainer werden.

Und ich wollte übers Subclassing einen Zeitmesser laufen lassen. Klappt auch sehr gut!

Und dann wollte ich während der Eingabe einer Antwort mit einem Wechsel eines Icons für richtig oder falsch eine Rückmeldung geben.

Das Beispiel oben sollte das Problem nur vereinfacht darstellen. Ich denke, jetzt bekomme ich es hin!
 
XProfan X4
Schöne Grüße aus Wittgenstein
von Stephan

Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz
vor 16 Tagen  
 




Matthias
Arlt
Hallo Stephan,
dann gutes Gelingen! Freut mich, wenn ich ein wenig dazu beitragen konnte...
Gruß Matthias
 
Alle Sprachen
WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia
vor 16 Tagen  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

308 Betrachtungen

Unbenanntvor 0 min.
Thomas ZielinskiVorgestern (17:23)
iF vor 5 Tagen
RudiB. vor 11 Tagen
RGH vor 11 Tagen
Mehr...

Themeninformationen



AGB  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Impressum  |  Mart  |  Support  |  Suche

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie