Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:18 Uhr.
Seite 1 von 2  1 2      

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