| Autor |
Beitrag |
Miri
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Di 06.12.05 13:18
Und schon wieder ein Problem mit meinem Stringgrid...
Jetzt würde ich gerne kontrollieren, ob der User etwas geändert hat.
Ich hab eine Spalte, in die J/N eingetragen werden soll, will die Eingabe aber kontrollieren, damit nachher nichts anderes drinsteht. Hab aber irgendwie noch nichts gefunden, was so funktioniert wie OnChange, o.ä.
Hat jemand nen Tip für mich?
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Di 06.12.05 13:28
Hallo,
das StringGrid hat die Ereignisse OnGetText und OnSetText. Wenn eines dieser Ereignisse eintritt, dann hat der Benutzer etwas in die Zelle eingegeben.
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
Miri 
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Di 06.12.05 13:45
Habe beides ausprobiert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TFRM_main.STG_mainGetEditText(Sender: TObject; ACol, ARow: Integer; var Value: String); begin if ACol = 9 then if not ((Value = 'Y') or (Value = 'y') or (Value = 'N') or (Value = 'n')) then begin ShowMessage('Bitte geben Sie einen gültigen Wert ein: Y/N'); Value := 'N'; end; end; |
SetEditText sieht prinzipiell genauso aus, nur ist Value da statt einer Variable eine Konstante.
GetEditText läuft in eine Endlosschleife, sobald ich in die Zelle 'nnn' oä reinschreibe, und SetEditText kommt mit den kleinen Buchstaben nicht zurecht. Was mach ich denn da falsch?!
Moderiert von raziel: Delphi-Tags hinzugefügt.
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Di 06.12.05 15:27
Hallo,
bei dem Code wird nur 'Y','y','N','n' zugelassen,
der Eintrag erfolgt in Großschreibung.
Es kann auch nur ein Zeichen eingegeben werden.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); begin with StringGrid1 do if (ACol = 9) then if (Length(Value) = 1) and (Value[1] in ['Y','y','N','n']) then Cells[ACol,ARow] := UpperCase(Value) else if Value <> '' then begin ShowMessage('Bitte geben Sie einen gültigen Wert ein: Y/N'); Cells[ACol,ARow] := ''; EditorMode := True; end; end; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Miri 
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Mi 07.12.05 09:21
Vielen vielen Dank, Lannes!
Das klappt soweit..
Etwas stört mich aber noch, und zwar dass die Zelle auch leer sein kann.
Klar kann ich einfach das
if Value <> '' then
rauslassen. Aber wenn ich das mache, dann kommt die Meldung "Geben Sie einen gültigen Wert an" auch, wenn ich nur den Buchstaben, der drinsteht, entferne um nen neuen einzugeben, oder wenn ich ihn überschreibe (also auch, wenn Y drinsteht und ich wenns markiert ist N drücke).
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mi 07.12.05 09:47
Hallo,
versteh ich jetzt nicht so richtig
was soll denn erfolgen:
Falscheingabe, dann > ?
Keine Eingabe, dann > ?
Ist eine Inhalt vorgegeben? Standard = 'N' ?
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Miri 
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Mi 07.12.05 09:51
Standardmäßig pack ich beim Füllen des Stringgrids da 'N' rein.
Anhand dessen, was da drinsteht, wird nachher was ausgeführt, wenn da nichts drinsteht, läuft also was falsch, daher sollte das nicht möglich sein.
Ich habs dann bis jetzt so gelöst, dass, bevor ich das Auswerte, prüfe, ob was drinsteht. Aber ich hätte mir das halt so vorgestellt, dass ich etwas da reinschreiben kann und sobald ich das bestätige (z.B. Enter drücken oder die Zelle mit Maus verlassen), geprüft wird, ob und was drinsteht.
Jetzt verständlich?!
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mi 07.12.05 19:32
Hallo,
habs verstanden
Auf einen leeren String kannst Du im OnSetEditText nicht reagieren,
weil beim überschreiben von z.B. 'N' mit 'Y' OnSetEditText zweimal ausgelöst wird.
Das ersten mal ist Value dann '' und Du bekommst die Meldung,
obwohl ja etwas Richtiges eingetragen wird/wurde.
Also muss auf das Verlassen der Zelle oder des Stringgrids reagiert werden.
Zelle verlassen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin if (StringGrid1.Col = 3) and (StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row] = '') then begin showmessage('Bitte geben Sie einen gültigen Wert ein: Y/N'); Canselect := False; end; end; |
Grid verlassen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.StringGrid1Exit(Sender: TObject); begin if (StringGrid1.Col = 3) and (StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row] = '') then begin showmessage('Bitte geben Sie einen gültigen Wert ein: Y/N'); ActiveControl := StringGrid1; end; end; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
|