Autor Beitrag
Miri
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: Di 06.12.05 13:45 
Habe beides ausprobiert:

ausblenden 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'; //<- habs auch schon ohne diese Zeile versucht
      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 user profile iconraziel: Delphi-Tags hinzugefügt.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mi 07.12.05 19:32 
Hallo,

habs verstanden :wink:

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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
  // auf Col/Row prüfen !!!! nicht ACol/ARow
  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:
ausblenden 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 )