Editfeld Uhrzeit Format

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Editfeld Uhrzeit Format

Beitrag von Bernie110 »

Hallo Zusammen,

Sorry für die Frage, ich such mir schon seit Tagen nen Wolf finde aber leider nichts.

Ich möchte ein Edit Feld zur Eingabe einer Uhrzeit benutzen.

Das Format soll so aussehen und 24 Std berücksichtigen.
Im leeren Zustand soll es so aussehen. Der User soll keine andere Eingabe-Möglichkeit haben.
__ : __

Beispiel

08:00

Wäre für nen Tip echt dankbar .
Lg Bernie

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Editfeld Uhrzeit Format

Beitrag von wp_xyz »

Das sieht mir nach einem Fall für ein TMaskEdit aus. Trage als EditMask den String '00:00' ein, dann erscheint genau die Eingabemaske wie von dir gefordert. Die Uhrzeit 16:55 würde dann mit den Tasten '1', '6', '5', '5' eingegeben, ohne den Doppelpunkt. Es gäbe auch die Möglichkeit, '90:90' zu nehmen, damit wären jeweils die 10er Stellen optionar; allerdings muss man dafür die Pfeiltaste drücken, was ich unergonomisch finde.

Die '0' in der Eingabemaske erlaubt nur die Eingabe einer Ziffer an der entsprechenden Stelle, der Doppelpunkt wird durch den TimeSeparator der FormatSettings ersetzt (bei uns aber auch wieder ein Doppelpunkt). Allerdings gibt es m.E. keine Möglichkeit für die 1.Stelle der Stunden nur eine '0', '1' oder '2' und für die erste Stelle der Minuten nur eine '0'..'6' zuzulassen, sodass weiterhin fehlerhafte Uhrzeiten eingetippt werden können.

Siehe: https://wiki.freepascal.org/TMaskEdit

Alternative Zeiteingabe-Felder wären TTimeEdit (standardmäßig auf Palette "Misc") oder TDateTimePicker (Über "Package" > "Install/Uninstall Packages" nachzuinstallieren, Packages DateTimectrls und DateTimeCtrlsDsgn).

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Editfeld Uhrzeit Format

Beitrag von Winni »

Hallo!

Bei MaskEdit muss man dann auch kontrollieren, ob die Stunde >= 24 ist und die Minute >=60 - und dann meckern oder automatisch korrigieren.
Dann kann man alles auch gleich selbst machen.

Ich hab vor langer Zeit mal selbst ein TEdit als Time-Editor benutzt.
Die Edit-Componente heisst TimeEdit.

Code: Alles auswählen

 
procedure TForm5.FormCreate(Sender: TObject)
begin
TimeEdit.text := '00:00';
end;
 
function FillLeadingZeros(s: String; len: Integer) : string; inline;
begin
  while length(s) < len do s := '0'+s;
  result := s;
end;
 
 
 
// Time editor
procedure TForm5.TimeEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var p, iH, iMin, sel : Integer;
    s,h, min : string;
 
    procedure checkAndSet;
    begin
      if iMin >= 60 then begin iMin := 0; inc(iH); end;
      if iMin < 0 then begin iMin := 59; dec(iH); end;
      if iH > 23 then iH := 0;
      if iH < 0 then iH := 23;
      str(iH,H);
      str (iMin,min);
      H := FillLeadingZeros(H,2);
      Min := FillLeadingZeros(Min,2);
      TimeEdit.Text := h+':'+min;
      TimeEdit.SelStart := sel;
    end;
 
 
    procedure GetInts;
    begin
    h := copy (s,1,2);
    min := copy(s,4,2);
    iH := Str2Int(h);
    iMin := Str2Int(min);
    end;
 
begin
  if key in [VK_0..VK_9,VK_UP,VK_Down,VK_LEFT,VK_RIGHT,VK_END,VK_HOME,VK_RETURN, VK_TAB] then else key := 0;
  sel := TimeEdit.SelStart;
  s := TimeEdit.Text;
  if key in [VK_Up, VK_Down] then
    begin
    getInts;
    if  sel <=2  then // hours
      begin
      if key = VK_Up then Inc(iH) else dec(iH);
      end else // minutes
      begin
      if key = VK_Up then inc(iMin) else dec(iMin);
      end;
     checkAndSet;
    end; // up down
 
  if key in [Vk_0..VK_9] then
      begin
       p := sel+1;
       if (p>0) and (p<= length(s)) and (s[p] <> ':') then
          BEGIN
           s[p] := chr(key);
           key := 0;
           inc(sel);
           p := sel+1;
           if (p>0) and (p<= length(s)) and (s[p] = ':') then inc(sel);
           GetInts;
           checkAndSet;
          end;
      end;
end;
 


Der Anfangswert is 00:00 und nicht __:__ - sonst müsste man noch Einiges an Code hinzufügen!

Winni

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Editfeld Uhrzeit Format

Beitrag von m.fuchs »

Schau mal in der Kompoenentenpalette unter dem Tab Misc. Da liegt eine Komponente namens TTimeEdit. Wäre die etwas für dich?

Bild
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Bernie110
Beiträge: 120
Registriert: Mo 10. Feb 2020, 17:43

Re: Editfeld Uhrzeit Format

Beitrag von Bernie110 »

Hallo Ihr beiden & danke für eure Antworten.
Schau mir mal alles an. Wobei ich wohl mein Glück mal mit TTimeEdit versuchen werde. Wollte jetzt nicht das Rad neu erfinden :-)
Mal sehen was ich hierzu noch alles finde und ob bzw wie man damit Berechnungen anstellen kann.
Lg Bernie

Antworten