Beschreibung der wichtigsten Funktionen, Prozeduren
und Eigenschaften der DBR-Komponente
TTEXTGRID

Hinweise:

Um Flackern zu unterdrücken, sollten Sie bei Parent der Komponente
DoubleBuffered setzen:

procedure
TForm1.FormCreate(Sender: TObject);
var x: integer;
begin
  DoubleBuffered := true;
// <--------------
  for x := 1 to 4 do
    TextGrid1.cells[0, x] := char(64 + x);
  for x := 1 to 4 do
    TextGrid1.cells[x, 0] := inttostr(x);
  TextGrid1.ColWidths[0] := 30;
  TextGrid1.FixCenter := true;
end;

Wenn die Komponente auf ein Panel gesetzt wird, dann natürlich:
Panel1.DoubleBuffered := true;

Da zur Texteingabe ein TMemo geöffnet wird, denken Sie daran (je nach Position des Memo [siehe unten EditPosition])
dafür Platz zu lassen.

 


Erläuterung der wichtigsten Eigenschaften:

AutoSpread (Boolean)
Normalerweise dürfen überlappende Zellbereich nicht miteinander verbunden werden.
Das kann man umgehen, wenn man
AutoSpread auf True stellt. Dann wird aber automatisch der Verbund unter Berücksichtigung der äußersten Selektionen verteilt.
Siehe aber unten
MergeCells!!




Es können immer nur rechteckige Bereiche verbunden sein!

BackGround  (TTGBack)
tgOpaque
= Solider Hintergrund.
tgTransparent = Die Zellen (außer den Fixed-Zellen) werden durchsichtig.
tgTooFixTransparent = Alle Zellen (auch Fixed-Zellen) werden durchsichtig.
tgPicture = Ist eine Grafik geladen, wird diese als Hintergrund
            dargestellt, ansonsten ist die Wirkung wie
tgTransparent.
tgPicTransparent
= Ist eine Grafik geladen und ist dieselbe transparent
                  
(z.B.: *.wmf oder *.ico), wird auch der Hintergrund an den
                   selben Stellen wie die Grafik transparent.
tgPicFixTransparent
= Grafik und Fixed-Zellen werden transparent.

BorderStyle (TTGBorder)
tgNone = Komponente wird ohne Rand dargestellt.
tgSingle
= Es wird ein schmaler Rand um die Komponente gezeichnet.

Col (Integer)
Liest oder setzt die Spalte, in der sich die fokussierte Zelle befindet. Bei
Fehlern oder dem Aufruf von
Reset
wird der Wert -1.

ColCount (Word)
Liest oder setzt die Anzahl der Spalten. Es muss mindestens 1 Spalte vorhanden sein.

Color (TColor)
Bestimmt die Hintergrundfarbe der Standard-Zellen. Hat natürlich bei transparentem
Grid keine Wirkung.

DefaultColWidth (Byte)
Setzt alle Spalten auf die angegebene Spaltenbreite. Waagerechte Zellverbände
werden dabei aufgelöst.

DefaultRowHeight (Byte)
Setzt alle Zeilen auf die angegebene Zeilenhöhe. Senkrechte Zellverbände
werden dabei aufgelöst.

DisabledColor (TColor)
Bestimmt die Hintergrundfarbe der Standard-Zellen, wenn das Grid nicht Enabled ist.
Hat natürlich bei transparentem Grid keine Wirkung.

Edge (Boolean)
Bestimmt, ob die Gitterlinien auch außen herum gezeichnet werden.

   
Edge = True              Edge = False

EditBackGround (TColor)
Hintergrundfarbe des Texteingabefeldes.

EditFont (TFont)
Schriftart und Farbe des Texteingabefeldes.

Editing (Boolean)
Erlaubt oder verhindert, dass das Grid editiert werden kann (Zeilenhöhen, Texte, Zellverbände usw.)
.

EditPosition (TTGEPos)
tgEditBottomLeft
= Das Eingabefeld für das Editieren eines Zellinhaltes wird
                   unterhalb des Grids an der linken Kante eingeblendet.
tgEditBottomRight = Das Eingabefeld wird unterhalb des Grids an der rechten Kante
                    eingeblendet.

