Difference between revisions of "Grids Reference Page/de"

From Free Pascal wiki
Jump to navigationJump to search
m
Line 164: Line 164:
  
 
===== Beispiele =====
 
===== Beispiele =====
*Set Example: Set the content of the third row in the grid from a ListBox:
+
*Set Beispiel: Setzt den Inhalt der dritten Zeile im Grid (Zählung beginnt bei 0) aus einer ListBox:
 
  Grid.Rows[2] := ListBox1.Items;
 
  Grid.Rows[2] := ListBox1.Items;
*Get Example: Set the content of a Listbox from the grid's row index 4:
+
*Get Beispiel: Set the content of a Listbox from the grid's row index 4:
 
  procedure TForm1.FillListBox1;
 
  procedure TForm1.FillListBox1;
 
  var  
 
  var  
Line 177: Line 177:
 
   end;
 
   end;
 
  end;   
 
  end;   
*Not Working Example and Fix: Retrieved string list is read only
+
*Nicht funktionierendes Beispiel und Berichtigung: Retrieved string list is read only
  // this will not work and will cause memory leak
+
  // dies wird nicht funktionieren und einen Speicherüberlauf verursachen
  // because returned StringList is not being freed
+
  // weil die zurückgegebene StringList nicht freigegeben wird
 
  Grid.Rows[1].CommaText := '1,2,3,4,5';
 
  Grid.Rows[1].CommaText := '1,2,3,4,5';
 
  Grid.Rows[2].Text := 'a'+#13#10+'s'+#13#10+'d'+#13#10+'f'+#13#10+'g';  
 
  Grid.Rows[2].Text := 'a'+#13#10+'s'+#13#10+'d'+#13#10+'f'+#13#10+'g';  
 
   
 
   
  // fixing the first case
+
  // berichtigen des ersten Falls
 
  Lst:=TStringList.Create;
 
  Lst:=TStringList.Create;
 
  Lst.CommaText := '1,2,3,4,5';
 
  Lst.CommaText := '1,2,3,4,5';

Revision as of 12:59, 6 January 2007

Deutsch (de) English (en) español (es) polski (pl) русский (ru)

Die Zielsetzung

Dieser Text will versuchen, dem Benutzer einige Aspekte der Grid-Komponenten in Lazarus zu zeigen. Es ist auch vorgesehen, als ein Handbuch für Benutzer zu dienen, die noch nie zuvor Grids benutzt haben (während erfahrene Benutzer im Allgemeinen nur eine Referenz benötigen für neue Funktionalitäten). Daher will dieser Text versuchen, die folgenden Ziele zu erreichen:

  1. Die Grid-Komponenten den Menschen mit geringem oder gar keinem Delphi Kontakt vorzustellen.
  2. Die Unterschiede hinsichtlich der Delphi Grid-Komponenten zu dokumentieren.
  3. Die neuen Funktionalitäten in Lazarus Grids zu dokumentieren.
  4. Referenzen und Beispiele für die Komponenten zu erstellen.

Überblick

Ein Grid ist eine Komponente, die a mean zur Anzeige von Daten in einem tabellarischen Format bietet. Die offensichtlichste Charakteristik von Grids ist, daß sie aus Zellen bestehen, Zeilen und Spalten bildend.

Der Informationstyp, der in einem Grid angezeigt werden kann, ist sehr weitläufig, hauptsächlich abhängig von dem, was der Benutzer anzeigen möchte. Gewöhnlich wird diese Information in Text, Farben, Bilder oder eine Kombination daraus übersetzt.

In Anbetracht der großen Vielfalt von Informationen, die representiert werden können, existiert eine Reihe von Grids, deren Zweck darin besteht, den Benutzer zu unterstützen, eine spezifische Art von Informationen zu zeigen.

Vererbungsbaum

                      [TCustomControl]           
                              |                    
                              |                    
                         TCustomGrid               
                              |                    
                +-------------+------------+       
                |                          |       
          TCustomDrawGrid             TCustomDbGrid
                |                          |       
       +--------+--------+                 |       
       |                 |              TDbGrid    
   TDrawGrid      TCustomStringGrid                
                         |                         
                         |                         
                    TStringGrid                    

