Eingabe von Zahlen in eine StringGrid-Komponente
Zellen einer TStringGrid-Komponente mit zugewiesenen Masken entsprechen TMaskEdit-Komponenten.
Damit programmiert sich die Eingabe bzw. Edition von Dezimalzahlen in TStringGrid im Prinzip wie in TMaskEdit-Feldern. Da die Eigenschaften MaxLength, SelLength und Tag sowie der OnExit-Event für die einzelnenZellen fehlen ist folgendes zu beachten:
· Ein Feld des StringGrids ist nach Auswahl einer neuen Zelle und beim Verlassen des Gitter zu formatieren, d.h. mit den Ereignissen OnSelectCell und OnExit.
· Die Eigenschaft Text der TMaskEdit-Komponente ist durch Cells[Col, Row] zu ersetzen.
Nachdem das Gitter den Focus erhalten hat, bewegt man sich mit Tab zeilenweise durch alle Zellen. Mit den Cursortasten kann man andere Wege gehen. Alle Zellen werden automatisch selektiert Die Eingabe eines neuen Wertes kann sofort begonnen werden und folgt der natürlichen Reihenfolge der Zeichen, wobei das Komma für den Dezimalpunkt verwendet werden kann.
Zur Edition des im Feld stehenden Wertes drückt man F2. Im Edit-Zustand bewegen die horizontale Kursortasten wie gewohnt den Textcursor. Am Feldende wechselt man mit den Kursortasten Links und Rechts ins Nachbarfeld.
Delphi-Quellcode:
//*** Edition der Matrix im Stringgrid ***********************************
// Maske für die Felder setzen
procedure TForm1.StringGridGetEditMask(Sender: TObject; ACol,
ARow: Integer; var Value: String);
begin
Value:= Fmt
end;
procedure TForm1.StringGridKeyPress(Sender: TObject; var Key: Char);
begin
if Key=',' then Key:= '.'; // Komma zur Eingabe Dezimalpunkt zulassen
if Key='+' then Key:= char(0); // Kein '+' als Vorzeichen
with StringGrid1 do // Kein zweites Vorzeichen
if (Key='-') and (Pos('-', Cells[Col, Row])>0) and not isFirst then Key:= char(0);
if Key=#9 then isFirst:= true else isFirst:= false;
end;
procedure TForm1.Korr; // Korrektur beim Verlassen der Zelle
var
s: string;
w: extended;
k: integer;
begin
with StringGrid1 do begin
s:= Trim(Cells[Col, Row]); k:= Pos(' ', s); // Leerzeichen entfernen
while k>0 do begin Delete(s, k, 1); k:= Pos(' ', s) end;
// Vorzeichenbehandlung: '-' vor erste Ziffer
k:= Pos('-', s); if k>1 then begin Delete(s, k, 1); s:= '-' + s end;
if s='' then w:=0 // 0 mit leerem Eingabefeld
else w:= StrToFloat(s); // wandeln
Str(w:Len:Dez, s); // formatieren
Cells[Col, Row]:= s end // und in Celle zurückschreiben
end;
// Neue Zelle selektiert
procedure TForm1.StringGridSelectCell(Sender: TObject; Col, Row: Longint;
var CanSelect: Boolean);
begin
with Sender as TStringGrid do Korr; // Verlassene Zelle korregieren
end;
procedure TForm1.StringGridExit(Sender: TObject); // StringGrid verlassen
begin
with Sender as TStringGrid do Korr; // Verlassene Zelle korregieren
end;
Im StringGrid sind die Options
[goFixedVertLine,goFixedHorzLine,goVertLine,goHorzL ine,goEditing,goTabs,goAlwaysShowEditor]
und ‘Courier New’ als Font gesetzt.
Als Beispiel für die Verwendung: Lineare Gleichungssysteme nach Gauß.