tgEditTopLeft =
Das Eingabefeld erscheint oberhalb des Grids links.
tgEditTopRight = Das Eingabefeld erscheint oberhalb rechts.
tgEditLeftTop =
Eingabefeld links oben neben dem Grid.
tgEditLeftBottom = Eingabefeld links unten neben dem Grid.
tgEditRightTop =
Eingabefeld rechts vom Grid oben.
tgEditRightBottom =
Eingabefeld rechts vom Grid unten.

EditShowTip (Boolean)
Zeigt oder verbirgt unter dem Eingabefeld den Hinweies:
Bestätigen mit Strg+Enter

EditTipColor (TColor)
Farbe des Hinweises unter dem Eingabefeld

EditTipFontColor (TColor)
Farbe der Schrift des Hinweises unter dem Eingabefeld

FixButtons (Boolean)
Bestimmt, ob die Fixed-Zellen als Buttons mit der linken Maustaste heruntergedrückt
werden können. Bei
TRUE werden dabei die Ereignisse OnFixButtonDown bzw.
OnFixButtonUp ausgelöst. Different gibt an, ob es sich um eine fremdgezeichnete Zelle handelt.
Beispiel:

procedure
TForm1.TextGrid1FixButtonUp(Sender: TObject; ACol, ARow: Integer;
  Different: Boolean);
begin
  if not Different then begin
   
 
// mach was, z.B.:
    showmessage(Textgrid1.Cells[ACol, Arow]);
  end;
end;

FixCenter (Boolean)
Legt fest, ob die Beschriftung der Fixed-Zellen immer zentriert wird.

FixCenter = False       FixCenter = True

FixColor (TColor)
Bestimmt die Flächenfarbe der Fixed-Zellen, wenn das Grid Enabled
ist. Hat
natürlich bei transparenten Zellen keine Wirkung.

FixDisabledColor (TColor)
Bestimmt die Flächenfarbe der Fixed-Zellen, wenn das Grid not Enabled
ist. Hat
natürlich bei transparenten Zellen keine Wirkung.

FixedCols (Byte)
Bestimmt die Anzahl der fixierten Spalten.

FixedRows (Byte)
Bestimmt die Anzahl der fixierten Zeilen.

FixFlat (Boolean)
Bestimmt ob Fixed-Zellen flach dargestellt werden.

FixFontStyle (TFontStyles)
Für Fixed-Zellen wird ein abweichender Fon.Style
eingestellt.

FocusRect (Boolean)
Wenn diese Eigenschaft TRUE
ist und das Grid den Fokus erhält, wird innerhalb der
fokussierten Zelle ein gestricheltes Rechteck gezeichnet.

LineColor (TColor)
Bestimmt die Farbe der Gitterlinien, wenn das Grid nicht den Fokus hat.

LineFocusColor (TColor)
Bestimmt die Farbe der Gitterlinien, wenn das Grid den Fokus besitzt.

LineWidth (Byte)
Bestimmt die Strichbreite des Gitters.

Messages (Boolean)
Steht diese Eigenschaft auf
TRUE, wird bei bestimmten Fehlern (z.B. wenn überlappende Bereiche verbunden werden sollen) eine Meldung ausgegeben.
Ansonsten passiert entweder nichts, oder die Funktion wird ohne Nachfrage ausgeführt
(z.B. beim Löschen von Text)
.

NoFocusSelColor (TColor)
Wenn die Komponente den Fokus verliert, können selektierte Zellen andersfarbig
angezeigt werden. Um beispielsweise das Verhalten eines TStringGrid
(ohne Hintergrundbild) nachzubilden,
können Sie
(falls die Farben noch nicht geändert wurden) folgendes tun:
Beispiel:
procedure TForm1.FormCreate(Sender: TObject);
begin
  doublebuffered := true; 
  with Textgrid1 do begin
    NoFocusSelColor := SelectColor;
    SelectColor := Color;
    Focusrect := true;
  end;
end;

Picture (TPicture)
Damit kann eine Grafik für den Hintergund geladen werden. Ist die Grafik kleiner
als das Grid, wird das Bild wiederholt neben- und untereinander gezeichnet.

Row (Integer)
Liest oder setzt die Zeile, in der sich die fokussierte Zelle befindet. Bei
Fehlern oder dem Aufruf von
Reset
wird der Wert -1.

RowCount (Word)
Liest oder setzt die Anzahl der Zeilen. Es muss mindestens 1 Zeile vorhanden sein.

SelectColor (TColor)
Bestimmt die Farbe der Zellen, welche selektiert sind.