Ein Anfangsbeispiel

As one of the objectives of this is to be nice with people with little or no previous lazarus knowledge lets do a quick starting example of grids in action. Why not, lets make a traditional "hello world" Beispiel unter Verwendung der TStringGrid Komponente.

  1. Erstellen sie eine neue Anwendung.
    • Im Hauptmenü wählen sie: Projekt -> Neues Projekt
    • Im Erzeuge neues Projekt Dialog drücken sie den "Erzeuge Button"
    • Ein neues leeres Formular wird angezeigt.
  2. Platzieren sie ein Grid auf dem Formular.
    • In der Komponentenpalette wählen sie den "Additional" Tab.
    • Klicken sie auf das TStringGrid Icon [].
    • Klicken sie auf das Formular, in der Nähe der oberen linken Ecke. Ein neues leeres Grid erscheint.
  3. Platzieren sie einen Button auf dem Formular.
    • In der Komponentenpalette wählen sie den "Standard" Tab.
    • Klicken sie auf das TButton Icon [].
    • Klicken sie auf einen freien Bereich im Formular. Ein neuer Button erscheint.
  4. Klicken sie doppelt auf den Button von Schritt 3, und schreiben sie den folgenden Code in den click button handler:
    • Stringgrid1.Cells[1,1] := 'Hi World!';
  5. Starten sie das Programm durch klicken auf das Start Icon [].
    • Durch Drücken von Button1, sollte der hello world Text in der Zelle Spalte 1, Zeile 1 erscheinen.

Unterschiede zwischen Lazarus und Delphi Grids

Die aktuellen Grid-Komponenten zeigen verschiedene Unterschiede hinsichtlich der Delphi Grids. Das ist hauptsächlich so, weil die Lazarus Grids von Beginn an erstellt wurden ohne in erster Linie zu versuchen, sie vollständig kompatibel zu machen.

In einem späteren Stadium wurde die Kompatibilität mit Delphi Grids zu einem gewünschten Ziel und die Grids begannen der Delphi Grid-Schnittstelle enger zu folgen, aber ohne zwingende Bemühungen, jede einzelne Eigenschaft oder Methode passend zu ihrem Delphi Gegenstück zu machen. Auch weil die Grid Interna sehr verschieden sind, sind manche Dinge nicht möglich oder müssen auf eine andere Weise erledigt werden in den Lazarus Grids. As the grids were evolved, greater compatibility becomes and is a desired.

Unterschiede

An dieser Stelle werden die bekannten Unterschiede aufgeführt ohne spezielle Reihenfolge.

  • Cell Editors
  • Designtime Behaviour

Neue Funktionsweise

  • Columns
  • Events
  • Grid Editor

Grids Referenz

Information

Der Ausgangspunkt für eine Referenz über TCustomGrid, TDrawGrid, TCustomDrawGrid, TCustomStringGrid und TStringGrid ist die Unit grids.pas Referenz.

Für TCustomDBGrid und TDBgrid ist es die Unit dbgrids.pas Referenz.

Gegenwärtig enthalten diese Links noch nicht viel Inhalt, teilweise wegen des Fehlens eines Werkzeugs, das eine einfache Wartung ihres Inhalts erlaubt. Aber ein solches Werkzeug is under construction and eventually the gaps will be filled.

