Tech-Ecke / Delphi Inhalt / TStringGrid

 

     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 := StringGr
id.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.

  Handled := true;
 


 

   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;
 

Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !

[letzte Aktualisierung 09.10.2006]