Deutsch
Forum

SubClassing: Unterschiede in Interpreter und Exe

 

E.T.
Mein folgendes Beispiel reagiert in der .exe anders als im Interpreter:
Interpreter : 
Ich kann mit der Tab-Taste von einem Edit zum anderen hüpfen, ohne das irgendwas passiert. Komme ich in Edit 1 an, wird der Kalender aktiv, verlasse ich dieses, wird der Kalender wieder deaktiviert. Ich kann also im Edit 1 den Kalender anklicken, und das Datum (welches angeklickt wurde), wird übernommen (also ins SubClassProc gerannt, Menu 15000 gesetzt, das dann ausgewertet).
Freu, so will ich es haben !!

In der Exe 
Jedes mal, wenn der Kalender aktiviert wird (also Focus in Edit 1) wird ins SubclassProc gerannt und Menu 15000 gesetzt (also auch gleich am Start, weil ja der Focus in Edit 1 ist).
Beim Deaktivieren des Kalenders (Focus ausserhalb Edit 1) wird nochmal ins SubClassProc gerannt und das Event ausgelöst.
Stoffwechselendprodukt !!

Bin für jede Idee dankbar !! 
KompilierenMarkierenSeparieren
Declare Element&[], Kalender&, Ende%

SubClassProc

    If SubClassMessage(Kalender& , 15)Tag angeklickt

        messagebox(Im SubClassProc,Info,64)...zur Information
        SetMenuItem 15000
        Set(WinProc, 1)

    EndIf

EndProc

Proc Check_Element

    If @GetFocus(Element&[1])

        EnableWindow Kalender&,1

    Else

        EnableWindow Kalender&,0

    EndIF

EndProc