Im Allgemeinen, jede Delphi Referenz über Grids sollte helfen, die Lazarus Grids zu verwenden (don't forget that there are several differences between Delphi and Lazarus grids being documented), with this in mind and as a temporal place for reference information, wird dieser Ort genutzt, um Dinge zu dokumentieren, die nicht wie in Delphi funktionieren oder die eine neue Funktionalität darstellen.

TCustomGrid

Siehe die vollständige TCustomGrid Referenz.

Eigenschaft OnBeforeSelection: TOnSelectEvent

Eigenschaft OnCompareCells: TOnCompareCells

Eigenschaft OnPrepareCanvas: TOnPrepareCanvasEvent

Eigenschaft OnDrawCell: TOnDrawCell

Eigenschaft OnEditButtonClick: TNotifyEvent

Eigenschaft OnSelection: TOnSelectEvent

Eigenschaft OnSelectEditor: TSelectEditorEvent

Eigenschaft OnTopLeftChanged: TNotifyEvent

Prozedur AutoAdjustColumns;

Prozedur BeginUpdate;

Prozedur Clear;

Prozedur DeleteColRow(IsColumn: Boolean; index: Integer);

Funktion EditorByStyle(Style: TColumnButtonStyle): TWinControl;

Prozedur EndUpdate(UO: TUpdateOption); overload;

Prozedur EndUpdate(FullUpdate: Boolean); overload;

Prozedur EndUpdate; overload;

Prozedur ExchangeColRow(IsColumn: Boolean; index, WithIndex:Integer);

Funktion IscellSelected(aCol,aRow: Integer): Boolean;

Funktion IscellVisible(aCol, aRow: Integer): Boolean;

Prozedur LoadFromFile(FileName: string);

Funktion MouseToCell(Mouse: TPoint): TPoint; overload;

Funktion MouseToLogcell(Mouse: TPoint): TPoint;

Funktion MouseToGridZone(X,Y: Integer): TGridZone;

Funktion CellToGridZone(aCol,aRow: Integer): TGridZone;

Prozedur MoveColRow(IsColumn: Boolean; FromIndex, ToIndex: Integer);

Prozedur SaveToFile(FileName: string);

Prozedur SortColRow(IsColumn: Boolean; index:Integer); overload;

Prozedur SortColRow(IsColumn: Boolean; index,FromIndex,ToIndex: Integer); overload;

TCustomStringGrid

TCustomStringGrid dient als Basis für TStringGrid. Es kann verwendet werden für von TStringGrid abgeleitete Komponenten that want to hide published properties. Siehe new intermediate grids für mehr Informationen.

Diese Eigenschaften bzw. Methoden sind public und auch bei TStringGrid verfügbar.

Siehe die vollständige TCustomStringGrid Referenz.

Prozedur AutoSizeColumn(aCol: Integer);

Diese Prozedur setzt die Spaltenbreite auf die Größe des breitesten Texts, den sie in allen Zeilen finden kann für die Spalte aCol. Tipp: siehe die goDblClickAutoSize Option, um den Spalten die automatische Anpassung zu erlauben, wenn doppelt auf den Spaltenrand geklickt wird.

Prozedur AutoSizeColumns;

Automatically resizes all columns by adjusting them to fit in the longest text in each column. Dies ist eine schnelle Methode of applying AutoSizeColumn() für jede Spalte im Grid.

Prozedur Clean; overload;

Cleans all cells in the grid, fixed or not.

Prozedur Clean(CleanOptions: TCleanOptions); overload;

Cleans all cells in the grid subject to the given CleanOptions. Siehe TCleanOptions für mehr Informationen. Einige Beispiele:

  • Clean all cells: grid.Clean([]); (das selbe wie grid.clean)
  • Clean all non fixed cells: grid.Clean([gzNormal]);
  • Clean all cells but don't touch grid column headers: Grid.Clean[gzNormal, gzFixedRows]);

Prozedur Clean(StartCol,StartRow,EndCol,EndRow: integer; CleanOptions:TCleanOptions); overload;

macht das selbe wie Clean(CleanOptions:TCleanOptions) but restricted to the given StartCol,StartRow,EndCol and EndRow. Beispiele:

  • Clean column index 4 to 6 but don't touch grid column headers: many variations, Grid.Clean(4,Grid.FixedRows,6,Grid.RowCount-1,[]); Grid.Clean(4,0,6,Grid,RowCount-1, [gzNormal]); etc.

Prozedur Clean(aRect: TRect; CleanOptions: TCleanOptions); overload;

The same as Clean(StartCol,StartRow,EndCol,EndRow, CleanOptions), just taking a TRect instead of individual cell coordinates. Useful to clean the selection: grid.Clean(Grid.Selection,[]);

Eigenschaft Cols[index: Integer]: TStrings read GetCols write SetCols;

Get/set a list of strings from/to the given grid's column index beginnend mit Spaltenindex 0 bis RowCount-1.

Beispiele
  • Set Example: Set the content of the third column in the grid from a ListBox:
Grid.Cols[2] := ListBox1.Items;
  • Get Example: Set the content of a Listbox from the grid's column index 4:
procedure TForm1.FillListBox1;
var 
  StrTempList: TStringList;
begin
  StrTempList := TStringList(Grid.Cols[4]);
  if StrTempList<>nil then begin
    ListBox1.Items.Assign(StrTempList);
    StrTempList.Free;
  end;
end;   
Anmerkungen

Diese Eigenschaft funktioniert beim holen der Daten aus dem Grid in Lazarus auf eine andere Weise als in Delphi. In Lazarus wird ein temporäres TStringList Objekt erzeugt, um den Spalteninhalt zu holen. Es liegt in der Verantwortung des Benutzers, dieses Objekt nach der Verwendung freizugeben.

Das bedeutet auch, dass die Änderungen in der zurückgegebenen Liste weder den Inhalt noch das Aussehen des Grids beeinflussen werden.

Siehe das Get Beispiel.

Eigenschaft Rows[index: Integer]: TStrings read GetRows write SetRows;

Get/set a list of strings from/to the given grid's row index beginnend mit Spaltenindex 0 bis Spalte ColCount-1.

Anmerkungen

Diese Eigenschaft funktioniert in Lazarus auf eine andere Weise als in Delphi when getting the data from the grid. In Lazarus wird ein temporäres TStringList Objekt erzeugt for retrieving the row content. Es ist in der Verantwortung des Benutzers, dieses Objekt nach der Verwendung wieder freizugeben.

This means also that changes in the returned list will not affect the grids content or layout.

Beispiele
  • Set Beispiel: Setzt den Inhalt der dritten Zeile im Grid (Zählung beginnt bei 0) aus einer ListBox:
Grid.Rows[2] := ListBox1.Items;
  • Get Beispiel: Set the content of a Listbox from the grid's row index 4:
procedure TForm1.FillListBox1;
var 
  StrTempList: TStringList;
begin
  StrTempList := TStringList(Grid.Rows[4]);
  if StrTempList<>nil then begin
    ListBox1.Items.Assign(StrTempList);
    StrTempList.Free;
  end;
end;  
  • Nicht funktionierendes Beispiel und Berichtigung: Retrieved string list is read only
// dies wird nicht funktionieren und einen Speicherüberlauf verursachen
// weil die zurückgegebene StringList nicht freigegeben wird
Grid.Rows[1].CommaText := '1,2,3,4,5';
Grid.Rows[2].Text := 'a'+#13#10+'s'+#13#10+'d'+#13#10+'f'+#13#10+'g'; 

// berichtigen des ersten Falls
Lst:=TStringList.Create;
Lst.CommaText := '1,2,3,4,5';
Grid.Rows[1] := Lst;
Lst.Free;

Eigenschaft UseXORFeatures;

Boolean Eigenschaft, Vorgabewert: false;

Diese Eigenschaft steuert wie the dotted focus rectangle appears in the grid. When true, the rectangle is painted using the XOR raster operation. This allow us to see the focus rectangle no matter what the cells' background color is. When false, the user can control the color of the dotted focus rectangle using the FocusColor property

It also controls the look of the column/row resizing. When true, a line shows visually the size that the the column or row will have if the user ends the operation. When false, the column or row resizing takes effect just as the user drags the mouse.

Grids Howto

Look and Feel

Operations

Save and Retrieve Grid Content

Die SaveToFile Prozedur erlaubt ihnen, die TStringGrid Formate, Attribute und Werte in eine XML Datei zu speichern. Zuvor müssen sie die SaveOptios Eigenschaft wie folgt setzen:

soDesign:     Save & Load ColCount,RowCount,FixedCols,FixedRows,
              ColWidths, RowHeights and Options (TCustomGrid)
soPosition:   Save & Load Scroll Position, Row, Col and Selection (TCustomGrid)
soAttributes: Save & Load Colors, Text Alignment & Layout, etc. (TCustomDrawGrid)
soContent:    Save & Load Text (TCustomStringGrid)

Die LoadFromFile Prozedur erlaubt ihnen, Attribute, Formate und Werte aus einer XML Datei in eine StringGrid Instanz zu laden. Zuerst müssen sie einige dieser Optionen der SaveOptios Eigenschaft setzen (in ihrer TStringGrid Instanz) SaveOptions

 soDesign:     Save & Load ColCount,RowCount,FixedCols,FixedRows,
               ColWidths, RowHeights and Options (TCustomGrid)
 soPosition:   Save & Load Scroll Position, Row, Col and Selection (TCustomGrid)
 soAttributes: Save & Load Colors, Text Alignment & Layout, etc. (TCustomDrawGrid)
 soContent:    Save & Load Text (TCustomStringGrid)

Beispiel: 1) Zuerst öffnen sie ein neues Projekt "Application". 2) Legen sie ein leeres TStringGrid ab. 3) Legen sie einen TButton ab. 4) Legen sie einen TOpenDialog ab. 5) Fügen sie ein OnCreate Ereignis für das Formular hinzu. 5) Fügen sie ein OnClick Ereignis für den Button hinzu.

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Grids,
  Buttons, StdCtrls, XMLCfg;