SelectStyle (TTGSelS)
tgFull = Zelle wird  ausgefüllt
tgPart
= ein kleiner Rand der Zelle bleibt frei, damit man beispielsweise ein
         Teil des Hintergrundbildes noch erkennen kann.

TextLine (TTGMul)
tgMultiLine =
der Zelltext wird an Leerzeichen oder Zeilenenden umgebrochen.
tgSingleLine = mehrzeiliger Text wird einzeilig am oberen Zellrand ausgegeben.
tgSingleVCenter = der Text wird einzeilig vertikal zentriert ausgegeben.
tgDefault = entspricht hier tgSingleLine (siehe aber weiter unten CellLine)
Alle (außer Fixed)Zellen werden entsprechend angepasst.

tgSingleLine            tgMultiLine             tgSingleVCenter

WheelPermit (Boolean)
Entscheidet, ob die Komponente auf Drehen am Mausrad reagiert.


 

Erläuterung der wichtigsten Ereignisse:

OnDrawCell
Wird vor dem Zeichnen jeder Zelle ausgelöst. Man kann mittels DefaultDraw für
bestimmte Zellen eine abweichende Darstellung erreichen.


Beispiel:

procedure
TForm1.TextGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; Selected: Boolean; var DefaultDraw: Boolean);
begin
  if (acol = 2) and (arow > 0)
    then begin
    DefaultDraw := false; 
// <--------------

    with TTextGrid(sender) do begin
      canvas.font.color := clred;
      if selected
        then
        canvas.brush.color := claqua
      else
        if BackGround = tgOpaque
          then
          canvas.brush.color := clyellow
        else
          canvas.brush.style := bsclear;
      canvas.fillrect(Rect);
      inflaterect(Rect, -3, -3);
      if (Rect.bottom - Rect.top > 0)
        and (Rect.right - Rect.left > 0)
        then
        drawtext(canvas.handle, pchar(Textgrid1.cells[acol, arow]), -1,
          rect, DT_SINGLELINE or DT_VCenter);
    end;
  end;
end
;

OnEdited
Wird nach dem Editieren von Zellinhalten aufgerufen. Man kann unerwünschte Inhalte
abweisen.
Beispiel:
procedure TForm1.TextGrid1Edited(Sender: TObject; ACol, ARow: Integer; 
  var S: string); 
begin 
  if pos('sex', LowerCase(S)) > 0 then S := 'Zensiert'; 
end;
OnEditing
Wird vor dem Editieren von Zellinhalten aufgerufen. Damit kann man beispielsweise
das Editieren von speziellen Zellen verhindern.
Beispiel:
procedure TForm1.TextGrid1Editing(Sender: TObject; ACol, ARow: Integer; 
  var EditType: TTGEd; var Edit: TCustomEdit); 
begin 
  if (ACol = 3) and (ARow = 2) then 
    EditType := tgNo; 
end;
Außerdem kann bestimmt werden, dass die Zellen ihren Text aus
fremden Eingabefeldern übernehmen.
Beispiel:
procedure TForm1.TextGrid1Editing(Sender: TObject; ACol, ARow: Integer; 
  var EditType: TTGEd; var Edit: TCustomEdit); 
begin 
  EditType := tgStrange; 
  Edit := Richedit1; 
end; 
Standardmäßig steht EditType auf tgSelf und Edit ist nil. Damit wird für
das Editieren von Zelltexten das eigene Memo der Komponente geöffnet.
OnWheel
Wird ausgelöst, wenn am Mausrad gedreht wird (und WheelPermit auf True steht).
Damit kann man beispielsweise bestimmte Bereiche ausgrenzen. Hier ein Codeschnipsel,
bei dem über das Mausrad nicht die Spalte 1 erreicht werden kann:
Beispiel:
procedure TForm1.TextGrid1Wheel(Sender: TObject; Direction: TTGDirection; 
  ACol, ARow: Integer; var Handled: Boolean); 
begin 
  if (Direction = tgLeftWards) 
    and (ACol < 3) then Handled := true; 
end;
OnWheel arbeitet unabhängig von OnChgDirection!
OnChgDirection
Wird ausgelöst, wenn man die Kursortasten betätigt.
Beispiel:
procedure TForm1.TextGrid1ChgDirection(Sender: TObject; 
  Direction: TTGDirection; ACol, ARow: Integer; var Handled: Boolean); 
