Frage zum DateTime Control

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Frage zum DateTime Control

15 Oct 2013, 17:46

Hallo zusammen,

analog zum Thrad im anderen Forum http://www.autohotkey.com/board/topic/9 ... e-control/

die gleiche Frage hier:

Wenn ein Datetime Control die Formatierung dd.MM.yyyy HH:mm hat wäre es toll wenn beim eingeben selbstständig nach rechts gerückt wird.

Alibaba hatte schon diese Script gepostet:

Code: Select all

Gui, Add, DateTime, gChangeDateTime, dd.MM.yyyy HH:mm
Gui, Show, AutoSize
Return

ChangeDateTime:
Loop 10
{
	;Auswahl über Mausklicks herausfiltern
	If GetKeyState(A_Index - 1) or GetKeyState("Numpad" . A_Index - 1)
		Send {Right}
}
Return
Dies jedoch macht Probleme. Mal gehts mal gehts nicht. Es springt auch mal ganz wild.

Vielleicht habt ihr da eine bessere Lösung bzw. noch eine Idee dazu... Ich komm hier leider nicht weiter :(

MfG und vielen Dank!

fump
Last edited by fump2000 on 16 Oct 2013, 02:07, edited 1 time in total.
gregster
Posts: 9111
Joined: 30 Sep 2013, 06:48

Re: Frage zum DateTime Control

15 Oct 2013, 18:41

Hi Fump2000,
hm, ich kann dein Problem mit diesem Codeschnipsel hier nicht rekonstruieren. Macht dieser Schnipsel alleine schon Probleme oder in einem größeren Skript, das bspw. Timer oder Hotstrings enthält, die irgendwelche Send-Kommandos senden, die dazwischenfunken könnten?

Würde das so nicht überhaupt reichen?

Code: Select all

Gui, Add, DateTime, gChangeDateTime
Gui, Show, AutoSize
Return
ChangeDateTime:
        Send {Right}
Return
Aber das wird dein Problem wahrscheinlich nicht lösen... mehr Details wären hilfreich. Kannst du ein Skript posten, bei dem die Probleme tatsächlich auftreten? Oder hast du tatsächlich schon mit diesem kleinen Schnipsel Probleme?
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Frage zum DateTime Control

16 Oct 2013, 02:11

Der Schnipsel macht schon Probleme. Wenn du mit der formatierung in dd.MM.yyyy HH:mm versuchst durchgehend von dd an ein Datum dann eine Zeit einzugeben kommst du nicht auf die Minuten. Die werden bei mir übersprungen.

Wenn man erst am Monat was ändert und dann auf die Zeit klickt und da schreibt wird auch dann wirld gesprungen.

Es ist einfach nicht zuverlässig, aber ich denke das man sowas auch gar nicht 100%ig hinbekommt... man kann ja nicht genau abfragen wo in dem Control man gerade was eingibt. Oder?

MfG
fump
Alibaba
Posts: 480
Joined: 29 Sep 2013, 16:15
Location: Germany

Re: Frage zum DateTime Control

16 Oct 2013, 04:33

gregster wrote:Würde das so nicht überhaupt reichen?

Code: Select all

Gui, Add, DateTime, gChangeDateTime
Gui, Show, AutoSize
Return
ChangeDateTime:
        Send {Right}
Return
Nein, denn das gLabel wird leider auch bei einer Datumsänderung über die Maus angesprungen.
Wenn dann {Right} gesendet wird, springt das Control zum Reiter für den nächsten Monat, was dann für völliges Durcheinander sorgt.
Deshalb muss man eine möglichst zuverlässige Methode suchen, um diese Datumsänderung per MAusklick auszufiltern...

Die derzeitige Methode ist inkonsistent, weil sie von der Geschwindigkeit des PC's abhängt.
Nur wenn das Label rechtzeitig angesprungen wird, kann man den Mausklick registrieren...
"Nothing is quieter than a loaded gun." - Heinrich Heine
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Frage zum DateTime Control

16 Oct 2013, 05:17

Klingt kompliziert. Wenig flexibel das Control leider...
Alibaba
Posts: 480
Joined: 29 Sep 2013, 16:15
Location: Germany

Re: Frage zum DateTime Control

16 Oct 2013, 05:58

Ja. Das Problem ist, das keine der Infovariablen im gLabel Auskunft darüber gibt, auf welche Art und Weise das Datum geändert wurde.
Ich habe allerdings eine andere Idee für ein sicheres Workaround, ich werd es gleich posten, wenn ichs getestet habe.

Edit:
Ok, hier das Script:

Code: Select all

#InstallMouseHook
Gui, Add, DateTime, gChangeDateTime, dd.MM.yyyy HH:mm
Gui, Show, AutoSize
switch := 0
Return

ChangeDateTime:
	MouseGetPos, MX, MY
	;Aufruf während aktiver Maussteuerung ignorieren
	If (GetKeyState("LButton") or GetKeyState("RButton") or GetKeyState("WheelDown") or GetKeyState("WheelUp") or GetKeyState("Up") or GetKeyState("Down") or GetKeyState("Left") or GetKeyState("Right") or GetKeyState("PgUp") or GetKeyState("PgDn") or GetKeyState("Home") or GetKeyState("End") or GetKeyState("NumpadAdd") or GetKeyState("NumpadSub"))
		Return
	sleep, 50
	;Bei Datumsänderung testen, ob letzter Input die linke Maustaste war
	If !((Time_LastInput() = Time_Mouse))
	{
		MouseGetPos, NMX, NMY
		If (MX != NMX or MY != NMY)
			Return
		;ToolTip % MX . "`n" . NMX . "`n" . MY . "`n" . NMY . "`n" . Time_LastInput() . "`n" . Time_Mouse
		Send {Right} ;Ansonsten in nächstes Feld springen
	}
Return

~WheelUp::
~WheelDown::
~LButton UP::
	Time_Mouse := A_TickCount
Return
Time_LastInput()
{
	Return (A_TickCount - A_TimeIdle)
}
"Nothing is quieter than a loaded gun." - Heinrich Heine
just me
Posts: 9574
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Frage zum DateTime Control

16 Oct 2013, 09:52

Alternativlösung, nur unter XP getestet:

Code: Select all

#NoEnv
WM_KEYDOWN := 0x0100
WM_KEYUP   := 0x0101
Global HDT
Global DT_ProcessChange := True
Gui, Add, DateTime, gDateTimeChanged hwndHDT, dd.MM.yyyy HH:mm
Gui, Show, , DateTime
OnMessage(WM_KEYDOWN, "On_KeyDown")
OnMessage(WM_KEYUP, "On_KeyUp")
Return
; ======================================================================================================================
GuiClose:
ExitApp
; ======================================================================================================================
DateTimeChanged:
   ; http://msdn.microsoft.com/en-us/library/bb761765%28v=vs.85%29.aspx
   ; Der Monatskalender wir bei Bedarf jedesmal neu erzeugt. Wenn er nicht sichtbar ist, gibt es keinen und
   ; DTM_GETMONTHCAL liefert Null.
   SendMessage, 0x1008, 0, 0, , ahk_id %HDT% ; DTM_GETMONTHCAL = (DTM_FIRST + 8), DTM_FIRST = 0x1000
   If !(ErrorLevel) && (DT_ProcessChange)
      Send {Right}
Return
; ======================================================================================================================
On_KeyDown(WP, LP, M, H) {
   ; Die Tastenereignisse werden dem Control über das Elternfenster übermmittelt. Sie können deshalb per OnMessage
   ; ausgewertet werden, bevor sie im Control ankommen.
   ; VK_HOME, VK_END, VK_DOWN, VK_UP, VK_ADD, VK_SUBTRACT
   Static VK := {0x23: "", 0x24: "", 0x26: "", 0x28: "", 0x6B: "", 0x6D: ""}
   If (H = HDT) && VK.HasKey(WP)
      DT_ProcessChange := False
   Else
      DT_ProcessChange := True
}
; ======================================================================================================================
On_KeyUp() {
   DT_ProcessChange := True
}
Alibaba
Posts: 480
Joined: 29 Sep 2013, 16:15
Location: Germany

Re: Frage zum DateTime Control

16 Oct 2013, 13:49

just me's Lösung ist empfehlenswerter.
Messages sind eine ziemlich stabile Basis.
"Nothing is quieter than a loaded gun." - Heinrich Heine
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Frage zum DateTime Control

16 Oct 2013, 14:33

Wow, beides sehr interessant.

Danke Alibaba, dein Script funktioniert bisher einwandfrei. Vielen Dank dafür!

Just me, deins teste ich gleich morgen früh. Das mit den Messages find ich echt cool gemacht.
Woher bekommt man solche infos? Hieraus: http://msdn.microsoft.com/en-us/library ... 85%29.aspx werd ich leider nicht sehr schlau :(

MfG
fump
just me
Posts: 9574
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Frage zum DateTime Control

16 Oct 2013, 14:54

Hi fump,

ich bin jedesmal aufs Neue verwundert, wenn jemand ein "Common Control" verwenden will, dann aber sagt, ich möchte aber, dass es anders als "Common" reagiert. Genau das ist immer mit einigem Aufwand verbunden, und in diesem Fall würde ich denken, dass Alibabas Lösung genau so gut oder schlecht funktioniert, wie meine. Wenn Du mit den vorgefertigten Controls nicht leben kannst, ist es stets die beste Lösung, ein eigenes Control zu schreiben. Nur dann hast Du die volle Kontrolle über Alles, unabhängig von Microsoft und der versionsabhängigen Änderungen im Verhalten der "Common Controls". All diese Workarounds, die heute funktionieren, können schon mit Windows X.X scheitern.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Frage zum DateTime Control

16 Oct 2013, 15:41

Ich wäre sehr für ein Tutorial über das Thema.
Recommends AHK Studio
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Frage zum DateTime Control

16 Oct 2013, 16:55

Ich auch!!! Ein eigenes Control zu schreiben gerade bzgl. des DateTime Controls wäre total interessant. So hätte man viel mehr Möglichkeiten. Aber wie sowas funktioniert? Wie man da ansetzt? Wo man da anfängt? Keine Ahnung... Wahrscheinlich übersteigt es meinen Horizont. Aber vor etwa 10 Monaten hätte ich auch nicht gedacht, dass ich soweit bin wie jetzt. Dank euch :)
just me
Posts: 9574
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Frage zum DateTime Control

