Dit artikel gaat over het “Gridpack”, een subset van het complete Component pack met daarin TAdvStringGrid, een aantal afgeleide en aanvullende componenten.
TMS legt bij TAdvStringGrid de nadruk op zoveel mogelijk features in de component. Heel mooi natuurlijk, maar hieraan kleeft ook een nadeel. De vele properties, methods en events laten de component onoverzichtelijk overkomen. Dit maakt dat het even duurt, voordat je je weg gevonden hebt. Gelukkig is er documentatie beschikbaar in PDF formaat. Omdat er voortdurend verder ontwikkeld wordt, loopt deze documentatie echter meestal achter.
Maar gelukkig zijn er naast de PDF documentatie ook nog newsgroups, voorbeeldapplicaties en een erg goede email ondersteuning, verzorgd door Bruno Fierens. Deze communicatiemiddelen zorgen ervoor dat de grid steeds verbeterd wordt, want Bruno implementeert suggesties als deze bruikbaar blijken.
Als je de grid vanuit het pallet op je form zet, lijkt het in eerste instantie niet veel bijzonders. Standaard heeft de grid een XP look, maar dit kan naar wens aangepast worden.
Visueel is het geheel snel op te leuken door bands aan te zetten (dit zijn afwisselende kleuren in de rijen) of een achtergrondplaatje toe te voegen. Verder zijn alle mogelijke kleuren aan te passen en je kunt ook het aantal vaste rijen en kolommen zelf bepalen.
Met de RowHeaders en ColHeaders TStrings property vul je in wat je op je deze rijen of kolommen wilt hebben.
Veel interessants tref je via Set Property Options aan.
Een greep uit het aanbod:
- goRowSizing/goColSizing: de gebruiker kan rijen/kolommen breder of smaller maken.
- goRowMoving/goColMoving: een complete rij kan naar een andere positie gesleept worden
- goEditing: cellen kunnen voor het hele grid gewijzigd worden. Dit is een master-switch. Per cel kan bepaald worden wat er ingevuld wordt en met welke editor. Ik ga daar verderop in dit artikel op in.
- goRowSelect: laat de gebruiker niet een cel tegelijk selecteren, maar een rij tegelijk.
Inmiddels ziet mijn grid er zo uit:
Nu wil ik op celniveau kunnen bepalen of een gebruiker wel of niet mag wijzigen. Hiervoor is het OnCanEditCell event:
procedure TSDCForm.SDCGridCanEditCell(Sender: TObject;
ARow, ACol: Integer;
var CanEdit: Boolean);
begin
CanEdit := (Sender as TAdvStringGrid).Cells[ACol,0] <>'';
end;
Let hierbij op, dat als je goRowMoving/goColmoving aan hebt staan, zoals ik in dit voorbeeld, je niet hard op rij- of kolom-index kunt checken.
De Cells property gedraagt zich als een tweedimensionale array van strings, waar je eerst de kolom opgeeft en daarna de rij. Leuk is dat je een subset van HTML kunt gebruiken om cellen opmaak te geven, iets wat vaker terug komt in andere componenten van TMS.
Per cel kan ik ook de editor bepalen met het OnGetEditorType event
Per cel kan ik ook de editor bepalen met het OnGetEditorType event:
procedure TSDCForm.SDCGridGetEditorType(Sender: TObject;
ACol, ARow: Integer;
var AEditor: TEditorType);
var Grid : TAdvStringGrid;
begin
Grid := (Sender as TAdvStringGrid);
if Grid.Cells[ACol,0] = 'Zaal' then
begin
AEditor := edComboList;
Grid.Combobox.Clear;
Grid.Combobox.Items.Add('Delphi');
Grid.Combobox.Items.Add('C#');
Grid.Combobox.Items.Add('FoxPro');
end;
if Grid.Cells[ACol,0] = 'Datum' then
AEditor := edDateEdit;
if Grid.Cells[ACol,0] = 'Aanwezig' then
AEditor := edCheckBox;
if Grid.Cells[ACol,0] = 'Foto' then
AEditor := edButton;
end;
Editors zijn er in veel verschillende smaken:
TEditorType =
(edNormal, edSpinEdit, edComboEdit, edComboList,
edEditBtn, edCheckBox, eDateEdit, edDateEditUpDown,
edTimeEdit, edButton, edDataCheckBox, edNumeric,
edPositiveNumeric, edFloat, edCapital, edMixedCase,
edPassword, edUnitEditBtn, edLowerCase, edUpperCase,
edFloatSpinEdit, edTimeSpinEdit, edDateSpinEdit,
edNumericEditBtn, edFloatEditBtn, edCustom, edRichEdit,
edNone
{$IFDEF TMSUNICODE}
, edUniEdit,edUniComboEdit,edUniComboList
{$ENDIF}
);
Als je niets doet is de editor edNormal. Dit is een normale Edit component.
Veel editors (zoals edComboList hierboven) maken gebruik van een andere component, embedded in de grid.
De grid heeft hier ook de benodigde events voor, b.v. OnEllipsClick (zie hieronder).
Het is ook mogelijk om eigen editors te maken. Je kiest dan als AEditor edCustom en wijst dan runtime een EditLink toe. Dit is een klasse afgeleid van TEditLink. Door een aantal methods te overriden bepaal je welke component getoond wordt in de grid en hoe deze zich gedraagt.
Je kunt zo iedere component die afstamt van TWinControl gebruiken. Er wordt standaard een aantal EditLinks meegeleverd.
TFormControlEditLink is ook een mogelijkheid. Je zet dan een control op je form, die je doorlinkt via deze component naar de grid.
Nu de foto nog. Als de gebruiker op de button klikt, open ik een PictureDialog en laad ik de foto in de grid:
procedure TSDCForm.SDCGridEllipsClick(Sender: TObject;
ACol, ARow: Integer; var S: String);
var Grid : TAdvStringGrid;
begin
Grid := (Sender as TAdvStringGrid);
if Grid.Cells[ACol,0] = 'Foto' then
if OpenPictureDialog.Execute then
Grid.CreateFilePicture(ACol,ARow,False,NoStretch,
0,haLeft,vaTop).Filename :=
OpenPictureDialog.FileName;
end;
Het mooie van FilePicture is dat het alleen de filereferentie opslaat in de grid. Pas als het plaatje in beeld komt, wordt het plaatje daadwerkelijk geladen. Dit scheelt flink wat geheugen als je met meer rijen werkt dan in het voorbeeld.
De grid heeft veel mogelijkheden om data te importeren en nog meer om te exporteren
De grid heeft veel mogelijkheden om data te importeren en nog meer om te exporteren. Er zijn methods om te importeren van native-, XLS-, CSV-, MDB tables- en stream-formaat. Voor exporteren komt daar nog HTML, ASCII en DOC bij.
Helaas zou dit artikel te lang worden als ik alle features van de grid zou behandelen. Ik heb het bijvoorbeeld nog niet gehad over de uitgebreide sorteer-, navigatie-, filter-, zoek- en print mogelijkheden. Ook is het mogelijk om met treenodes bepaalde rijen te verbergen en weer tevoorschijn te halen.
Rest mij nog een overzicht van afgeleiden en aanvullende componenten:
- TAdvGridWorkbook: ondersteuning voor meerdere sheets (a la Excel)
- TAdvColumnGrid: met een collection property met daarin kolomobjecten. Het kolomobject heeft vele properties, die dus voor iedere kolom apart kunnen worden ingesteld.
- TAdvSpreadGrid: Excel formule functionaliteit.
- TDBAdvStringGrid: de data-aware versie. Je hebt de mogelijkheid om per veld in de database properties op te geven, zoals de editor.
- TAdvGridExcelIO: native XLS file import en export
- TESBMathsLib: koppelt de ESB mathematics library
- TChartLink: TCharts synchroniseren
- TFormCtrlLink: een willekeurige TWinControl op je form als grid editor gebruiken
Meer informatie kun je vinden op: www.tmssoftware.com