begin 
  if (Direction = tgRightWards) 
    and (ACol >= 5) then Handled := true 
  else 
    if (Direction = tgUpWards) 
      and (ARow <= 2) then Handled := true 
end;
OnChgDirection arbeitet unabhängig von OnWheel!
OnFixButtonDown, OnFixButtonUp siehe oben --> FixButtons


Erläuterung der wichtigsten Funktionen, Prozeduren u. Eigenschafte zur Laufzeit:

MergeCells(x1, y1, x2, y2: word)
Verbindet den angegebenen Zellbereich unter der Voraussetzung, dass im Bereich keine fremdgezeichneten Zellen sind (siehe oben OnDrawCell), dass Zellen nicht zu anderen Verbundbereichen gehören (außer bei AutoSpread; siehe oben) und dass keine ausgeblendeten oder fixe Zellen im Bereich liegen. Steht AutoSpread auf TRUE, dann werden überlappende Bereiche ohne Nachfrage aufgelöst!! Man muss also immer den kompletten Bereich angeben, den man verbinden will.
Es können immer nur rechteckige Bereiche verbunden sein!

SeparateCells(x, y: word)
Löst die Verbindung von Zellbereichen wieder auf. Dabei müssen die angegebenen Koordinaten eine Zelle des Verbundes kennzeichnen (egal welche)
.

SeparateAll
Alle Zellverbände werden aufgelöst.

SelCount (Cardinal)
Gibt die Anzahl der selektieren Zellen zurück.

DifferentCount (Cardinal)
Gibt die Anzahl der fremdgezeichneten Zellen zurück (siehe oben OnDrawCell)
.

ColWidths[x: word] (Word)
Setzt oder liest die Breite für eine bestimmte Spalte. Zum Ausblenden einer Spalte setzt man X auf Null.

RowHeights[y: word] (Word)
Setzt oder liest die Breite für eine bestimmte Zeile. Zum Ausblenden einer Zeile setzet man Y auf Null.

ColWidthsX(x1, x2, degree: word)
Setzt die Breite für mehrere zusammenhängende Spalten (x1 bis einschl. x2)
.

RowHeightsX(y1, y2, degree: word)
Setzt die Höhe für mehrere zusammenhängende Zeilen (y1 bis einschl. y2)
.

FontColor[x, y: Word] (Integer)
Setzt eine abweichende Schriftfarbe für eine bestimmte Zelle, bzw. gibt die Schriftfarbe einer Zelle zurück. Setzt man die Eigenschaft auf MAXINT, wird die spezielle Farbe wieder gelöscht und die Schriftfarbe der Zelle auf Standardfarbe gesetzt (Font.Color)
.

Cells[x, y: Word] (String)
Setzt und liest den Text einer bestimmten Zelle.

CellLine[x, y: Word] (TTGMUL)
Entspricht bei der Ausrichtung dem obigen Textline, setzt und liest aber
nur den Wert einer einzigen Zelle. Wird der Wert
tgDefault
übergeben, erhält
die Zelle den Wert vom standardmäßigen TextLine.

Alignments[x: word] (TTGAlig)
Setzt oder liest die Textausrichtung einer Spalte.

tgLeft = linksbündig
tgCenter = zentriert
tgRight = rechtsbündig
tgOuter = Beim Lesen:
          Die angegebene Spalte liegt außerhalb des Grids oder ist
          eine Fixed-Spalte.
         
Beim Schreiben:
         
tgOuter enspricht hier
tgLeft

AlignmentToStr(alg: TTGAlig)
Setzt die Spaltenausrichtung zu Strings um.
Beispiel:

procedure
TForm1.Button1Click(Sender: TObject);
begin
  with TextGrid1 do
    ShowMessage(AlignmentToStr(Alignments[2]));
end
;

DeleteCols(x1, x2: word)
Löscht eine oder mehrere zusammenhängende Spalten
(x1 bis einschl. x2).
Es muss mindestens 1 Spalte übrigbleiben.

DeleteRows(y1, y2: word)
Löscht eine oder mehrere zusammenhängende Zeilen
(y1 bis einschl. y2).
Es muss mindestens 1 Zeile übrigbleiben.

SaveBasicsToStream(st: TStream)
Speichert essentielle Grid-Daten in einen Stream
(Spalten- und Zeilenzahl, Spaltenbreiten und Zeilenhöhen, Zellverbände, spezielle Schriftfarben,
Selektionen, Zelltexte und deren Anordnung)
.

