Autor Beitrag
ebiebiebi
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 28.11.06 22:25 
Hallo!
ich habe ein StringGrid auf die Form gepackt und die erste Spalte als feste festgelegt, die zweite der beiden Spalten ist editierbar!

Nun möchte ich, dass links z.B. steht: Name des Spielers 1 und rechts soll der name eingetragen werden!

Ich habe mir die proceduren DrawCell, SetEditText schon genauer angeguckt, wo die Länge des neuen Eintrages gleich geprüft wird, wenn die aktuelle Zelle bestätigt wird (unselectieren / Enter drücken!)

Mit DrawCell kann ich folgendes herbeiführen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.sgdEinstellungen1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
 
case ARow of
 1//reihe 1 .....
   begin
     if Length(sgdEinstellungen1.Cells[ACol,ARow]) > 12 then  sgdEinstellungen1.Cells[ACol,ARow] := 'max 12 Zeichen' ;
   end;
   
end;
end;

(Problem: Flackern des StringGrids...)

Ich möchte gleich bei der Eingabe (Ende der Eingabe) überprüfen, ob die Länge nicht zu groß ist!
geht das irgendwie ??

Danke schön! :D
Michael Stenzel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 133


D3 Prof, D7 PE
BeitragVerfasst: Di 28.11.06 23:28 
Hi ebiebiebi!

Nehme das Ereignis OnKeyPress, damit hast Du dann volle Tastenkontrolle.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
     if Length(StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]) >= 12 then
        if Not(Key in [#8,#13]) then Key := #0;
end;


Und um die Spaltennamen zu Initalisieren kannst Du das OnCreate - Ereignis verwenden.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.FormCreate(Sender: TObject);
var i : integer;
begin
     for i := 0 to 2 do
      StringGrid1.Cells[0,i] := format('Name des Spielers %d',[i + 1]);
end;


Gruß
Michael. :)
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 29.11.06 08:55 
Natürlich flackert es.

Du prüfst, ob der String größer 12 ist und schreibst als Info einen String rein, der größer 12 ist. Dadurch wird das Ereignis erneut ausgelöst. Da Dein Eintrag größer 12 ist, schreibst Du Deinen Eintrag mit mehr als 12 Zeichen erneut rein. Dadurch wird das Ereignis erneut ausgelöst. Da Dein Eintrag größer 12 ist, schreibst Du Deinen Eintrag mit mehr als 12 Zeichen erneut rein. Dadurch wird das Ereignis erneut ausgelöst. Da Dein Eintrag größer 12 ist, schreibst Du Deinen Eintrag mit mehr als 12 Zeichen erneut rein. ...

Alles klar?
ebiebiebi Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 29.11.06 09:41 
Danke Michael!
Nun funktioniert der Teil immerhin, und ich habe es auch noch verstanden!

Und das Flackern wäre nun auch geklärt!
Super ....

Nur eine Frage hätte ich zu dem Thema noch:
  • - Woher weiß der PC, wann die Eingabe in der Zelle fertig ist ?
  • - entweder man klickt mit der Maus in eine andere Zelle oder bestätigt mit ENTER!


Gibt es so etwas wie LostFocus() für einzelne Zellen, sodass man nach Eingabe in der Zelle den Wert auch speichern kann ?
Ich möchte dies nicht bei KeyPress mit reinpacken, da man dort nach jedem Buchstaben gleich speichert, obwohl der Name noch nicht ganz ist!

Gibt es eine Procedure nach Eingabe der Zelle mit Enter zu bestätigen, oder wenn der Fokus auf eine andere Zelle wandert ? (Durch TAB möglich oder Maus ... )

Meine Idee wäre ....

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if Length(StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]) >= 12 then
        if Not(Key in [#8,#13]) then Key := #0;
if (Key in [#8,#13]) then Spielername :=  StringGrid1.Cells[Stringgrid1.Col,Stringgrid1.Row];
 //müsste ja nach Drücken auf Enter (#13) (?) speichern - oder ?

end;
:?: :?: :?:


Gruß
ebiebiebi
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 29.11.06 23:13 
Hallo,

bei ENTER, Pfeiltasten oder wenn das StringGrid den Focus verliert, wird OnSetEditText ausgelöst.
OnSetEditText wird aber auch bei jeder Taste ausgelöst.
Darum muss man noch prüfen ob der Inplace-Editor geschlossen wurde.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
begin
  if not StringGrid1.EditorMode then
    Caption := Value;
end;


Weil aber das nicht funktioniert wenn mit der Maus in eine andere Zelle geklickt wird, ist noch eine Behandlung von OnSelectCell erforderlich.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; Col, Row: Integer;
  var CanSelect: Boolean);
begin
  Caption := Stringgrid1.Cells[Stringgrid1.Col,Stringgrid1.Row];
end;
Dabei aber beachten das auf Stringgrid1.Col und Stringgrid1.Row zugegriffen wird,
denn das sind die Koordinaten der Zelle die verlassen wird.
Die Variablen Col und Row die von OnSelectCell angeboten werden
sind die Koordinaten der Zelle die selectiert wird.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
ebiebiebi Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 29.11.06 23:19 
Vielen Dank! :zustimm:
Nun hat alles geklappt, danke für die Hilfe ....

Mit den beiden Proceduren zusammen habe ich nun das, was ich schon seit Langem wollte!