lasarus_compotents/RXLib/rxdb/rxdbverticalgrid.pas

1710 lines
46 KiB
ObjectPascal

{ rxdbgrid unit
Copyright (C) 2005-2017 Lagunov Aleksey alexs75@yandex.ru and Lazarus team
original conception from rx library for Delphi (c)
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at your
option) any later version with the following modification:
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent modules,and
to copy and distribute the resulting executable under terms of your choice,
provided that you also meet, for each linked independent module, the terms
and conditions of the license of that module. An independent module is a
module which is not derived from or based on this library. If you modify
this library, you may extend this exception to your version of the library,
but you are not obligated to do so. If you do not wish to do so, delete this
exception statement from your version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
for more details.
You should have received a copy of the GNU Library General Public License
along with this library; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
}
{$I rx.inc}
unit rxdbverticalgrid;
interface
uses
Classes, SysUtils, Types, Grids, Graphics, Controls, DB, Menus;
type
TRxDBVerticalGridOption = (rxvgColumnTitle);
TRxDBVerticalGridOptions = set of TRxDBVerticalGridOption;
TRxDBVerticalGridRowStyle = (rxvrData, rxvrStaticText);
type
TRxCustomDBVerticalGrid = class;
TRxDBVerticalGridRow = class;
TRxDBVerticalGridRowsEnumerator = class;
{ TRxDBVerticalGridDataLink }
TRxDBVerticalGridDataLink = class(TDataLink)
private
FDataControl:TRxCustomDBVerticalGrid;
protected
constructor Create(ADataControl:TRxCustomDBVerticalGrid);
procedure ActiveChanged; override;
procedure LayoutChanged; override;
procedure FocusControl(Field: TFieldRef); override;
procedure RecordChanged(Field: TField); override;
procedure UpdateData; override;
end;
{ TRxDBVerticalGridDefValues }
TRxDBVerticalGridDefValues = class(TPersistent)
private
FBlobText: string;
FOwner: TRxCustomDBVerticalGrid;
protected
procedure AssignTo(Dest: TPersistent); override;
public
constructor Create(AOwner: TRxCustomDBVerticalGrid);
destructor Destroy; override;
published
property BlobText:string read FBlobText write FBlobText;
end;
{ TRxDBVerticalGridRowTitle }
TRxDBVerticalGridRowTitle = class(TPersistent)
private
FFont: TFont;
FRow: TRxDBVerticalGridRow;
FisDefaultTitleFont : Boolean;
FIsDefaultCaption: boolean;
FAlignment: ^TAlignment;
FColor: ^TColor;
FCaption: PChar;
function GetAlignment: TAlignment;
function GetCaption: TCaption;
function GetColor: TColor;
function GetFont: TFont;
function IsAlignmentStored: Boolean;
function IsCaptionStored: Boolean;
function IsColorStored: Boolean;
function IsFontStored: Boolean;
procedure SetAlignment(AValue: TAlignment);
procedure SetCaption(AValue: TCaption);
procedure SetColor(AValue: TColor);
procedure SetFont(AValue: TFont);
procedure FontChanged(Sender: TObject);
property IsDefaultFont: boolean read FIsDefaultTitleFont;
protected
function GetDefaultCaption: string; virtual;
function GetDefaultAlignment: TAlignment;
function GetDefaultColor: TColor;
public
constructor Create(ARow: TRxDBVerticalGridRow);
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
procedure FillTitleDefaultFont;
function IsDefault: boolean;
property Row: TRxDBVerticalGridRow read FRow;
published
property Alignment: TAlignment read GetAlignment write SetAlignment stored IsAlignmentStored;
property Caption: TCaption read GetCaption write SetCaption stored IsCaptionStored;
property Color: TColor read GetColor write SetColor stored IsColorStored;
property Font: TFont read GetFont write SetFont stored IsFontStored;
end;
{ TRxDBVerticalGridRow }
TRxDBVerticalGridRow = class(TCollectionItem)
private
FButtonStyle: TColumnButtonStyle;
FColor: ^TColor;
FAlignment: ^TAlignment;
FNotInKeyListIndex: integer;
FPopupMenu: TPopupMenu;
FRowHeight: PInteger;
FShowBlobImagesAndMemo: boolean;
FValueChecked: PChar;
FValueUnchecked: PChar;
FFieldName: String;
FDisplayFormat : String;
FDisplayFormatChanged: boolean;
FField: TField;
FGroupName: string;
FKeyList: TStringList;
FPickList: TStringList;
FFont: TFont;
FImageList: TImageList;
FisDefaultFont: Boolean;
FReadOnly: Boolean;
FRowTitle: TRxDBVerticalGridRowTitle;
FStaticText: string;
FStyle: TRxDBVerticalGridRowStyle;
FWordWrap: Boolean;
function GetAlignment: TAlignment;
function GetColor: TColor;
function GetDisplayFormat: string;
function GetField: TField;
function GetFont: TFont;
function GetGrid: TRxCustomDBVerticalGrid;
function GetKeyList: TStrings;
function GetPickList: TStrings;
function GetRowHeight: Integer;
function GetValueChecked: string;
function GetValueUnchecked: string;
function IsAlignmentStored: Boolean;
function IsColorStored: Boolean;
function IsDisplayFormatStored: Boolean;
function IsFontStored: Boolean;
function IsValueCheckedStored: Boolean;
function IsValueUncheckedStored: Boolean;
procedure SetAlignment(AValue: TAlignment);
procedure SetButtonStyle(AValue: TColumnButtonStyle);
procedure SetColor(AValue: TColor);
procedure SetDisplayFormat(AValue: string);
procedure SetField(AValue: TField);
procedure SetFieldName(AValue: String);
procedure SetFont(AValue: TFont);
procedure SetGroupName(AValue: string);
procedure SetImageList(AValue: TImageList);
procedure SetKeyList(AValue: TStrings);
procedure SetNotInKeyListIndex(AValue: integer);
procedure SetPickList(AValue: TStrings);
procedure SetPopupMenu(AValue: TPopupMenu);
procedure SetReadOnly(AValue: Boolean);
procedure SetRowHeight(AValue: Integer);
procedure SetRowTitle(AValue: TRxDBVerticalGridRowTitle);
procedure LinkField;
procedure ApplyDisplayFormat;
procedure FontChanged(Sender: TObject);
procedure KeyListChanged(Sender: TObject);
procedure SetShowBlobImagesAndMemo(AValue: boolean);
procedure SetStaticText(AValue: string);
procedure SetStyle(AValue: TRxDBVerticalGridRowStyle);
procedure SetValueChecked(AValue: string);
procedure SetValueUnchecked(AValue: string);
procedure SetWordWrap(AValue: Boolean);
protected
function GetDefaultValueChecked: string; virtual;
function GetDefaultValueUnchecked: string; virtual;
function GetDisplayName: string; override;
function GetDefaultAlignment : TAlignment; virtual;
function GetDefaultRowHeight : integer;
procedure RowChanged;
function GetDefaultDisplayFormat: string;
property IsDefaultFont: boolean read FIsDefaultFont;
function GetDefaultColor: TColor; virtual;
function EditorStyle:TColumnButtonStyle;
//property GroupName:string read FGroupName write SetGroupName;
public
constructor Create(ACollection: TCollection); override;
destructor Destroy; override;
procedure FillDefaultFont;
procedure Assign(Source: TPersistent); override;
property Field: TField read GetField write SetField;
property Grid: TRxCustomDBVerticalGrid read GetGrid;
published
property Alignment: TAlignment read GetAlignment write SetAlignment stored IsAlignmentStored;
property ButtonStyle: TColumnButtonStyle read FButtonStyle write SetButtonStyle default cbsAuto;
property FieldName: String read FFieldName write SetFieldName;
property RowTitle:TRxDBVerticalGridRowTitle read FRowTitle write SetRowTitle;
property Color: TColor read GetColor write SetColor stored IsColorStored;
property Font: TFont read GetFont write SetFont stored IsFontStored;
property DisplayFormat: string read GetDisplayFormat write SetDisplayFormat stored IsDisplayFormatStored;
property StaticText:string read FStaticText write SetStaticText;
property ImageList: TImageList read FImageList write SetImageList;
property NotInKeyListIndex: integer read FNotInKeyListIndex write SetNotInKeyListIndex default -1;
property KeyList: TStrings read GetKeyList write SetKeyList;
property PickList: TStrings read GetPickList write SetPickList;
property Style : TRxDBVerticalGridRowStyle read FStyle write SetStyle default rxvrData;
property WordWrap : Boolean read FWordWrap write SetWordWrap;
property RowHeight : Integer read GetRowHeight write SetRowHeight;
property ReadOnly : Boolean read FReadOnly write SetReadOnly;
property PopupMenu : TPopupMenu read FPopupMenu write SetPopupMenu;
property ValueChecked: string read GetValueChecked write SetValueChecked stored IsValueCheckedStored;
property ValueUnchecked: string read GetValueUnchecked write SetValueUnchecked stored IsValueUncheckedStored;
property ShowBlobImagesAndMemo:boolean read FShowBlobImagesAndMemo write SetShowBlobImagesAndMemo default false;
end;
{ TRxDBVerticalGridRows }
TRxDBVerticalGridRows = class(TOwnedCollection)
private
function GetRow(Index: Integer): TRxDBVerticalGridRow;
procedure SetRow(Index: Integer; AValue: TRxDBVerticalGridRow);
protected
procedure Update(Item: TCollectionItem); override;
public
procedure LinkField;
function Add: TRxDBVerticalGridRow;
property Items[Index: Integer]: TRxDBVerticalGridRow read GetRow write SetRow; default;
function GetEnumerator: TRxDBVerticalGridRowsEnumerator;
end;
{ TRxDBVerticalGridRowsEnumerator }
TRxDBVerticalGridRowsEnumerator = class
private
FList: TRxDBVerticalGridRows;
FPosition: Integer;
public
constructor Create(AList: TRxDBVerticalGridRows);
function GetCurrent: TRxDBVerticalGridRow;
function MoveNext: Boolean;
property Current: TRxDBVerticalGridRow read GetCurrent;
end;
{ TRxCustomDBVerticalGrid }
TRxCustomDBVerticalGrid = class(TCustomGrid)
private
FDataLink: TRxDBVerticalGridDataLink;
FGridDefValues: TRxDBVerticalGridDefValues;
FOptions: TRxDBVerticalGridOptions;
FReadOnly: Boolean;
FRows: TRxDBVerticalGridRows;
FLinkActive:integer;
FTmpPicture:TPicture;
function GetDataCoumn: TGridColumn;
function GetDataSource: TDataSource;
function GetLabelCoumn: TGridColumn;
procedure SetDataCoumn(AValue: TGridColumn);
procedure SetDataSource(AValue: TDataSource);
procedure SetGridDefValues(AValue: TRxDBVerticalGridDefValues);
procedure SetLabelCoumn(AValue: TGridColumn);
procedure SetOptions(AValue: TRxDBVerticalGridOptions);
procedure SetRows(AValue: TRxDBVerticalGridRows);
procedure RecordChanged;
procedure RowsChanged(aRow: TRxDBVerticalGridRow);
procedure UpdateRowsHight;
protected
procedure OutCaptionCellText(aCol, aRow: integer; const aRect: TRect;
aState: TGridDrawState; const ACaption: string);
procedure DrawCell(aCol,aRow:Integer; aRect:TRect; aState:TGridDrawState); override;
procedure DrawDataCell(aCol, aRow:Integer; aRect:TRect; aState:TGridDrawState; AGridRow: TRxDBVerticalGridRow);
procedure DrawCheckboxBitmaps(aRect: TRect; AGridRow: TRxDBVerticalGridRow);
procedure DrawCellBitmap(AGridRow: TRxDBVerticalGridRow; aRect: TRect; aState: TGridDrawState; AImageIndex: integer);
procedure DrawDataCellPicture(AGridRow: TRxDBVerticalGridRow; aRect: TRect; aState: TGridDrawState);
procedure PrepareCanvas(aCol, aRow: Integer; aState:TGridDrawState); override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: integer); override;
procedure LinkActive(Value: Boolean); virtual;
procedure BeginLink;
procedure EndLink;
property Rows:TRxDBVerticalGridRows read FRows write SetRows;
property Options:TRxDBVerticalGridOptions read FOptions write SetOptions;
property DataSource: TDataSource read GetDataSource write SetDataSource;
property ReadOnly: Boolean read FReadOnly write FReadOnly default false;
property LabelCoumn:TGridColumn read GetLabelCoumn write SetLabelCoumn;
property DataCoumn:TGridColumn read GetDataCoumn write SetDataCoumn;
property GridDefValues:TRxDBVerticalGridDefValues read FGridDefValues write SetGridDefValues;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
TRxDBVerticalGrid = class(TRxCustomDBVerticalGrid)
published
property Align;
property AlternateColor;
property Anchors;
property AutoEdit;
property AutoFillColumns;
property BiDiMode;
property BorderColor;
property BorderSpacing;
property BorderStyle;
property CellHintPriority;
property Color;
property GridDefValues;
property DataCoumn;
property DataSource;
property DefaultRowHeight;
property FixedColor;
property FixedHotColor;
property FocusColor;
property LabelCoumn;
property Options;
property ReadOnly;
property Rows;
property TabStop;
property TitleStyle;
end;
implementation
uses LCLType, Math, Forms, rxdconst, rxlclutils, StdCtrls, Themes, LazUTF8, LCLVersion;
{$IFDEF lcl_version<'1.9.0.0'}
varCellPadding = 2;
{$ENDIF}
{ TRxDBVerticalGridDefValues }
procedure TRxDBVerticalGridDefValues.AssignTo(Dest: TPersistent);
begin
if Dest is TRxDBVerticalGridDefValues then
begin
TRxDBVerticalGridDefValues(Dest).FBlobText:=FBlobText;
end
else
inherited AssignTo(Dest);
end;
constructor TRxDBVerticalGridDefValues.Create(AOwner: TRxCustomDBVerticalGrid);
begin
inherited Create;
FOwner:=AOwner;
FBlobText:=sBlobText;
end;
destructor TRxDBVerticalGridDefValues.Destroy;
begin
inherited Destroy;
end;
{ TRxDBVerticalGridRowsEnumerator }
constructor TRxDBVerticalGridRowsEnumerator.Create(AList: TRxDBVerticalGridRows
);
begin
FList := AList;
FPosition := -1;
end;
function TRxDBVerticalGridRowsEnumerator.GetCurrent: TRxDBVerticalGridRow;
begin
Result := FList[FPosition];
end;
function TRxDBVerticalGridRowsEnumerator.MoveNext: Boolean;
begin
Inc(FPosition);
Result := FPosition < FList.Count;
end;
{ TRxDBVerticalGridRows }
function TRxDBVerticalGridRows.GetRow(Index: Integer): TRxDBVerticalGridRow;
begin
Result:=TRxDBVerticalGridRow(inherited Items[Index]);
end;
procedure TRxDBVerticalGridRows.SetRow(Index: Integer;
AValue: TRxDBVerticalGridRow);
begin
Items[Index].Assign(AValue);
end;
procedure TRxDBVerticalGridRows.Update(Item: TCollectionItem);
begin
(Owner as TRxCustomDBVerticalGrid).RowsChanged(TRxDBVerticalGridRow(Item));
end;
procedure TRxDBVerticalGridRows.LinkField;
var
FGrid: TRxCustomDBVerticalGrid;
i: Integer;
begin
FGrid:=TRxCustomDBVerticalGrid(Owner);
FGrid.BeginLink;
for i:=0 to Count-1 do
Items[i].LinkField;
FGrid.EndLink;
end;
function TRxDBVerticalGridRows.Add: TRxDBVerticalGridRow;
begin
Result:=inherited Add as TRxDBVerticalGridRow;
end;
function TRxDBVerticalGridRows.GetEnumerator: TRxDBVerticalGridRowsEnumerator;
begin
Result:=TRxDBVerticalGridRowsEnumerator.Create(Self);
end;
{ TRxDBVerticalGridDataLink }
constructor TRxDBVerticalGridDataLink.Create(
ADataControl: TRxCustomDBVerticalGrid);
begin
inherited Create;
FDataControl:=ADataControl;
end;
procedure TRxDBVerticalGridDataLink.ActiveChanged;
begin
inherited ActiveChanged;
if Active then
else
begin
BufferCount:=0;
end;
FDataControl.LinkActive(Active);
end;
procedure TRxDBVerticalGridDataLink.LayoutChanged;
begin
inherited LayoutChanged;
end;
procedure TRxDBVerticalGridDataLink.FocusControl(Field: TFieldRef);
begin
inherited FocusControl(Field);
end;
procedure TRxDBVerticalGridDataLink.RecordChanged(Field: TField);
begin
inherited RecordChanged(Field);
FDataControl.RecordChanged;
end;
procedure TRxDBVerticalGridDataLink.UpdateData;
begin
inherited UpdateData;
end;
{ TRxDBVerticalGridRowTitle }
function TRxDBVerticalGridRowTitle.GetAlignment: TAlignment;
begin
if FAlignment = nil then
result := GetDefaultAlignment
else
result := FAlignment^;
end;
function TRxDBVerticalGridRowTitle.GetCaption: TCaption;
begin
if (FCaption = nil) and FIsDefaultCaption then
result := GetDefaultCaption
else
result := FCaption;
end;
function TRxDBVerticalGridRowTitle.GetColor: TColor;
begin
if FColor = nil then
result := GetDefaultColor
else
result := FColor^;
end;
function TRxDBVerticalGridRowTitle.GetFont: TFont;
begin
Result := FFont;
end;
function TRxDBVerticalGridRowTitle.IsAlignmentStored: Boolean;
begin
result := FAlignment <> nil;
end;
function TRxDBVerticalGridRowTitle.IsCaptionStored: Boolean;
begin
result := Assigned(FCaption);
end;
function TRxDBVerticalGridRowTitle.IsColorStored: Boolean;
begin
result := FColor <> nil;
end;
function TRxDBVerticalGridRowTitle.IsFontStored: Boolean;
begin
result := not IsDefaultFont;
end;
procedure TRxDBVerticalGridRowTitle.SetAlignment(AValue: TAlignment);
begin
if Falignment = nil then
begin
if AValue = GetDefaultAlignment then
exit;
New(Falignment)
end
else
if FAlignment^ = AValue then
exit;
FAlignment^ := AValue;
FRow.RowChanged;
end;
procedure TRxDBVerticalGridRowTitle.SetCaption(AValue: TCaption);
begin
if (FCaption=nil) or (AValue<>StrPas(FCaption)) then
begin
if FCaption<>nil
then
StrDispose(FCaption);
FCaption := StrNew(PChar(AValue));
FIsDefaultCaption := false;
FRow.RowChanged;
end;
end;
procedure TRxDBVerticalGridRowTitle.SetColor(AValue: TColor);
begin
if FColor=nil then
begin
if AValue = GetDefaultColor then
exit;
New(FColor)
end
else
if FColor^=AValue then
exit;
FColor^ := AValue;
FRow.RowChanged;
end;
procedure TRxDBVerticalGridRowTitle.SetFont(AValue: TFont);
begin
if not FFont.IsEqual(AValue) then
FFont.Assign(AValue);
end;
procedure TRxDBVerticalGridRowTitle.FontChanged(Sender: TObject);
begin
FisDefaultTitleFont := False;
FRow.RowChanged;
end;
function TRxDBVerticalGridRowTitle.GetDefaultCaption: string;
begin
if Row.FieldName<>'' then
begin
if Row.FField<>nil then
Result := Row.FField.DisplayName
else
Result := Row.FieldName;
end
else
Result := 'Title'
end;
function TRxDBVerticalGridRowTitle.GetDefaultAlignment: TAlignment;
begin
result := taLeftJustify
end;
function TRxDBVerticalGridRowTitle.GetDefaultColor: TColor;
begin
if FRow.Grid <> nil then
result := FRow.Grid.FixedColor
else
result := clWindow;
end;
constructor TRxDBVerticalGridRowTitle.Create(ARow: TRxDBVerticalGridRow);
begin
inherited Create;
FRow:=ARow;
FIsDefaultTitleFont := True;
FFont := TFont.Create;
FillTitleDefaultFont;
FFont.OnChange := @FontChanged;
{ FImageIndex := -1;
FOldImageIndex := -1;
FImageLayout := blGlyphRight;
FIsDefaultCaption := true;}
end;
destructor TRxDBVerticalGridRowTitle.Destroy;
begin
FreeAndNil(FFont);
if Assigned(FAlignment) then Dispose(FAlignment);
if Assigned(FColor) then Dispose(FColor);
if Assigned(FCaption) then StrDispose(FCaption); //DisposeStr(FCaption);
// if FLayout<>nil then Dispose(FLayout);
inherited Destroy;
end;
procedure TRxDBVerticalGridRowTitle.Assign(Source: TPersistent);
begin
inherited Assign(Source);
if Source is TRxDBVerticalGridRowTitle then
begin
Alignment:=TRxDBVerticalGridRowTitle(Source).Alignment;
Caption:=TRxDBVerticalGridRowTitle(Source).Caption;
Color:=TRxDBVerticalGridRowTitle(Source).Color;
Font:=TRxDBVerticalGridRowTitle(Source).Font;
end;
end;
procedure TRxDBVerticalGridRowTitle.FillTitleDefaultFont;
var
AGrid: TRxCustomDBVerticalGrid;
begin
AGrid := FRow.Grid;
if AGrid<>nil then
FFont.Assign( AGrid.TitleFont )
else
FFont.Assign( FRow.Font );
FIsDefaultTitleFont := True;
end;
function TRxDBVerticalGridRowTitle.IsDefault: boolean;
begin
Result := (FAlignment = nil) and (FColor = nil) and (FCaption = nil) and
IsDefaultFont {and (FLayout = nil) and
(FImageIndex = 0) and (FImageLayout = blGlyphRight)};
end;
{ TRxDBVerticalGridRow }
function TRxDBVerticalGridRow.GetField: TField;
begin
if (FFieldName<>'') and (FField = nil) then
LinkField;
result := FField;
end;
function TRxDBVerticalGridRow.GetFont: TFont;
begin
Result := FFont;
end;
function TRxDBVerticalGridRow.GetGrid: TRxCustomDBVerticalGrid;
begin
Result:= TRxCustomDBVerticalGrid(TRxDBVerticalGridRows(Collection).Owner);
end;
function TRxDBVerticalGridRow.GetKeyList: TStrings;
begin
Result:=FKeyList;
end;
function TRxDBVerticalGridRow.GetPickList: TStrings;
begin
Result:=FPickList;
end;
function TRxDBVerticalGridRow.GetRowHeight: Integer;
begin
if FRowHeight = nil then
result := GetDefaultRowHeight
else
result := FRowHeight^;
end;
function TRxDBVerticalGridRow.GetValueChecked: string;
begin
if FValueChecked = nil then
Result := GetDefaultValueChecked
else
Result := FValueChecked;
end;
function TRxDBVerticalGridRow.GetValueUnchecked: string;
begin
if FValueUnChecked = nil then
Result := GetDefaultValueUnChecked
else
Result := FValueUnChecked;
end;
function TRxDBVerticalGridRow.IsAlignmentStored: Boolean;
begin
result := FAlignment <> nil;
end;
function TRxDBVerticalGridRow.IsColorStored: Boolean;
begin
result := FColor <> nil;
end;
function TRxDBVerticalGridRow.GetDisplayFormat: string;
begin
if not FDisplayFormatChanged then
Result := GetDefaultDisplayFormat
else
result := FDisplayFormat;
end;
function TRxDBVerticalGridRow.GetColor: TColor;
begin
if FColor=nil then
result := GetDefaultColor
else
result := FColor^
end;
function TRxDBVerticalGridRow.GetAlignment: TAlignment;
begin
if FAlignment=nil then
Result := GetDefaultAlignment
else
Result := FAlignment^;
end;
function TRxDBVerticalGridRow.IsDisplayFormatStored: Boolean;
begin
Result := FDisplayFormatChanged;
end;
function TRxDBVerticalGridRow.IsFontStored: Boolean;
begin
result := not FisDefaultFont;
end;
function TRxDBVerticalGridRow.IsValueCheckedStored: Boolean;
begin
result := FValueChecked <> nil;
end;
function TRxDBVerticalGridRow.IsValueUncheckedStored: Boolean;
begin
Result := FValueUnchecked <> nil;
end;
procedure TRxDBVerticalGridRow.SetAlignment(AValue: TAlignment);
begin
if FAlignment = nil then
begin
if AValue=GetDefaultAlignment then
exit;
New(FAlignment);
end
else
if FAlignment^ = AValue then
exit;
FAlignment^ := AValue;
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetButtonStyle(AValue: TColumnButtonStyle);
begin
if FButtonStyle=AValue then Exit;
FButtonStyle:=AValue;
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetColor(AValue: TColor);
begin
if FColor = nil then
begin
if AValue=GetDefaultColor then
exit;
New(FColor)
end
else
if FColor^ = AValue then
exit;
FColor^ := AValue;
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetDisplayFormat(AValue: string);
begin
if (not FDisplayFormatChanged)or(CompareText(AValue, FDisplayFormat)<>0) then
begin
FDisplayFormat := AValue;
FDisplayFormatChanged:=True;
RowChanged;
end;
end;
procedure TRxDBVerticalGridRow.SetField(AValue: TField);
begin
if FField <> AValue then
begin
FField := AValue;
if FField<>nil then
FFieldName := FField.FieldName;
RowChanged;
end;
end;
procedure TRxDBVerticalGridRow.SetFieldName(AValue: String);
begin
if FFieldName=AValue then exit;
FFieldName:=AValue;
LinkField;
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetFont(AValue: TFont);
begin
if not FFont.IsEqual(AValue) then
begin
FFont.Assign(AValue);
RowChanged;
end;
end;
procedure TRxDBVerticalGridRow.SetGroupName(AValue: string);
begin
if FGroupName=AValue then Exit;
FGroupName:=AValue;
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetImageList(AValue: TImageList);
begin
if FImageList=AValue then Exit;
FImageList:=AValue;
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetKeyList(AValue: TStrings);
begin
FKeyList.Assign(AValue);
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetNotInKeyListIndex(AValue: integer);
begin
if FNotInKeyListIndex=AValue then Exit;
FNotInKeyListIndex:=AValue;
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetPickList(AValue: TStrings);
begin
FPickList.Assign(AValue);
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetPopupMenu(AValue: TPopupMenu);
begin
if FPopupMenu=AValue then Exit;
FPopupMenu:=AValue;
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetReadOnly(AValue: Boolean);
begin
if FReadOnly=AValue then Exit;
FReadOnly:=AValue;
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetRowHeight(AValue: Integer);
var
FGrid: TRxCustomDBVerticalGrid;
begin
if FRowHeight = nil then
begin
if AValue=GetDefaultRowHeight then
exit;
New(FRowHeight);
end
else if FRowHeight^ = AValue then
exit;
FRowHeight^ := AValue;
FGrid:=Grid;
if Index + FGrid.FixedRows < FGrid.RowCount then
FGrid.RowHeights[Index + FGrid.FixedRows]:=AValue;
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetRowTitle(AValue: TRxDBVerticalGridRowTitle);
begin
FRowTitle.Assign(AValue);
RowChanged;
end;
procedure TRxDBVerticalGridRow.LinkField;
var
FGrid: TRxCustomDBVerticalGrid;
begin
FGrid:=Grid;
if (FGrid <> nil) and FGrid.FDataLink.Active then
begin
Field := FGrid.FDataLink.DataSet.FindField(FFieldName);
ApplyDisplayFormat;
end
else
Field := nil;
end;
procedure TRxDBVerticalGridRow.ApplyDisplayFormat;
begin
if (FField <> nil) and FDisplayFormatChanged then
begin
if (FField is TNumericField) then
TNumericField(FField).DisplayFormat := DisplayFormat
else
if (FField is TDateTimeField) then
TDateTimeField(FField).DisplayFormat := DisplayFormat;
end;
end;
procedure TRxDBVerticalGridRow.FontChanged(Sender: TObject);
begin
FisDefaultFont := False;
RowChanged;
end;
procedure TRxDBVerticalGridRow.KeyListChanged(Sender: TObject);
begin
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetShowBlobImagesAndMemo(AValue: boolean);
begin
if FShowBlobImagesAndMemo=AValue then Exit;
FShowBlobImagesAndMemo:=AValue;
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetStaticText(AValue: string);
begin
if FStaticText=AValue then Exit;
FStaticText:=AValue;
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetStyle(AValue: TRxDBVerticalGridRowStyle);
begin
if FStyle=AValue then Exit;
FStyle:=AValue;
RowChanged;
end;
procedure TRxDBVerticalGridRow.SetValueChecked(AValue: string);
begin
if (FValueChecked=nil) or (CompareText(AValue, FValueChecked)<>0) then
begin
if FValueChecked<>nil then
StrDispose(FValueChecked)
else
if CompareText(AValue, GetDefaultValueChecked)=0 then
exit;
FValueChecked := StrNew(PChar(AValue));
Changed(False);
end;
end;
procedure TRxDBVerticalGridRow.SetValueUnchecked(AValue: string);
begin
if (FValueUnchecked=nil) or (CompareText(AValue, FValueUnchecked)<>0) then
begin
if FValueUnchecked<>nil then
StrDispose(FValueUnchecked)
else
if CompareText(AValue, GetDefaultValueUnchecked)=0 then
exit;
FValueUnchecked := StrNew(PChar(AValue));
Changed(False);
end;
end;
procedure TRxDBVerticalGridRow.SetWordWrap(AValue: Boolean);
begin
if FWordWrap=AValue then Exit;
FWordWrap:=AValue;
end;
function TRxDBVerticalGridRow.GetDefaultValueChecked: string;
begin
result := '1';
end;
function TRxDBVerticalGridRow.GetDefaultValueUnchecked: string;
begin
result := '0';
end;
function TRxDBVerticalGridRow.GetDisplayName: string;
begin
if RowTitle.Caption<>'' then
Result := RowTitle.Caption
else
Result := 'GridColumn';
end;
function TRxDBVerticalGridRow.GetDefaultAlignment: TAlignment;
begin
{ if ButtonStyle in [cbsCheckboxColumn,cbsButtonColumn] then
result := taCenter
else}
result := taLeftJustify;
end;
function TRxDBVerticalGridRow.GetDefaultRowHeight: integer;
begin
Result:=Grid.DefaultRowHeight;
end;
procedure TRxDBVerticalGridRow.RowChanged;
begin
Changed(False);
//FWidthChanged := False;
end;
function TRxDBVerticalGridRow.GetDefaultDisplayFormat: string;
begin
Result := '';
if FField<>nil then
begin
if FField is TNumericField then
Result := TNumericField(FField).DisplayFormat
else
if FField is TDateTimeField then
Result := TDateTimeField(FField).DisplayFormat
end;
end;
function TRxDBVerticalGridRow.GetDefaultColor: TColor;
var
FGrid: TRxCustomDBVerticalGrid;
begin
FGrid := Grid;
if FGrid<>nil then
result := FGrid.Color
else
result := clWindow
end;
function TRxDBVerticalGridRow.EditorStyle: TColumnButtonStyle;
begin
Result:=FButtonStyle;
if (Result = cbsAuto) then
if Assigned(Field) then
if Field.DataType = ftBoolean then
Result:=cbsCheckboxColumn;
end;
constructor TRxDBVerticalGridRow.Create(ACollection: TCollection);
begin
inherited Create(ACollection);
FNotInKeyListIndex:=-1;
FRowTitle:=TRxDBVerticalGridRowTitle.Create(Self);
FKeyList:=TStringList.Create;
FKeyList.OnChange:=@KeyListChanged;
FPickList:=TStringList.Create;
FPickList.OnChange:=@KeyListChanged;
FIsDefaultFont := True;
FFont := TFont.Create;
FillDefaultFont;
FFont.OnChange := @FontChanged;
FButtonStyle:=cbsAuto;
FStyle:=rxvrData;
FShowBlobImagesAndMemo:=false;
end;
destructor TRxDBVerticalGridRow.Destroy;
begin
FreeAndNil(FRowTitle);
FreeAndNil(FFont);
FreeAndNil(FKeyList);
FreeAndNil(FPickList);
if Assigned(FColor) then Dispose(FColor);
if Assigned(FAlignment) then Dispose(FAlignment);
if Assigned(FRowHeight) then Dispose(FRowHeight);
if Assigned(FValueChecked) then StrDispose(FValueChecked);
if Assigned(FValueUnchecked) then StrDispose(FValueUnchecked);
inherited Destroy;
end;
procedure TRxDBVerticalGridRow.FillDefaultFont;
var
AGrid: TRxCustomDBVerticalGrid;
begin
AGrid := Grid;
if (AGrid<>nil) then
begin
FFont.Assign(AGrid.Font);
FIsDefaultFont := True;
end;
end;
procedure TRxDBVerticalGridRow.Assign(Source: TPersistent);
begin
inherited Assign(Source);
if Source is TRxDBVerticalGridRow then
begin
FFieldName:=TRxDBVerticalGridRow(Source).FFieldName;
FGroupName:=TRxDBVerticalGridRow(Source).FGroupName;
FDisplayFormat:=TRxDBVerticalGridRow(Source).FDisplayFormat;
FButtonStyle:=TRxDBVerticalGridRow(Source).ButtonStyle;
Alignment:=TRxDBVerticalGridRow(Source).Alignment;
RowTitle:=TRxDBVerticalGridRow(Source).RowTitle;
Color:=TRxDBVerticalGridRow(Source).Color;
FImageList:=TRxDBVerticalGridRow(Source).FImageList;
KeyList:=TRxDBVerticalGridRow(Source).KeyList;
PickList:=TRxDBVerticalGridRow(Source).PickList;
FWordWrap:=TRxDBVerticalGridRow(Source).WordWrap;
RowHeight:=TRxDBVerticalGridRow(Source).RowHeight;
ReadOnly:=TRxDBVerticalGridRow(Source).ReadOnly;
PopupMenu:=TRxDBVerticalGridRow(Source).PopupMenu;
Style:=TRxDBVerticalGridRow(Source).Style;
Font:=TRxDBVerticalGridRow(Source).Font;
FStaticText:=TRxDBVerticalGridRow(Source).StaticText;
FShowBlobImagesAndMemo:=TRxDBVerticalGridRow(Source).ShowBlobImagesAndMemo;
end;
end;
{ TRxCustomDBVerticalGrid }
procedure TRxCustomDBVerticalGrid.SetRows(AValue: TRxDBVerticalGridRows);
begin
FRows.Assign(AValue);
end;
procedure TRxCustomDBVerticalGrid.RecordChanged;
begin
Invalidate;
end;
procedure TRxCustomDBVerticalGrid.RowsChanged(aRow: TRxDBVerticalGridRow);
begin
if FLinkActive > 0 then Exit;
if Assigned(aRow) then
Invalidate
else
begin
if FRows.Count <> RowCount - FixedRows then
RowCount:=FRows.Count + FixedRows;
end;
end;
procedure TRxCustomDBVerticalGrid.UpdateRowsHight;
var
R: TRxDBVerticalGridRow;
i: Integer;
begin
for R in Rows do
RowHeights[R.Index + FixedRows]:=R.RowHeight;
if FixedRows > 0 then
for i:=0 to FixedRows-1 do
RowHeights[i]:=DefaultRowHeight;
end;
procedure TRxCustomDBVerticalGrid.OutCaptionCellText(aCol, aRow: integer;
const aRect: TRect; aState: TGridDrawState; const ACaption: string);
begin
if (TitleStyle = tsNative) then
DrawThemedCell(aCol, aRow, aRect, aState)
else
begin
Canvas.FillRect(aRect);
DrawCellGrid(aCol, aRow, aRect, aState);
end;
if ACaption <> '' then
begin
{ if not (rdgDisableWordWrapTitles in OptionsRx) then
WriteTextHeader(Canvas, aRect, ACaption, GetColumnAlignment(aCol, True))
else}
DrawCellText(aCol, aRow, aRect, aState, ACaption);
end;
end;
procedure TRxCustomDBVerticalGrid.DrawCell(aCol, aRow: Integer; aRect: TRect;
aState: TGridDrawState);
var
FRow: TRxDBVerticalGridRow;
begin
inherited DrawCell(aCol, aRow, aRect, aState);
if (rxvgColumnTitle in FOptions) and (aRow = 0) then
begin
if aCol = 0 then
//DrawCellText(aCol, aRow, aRect, aState, LabelCoumn.Title.Caption)
OutCaptionCellText(aCol, aRow, aRect, aState, LabelCoumn.Title.Caption)
else
OutCaptionCellText(aCol, aRow, aRect, aState, DataCoumn.Title.Caption)
end
else
begin
FRow:=nil;
if FRows.Count > aRow - FixedRows then
FRow:=FRows[aRow - FixedRows];
if Assigned(FRow) then
begin
if aCol = 0 then
begin
DrawCellText(aCol,aRow, aRect, aState, FRow.RowTitle.Caption);
end
else
if (aCol = 1) then
DrawDataCell(aCol,aRow, aRect, aState, FRow);
end;
end;
end;
procedure TRxCustomDBVerticalGrid.DrawDataCell(aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState; AGridRow: TRxDBVerticalGridRow);
var
S: String;
J: Integer;
AImageIndex: LongInt;
begin
if AGridRow.Style = rxvrData then
begin
if AGridRow.EditorStyle = cbsCheckboxColumn then
DrawCheckboxBitmaps(aRect, AGridRow)
else
if Assigned(AGridRow.Field) then
begin
if Assigned(AGridRow.ImageList) then
begin
AImageIndex := StrToIntDef(AGridRow.KeyList.Values[AGridRow.Field.AsString], AGridRow.NotInKeyListIndex);
if (AImageIndex > -1) and (AImageIndex < AGridRow.ImageList.Count) then
DrawCellBitmap(AGridRow, aRect, aState, AImageIndex);
end
else
if AGridRow.Field.dataType = ftBlob then
begin
if AGridRow.ShowBlobImagesAndMemo then
begin
DrawDataCellPicture(AGridRow, aRect, aState);
exit;
end
else
begin
if AGridRow.Field.IsNull then
S := GridDefValues.FBlobText
else
S := UTF8UpperCase(GridDefValues.FBlobText);
end;
end
else
if AGridRow.Field.dataType = ftMemo then
begin
if AGridRow.ShowBlobImagesAndMemo then
S := AGridRow.Field.AsString
else
begin
if AGridRow.Field.IsNull then
S := GridDefValues.FBlobText
else
S := UTF8UpperCase(GridDefValues.FBlobText);
end;
end
else
begin
S := AGridRow.Field.DisplayText;
if (AGridRow.KeyList.Count > 0) and (AGridRow.PickList.Count > 0) then
begin
J := AGridRow.KeyList.IndexOf(S);
if (J >= 0) and (J < AGridRow.PickList.Count) then
S := AGridRow.PickList[j];
end;
end;
WriteTextHeader(Canvas, aRect, S, AGridRow.Alignment);
end;
end
else
if AGridRow.Style = rxvrStaticText then
if AGridRow.StaticText <> '' then
WriteTextHeader(Canvas, aRect, AGridRow.StaticText, AGridRow.Alignment);
end;
procedure TRxCustomDBVerticalGrid.DrawCheckboxBitmaps(aRect: TRect;
AGridRow: TRxDBVerticalGridRow);
const
arrtb:array[TCheckboxState] of TThemedButton =
(tbCheckBoxUncheckedNormal, tbCheckBoxCheckedNormal, tbCheckBoxMixedNormal);
var
AState: TCheckboxState;
aCol: Integer;
ChkBitmap: TBitmap;
XPos, YPos: Int64;
Details: TThemedElementDetails;
CSize: TSize;
PaintRect: TRect;
begin
if Assigned(AGridRow.Field) then
begin
if AGridRow.Field.DataType=ftBoolean then
begin
if AGridRow.Field.IsNull then AState := cbGrayed
else
if AGridRow.Field.AsBoolean then AState := cbChecked
else AState := cbUnChecked
end
else
if AGridRow.Field.AsString=AGridRow.ValueChecked then
AState := cbChecked
else
if AGridRow.Field.AsString=AGridRow.ValueUnChecked then
AState := cbUnChecked
else
AState := cbGrayed
end
else
AState := cbGrayed;
{
if assigned(OnUserCheckboxState) then
OnUserCheckboxState(Self, TColumn(ColumnFromGridColumn(aCol)), AState);
}
// DrawGridCheckboxBitmaps(1, 1{dummy}, ARect, AState);
if (TitleStyle=tsNative) {and not assigned(OnUserCheckboxBitmap)} then
begin
Details := ThemeServices.GetElementDetails(arrtb[AState]);
CSize := ThemeServices.GetDetailSize(Details);
CSize.cx := MulDiv(CSize.cx, Font.PixelsPerInch, Screen.PixelsPerInch);
CSize.cy := MulDiv(CSize.cy, Font.PixelsPerInch, Screen.PixelsPerInch);
case AGridRow.Alignment of
taCenter: PaintRect.Left := Trunc((aRect.Left + aRect.Right - CSize.cx)/2);
taLeftJustify: PaintRect.Left := ARect.Left + varCellPadding;
taRightJustify: PaintRect.Left := ARect.Right - CSize.Cx - varCellPadding - 1;
end;
PaintRect.Top := Trunc((aRect.Top + aRect.Bottom - CSize.cy)/2);
PaintRect := Bounds(PaintRect.Left, PaintRect.Top, CSize.cx, CSize.cy);
ThemeServices.DrawElement(Canvas.Handle, Details, PaintRect, nil);
end
else
begin
{$IF lcl_fullversion < 01090000}
ChkBitmap := GetImageForCheckBox(aCol, Row, AState);
if ChkBitmap<>nil then
begin
case AGridRow.Alignment of
taCenter: XPos := Trunc((aRect.Left+aRect.Right-ChkBitmap.Width)/2);
taLeftJustify: XPos := ARect.Left + varCellPadding;
taRightJustify: XPos := ARect.Right - ChkBitmap.Width - varCellPadding - 1;
end;
YPos := Trunc((aRect.Top+aRect.Bottom-ChkBitmap.Height)/2);
Canvas.Draw(XPos, YPos, ChkBitmap);
end;
{$ELSE}
DrawGridCheckboxBitmaps(aCol, Row, aRect, aState);
{$ENDIF}
end;
end;
procedure TRxCustomDBVerticalGrid.DrawCellBitmap(
AGridRow: TRxDBVerticalGridRow; aRect: TRect; aState: TGridDrawState;
AImageIndex: integer);
var
H, W: Integer;
ClientSize: TSize;
begin
InflateRect(aRect, -1, -1);
H := AGridRow.ImageList.Height;
W := AGridRow.ImageList.Width;
ClientSize.cx := Min(aRect.Right - aRect.Left, W);
ClientSize.cy := Min(aRect.Bottom - aRect.Top, H);
if ClientSize.cx = W then
begin
aRect.Left := (aRect.Left + aRect.Right - W) div 2;
aRect.Right := aRect.Left + W;
end;
if ClientSize.cy = H then
begin
aRect.Top := (aRect.Top + aRect.Bottom - H) div 2;
aRect.Bottom := aRect.Top + H;
end;
AGridRow.ImageList.StretchDraw(Canvas, AImageIndex, aRect);
end;
procedure TRxCustomDBVerticalGrid.DrawDataCellPicture(
AGridRow: TRxDBVerticalGridRow; aRect: TRect; aState: TGridDrawState);
function PicDrawRect:TRect;
var
PicWidth, PicHeight: LongInt;
ImgWidth, ImgHeight, w, h, ChangeX, ChangeY: Integer;
PicInside, PicOutside, PicOutsidePartial: Boolean;
begin
PicWidth := FTmpPicture.Width;
PicHeight := FTmpPicture.Height;
ImgWidth := aRect.Width;
ImgHeight := aRect.Height;
if (PicWidth=0) or (PicHeight=0) then Exit(Rect(0, 0, 0, 0));
PicInside := (PicWidth<ImgWidth) and (PicHeight<ImgHeight);
PicOutside := (PicWidth>ImgWidth) and (PicHeight>ImgHeight);
PicOutsidePartial := (PicWidth>ImgWidth) or (PicHeight>ImgHeight);
{ if Stretch or (Proportional and PicOutsidePartial) then
if (FStretchOutEnabled or PicOutside) and
(FStretchInEnabled or PicInside) then
if Proportional then }
begin
w:=ImgWidth;
h:=(PicHeight*w) div PicWidth;
if h>ImgHeight then
begin
h:=ImgHeight;
w:=(PicWidth*h) div PicHeight;
end;
PicWidth:=w;
PicHeight:=h;
end
{ else begin
PicWidth := ImgWidth;
PicHeight := ImgHeight;
end};
Result := Rect(0, 0, PicWidth, PicHeight);
case AGridRow.Alignment of
//taLeftJustify,
taRightJustify :
begin
ChangeX := ImgWidth-PicWidth;
ChangeY := ImgHeight-PicHeight;
{if FKeepOriginXWhenClipped and (ChangeX<0) then ChangeX := 0;
if FKeepOriginYWhenClipped and (ChangeY<0) then ChangeY := 0;}
OffsetRect(Result, ChangeX, ChangeY);
end;
taCenter :
begin
ChangeX := (ImgWidth-PicWidth) div 2;
ChangeY := (ImgHeight-PicHeight) div 2;
{if FKeepOriginXWhenClipped and (ChangeX<0) then ChangeX := 0;
if FKeepOriginYWhenClipped and (ChangeY<0) then ChangeY := 0;}
OffsetRect(Result, ChangeX, ChangeY);
end;
end;
OffsetRect(Result, aRect.Left, aRect.Top);
InflateRect(Result, -constCellPadding, -constCellPadding);
end;
var
St: TStream;
begin
St:=AGridRow.Field.DataSet.CreateBlobStream(AGridRow.Field, bmRead);
if not Assigned(St) then Exit;
try
if St.Size > 0 then
begin
if not Assigned(FTmpPicture) then
FTmpPicture:=TPicture.Create;
FTmpPicture.LoadFromStream(st);
if Assigned(FTmpPicture.Graphic) then
Canvas.StretchDraw(PicDrawRect, FTmpPicture.Graphic);
end;
finally
St.Free;
end;
end;
procedure TRxCustomDBVerticalGrid.PrepareCanvas(aCol, aRow: Integer;
aState: TGridDrawState);
var
FRow: TRxDBVerticalGridRow;
CurrentTextStyle: TTextStyle;
begin
inherited PrepareCanvas(aCol, aRow, aState);
if (aRow - FixedRows >= 0) and (FRows.Count > aRow - FixedRows) then
begin
FRow:=FRows[aRow - FixedRows];
if Assigned(FRow) then
begin
CurrentTextStyle:=Canvas.TextStyle;
if aCol = 0 then
begin
CurrentTextStyle.Alignment := BidiFlipAlignment(FRow.RowTitle.Alignment, UseRightToLeftAlignment);
if ([gdSelected, gdFocused] * aState = []) then
Canvas.Brush.Color := FRow.RowTitle.Color
end
else
if aCol = 1 then
if ([gdSelected, gdFocused] * aState = []) then
Canvas.Brush.Color := FRow.Color;
Canvas.TextStyle := CurrentTextStyle;
end;
end;
end;
procedure TRxCustomDBVerticalGrid.Notification(AComponent: TComponent;
Operation: TOperation);
var
R: TRxDBVerticalGridRow;
begin
inherited Notification(AComponent, Operation);
if Operation = opRemove then
begin
if AComponent is TImageList then
begin
for R in Rows do
if R.ImageList = TImageList(AComponent) then
R.ImageList:=nil;
end
else
if AComponent is TPopupMenu then
begin
for R in Rows do
if R.PopupMenu = TPopupMenu(AComponent) then
R.PopupMenu:=nil;
end;
end;
end;
procedure TRxCustomDBVerticalGrid.MouseUp(Button: TMouseButton;
Shift: TShiftState; X, Y: integer);
var
Cell: TGridCoord;
FRow1: TRxDBVerticalGridRow;
R: TPoint;
begin
inherited MouseUp(Button, Shift, X, Y);
if Button = mbRight then
begin
Cell := MouseCoord(X, Y);
if (Cell.X = 1) and (Cell.Y >= FixedRows) and (Cell.Y - FixedRows < FRows.Count) then
begin
FRow1:=FRows[Cell.Y - FixedRows];
if Assigned(FRow1) and Assigned(FRow1.PopupMenu) then
begin
R:=ClientToScreen(Point(X, Y));
FRow1.PopupMenu.PopUp(R.X, R.Y);
end;
end;
end;
end;
procedure TRxCustomDBVerticalGrid.LinkActive(Value: Boolean);
begin
BeginLink;
FRows.LinkField;
EndLink;
Invalidate;
end;
procedure TRxCustomDBVerticalGrid.BeginLink;
begin
Inc(FLinkActive);
end;
procedure TRxCustomDBVerticalGrid.EndLink;
begin
if FLinkActive > 0 then
Dec(FLinkActive);
if FLinkActive = 0 then
RowsChanged(nil);
end;
procedure TRxCustomDBVerticalGrid.SetOptions(AValue: TRxDBVerticalGridOptions);
var
O: TGridOptions;
begin
if FOptions=AValue then Exit;
FOptions:=AValue;
// O:=inherited Options;
if rxvgColumnTitle in FOptions then
begin
RowCount:=RowCount + 1;
FixedRows:=1;
end
else
begin
RowCount:=RowCount - 1;
FixedRows:=0;
end;
UpdateRowsHight;
end;
function TRxCustomDBVerticalGrid.GetDataSource: TDataSource;
begin
Result:= FDataLink.DataSource;
end;
function TRxCustomDBVerticalGrid.GetDataCoumn: TGridColumn;
begin
Result:=Columns[1];
end;
function TRxCustomDBVerticalGrid.GetLabelCoumn: TGridColumn;
begin
Result:=Columns[0];
end;
procedure TRxCustomDBVerticalGrid.SetDataCoumn(AValue: TGridColumn);
begin
Columns[1].Assign(AValue);
end;
procedure TRxCustomDBVerticalGrid.SetDataSource(AValue: TDataSource);
begin
if AValue = FDatalink.Datasource then Exit;
// RenewColWidths;
FDataLink.DataSource := AValue;
// UpdateActive;
end;
procedure TRxCustomDBVerticalGrid.SetGridDefValues(
AValue: TRxDBVerticalGridDefValues);
begin
if FGridDefValues=AValue then Exit;
FGridDefValues:=AValue;
end;
procedure TRxCustomDBVerticalGrid.SetLabelCoumn(AValue: TGridColumn);
begin
Columns[0].Assign(AValue);
end;
constructor TRxCustomDBVerticalGrid.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FDataLink:=TRxDBVerticalGridDataLink.Create(Self);
FRows:=TRxDBVerticalGridRows.Create(Self, TRxDBVerticalGridRow);
FGridDefValues:=TRxDBVerticalGridDefValues.Create(Self);
//ColCount:=2;
FixedCols:=0;
FixedRows:=0;
Columns.Clear;
Columns.Add;
Columns.Add;
Columns[0].ReadOnly:=true;
inherited Options :=
[goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,
goSmoothScroll, goTabs, goEditing, goDrawFocusSelected,
goColSizing ];
end;
destructor TRxCustomDBVerticalGrid.Destroy;
begin
FreeAndNil(FRows);
FreeAndNil(FDataLink);
FreeAndNil(FGridDefValues);
if Assigned(FTmpPicture) then
FreeAndNil(FTmpPicture);
inherited Destroy;
end;
end.