type

  { TForm1 }
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure Form1Create(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 

implementation

{ TForm1 }

procedure TForm1.Form1Create(Sender: TObject);
begin
 //setzt die SaveOptions bei der Erzeugung des Formulars 
 stringgrid1.SaveOptions := [soDesign,soPosition,soAttributes,soContent];
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
 //Ask if thew Execute method of the OpenDialog was launched 
 //when this occurs, the user selects an XML file to Load
 //wich name was stored in the FileName prop.

 if opendialog1.Execute then
 Begin
   //Clear the grid 
   StringGrid1.Clear;
   //Load the XML
   StringGrid1.LoadFromFile(OpenDialog1.FileName);
   //Refresh the Grid
   StringGrid1.Refresh;
 End;
end;

initialization
  {$I unit1.lrs}

end.

Die Beispiel-XML-Datei: (Kopieren sie den Text unterhalb in eine Textdatei und vergessen sie den XML Header nicht :-))

''<?xml version="1.0"?>
<CONFIG>
  <grid version="3">
    <saveoptions create="True" position="True" content="True"/>
    <design columncount="2" rowcount="5" fixedcols="1" fixedrows="1" defaultcolwidth="64" defaultRowHeight="20">
      <options>
        <goFixedVertLine value="True"/>
        <goFixedHorzLine value="True"/>
        <goVertLine value="True"/>
        <goHorzLine value="True"/>
        <goRangeSelect value="True"/>
        <goDrawFocusSelected value="False"/>
        <goRowSizing value="False"/>
        <goColSizing value="False"/>
        <goRowMoving value="False"/>
        <goColMoving value="False"/>
        <goEditing value="False"/>
        <goTabs value="False"/>
        <goRowSelect value="False"/>
        <goAlwaysShowEditor value="False"/>
        <goThumbTracking value="False"/>
        <goColSpanning value="False"/>
        <goRelaxedRowSelect value="False"/>
        <goDblClickAutoSize value="False"/>
        <goSmoothScroll value="True"/>
      </options>
    </design>
    <position topleftcol="1" topleftrow="1" col="1" row="1">
      <selection left="1" top="1" right="1" bottom="1"/>
    </position>
    <content>
      <cells cellcount="10">
        <cell1 column="0" row="0" text="Title Col1"/>
        <cell2 column="0" row="1" text="value(1.1)"/>
        <cell3 column="0" row="2" text="value(2.1)"/>
        <cell4 column="0" row="3" text="value(3.1)"/>
        <cell5 column="0" row="4" text="value(4.1)"/>
        <cell6 column="1" row="0" text="Title Col2"/>
        <cell7 column="1" row="1" text="value(1.2)"/>
        <cell8 column="1" row="2" text="value(2.2)"/>
        <cell9 column="1" row="3" text="value(3.2)"/>
        <cell10 column="1" row="4" text="value(4.2)"/>
      </cells>
    </content>
  </grid>