17 Oct 2013, 00:26

Na ja, das "Tutorial" steht ja schon im MSDN. Einfach eine mit den gewünschten Eigenschaften vorbelegte neue Controlklasse registrieren, einen eigenen Messagehandler schreiben und schon kannst Du mit CreateWindow/Ex() Dein eigenes Control erzeugen. ;)

Spaß beiseite! Ich finde es ja immer wieder interessant, etwas mehr aus den Common Controls herauszukitzeln, sonst würde ich mich ja nicht damit beschäftigen. Aber ich selbst habe von all dem Zeug einzig und allein den "alternativ eingefärbten ListView" produktiv verwendet. Man läuft halt immer Gefahr, dass sich Microsoft für seine Controls ein neues Verhalten ausdenkt, und dann die bisher rund laufenden Workarounds auf einmal nicht mehr (richtig) funktionieren. Diesem Risiko will ich mich in produktiven Skripten nicht aussetzen.

Abschließend muss ich noch gestehen, dass mich ein Mix aus gesundheitlichen Problemen und der aktuellen Entwicklung rund um AutoHotkey zuweilen etwas "knurrig" macht. Wenn sich dann jemand von Euch angemacht fühlt, denkt einfach: "Der braucht mal wieder ein Snickers".
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Frage zum DateTime Control

17 Oct 2013, 01:53

Tut mir leid zu hören, dass es Dir gesundheitlich nicht gut geht, ich wünsche dir auf jeden Fall gute Besserung!

Deine Lösung mit den Messages funktioniert einwandfrei, auch unter Windows 7. Vielen Dank dafür!
User avatar
Seidenweber
Posts: 17
Joined: 30 Sep 2013, 11:40

Re: Frage zum DateTime Control

18 Oct 2013, 08:39

just me wrote:Abschließend muss ich noch gestehen, dass mich ein Mix aus gesundheitlichen Problemen und der aktuellen Entwicklung rund um AutoHotkey zuweilen etwas "knurrig" macht. Wenn sich dann jemand von Euch angemacht fühlt, denkt einfach: "Der braucht mal wieder ein Snickers".
Ich habe das unter Win7 Pro x64 gestestet. Völlig genial und funktioniert einwandfrei.

Und lass dir nicht auf den Sack gehen. Weder von mir, noch von anderen.
Das Forum hier entwickelt sich prima.
Questions and answers are related to AHK 1.1.13.01 (x64) & Win 7 pro x64

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 55 guests