Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Cursor auf StringGrid-Celle setzen


hRb - Di 12.04.16 22:03
Titel: Cursor auf StringGrid-Celle setzen
Ich habe ein StringGrid-Objekt, bei dem der Anwender per ButtonClick eine Zeile nach oben bzw. nach unten verschieben kann. Geschieht dies, dann ist der Cursor nicht mehr sichtbar. Wie kann ich den Cursor wieder sichtbar machen und auf eine Celle[col,row] setzen?


Gerd Kayser - Mi 13.04.16 00:30

user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Wie kann ich den Cursor wieder sichtbar machen und auf eine Celle[col,row] setzen?

Man kann bei einem StringGrid Row, Col, LeftCol, TopRow abfragen und ihnen neue Werte zuweisen.
Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
  StringGrid1.Col := StringGrid1.Col + 2;
  StringGrid1.Row := StringGrid1.Row + 3;
  Label1.Caption := IntToStr(StringGrid1.LeftCol);
  Label2.Caption := IntToStr(StringGrid1.TopRow);


hRb - Mi 13.04.16 23:48

Danke, mit den ersten zwei Anweisungen setzt man den Focus tatsächlich auf eine bestimmte Zelle. Allerdings wird hierdurch der Cursor noch nicht sichtbar. Aber auch dieses "Problem" habe ich inzwischen gefunden/gelöst. Verschiebt man die Zeilen mittels einer Procedure-ButtonClick, so wechselt der Focus natürlich zum Button. Daher muss am Ende noch der Aufruf StringGrid1.SetFocus stehen.
Nachstehend ein funktionsfähiges Beispiel


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
Procedure TForm2.ZeileAbClick(Sender: TObject);
{StringGrid-Zeile um +1 abwärts}
Var i,j : integer;
    s : string;
begin with StringGrid1 do begin
 if ((Row>-1and (Row<RowCount-1)) then
  begin //Zeile abwärts schieben
    i:=row+1;
    for j:= FixedCols to ColCount-1 do
    begin
      s:=Cells[j,row];
      Cells[j,row]:=Cells[j,i];
      Cells[j,i]:=s;
    end;
    Row := Row + 1// Cursor auf verschobene Zeile setzen
  end;
  SetFocus;
endend;