</CONFIG>''

--Raditz 21:06, 11 Jan 2006 (CET) from ARGENTINA

Grid Cell Editors

The grid uses cell editors to change the content of cells. For a specilized grid like TStringGrid, the editor is the habitual single line text editor control, sometimes it's desireable to have other means to enter information. For example, to call the open file dialog to find the location of a file so the user doesn't have to type the full path manually, if the text in the cell represents a date, it would be more friendly if we could popup a calendar so we can choose a specific date easily. Sometimes the information the user should enter in a cell is restricted to a limited list of words, in this case typing the information directly might introduce errors and validating routines might need to be implemented, we can avoid this by using a cell editor that present the user a list with only the legal values. This is also the case of generic grids like TDrawGrid where user have to have some kind of structure to hold the data that will be shown in the grid, in this situation, the information that is entered in the cell editor updates the internal structure to reflect the changes in the grid.

Builtin cell editors

The grids.pas unit already include some of the most used cell editors ready for use in grids, there is also the posibility to create new cell editors (custom cell editors) if the builtin editors are not appropiated for a specific tasks.

The builtin cell editors are Button, Edit, and Picklist.

Using cell editors

Users can specify what editor will be used for a cell using one of two methods.

  1. Using a custom column and selecting the ButtonStyle property of column. In this method the user can select the style of the editor that will be shown. Available values are: cbsAuto, cbsEllipsis, cbsNone, cbsPickList, cbsCheckboxColumn
  2. Using OnSelectEditor grid event, here the user specify in the Editor parameter which editor to use for a cell identified for column aCol and row ARow in a TCustomDrawGrid derived grid or TColumn in TCustomDBGrid. For this purpose there is a useful public function of grids, EditorByStyle() that takes as parameter one of the following values: cbsAuto, cbsEllipsis, cbsNone, cbsPickList, cbsCheckboxColumn. This method takes precedence over the first one using custom columns. A Custom cell editor can be specified here. This event is also the place to setup the editor with values specific to the cell, row or column.

