TStringGrid

Grundlegendes
Ein TStringGrid enthält Zellen,
welche in Zeilen und Spalten angeordnet sind. Der Inhalt einer
einzelnen Zelle
ist ein String.
Die Zeilen und Spalten werden durchnummeriert, wobei die
erste Spalte bzw. Zeile mit 0
beginnt.

Zuweisen von Text (
var S:
String;)
| |
StringGrid1.Cells[1,2] :=
'Hallo';
// Schreibt den Text "Hallo" in die 3.
Zelle der 2. Spalte |

Textformatierung
Um Zellentext formatieren zu können,
muss beim Zeichnen der Zellen Hand angelegt werden. Im Beispiel
soll die erste Zeile (0) in rot und Fettdruck erscheinen. Dazu
beim Ereignis OnDrawCell, der entsprechenden
StringGrid (hier StringGrid1) folgenden Code hinterlegen.
| |
if ARow =
0
then
with StringGrid1, Canvas
do
begin
Font.Color := clRed;
Font.Style := [fsBold];
TextRect(Rect, Rect.Left + 2, Rect.Top
+ 2, Cells[ACol, ARow]);
end; |

Zeile markieren
| |
var
x:Integer;x = 5
// fünfte Zeile markieren
StringGrid1.Selection :=
TGridRect(Rect(StringGrid1.FixedCols, x, StringGrid1.ColCount-1,
x)); |

StringGrid Zeile mit Rechtsklick
markieren
Durch einen Rechtsklick mit der
Maus, wird die unter dem Mauscursor liegende Zeile markiert.
Dazu hinter dem Event OnMouseDown folgenden Code
hinterlegen:
| |
var
aGridCoord:TGridCoord;
if Shift = [ssRight]
then // nur rechte maustaste
begin
// mauskoordinaten in gridkoordinaten
aGridCoord := StringGrid1.MouseCoord(x,y);
if
(aGridCoord.y >= stringgrid1.FixedRows)
and
(aGridCoord.y > -1)
and
(aGridCoord.x >= stringgrid1.FixedCols)
and
(aGridCoord.x > -1)
then
begin
// zelle markieren
StringGrid1.Row := aGridCoord.y;
StringGrid1.Col := aGridCoord.x;
end;
end; |

Markierte Zeile ausgeben
Bei Option goRowSelect wird die
markierte Zeile über Selection.Top augegeben
| |
StringGrid1.Selection.Top
// Zeile als integer 0 = 1 Zeile |

Zellen / Zeilenmarkierung aufheben
| |
StringGrid1.Selection :=
TGridRect(Rect(-1,-1,-1,-1));
// hebt die Markierung auf |

Zeilen und Spalten zählen
(
var Zahl: Integer;)
| |
Zahl := StringGrid.RowCount;
// die Variable Zahl enthält die Anzahl
der Zeilen
Zahl := StringGrid.ColCount;
// die Variable Zahl enthält die Anzahl
der Spalten |

Zeilenhöhe und Spaltenbreite
| |
StringGrid.RowHeights[3]
:= 10;
// setzt die Zeilenhöhe der 4. Zeile auf 10 Pixel
StringGrid.ColWidths[3]
:= 10;
//
setzt die Spaltenbreite der 4. Spalte auf 10 Pixel |

An bestimmte Position scrollen
(Scrollbarposition)
Um an eine bestimmte
Position zu springen wird die Eigenschaft TopRow verwenden.
TopRow definiert die Zeile die als erste Zeile angezeigt wird.
Also bei .TopRow := 5, wird die fünfte Zeile als erste Position angezeigt,
demzufolge sind die Zeilen 1-4 oberhalb des Sichtbereiches.
| |
var
x:Integer;
x := StringGrid1.TopRow;
// abfragen
StringGrid1.TopRow := x; // zuweisen
|

Scrollbar vorhanden?
Um zu prüfen ob eine Scrollbar
vorhanden bzw. sichtbar ist oder nicht. Tipp: Die für die
Spaltenbreite zur Verfügung stehende Pixelanzahl verringert sich
um 17 Pixel wenn die vertikale Scrollbar eingeblendet
ist.
| |
if
GetWindowlong(Stringgrid1.Handle, GWL_STYLE)
and WS_VSCROLL <>
0 then
ShowMessage(' Vertikal ist sichtbar')
if
GetWindowlong(Stringgrid1.Handle, GWL_STYLE)
and WS_HSCROLL <>
0 then
ShowMessage(' Horizontal ist sichtbar') |

Maus Scrollrad deaktivieren bzw. blockieren?
Zum deaktivieren der Scrollfunktion
über das Scrollrad der Maus in den beiden Events "OnMouseWheelDown"
und "MouseWheelUp" den Handled auf "true" setzen.

Bild einer Zelle zuweisen
Ein Bild bekommt man über die Klasse
Canvas in eine Zelle. Dabei wird das Bild bei dem Event
OnDrawCell in die Zelle gezeichnet. Folgender Code prüft
beim OnDrawCell ob der Textinhalt, der gerade zu zeichnenden
Zelle ein Pfad zu einer Datei ist. Ist dies der Fall, so wird
diese Datei (Bitmapdatei) geladen und in die Zelle gezeichnet.
| |
procedure
TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
bmp: TBitmap;
begin
if
FileExists(StringGrid1.Cells[ACol,ARow])
then
begin
bmp := TBitmap.Create;
bmp.LoadFromFile(StringGrid1.Cells[ACol,ARow]);
StringGrid1.Canvas.CopyRect(Rect,bmp.Canvas,Classes.Rect(0,0,bmp.Width,bmp.Height));
bmp.Free;
end;
end; |
Anwendung
Da das zuweisen eines Textes den
OnDrawCell Event hervorruft, wird hier direkt das angegebene
Bild in die entsprechende Zelle gezeichnet.
| |
StringGrid1.Cells[1,1]
:= 'c:\test.bmp'; |

Eigener Hint-Text für jede
Zelle
Zunächst muss veranlasst werden,
dass der Hint ständig aktualisiert wird, das wird
hier
gezeigt.
Dann beim Event
OnMouseMove folgenden Code hinzufügen.
| |
procedure
TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
X,
Y: Integer);
var
Row, Col : Integer;
begin
StringGrid1.MouseToCell(X, Y, Col, Row);
StringGrid1.Hint:= IntToStr(Row) +',' +IntTostr(Col);
// Zeigt aktuelle Zeile und Spalte
end; |

|