LoadBasicsFromStream(st: TStream)
Liest die Daten aus einen Stream, der mit
SaveBasicsToStream
erzeugt wurde. Ist nicht kompatibel mit LoadFromStream
.

SaveToStream(st: TStream)
Sichert die Daten von
SaveBasicsToStream und weitere wichtige Grid-Daten in einen Stream (z.B. alle Farben, die Schriftart, Rand, Hint usw.)
. Standardeigenschaften wie Left, Top, Showhint, Tag etc. werden nicht berücksichtigt.

LoadFromStream(st: TStream)
Liest die Daten aus einen Stream, der mit
SaveToStream erzeugt wurde. Ist nicht kompatibel mit LoadBasicsFromStream
.

Reset
Löscht die Selection und setzt Col und Row auf -1.

Inside(x, y: Integer)
Hiermit kann man feststellen, ob sich eine Zelle mit den angegebenen Koordinaten innerhal eines Zellverbandes befindet.
Beispiel:

procedure
TForm1.Button1Click(Sender: TObject);
begin
  if Textgrid1.Inside(
3, 4) then showmessage('Innerhalb')
  else showmessage(
'Außerhalb');
end;

ClearText
Löscht alle Zell-Inhalte.

MouseToCell(x, y: integer; Rahmen: boolean; out ACol, ARow: integer)
Ermittelt anhand der Mauskoordinaten, über welcher Zelle sich der Mauspfeil
befindet. Ist
Rahmen = TRUE, wird der rechte und untere Rahmen mit zur Zelle
gezählt. Ansonsten wird
-1 zurückgegeben, wenn sich der Mauspfeil auf einem
Strich befindet
.


Erläuterung der manuellen Handhabung:

Wenn eine einzelne Zelle markiert ist und man drückt ENTER (und das Grid hat den Focus) oder man klickt doppelt auf eine Zelle, öffnet sich ein TMemo zur Texteingabe. Die Eingabe muss mit der Tastenkombination Strg+Enter bestätigt werden. Man kann aber auch ersatzweise mit der linken Maustaste auf die markierte Zelle im Grid oder auf den Hinweis "Bestätigen mit Strg+Enter" klicken.
Es ist aber auch möglich, Text aus externen Eingabefeldern zu übernehmen
(siehe oben
OnEditing).

Sind Zellen (welche Text enthalten) markiert und man drückt ENTF (und das Grid hat den Focus), wird der Text der Zellen gelöscht.

Mit den Kursortasten kann man von Zelle zu Zelle springen.

Wenn man mit gedrücktgehaltener linken Maustaste das Grid überstreicht, werden Zellbereiche markiert.

Drückt man auf einer Zelle die rechte Maustaste, erscheint ein Kontextmenü, über welches man Zelltexte editieren, Bereiche verbinden oder wieder separieren kann.
Bedingung:
Editing ist auf TRUE eingestellt.

Die Taste ESC (bei Grid-Focus) löscht Selektionen, bzw. bricht den Editiermodus ab.

Die Taste Pos1 fokussiert die links liegende Zelle innerhalb der aktuellen Zeile. Strg+Pos1 fokussiert die links oben liegende Zelle.

Die Taste Ende fokussiert die rechts liegende Zelle innerhalb der aktuellen Zeile. Strg+Ende fokussiert die rechts unten liegende Zelle.

Wenn man am Mausrad dreht, wird der Zellfokus nach oben oder unten verschoben. Hält man dabei die Strg-Taste gedrückt, erfolgt die Verschiebung nach links und rechts. Mittels eines Klicks mit der mittleren Maustaste (Mausrad) wird die waagerechte Richtung mit der senkrechten vertauscht. Sind Mehrere Zellen markliert, wird diese Markierung aufgehoben. Achten Sie bitte darauf, dass dieser Mausrad-Klick über dem Grid und nicht daneben ausgeführt wird.

Hält man die ALT-Taste gedrückt, kann man Zellinhalte mit der linken Maustaste verschieben. Hält man zusätzlich die STRG-Taste gedrückt, wird der Zellinhalt in
die Zielzelle kopiert.
Bedingung:
Editing ist auf TRUE eingestellt.
 

Anwendungsbeispiele:

Beispiel 1:
Der folgende Code lässt Spalten durch Ein- und Ausblenden scheinbar scrollen.
Von 15 Spalten sind immer nur 5 sichtbar. Bedingung ist, dass es eine einzige
fixe Spalte gibt, alle anderen Spalten die gleiche Breite haben und keine
Zellverbände existieren.