Proc Kal_GetDate

    Declare Datum#
    dim Datum#,20
    SendMessage(Kalender&,4097,0,Datum#)
    Var Zurück$ = format$(00,word(Datum#,6))+.+format$(00,word(Datum#,2))+.+format$(0000,word(Datum#,0))
    Dispose Datum#
    Return Zurück$

ENDPROC

Window 800,600
Kalender&=Control(SysMonthCal32,Kalender,$50000000,600,0,180,height(%HWnd),%HWnd,5000,%hinstance,0)
EnableWindow Kalender&,0
Element&[0] = @Control(Dialog,,$54000000 | $00800000,0,0,400,height(%HWnd),%HWnd,5001,%HInstance,$10000)
Element&[1] = @Create(Edit,Element&[0],,10,10,200,20)
Element&[2] = @Create(Edit,Element&[0],,10,50,200,20)
Element&[3] = @Create(Edit,Element&[0],,10,100,200,20)
Element&[4] = @Create(Edit,Element&[0],,10,150,200,20)
SetFocus(Element&[1])
SubClass Kalender&,1

WhileNot Ende%

    Check_Element
    Waitinput

    If %Key = 2

        Ende% = 1

    ElseIf @MenuItem(15000)

        SetText Element&[1],Kal_GetDate()

    EndIf

EndWhile

SubClass Kalender&,0
end

Nachtrag: Wieso werden überhaupt im Subclassproc die Messages verdreht, der Kalender löst %Message=32 aus, nur nicht im Subclassproc ???
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
28.12.2008  
 




Andreas
Miethe


IDEE !
KompilierenMarkierenSeparieren
Declare Element&[], Kalender&, Ende%

SubClassProc

    If SubClassMessage(Kalender& , 15) & GetFocus(Element&[1])Tag angeklickt

        SetMenuItem 15000
        Set(WinProc,1)

    EndIf

EndProc

Proc Kal_GetDate

    Declare Datum#
    dim Datum#,20
    SendMessage(Kalender&,4097,0,Datum#)
    Var Zurück$ = format$(00,word(Datum#,6))+.+format$(00,word(Datum#,2))+.+format$(0000,word(Datum#,0))
    Dispose Datum#
    Return Zurück$

ENDPROC

Window 800,600
Kalender&=Control(SysMonthCal32,Kalender,$50000000,600,0,180,height(%HWnd),%HWnd,5000,%hinstance,0)
Element&[0] = @Control(Dialog,,$54000000 | $00800000,0,0,400,height(%HWnd),%HWnd,5001,%HInstance,$10000)
Element&[1] = @Create(Edit,Element&[0],,10,10,200,20)
Element&[2] = @Create(Edit,Element&[0],,10,50,200,20)
Element&[3] = @Create(Edit,Element&[0],,10,100,200,20)
Element&[4] = @Create(Edit,Element&[0],,10,150,200,20)
SetFocus(Element&[1])
SubClass Kalender&,1

WhileNot Ende%

    Waitinput

    If %Key = 2

        Ende% = 1

    ElseIf @MenuItem(15000)

        SetText Element&[1],Kal_GetDate()
        SetFocus(Element&[1])

    EndIf

EndWhile

SubClass Kalender&,0
end
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
28.12.2008  
 




E.T.
@Andreas: Danke. Jetzt wird aber der Kalender nicht mehr deaktiviert
Bei mir im richtigen Proc ist das wichtig, dort werden auch noch div. Buttons und Menü-Eintrage disabled.
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
28.12.2008  
 




Sascha
Oliver
Haak
In Deinem Code habe ich den Focus von Element&[1] genommen.

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ändern
Proc Check_Element
If @GetFocus(Element&[1])
EnableWindow Kalender&,1
Else
EnableWindow Kalender&,0
@SetFocus(Element&[2]) Focus von Element&[1] weg nehmen
EndIF
EndProc
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Ende ändern
Habe auch IDEE gehabt.!

Wenns passt bitte schön!

Gruß
Sascha
 
28.12.2008  
 




E.T.
@Sascha: , Nur sagt mir meine Logik, das alles, was hinter dem Else  steht, sowieso ausgeführt wird, wenn der Focus nicht auf [1] ist .
Deine Schleife bewirkt nur das ich immer in [2] ankomme, wenn ich nicht in [1] bin. Also komme ich dann gar nicht mehr in [3] und [4]...
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
28.12.2008  
 




Sascha
Oliver
Haak
OK hast ja recht. (Schnellschuß gleich Kurzschluß!?!?!)

Solltest als erstes in Deiner Hauptroutine erst waitinput und dann Check_Element durchführen.
Weil sonst die Routine Check_Element den Focus sofort ermittelt.

Nach Übernahme des Datums hat das Edit Feld keinen Focus mehr und erhält diesen bei erneutem
betreten.

Besser, bei mir klappt es nun!

Gruß
Sascha
 
28.12.2008  
 




E.T.

Schnellschuß gleich Kurzschluß!?!?!



Das löst aber alles das Problem aus meinem Start-Posting nicht:
Im Interpreter funktioniert alles, wie ich es will, nur in der Exe nicht.
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
28.12.2008  
 




E.T.
WORKARROUND
Ich hab jetzt in meinem Prog einfach mal hinter das Aktivieren / Deaktivieren des Kalenders ein sleep 10 gesetzt, und siehe da, jetzt funzt es auch in der .exe.
In meinem obigen Bsp. hab ich das ganze bis sleep 2000 getrieben, ohne Wirkung (ggf. doch mal 10.000 testen). Ich vermute mal, im Interpreter läuft da einiges gewaltig langsamer ab, als in der .Exe >>> Moment (dämmer...), irgendwo hab da doch mal was gelesen, das im Interpr. irgendwas alle 30 Zeilen gecheckt wird und in der .Exe jede Zeile...nachschau (aber erst heut Mittag).

[offtopic]So, jetzt schnell noch nen Eimer Kaffee, dann will ein TraPo voller Post-Taschen im Holzäppelgebirge an die Zusteller verteilt werden (um diese Zeit meist mit Zoll-Kontrollen verbunden (bedingt durch die Nähe zur CZ, manchmal fahr ich direkt auf der Grenze lang) >> aber man gewöhnt sich an alles, und die Jungens (und manchmal auch hübsche Mädels) machen ja auch nur Ihren Job). Dann fix noch ne Runde schlafen...und schon kann der Tag am Mittag wieder beginnen [/offtopic]
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
29.12.2008  
 




Frank
Abbing
Alle 20 Zeilen.
Hm, ein Sleep 10 als Workaround halte ich immer für untauglich...
 
29.12.2008  
 




RGH
E.T.
Moment (dämmer...), irgendwo hab da doch mal was gelesen, das im Interpr. irgendwas alle 30 Zeilen gecheckt wird und in der .Exe jede Zeile...nachschau (aber erst heut Mittag).


Umgekehrt wird ein Schuh draus: Im Interpreter wird (außer im Fast-Mode) nach jeder Zeil der Messageloop aufgerufen, in der Runtime nach jeder 20. Zeile. Deine Prozeduren nutzen Messages, also muss auch diesen Gelegenheit gegeben werden anzukommen. In diesem Fall ist das Sleep(10) also eine korrekte Lösung. (In XProfan 11 könnte stattdessen auch das undokumentierte WaitInput 1 verwandt werden.)

Gruß
Roland

Nachtrag: Die einfachste Lösung habe ich dabei natürlich übersehen: Ein Repaint macht hier auch das, was der Name vermuten lässt, da auch dieser Befehl außerhalb des Fastmode einen Messageloop auslöst.
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
29.12.2008  
 




Frank
Abbing

Deine Prozeduren nutzen Messages, also muss auch diesen Gelegenheit gegeben werden anzukommen. In diesem Fall ist das Sleep(10) also eine korrekte Lösung.


SendMessage wartet, bis die Message auch angekommen ist. Sleep reagiert bisweilen unerwartet im Zusammenhang mit Messages, darum verwende ich in solchen Fällen:
KompilierenMarkierenSeparieren
 
29.12.2008  
 




RGH
Frank Abbing

Frank Abbing
Deine Prozeduren nutzen Messages, also muss auch diesen Gelegenheit gegeben werden anzukommen. In diesem Fall ist das Sleep(10) also eine korrekte Lösung.


SendMessage wartet, bis die Message auch angekommen ist. Sleep reagiert bisweilen unerwartet im Zusammenhang mit Messages, darum verwende ich in solchen Fällen:
KompilierenMarkierenSeparieren


... was dem erwähnten Waitinput 1 entspricht.

Ja, SendMessage wartet, im Gegensatz zu PostMessage, bis die Message angekommen ist. Aber manche Message löst nach Quittierung weitere Messages aus, die etwa zum Neuzeichnen von Controls aufrufen. Und die warten dann auf den nächsten Messageloop.

Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
29.12.2008  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.874 Betrachtungen

Unbenanntvor 0 min.
Andre Rohland13.06.2019
Jens-Arne Reumschüssel30.12.2018
Jörg Sellmeyer15.05.2018
rquindt24.01.2018
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

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