![]() |
VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich versuche seit geraumer Zeit den Style-Hook für den TDateTimePicker vom VCL Styles Utils Project am laufen zu kriegen ( ![]() Obwohl der Rodrigo einen verdammt guten Job macht, ist sein Style-Hook schon immer nicht ganz fehlerfrei gewesen. Es wird zwar nach dem Registrieren des Styles im initialization-Teil fast alles gestylt, aber man hat keine Selektionsfarbe im internen Edit-Feld für den gerade aktiven Teil (Tag, Monat, Stunde,...). Inzwischen konnte ich im
Delphi-Quellcode:
zwar den gesamten Text des aktiven DateTimePickers fokussiert zeichnen (siehe Projekt im Anhang), aber ich weiß nicht so richtig, wie ich nur den gerade aktiven Textteil des gesamten Strings einfärbe.
TDateTimePickerStyleHookFix.WMPaint
Oder besser gesagt, wie erhalte den gerade aktiven Teil des DateTimePickers, den man mit den Pfeiltasten oder den internen TUpDown verändern kann? Ich habe es mit folgenden Code versucht, aber das Handle des Edit-Feldes bleibt Null (das Handle des Updowns wiederum hat einen Wert ungleich null). Vielleicht hat jemand eine Idee oder einen anderen Ansatz? Anbei ein XE3-Testprojekt mit allen notwendigen Dateien. Es gibt im Hauptformular vier DateTimePicker. Je zwei gestylt und ungestylt.
Delphi-Quellcode:
uses
Winapi.CommCtrl; function GetSelectionBegin(ADateTimePicker : TDateTimePicker) : Integer; var SelectionBegin : Integer; pdtpi: TDateTimePickerInfo; Size : TSize; begin FillChar(pdtpi, SizeOf(pdtpi), 0); pdtpi.cbSize := SizeOf(pdtpi); Winapi.CommCtrl.DateTime_GetDateTimePickerInfo(ADateTimePicker.Handle, pdtpi); // AAAAAh, warum geht das nicht? if pdtpi.hwndEdit <> 0 then begin SelectionBegin := 0; SendMessage(pdtpi.hwndEdit, EM_GETSEL, WPARAM(@SelectionBegin), 0); OutputDebugString(PWideChar(IntToStr(SelectionBegin))); Result := SelectionBegin; end; end; |
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
interesantes Problem :-D ... ich denke da ist einfach kein Edit. Ein:
Delphi-Quellcode:
SendMessage(ADateTimePicker.Handle, WM_GETTEXT, 400, LPARAM(@buf) );
in GetSelectionBegin() gibt stets den aktuellen Wert. |
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
Aber auch nur des gesamten Strings!!!
Ich brauche ja die Position des gerade geänderten Teilstrings. Also liefert ein "13:25:00" immer die Länge 8 zurück, egal ob ich jetzt die Stunden, Minuten oder Sekunden ändere. Auch ein EM_GETSEL liefert für ein DateTimePicker-Handle bei mir immer 0. |
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
wahrscheinlich beleibt dir nichts anderes übrig als dich da in die Messagebehandlung zu hängen und selber rauszufinden welcher Teil gerade "markiert" ist...
|
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
Irgendein Tipp, auf welches Messages ich meine Aufmerksamkeit richten sollte?
|
VCL-Styles-Problem: Wie erhalte ich die aktuelle Selektionsposition eines DTP?
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei noch ein Screenshot von meinen Problem!
Grün umrahmt ist die ungestylte Windowsvariante und im roten Rechteck meine aktuellen Bemühungen. Ich würde gerne den Threadtitel ändern, aber das scheint nach 24 Stunden nach dem Erstellen nicht mehr möglich zu sein. |
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
Liste der Anhänge anzeigen (Anzahl: 1)
..irgendwie kann ich bei den privaten Nachrichten nichts hochladen ... daher also hier:
Nicht schön aber funktioniert hoffentlich immer... |
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
Vielen vielen Dank!:thumb:
Das funktioniert ziemlich gut für die Zeitanzeige (DateTimePicker.Kind = dtkTime), aber ich habe jetzt den ganzen Vormittag verbracht herauszukriegen, warum bei er bei dtkDate nichts zeichnet. Irgendwie, warum auch immer, findet er bei selektiertem Datum keine Highlight-Color in der ersten For-Schleife und läuft halt bis I gleich Bitmap.Width. Verdammt, irgendwas ist immer...:evil: Wenn das funktionieren würde, wäre diese Lösung tragbar. So langsam ist das mit den Pixels bei den kleinen Größen der DateTimePicker ja nicht. |
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
Bei mir geht das mit dktTime schon. Eigentlich kann es nur an der Windows-Einstellung liegen (vielleicht ist die Randfarbe unglücklicherweise clHighlight, dann kannst noch 2 Pixel vom Rand starten....
Um das mal zu testen, mach am besten im ScanSelRect() folgendes:
Delphi-Quellcode:
Dann Programm starten, Minuten Stelle anklicken und Bitmap ansehen...... cHi := ColorToRGB(clHighlight); ABmp.Canvas.Pixels[0,0] := cHi; ABmp.SaveToFile('C:\temp\test.bmp'); for x := 0 to ABmp.Width-1 do Ja, die paar Pixel sind schnell gescannt, schneller gings noch wenn du auf den Canvas verzichtest... |
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
Liste der Anhänge anzeigen (Anzahl: 2)
Eine gute Idee mit dem Wegspeichern des gerade zu scannenden Bitmaps, leider bestätigen sich meine Befürchtungen.
Im Anhang der "Bilddump" jeweils für dtkDate und dtkTime. Wie ich bereits schrieb, ist für die Uhrzeit alles im Butter, nur wird nichts auf den Bitmap.Canvas gezeichnet im Fall
Delphi-Quellcode:
.
DateTimePicker.Kind = dtkDate
Ich werde noch ein bisschen hinterherdebuggen und dann entnervt und weinend aufgeben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz