![]() |
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. |
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
Sorry, habe ich im Eifer des Gefechts übersehen, du hast leider recht.
Laut MSDN ist ja WPARAM bei WM_PAINT nicht verwendet und etwas weiter unten sthet dann [Zitat=MSDN]For some common controls, the default WM_PAINT message processing checks the wParam parameter. If wParam is non-NULL, the control assumes that the value is an HDC and paints using that device context.[/Zitat] Damit muss man wohl davon ausgehen, dass das für dtkTime so umgesetzt wurde aber für dtkDate ein eigener DC erzeugt wird und dann landet die Ausgabe nicht mehr in der Bitmap...:cry: |
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
Es...ist...zum...Kotzen! :kotz:
Wie kann man denn so fricklig eine wichtige Komponente im Framework umsetzen? Möge dem verantwortlichen Entwickler bei Microsoft der Blitz beim Scheißen treffen. |
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
Ach, schau mal einer an, scheint gefixt zu sein:
![]() Ist mir gerade beim Durchstöbern der Fixlist aufgefallen ( ![]() Gleich mal die Trial installieren und kontrollieren! |
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
Da bin ich aber mal gespannt wie sie das umgesetzt haben!
|
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
Liste der Anhänge anzeigen (Anzahl: 2)
Boah, das sind ja Schweinepriester.
Man muss glatt den Hut ziehen, vor soviel Cochones. Anbei die Test-App mit XE7 gebuildet. Die nehmen einfach, sobald das Control den Focus hat, den Wert seClients aus den StyleElements, so dass es aussieht wie unter Windows. |
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
Liste der Anhänge anzeigen (Anzahl: 1)
Na ja, wenn man die Vcl.Style.Hooks vom Rodrigo mit ins Projekt nimmt, sieht das auch einigermaßen aus (siehe Screenshot).
|
AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
Funktioniert in XE3 leider doch nicht so einfach wie gedacht, die müssen im originalen Style in
Delphi-Quellcode:
noch irgendetwas anders machen.
TDateTimePickerStyleHook.WMPaint(var Message : TMessage);
Könnte sich bitte jemand erbarmen und mir den Quelltext von Vcl.ComCtrls.TDateTimePickerStyleHook aus seiner XE7 Installation schicken? :angel2: Mehrere XE7 Lizenzen zu kaufen und das aktuelle Projekt kurz vor einen wichtigen Release umzustellen, ist leider keine Option für uns. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 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