Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers? (https://www.delphipraxis.net/181618-vcl-styles-problem-wie-kriege-ich-das-edit-handle-eines-datetimepickers.html)

TiGü 29. Aug 2014 10:47

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 (https://code.google.com/p/vcl-styles...imePickers.pas).

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:
TDateTimePickerStyleHookFix.WMPaint
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.

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;

Whookie 31. Aug 2014 08:58

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.

TiGü 31. Aug 2014 12:29

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.

Whookie 31. Aug 2014 16:18

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...

TiGü 31. Aug 2014 17:47

AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
 
Irgendein Tipp, auf welches Messages ich meine Aufmerksamkeit richten sollte?

TiGü 1. Sep 2014 08:31

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.

Whookie 1. Sep 2014 15:30

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...

TiGü 2. Sep 2014 10:54

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.

Whookie 2. Sep 2014 19:49

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:
   
    ...
    cHi := ColorToRGB(clHighlight);

    ABmp.Canvas.Pixels[0,0] := cHi;
    ABmp.SaveToFile('C:\temp\test.bmp');

    for x := 0 to ABmp.Width-1 do
Dann Programm starten, Minuten Stelle anklicken und Bitmap ansehen...

Ja, die paar Pixel sind schnell gescannt, schneller gings noch wenn du auf den Canvas verzichtest...

TiGü 3. Sep 2014 08:32

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.

Whookie 3. Sep 2014 23:09

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:

TiGü 4. Sep 2014 08:32

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.

TiGü 4. Sep 2014 13:46

AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
 
Ach, schau mal einer an, scheint gefixt zu sein:
http://qc.embarcadero.com/wc/qcmain.aspx?d=124908

Ist mir gerade beim Durchstöbern der Fixlist aufgefallen (http://edn.embarcadero.com/article/44049).
Gleich mal die Trial installieren und kontrollieren!

Whookie 4. Sep 2014 14:15

AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?
 
Da bin ich aber mal gespannt wie sie das umgesetzt haben!

TiGü 4. Sep 2014 15:47

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.

TiGü 4. Sep 2014 15:58

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).

TiGü 5. Sep 2014 15:27

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:
TDateTimePickerStyleHook.WMPaint(var Message : TMessage);
noch irgendetwas anders machen.

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 19:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz