AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?

VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?

Ein Thema von TiGü · begonnen am 29. Aug 2014 · letzter Beitrag vom 5. Sep 2014
Antwort Antwort
Seite 1 von 2  1 2   
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#1

VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?

  Alt 29. Aug 2014, 11:47
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 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;
Angehängte Dateien
Dateityp: zip StyleTestForm.zip (6,6 KB, 6x aufgerufen)

Geändert von TiGü (29. Aug 2014 um 12:14 Uhr)
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
441 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?

  Alt 31. Aug 2014, 09:58
interesantes Problem ... ich denke da ist einfach kein Edit. Ein:

  SendMessage(ADateTimePicker.Handle, WM_GETTEXT, 400, LPARAM(@buf) );

in GetSelectionBegin() gibt stets den aktuellen Wert.
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?

  Alt 31. Aug 2014, 13:29
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.
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
441 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?

  Alt 31. Aug 2014, 17:18
wahrscheinlich beleibt dir nichts anderes übrig als dich da in die Messagebehandlung zu hängen und selber rauszufinden welcher Teil gerade "markiert" ist...
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?

  Alt 31. Aug 2014, 18:47
Irgendein Tipp, auf welches Messages ich meine Aufmerksamkeit richten sollte?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#6

VCL-Styles-Problem: Wie erhalte ich die aktuelle Selektionsposition eines DTP?

  Alt 1. Sep 2014, 09:31
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.
Miniaturansicht angehängter Grafiken
datetimepicker.png  
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
441 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?

  Alt 1. Sep 2014, 16:30
..irgendwie kann ich bei den privaten Nachrichten nichts hochladen ... daher also hier:
Nicht schön aber funktioniert hoffentlich immer...
Angehängte Dateien
Dateityp: pas HolzHammer.Vcl.Styles.DateTimePickers.pas (11,5 KB, 9x aufgerufen)
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?

  Alt 2. Sep 2014, 11:54
Vielen vielen Dank!

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

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.
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
441 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?

  Alt 2. Sep 2014, 20:49
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...
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: VCL-Styles-Problem: Wie kriege ich das Edit-Handle eines DateTimePickers?

  Alt 3. Sep 2014, 09:32
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 DateTimePicker.Kind = dtkDate .

Ich werde noch ein bisschen hinterherdebuggen und dann entnervt und weinend aufgeben.
Angehängte Grafiken
Dateityp: jpg dtkDate.jpg (1,2 KB, 9x aufgerufen)
Dateityp: jpg dtkTime.jpg (1,7 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 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