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/)
-   -   Delphi DateTimePicker ReadOnly? (https://www.delphipraxis.net/164056-datetimepicker-readonly.html)

TUX_der_Pinguin 27. Okt 2011 09:25

DateTimePicker ReadOnly?
 
Hallo DPler,

ich habe ein DateTimePicker auf meinem Formular, welcher von einer Datenbank aus befüllt werden kann
ist in der Datenbank noch kein Eintrag dann kann der Anwender in dem DateTimePicker ein Datum wählen.

Wurde ein Datum aus der Datenbank in das Feld geladen so soll das Eingabefeld gesperrt sein, der
Anwender kann das Datum nicht mehr ändern.

Ich könnte das mit "TDateTimePicker.Enabled := False" lösen, jedoch ist ist das Eingabefeld dann
Grau. Gibt es nicht eine Möglichkeit wie bei einem TEdit "ReadOnly:=True" zu setzen?

RWarnecke 27. Okt 2011 09:39

AW: DateTimePicker ReadOnly?
 
Mir fallen dazu zwei Möglichkeiten ein :

1.) Die Komponente ableiten und wie ich es versucht habe in diesem Beitrag die Read Only Option selber zu implementieren.

2.) Ich habe gerade kein Delphi zur Hand, aber ich bin der Meinung, dass ich die DropDown-Auswahl deaktivieren kann und damit dann nur noch bewusst ein Datum eingeben kann. Zusätzlichzum Abschalten der DropDown-Auswahl würde ich dann noch jegliche Tastatureingabe über OnKeyPress oder OnKeyDown abfangen.

TUX_der_Pinguin 27. Okt 2011 10:03

AW: DateTimePicker ReadOnly?
 
Man kann die Einstellung DateMode von dmComboBox auf dmUpDown ändern dann hat man nur zwei kleine
Spinbuttons. Ob man dann aber wirklich alle Möglichkeiten händisch sperren kann die zu Eingaben im
dem Feld führen können bin ich mir nicht so sicher. Wäre relativ aufwändig.

Ich hatte einen Tipp gefunden wie man ein "leeres" DateTimePicker erzeugen kann (http://www.swissdelphicenter.ch/de/showcode.php?id=1227)

Dort wird im OnClick Ereignis direkt die Kalenderauswahl aufgerufen ohne das man mit der Tastatur in
das Eingabefeld gelangen kann (z.b. Tab). Meine Idee war es dort anzusetzen, ich habe nur keine Ahnnung ob das Möglich ist und wie.
Delphi-Quellcode:
procedure TForm1.DateTimePicker1Click(Sender: TObject);
begin
   if FDTMDateEmpty then
   begin
     DateTimePicker1.Perform(WM_KEYDOWN, VK_F4, 0);
     DateTimePicker1.Perform(WM_KEYUP, VK_F4, 0);
   end;
end;
Die Frage ist ob ich in dem OnClick Ereignis irgendwie selbiges unterdrücken kann um somit den Aufruf zu verhindern. :gruebel:

UliBru 27. Okt 2011 11:49

AW: DateTimePicker ReadOnly?
 
Setze doch die Komponente auf ein Panel. Wenn das Panel disabled wird, ist die Komponente read-only. Die Farbe bleibt erhalten.

TUX_der_Pinguin 27. Okt 2011 12:14

AW: DateTimePicker ReadOnly?
 
Zitat:

Zitat von UliBru (Beitrag 1132858)
Setze doch die Komponente auf ein Panel. Wenn das Panel disabled wird, ist die Komponente read-only. Die Farbe bleibt erhalten.

Das wäre eine Möglichkeit, zwar ziemlicher Pfusch aber wenn es scheinbar nicht anders geht.

Auf jedenfalls vielen Dank für die Tipps und Ideen.

ConnorMcLeod 27. Okt 2011 12:40

AW: DateTimePicker ReadOnly?
 
Zwei witzige Lösungen von experts-exchange:
-) change DragMode property of DateTimePicker to dmAutomatic;
-)
Delphi-Quellcode:
procedure TForm1.DateTimePicker1DropDown(Sender: TObject);
begin
  PostMessage(GetFocus(), WM_SYSKEYDOWN, VK_MENU, 0);
  PostMessage(GetFocus(), WM_SYSKEYDOWN, VK_UP, 0);
  PostMessage(GetFocus(), WM_SYSKEYUP, VK_UP, 0);
  PostMessage(GetFocus(), WM_KEYUP, VK_MENU, 0);
end;

procedure TForm1.DateTimePicker1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Key := 0;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 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