const 
  Fix = 1; // Bedingung 
 
var 
  SpaltenZahl: word = 15 + Fix; 
  AnzahlSichtbar: word = 5; 
  ScrollLinks: boolean = true; 
  SpalteLinks: word = Fix; 
 
procedure TForm1.FormCreate(Sender: TObject); 
var x: integer; 
begin 
  DoubleBuffered := true; 
  //------ Werte zum Testen --------- 
  with TextGrid1 do begin 
    DefaultColWidth := 50; 
    ColCount := SpaltenZahl; 
    FixedCols := Fix; 
    FixedRows := 1; 
    for x := 1 to RowCount - 1 do 
      cells[0, x] := char(64 + x); 
    for x := 1 to ColCount - 1 do 
      Cells[x, 0] := inttostr(x); 
    FixCenter := true; 
    Colwidths[0] := 30; 
    ColwidthsX(1, ColCount - 1, DefaultColwidth); 
  end; 
  //--------------------------------- 
  Anzeige; 
end; 
 
procedure TForm1.Anzeige; 
var i: integer; 
begin 
  with TextGrid1 do begin 
    if AnzahlSichtbar >= ColCount - Fix then 
      AnzahlSichtbar := ColCount - Fix - 1 else 
      if AnzahlSichtbar < 1 then AnzahlSichtbar := 1; 
    if SpalteLinks < Fix then begin 
      SpalteLinks := Fix; 
      beep; 
    end else begin 
      if SpalteLinks > ColCount - AnzahlSichtbar 
        then begin 
        SpalteLinks := ColCount - AnzahlSichtbar; 
        beep; 
      end; 
    end; 
    i := SpalteLinks; 
    if SpalteLinks > Fix then begin 
      if i + AnzahlSichtbar > colcount - 1 then 
        i := ColCount - AnzahlSichtbar; 
      ColwidthsX(Fix, i + Fix - 2 + ord(Fix = 0), 0); 
    end; 
    i := i + AnzahlSichtbar; 
    if ScrollLinks then 
      ColwidthsX(i - 1, i - 1, DefaultColWidth) else 
      ColwidthsX(SpalteLinks, SpalteLinks, DefaultColWidth); 
    if i < colcount then 
      ColwidthsX(i, ColCount - 1, 0); 
  end; 
end; 
 
 
// Spalten nach links verschieben 
 
procedure TForm1.SpeedButton1MouseDown(Sender: TObject; 
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
  ScrollLinks := true; 
  inc(SpalteLinks); 
  Anzeige; 
end; 
 
// Spalten nach rechts verschieben 
 
procedure TForm1.SpeedButton2MouseDown(Sender: TObject; 
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
  ScrollLinks := false; 
  dec(SpalteLinks); 
  Anzeige; 
end;
 
//-------------------------------------------------------


Beispiel 2:
Um das Grid scrollen zu können, setzt man es in eine Scrollbox. Es
werden dann aber im Gegensatz zum Stringgrid auch die fixen Zellen
weggescrollt. Man kann dann leider keine Transparenz nutzen und
sollte zur Texteingabe ein externes Feld einrichten
(siehe oben OnEditing).
var 
  sb: TScrollBox; 
 
procedure TForm1.FormCreate(Sender: TObject); 
var 
  x: integer; 
begin 
 //------ Werte zum Testen --------- 
  with TextGrid1 do begin 
    DefaultColWidth := 50; 
    ColCount := 20; 
    FixedCols := 1; 
    FixedRows := 1; 
    Rowcount := 15; 
    for x := 1 to RowCount - 1 do 
      cells[0, x] := chr(x + 64); 
    for x := 1 to ColCount - 1 do 
      Cells[x, 0] := inttostr(x); 
    background := tgPicture; 
    picture.loadfromfile('c:\test.bmp'); 
    EditPosition := tgEditRightTop; 
  end; 
  //--------------------------------- 
  sb := TScrollBox.create(self); 
  sb.left := TextGrid1.left; 
  sb.top := TextGrid1.top; 
  sb.width := 400; 
  sb.height := 200; 
  sb.parent := self; 
  TextGrid1.top := 0; 
  TextGrid1.left := 0; 
  Textgrid1.parent := sb; 
  sb.DoubleBuffered := true; 
end;