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/)
-   -   Blank im Edit-Control für Integer/Float-Werte (https://www.delphipraxis.net/61045-blank-im-edit-control-fuer-integer-float-werte.html)

Abrand 16. Jan 2006 13:34


Blank im Edit-Control für Integer/Float-Werte
 
Hallo,

das ist meine erste Frage hier...

Ich schaffe es nicht in Edit-Controls ein Blank (nicht 0) für
Integer- oder Float-Werte einzugeben bzw. anzuzeigen.
Zusätzlich soll der Wert auch noch formatiert sein (Tausenderpunkt und
Dezimalstellen, maximale Länge).

Ich habe schom mit RxCalcEdit und JvCalcEdit herumexperimentiert,
aber ich schaffe nur korrekte Formatierungen. Ein Blank kann ich immer
nicht anzeigen bzw. eingeben.

Kann mir jemand helfen? :gruebel:

ichbins 16. Jan 2006 14:04

Re: Blank im Edit-Control für Integer/Float-Werte
 
Hallo, willkommen in der Delphi-Praxis!


was meinst du mit Blank? Ein Leerzeichen? Wo liegt denn dann das Problem?

wenn du eine Edit-Komponente mit Sonderfunktionen schreiben willst, kannst du dich an diesem Code orientieren (Edit zum Eingeben eines Geldbetrags):

Delphi-Quellcode:
unit MyMoneyEdit;

interface

uses
  SysUtils, Classes, Controls, StdCtrls;

type
  TMoneyEdit = class(TEdit)
  private
    { Private-Deklarationen }
    reactonc:boolean;
  protected
    { Protected-Deklarationen }
    procedure setmoney(money:real);
    function getmoney:real;
  public
    { Public-Deklarationen }
  published
    { Published-Deklarationen }
    procedure keypress(var key:char); override;
    property money:real read getmoney write setmoney;
    procedure change; override;
    constructor create(aOwner:tcomponent); override;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiele', [TMoneyEdit]);
end;

constructor tmoneyedit.create(aOwner:tcomponent);
begin
  inherited create(aOwner);
  reactonc:=true;
end;

procedure tmoneyedit.setmoney(money:real);
begin
  if not (((text='') or (text='-')) and (money=0)) then
    self.text:=floattostr(money);
end;

function tmoneyedit.getmoney:real;
begin
  if (text='') or (text='-') then
    result:=0
  else
    try
      result:=strtofloat(text);
    except
      result:=0;
      text:='';
    end;
end;

procedure tmoneyedit.Change;
var
  curpos,i,commavalues:integer;
  commaexists:boolean;
  s:string;
begin
  if not reactonc then
    exit;
  reactonc:=false;
  curpos:=self.GetSelStart;
  if not((text='') or (text='-') or (text[length(text)]=',')) then
  begin
    commaexists:=false;
    commavalues:=0;
    for i:=1 to length(text) do
    begin
      if commaexists then
        inc(commavalues);
      if commavalues>2 then
      begin
        s:=text;
        delete(s,i,length(text));
        text:=s;
        break;
      end;
      if text[i]=',' then
      begin
        if commaexists then
        begin
          s:=text;
          delete(s,i,length(text));
          text:=s;
          break;
        end;
        commaexists:=true;
      end;
    end;
  end;
  setselstart(curpos);
  reactonc:=true;
  inherited change;
end;

procedure tmoneyedit.KeyPress(var key:char);
begin
  if Key = '.' then Key := ',';
  If not (Key in [#43..#45, #48..#57, #8, #13]) then
    Key := #0;
  If (Pos(',', Text) <> 0) then
    if Key = ',' then
      Key := #0;
  inherited keypress(key);
end;

end.

Abrand 16. Jan 2006 14:16

Re: Blank im Edit-Control für Integer/Float-Werte
 
Mit Blank meine ich ein Leerzeichen.

Ich schaffe bei den mir bekannten Controls immer nur eine
vernünftige Formatierung aber nie die Eingabe/Anzeige
eines Leerzeichens, wenn kein Wert vorhanden ist.
Ich muss unterscheiden zwischen 0 und Leerzeichen.

Die Eigenschaften wie
DisplayFormat:='0.00'
oder
ZeroIsEmpty:=True
oder
MaskEdit:='0.00'
helfen mir da nicht weiter.

marabu 16. Jan 2006 15:16

Re: Blank im Edit-Control für Integer/Float-Werte
 
Hallo Alex,

die Geschichte mit dem Leerzeichen ist mysteriös. Mir scheint, du suchst nach einer Möglichkeit die Eingabe von Festkommazahlen sicher zu gestalten, wobei eine Eingabe auch ganz unterbleiben kann. Da gibt es mehrere Strategien:
  • Unbeschränkte Eingabe und spätere Prüfung
  • Unbeschränkte Eingabe und visuelle Rückmeldung
  • Eingabebeschränkung
Der erste Ansatz gefällt wohl niemandem so recht. Michael hat den letzten Fall aufgegriffen, wenn auch anders als du mit der Edit-Maske. Ich erwärme mich mehr für den zweiten Fall, der quasi einen Kompromiss darstellt. Wenn du magst ziehe eine TEdit-Komponente auf eine Form und trage in den Ereignissen OnChange(), OnEnter() und OnExit() die folgenden Code-Zeilen ein um zu sehen was ich meine:

Delphi-Quellcode:
procedure TDemoForm.EditChange(Sender: TObject);
var
  fTest: Extended;
begin
  with Sender as TEdit do
  if Focused then
  begin
    if (Text = '') or TryStrToFloat(Text, fTest) then
    begin
      Color := clWhite;
      Font.Color := clBlack;
    end else
    begin
      Color := clRed;
      Font.Color := clWhite;
    end;
  end;
end;

procedure TDemoForm.EditExit(Sender: TObject);
begin
  with Sender as TEdit do
    Text := Format('%.2n', [StrToFloat(Text)]);
end;

procedure TDemoForm.EditEnter(Sender: TObject);
begin
  with Sender as TEdit do
  begin
    Text := StringReplace(Text, ThousandSeparator, '', []);
    SelectAll;
  end;
end;
Freundliche Grüße vom marabu

Abrand 16. Jan 2006 16:06

Re: Blank im Edit-Control für Integer/Float-Werte
 
Hallo marabu,

vielen Dank für deine Antwort, du hast mein Problem richtig erkannt.
Ich habe es gleich ausprobiert und es hat funktioniert bis auf
das Problem, dass ich kein Leerzeichen ohne Fehlermeldung eingeben konnte.

Dazu musste ich die Exit-Routine noch erweitern:

Delphi-Quellcode:

procedure TDemoForm.EditExit(Sender: TObject);
var
  fTest: Extended;
begin
  with Sender as TEdit do
  begin
    if (trim(text)<>'')
    then
    begin
      if (TryStrToFloat(Text, fTest))
      then Text := Format('%.2n', [StrToFloat(Text)])
      else ActiveControl:=TEdit(sender);
    end;
  end;
end;
Vielen Dank
Alex


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