AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Lazarus (IDE) Numerische Eingabe in Stinggrid validieren
Thema durchsuchen
Ansicht
Themen-Optionen

Numerische Eingabe in Stinggrid validieren

Ein Thema von Oniessen · begonnen am 17. Okt 2014 · letzter Beitrag vom 18. Okt 2014
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: Numerische Eingabe in Stinggrid validieren

  Alt 18. Okt 2014, 09:09
Per CopyPaste kannst du allerdings noch immer irgendwas in die Zelle bekommen.

Und wenn du in der Zelle -12 stehen hast und vor das - gehst, dann kannst du wieder - drücken und bekommst --12 .

Und diese Eingabe 12,,,,,45 ist auch möglich
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (18. Okt 2014 um 09:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: Numerische Eingabe in Stinggrid validieren

  Alt 18. Okt 2014, 10:09
Die einzige zuverlässige Art ist die Verwendung eines Memento und einer Prüfung, ob der aktuelle Wert den Anforderungen entspricht.

Wenn ja, dann wird der aktuelle Wert in das Memento übernommen, wenn nein, dann wird der Wert aus dem Memento wiederhergestellt.
Delphi-Quellcode:
unit EditGuardian;

interface

uses
  System.Generics.Collections,
  System.Classes, System.SysUtils,
  Vcl.StdCtrls;

type
  TEditMemento = class( TPersistent )
  private
    FSelStart: Integer;
    FSelLength: Integer;
    FText: string;
    procedure AssignFromCustomEdit( ASource: TCustomEdit );
    procedure AssignToCustomEdit( ADest: TCustomEdit );
    procedure AssignToEditMemento( ADest: TEditMemento );
  protected
    procedure AssignTo( Dest: TPersistent ); override;
  public
    procedure Assign( Source: TPersistent ); override;
  end;

  TEditGuardian = class
  private
    FEdit: TCustomEdit;
    FMemento: TEditMemento;
    FValidator: TPredicate<string>;
  public
    constructor Create( AEdit: TCustomEdit; AValidator: TPredicate<string> );
    destructor Destroy; override;

    procedure Validate;
  end;

implementation

{ TEditMemento }

procedure TEditMemento.Assign( Source: TPersistent );
begin
  if Source is TCustomEdit
  then
    AssignFromCustomEdit( Source as TCustomEdit )
  else
    inherited;
end;

procedure TEditMemento.AssignFromCustomEdit( ASource: TCustomEdit );
begin
  Self.FText := ASource.Text;
  Self.FSelStart := ASource.SelStart;
  Self.FSelLength := ASource.SelLength;
end;

procedure TEditMemento.AssignTo( Dest: TPersistent );
begin
  if Dest is TCustomEdit
  then
    AssignToCustomEdit( Dest as TCustomEdit )
  else if Dest is TEditMemento
  then
    AssignToEditMemento( Dest as TEditMemento )
  else
    inherited;
end;

procedure TEditMemento.AssignToCustomEdit( ADest: TCustomEdit );
begin
  ADest.Text := Self.FText;
  ADest.SelStart := Self.FSelStart;
  ADest.SelLength := Self.FSelLength;
end;

procedure TEditMemento.AssignToEditMemento( ADest: TEditMemento );
begin
  ADest.FText := Self.FText;
  ADest.FSelStart := Self.FSelStart;
  ADest.FSelLength := Self.FSelLength;
end;

{ TEditGuardian }

constructor TEditGuardian.Create( AEdit: TCustomEdit; AValidator: TPredicate<string> );
begin
  inherited Create;

  if not Assigned( AEdit )
  then
    raise EArgumentNilException.Create( 'AEdit' );
  if not Assigned( AValidator )
  then
    raise EArgumentNilException.Create( 'AValidator' );

  FEdit := AEdit;
  FMemento := TEditMemento.Create;
  FValidator := AValidator;
  Validate;
end;

destructor TEditGuardian.Destroy;
begin
  FMemento.Free;
  inherited;
end;

procedure TEditGuardian.Validate;
begin
  if ( FEdit.Text = '' ) or FValidator( FEdit.Text )
  then
    FMemento.Assign( FEdit )
  else
    FEdit.Assign( FMemento );
end;

end.
Und hier ein kleines Beispiel mit 3 Edits (Integer, Float, Frei)
Delphi-Quellcode:
unit FormMain;

interface

uses

  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes, System.Generics.Collections,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.AppEvnts,
  EditGuardian;

type
  TMainForm = class( TForm )
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    ApplicationEvents1: TApplicationEvents;
    procedure ApplicationEvents1Idle( Sender: TObject; var Done: Boolean );
  private
    FGuardians: TList<TEditGuardian>;
    procedure CheckGuardians;
  public
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.AfterConstruction;
begin
  inherited;
  FGuardians := TObjectList<TEditGuardian>.Create;

  // Integer Edit
  FGuardians.Add( TEditGuardian.Create( Edit1,
        function( AValue: string ): Boolean
    var
      LValue: Integer;
    begin
      Result := TryStrToInt( AValue, LValue );
    end ) );

  // FloatEdit
  FGuardians.Add( TEditGuardian.Create( Edit2,
    function( AValue: string ): Boolean
    var
      LValue: Extended;
    begin
      Result := TryStrToFloat( AValue, LValue );
    end ) );

end;

procedure TMainForm.ApplicationEvents1Idle( Sender: TObject; var Done: Boolean );
begin
  CheckGuardians;
end;

procedure TMainForm.BeforeDestruction;
begin
  inherited;
  FGuardians.Free;
end;

procedure TMainForm.CheckGuardians;
var
  LGuardian: TEditGuardian;
begin
  for LGuardian in FGuardians do
    LGuardian.Validate;
end;

end.
Und wie man sieht ist es völlig unerheblich welche Taste auch immer gedrückt wurde, oder auf welchem Weg der Wert es in das Edit-Control geschafft haben könnte. Passt der Wert nicht, wird einfach der alte Zustand wiederhergestellt.

Drops gelutscht

PS Wer jetzt anmerken möchte, dass man dort keine negativen Zahlen eingeben kann, weil ein einfaches - einfach geschluckt wird, der passt entweder den Validator an, oder viel besser erstellt sich eine eigene TryStrToMyValue und berücksichtigt dort diese Eingabe und nimmt diese in den Validator mit auf. Denn irgendwann will man den Wert aus dem Edit wieder auslesen und dann benutzt man einfach diesen TryStrToMyValue .
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (18. Okt 2014 um 10:25 Uhr)
  Mit Zitat antworten Zitat
Oniessen

Registriert seit: 17. Feb 2010
18 Beiträge
 
#13

AW: Numerische Eingabe in Stinggrid validieren

  Alt 18. Okt 2014, 13:12
Per CopyPaste kannst du allerdings noch immer irgendwas in die Zelle bekommen.

Und wenn du in der Zelle -12 stehen hast und vor das - gehst, dann kannst du wieder - drücken und bekommst --12 .

Und diese Eingabe 12,,,,,45 ist auch möglich
Also bei mir geht das nicht! Ich kann in jede Zelle immer nur genau 1(EIN) '-' und 1(EIN) ',' oder'.' eingeben! Das wird ja über die (Pos(Key, CellText) > 0 ( also wenn schon mehr als 0 da sind) abgefangen...

Mit dem CopyPaste hast du allerdings recht!

Gruß, Oliver
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 00: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