InspectorBar controls : Using custom inplace editors
The InspectorBars provide a similar functionality as TAdvStringGrid to use any TWinControl descendent component as inplace editor for the InspectorBar. This is done through a TInspectorEditLink that handles the communication between the InspectorBar and the TWinControl based inplace editor. To start using a custom inplace editor, it is then sufficient to :1) Drop the TInspectorEditLink component for the custom editor on the form
2) Set the EditLink property for the item that needs to be edited with this custom inplace editor to the InspectorEditLink component
3) Set the PropertyType to ptCustom
The InspectorBar has also the capability to draw an always visible dropdown button, spin up/down buttons and ellipsis button when the inplace editor is not visible.
This is done with the event : OnCustomEditButton. This event queries the button type that must be drawn for the custom editor. In case no button must be drawn, set the parameter AEditButton to ebNone. If drawing the button is not sufficient, but the value part of the property editor must be fully custom drawn, the OnCustomEditDraw event can be used. This allows drawing the value part during the time the inplace editor is not visible. A typical use for this custom drawing is showing a color as a color preview box instead of text only.
Before covering more in depth the creation of InspectorEditLink components, this is a brief look at how these are used. There are 2 categories of custom inplace editors possible. Either the inplace editor is shown in the inspector value rectangle or is shown as a popup. This is controlled by the EditStyle which can be esInplace or esPopup. When the esPopup style is choosen, the PopupWidth and PopupHeight control the size of the popup window at edit time.
The AEInspectorEditLink component enables the use of TAdvEdit in the InspectorBar. It exposes several properties such as EditColor, EditType, ModifiedColor, Prefix, Suffix etc.. These properties are applied to the TAdvEdit control when the edit control needs to be activated. Additional properties can be set from the OnSetProperties event. The ColComboInspectorEditLink makes using the TColumnComboBox component possible in the Inspector. The ColComboInspectorEditLink creates the ColumnComboBox and exposes this as ColComboInspectorEditLink.ColumnCombobox. This ColumnCombobox can as such be configured for its use in the Inspector from the OnSetProperties event. This example shows how it is done :
procedure TForm1.ColComboInspectorEditLink1SetProperties(Sender: TObject; R: TRect; Item: TInspectorItem); begin with ColComboInspectorEditLink1.ColumnComboBox do begin // Configure the columns Columns.Clear; with Columns.Add do begin Width := 50; Font.Name := 'Tahoma'; end; with Columns.Add do begin Width := 150; Font.Color := clBlue; Font.Style := [fsItalic]; Font.Name := 'Tahoma'; end; ComboItems.Clear; // Add the items in 2 columns with ComboItems.Add.Strings do begin Add('BMW'); Add('3 series'); end; with ComboItems.Add.Strings do begin Add('Porsche'); Add('Boxster Roadster series'); end; with ComboItems.Add.Strings do begin Add('Mercedes'); Add('SL Grand Tourismo series'); end; with ComboItems.Add.Strings do begin Add('Audi'); Add('TT roadster series'); end; // Use the Item's IntValue to preselect the correct combobox entry ItemIndex := Item.IntValue; end; end;
Creation of TInspectorEditLink descendent components :
This is the base class for a TInspectorEditLink. All descendent components will at least override a few methods of the base class to support a custom inplace editor.
TInspectorEditLink = class(TComponent) public function GetEditor: TWinControl; virtual; procedure CreateEditor(AParent:TWinControl); virtual; procedure DestroyEditor; virtual; procedure SetProperties(R: TRect; Item: TInspectorItem); virtual; procedure StartEdit(Item: TInspectorItem); virtual; procedure StopEdit(Item: TInspectorItem); virtual; function GetEditorValue: string; virtual; procedure SetEditorValue(s: string); virtual; procedure SetOriginalValue; virtual; property Inspector: TInspectorBar; published property EditStyle: TInspectorEditStyle; property PopupWidth: Integer; property PopupHeight: Integer; property WantKeyLeftRight: Boolean; property WantKeyUpDown: Boolean; property WantKeyHomeEnd: Boolean; property WantKeyPriorNext: Boolean; property WantKeyReturn: Boolean; property WantKeyEscape: Boolean; property Tag: Integer; property OnSetProperties: TInspSetPropertiesEvent; end;Virtual methods:
The first function that will always have to be used is GetEditor. Use this function to return the custom inplace editor as a TWinControl. The CreateEditor method is called when the inplace editor needs to be activated. Either this method can be used to create an instance of the inplace editor or the TInspectorEditLink constructor. The DestroyEditor is called when the inplace editor editing ends. Either in this method, the inplace editor can be destroyed or in the TInspectorEditLink's destructor. The StartEdit method is called just before making the editor visible. It allows setting some inplace editor values dependent on the item being edited. The StopEdit method allows to set some values in the item being edited after editing is done. 2 methods are used to get and set the item's value as a text : SetEditorValue & GetEditorValue. Finally, the method SetOriginalValue is called when the value needs to be restored when the users pressed ESC.
Properties:
The base class properties WantKeyXXXX are used to set which keystrokes the inplace editor will handle itself and which ones are handled automatically by the Inspector. The EditStyle determines whether the inplace editor is a displayed in the text value rectangle (esInplace style) or uses a popup (esPopup style) In the esPopup style, the PopupWidth / PopupHeight determine the size of the popup. Applying this to create an InspectorEditLink for TAdvEdit results in following code:
{ TAEInspectorEditLink } constructor TAEInspectorEditLink.Create(AOwner: TComponent); begin inherited; // Initialize default properties FAdvEdit := nil; FEditColor := clWhite; FModifiedColor := clRed; end; procedure TAEInspectorEditLink.CreateEditor(AParent: TWinControl); begin inherited; // Create an instance of TAdvEdit if not Assigned(FAdvEdit) then FAdvEdit := TAdvEdit.Create(AParent); // Make sure it is not visible yet FAdvEdit.Width := 0; FAdvEdit.Height := 0; FAdvEdit.Parent := AParent; FAdvEdit.Visible := False; // Use the Inspectors keyboard handling FAdvEdit.OnKeyDown := EditKeyDown; end; destructor TAEInspectorEditLink.Destroy; begin // Make sure the TAdvEdit instance is destroyed in all circumstances if Assigned(FAdvEdit) then FAdvEdit.Free; FAdvEdit := nil; inherited; end; procedure TAEInspectorEditLink.DestroyEditor; begin // Destroy the TAdvEdit instance if Assigned(FAdvEdit) then FAdvEdit.Free; FAdvEdit := nil; inherited; end; function TAEInspectorEditLink.GetEditor: TWinControl; begin // Returns the inplace edit control as TWinControl Result := FAdvEdit; end; procedure TAEInspectorEditLink.SetOriginalValue; begin inherited; // Restore original value when ESC is pressed FAdvEdit.Text := FOrigValue; end; procedure TAEInspectorEditLink.SetProperties(R: TRect; Item: TInspectorItem); begin // Method called just before display of the inplace editor, allows to set // all properties here inherited; InflateRect(R,-2,-1); R.Right := R.Right - 20; FAdvEdit.Left := R.Left; FAdvEdit.Top := R.Top; FAdvEdit.Width := R.Right - R.Left; FAdvEdit.Height := R.Bottom - R.Top; FAdvEdit.BorderStyle := bsNone; FAdvEdit.Font.Assign(Item.InspectorPanel.Font); FAdvEdit.Color := FEditColor; FAdvEdit.FocusColor := FEditColor; FAdvEdit.EditType := FEditType; FAdvEdit.EditAlign := FEditAlign; FAdvEdit.ModifiedColor := FModifiedColor; FAdvEdit.Prefix := FPrefix; FAdvEdit.Suffix := FSuffix; FAdvEdit.ShowModified := FShowModified; FAdvEdit.Precision := FPrecision; end; procedure TAEInspectorEditLink.StartEdit(Item: TInspectorItem); begin inherited; // Save current value to be able to restore when ESC is pressed & set initial value FOrigValue := Item.TextValue; FAdvEdit.Text := Item.TextValue; FAdvEdit.Visible := True; FAdvEdit.SetFocus; end; procedure TAEInspectorEditLink.StopEdit(Item: TInspectorItem); begin // Update item with edited value inherited; Item.TextValue := FAdvEdit.Text; FAdvEdit.Visible := False; end;
The INSPLINKS.PAS code is included in the distribution for TInspectorBar and can be used in Delphi & C++Builder
×