Description of editor styles

The following is the description of each editor style, they are enumeated values of type TColumnButtonStyle and so they are prefixed by 'cbs'. This type was used so it remains compatible with delphi's dbgrid.

  • cbsAuto
This is the default editor style for TCustomGrid derived grids. The actual editor class that will be used to edit the cell content, depends on several factors. For TCustomGrids it uses a TStringCelleditor class derived from TCustomMaskEdit, this editor is speciallized to edit single line strings. It is then used in TStringGrid and TDrawGrid by default. When using Custom Columns and programmer filled the Column's PickList property, this behaves as if cbsPickList editor style was set. For a TCustomDBGrid that have a field of type boolean, behaves as if cbsCheckBoxColumn editor style was specified. This is the recomended value for Custom Cell Editors TODO: related OnEditingDone.
  • cbsEllipsis
This editor style is the most generic one. When used, a button appears in the editing cell, programmers could use the OnEditButtonClick grid event to detect when user has pressed the button and take any action was programmed for such cell. For example a programmer could use this editor style to pop up a calendar dialog so user can easily pick a specific date, another could be to show a file open dialog to find files, a calculator so user can enter the numeric result of calcs, etc.
OnEditButtonClick is just a notification, so to find out which cell a button has been clicked, take a look at grid.Row and grid.Col properties.
A DbGrid has specific properties to retrieve the active column or field and because this event occurs in active record, it could update the information in active field.
This editor style is implemented using TButtonCellEditor a direct descendant of TButton.
  • cbsNone
