TStringGrid Ausnahme abfangen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

TStringGrid Ausnahme abfangen

Beitrag von Vbxler »

Ich erforsche gerade das TStringGrid, funktioniert auch schon recht gut.
Wenn ich aber eine Spalte mit maskierter Eingabe verwende und der User gibt nicht alles nach Plan ein, stürtzt das Programm ab.
Hier lege ich EditMask fest.

Code: Alles auswählen

procedure TfrmBearbeiten.sgTaetigkeitenGetEditMask(Sender: TObject; ACol, ARow: Integer; var Value: string);
begin
    if (ARow > 0) and (ACol = 3) then Value := '!##0,00;1;_';
end; 
Auch wenn die Maskierung : '!##0,00;1;0' ist und der User eine Stelle in der Mitte der Eingabe mit der Entfernentaste löscht,
dann stürtzt die Anwendung ab, da ich ein Leerzeichen in Value habe.
Habe auch schon in 'ValidateEntry' rumgespielt, abe ohne erfolg.

Frage: Wo und Wie kann ich diese Ausnahme am besten abfangen?

Danke


Vbxler
Vbxler
-------------------------

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TStringGrid Ausnahme abfangen

Beitrag von Michl »

Eine Möglichkeit wäre evtl so...

Code: Alles auswählen

procedure TForm1.StringGrid1GetEditMask(Sender: TObject; ACol, ARow: Integer;
  var Value: string);
begin
//  Value := '!##0,00;1;_';
  Value := '!###,##;1;_';
end;
 
procedure TForm1.StringGrid1ValidateEntry(sender: TObject; aCol, aRow: Integer;
  const OldValue: string; var NewValue: String);
var
  DummyFloat:Real;
begin
  if TryStrToFloat(NewValue,DummyFloat) then
    NewValue:=FormatFloat('#,##0.00',DummyFloat)
  else
    NewValue:='0,00';
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: TStringGrid Ausnahme abfangen

Beitrag von Vbxler »

Vielen Dank für Deine Hilfe!!!

Das ist ein tolle Lösung, hat mir sehr geholfen.
Ich habe es ein wenig adaptiert und funktioniert bestens.

Code: Alles auswählen

    //Nur Spalte 4+5 überwachen
    if (ARow > 0) and ((ACol = 4) or (ACol = 5))then
        begin
            if TryStrToFloat(NewValue,DummyFloat) then
                begin
                    NewValue:=FormatFloat('#,##0.00',DummyFloat);
 
                    //wurde der Wert geändert?
                    if (OldValue <> NewValue) then m_DatenGeaendert := True;
                end
            else
                begin
                    NewValue:= OldValue;
                    Beep;
                end;
        end;    
Vbxler
Vbxler
-------------------------

Antworten