This editor style instruct the grid to not use any editor for a specific cell or column, it behaves then, as if the grid is readonly for such cell or column.
  • cbsPickList
Used to present the user a list of values that can be entered, this editor style is implemented using TPickListCellEditor a component derived from TCustomComboBox. The list of values that are shown, are filled in two ways depending of the method used to select the editor style.
  1. When using custom columns, programmers can enter a list of values using the column's PickList property. [FOR BEGINNERS: TODO: exact procedure to edit the list]
  2. In OnSelectEditor, programmers get the TPickListCellEditor instance using the function EditorByStyle(cbsPickList), an example would be: var Lst:TPickListCellEditor; begin [...] Lst:=TPickListCellEditor(EditorByStyle(cbsPickList)); Lst.clear; Lst.Items.add('One');lst.items.add('Two'); Editor:=Lst; end;
The value in a TStringGrid grid will automatically reflect the value selected, if necessary the programmer could detect the moment the value is selected by writing an event handler for grid's OnPickListSelect event, so additional steps can be taken for example, to process the new value. TODO: related OnEditingDone.
  • cbsCheckboxColumn
This editor style is at the moment only available in TDbGrid. This editor style can be useful when field content associated with the column are restricted to a pair of values, for example, yes-no, true-false, on-off, 1-0, etc. Instead of forcing the user to type the values for this kind of field in a StringCellEditor or to choose one from a list, cbsCheckboxColumn is used to modify the field content of a column by using a checkbox representation that user can toggle by using a mouse click or pressing the SPACE key.
If columns' ButtonStyle property is set to cbsAuto and DbGrid detects that the field associated to the column is a boolean field, then the grid use this editor style automatically, this automatic selection can be disabled or enabled using dbgrid's OptionsExtra property, setting dgeCheckboxColumn element to false disable this feature.
The values that are used to recognize the checked or unchecked states are set in column's properties ValueChecked and ValueUnchecked.
In any moment, the field value can be in one to three states: Unchecked, checked or grayed. Internally this states are identified by the following values of type TDBGridCheckBoxState: gcbpUnChecked, gcbpChecked and gcbpGrayed.
This editor style doesn't use real TCheckbox components to handle user interaction, the visual representation is given by three builtin bitmap images that corresponds to the possible states of checkbox. The used bitmaps can be customized by writing a handler for DBGrid event OnUserCheckboxBitmap, the handler of this event gets the state of the checkbox in parameter CheckedState of type TDbGridCheckboxState and a bitmap parameter that programmer could use to specify custom bitmaps.

Beispiel: How to set a custom cell editor

Siehe lazarus/examples/gridcelleditor/gridcelleditor.lpi

Todo

  • TInplaceEditor Unterstützung

Bekannte Probleme

29-März-2005:

  • mouse autoedit
    • Linux: Klicken auf eine gewählte Zelle löst nicht die autoedit Funktion aus (der Editor verliert sofort den Fokus)
    • Windows: it should work only if the grid has the focus, if not it should focus and a second click should autoedit (cannot detect if the grid was previously focused or not)
  • ColumnWidths: Linux, Windows: dbgrid start with default column widths instead of calculated ones (it's disabled because early canvas creation causes strange effects if the parent is a notebook page)
  • Resizing Columns: Linux, Windows. Resizing a column should not hide the editor (specially in dbgrid if we are inserting)
  • MouseWheel:
    • Linux: mousewheel doesn't work as it should, (seems it's calling the default mousewheel handler)
    • Windows: patch was sent.
  • Double painting: Apparently dbgrid is painting twice the cell background (one with fillrect and one in textRect)
  • AutoFillColumns: sometimes the clientwidth is evaluated incorrectly (sometimes there are phantom scrollbars)