Varela_PuntosVenta/Source/Base/uDBSelectionList.pas
2007-08-01 16:16:26 +00:00

184 lines
4.8 KiB
ObjectPascal

{*******************************************************}
{ }
{ Administración de puntos de venta }
{ }
{ Copyright (C) 2006 Rodax Software S.L. }
{ }
{*******************************************************}
unit uDBSelectionList;
interface
uses
Classes, DB, cxGridTableView, uDADataTable, uIntegerList, cxGridCustomView;
type
TRecID = Integer;
TSelectedRowList = class;
ISelectedRowList = interface
['{1886B04A-DB0D-40AE-BCAE-DA57CD4CD582}']
function GetSelectedRows : TSelectedRowList;
property SelectedRows : TSelectedRowList read GetSelectedRows;
end;
TSelectedRowList = class
private
FDataTable: TDADataTable;
FListRecID : TIntegerList;
function GetCount: Integer;
function GetCurrentRowSelected: Boolean;
function GetItem(Index: Integer): TRecID;
procedure SetCurrentRowSelected(Value: Boolean);
protected
function CurrentRow: TRecID;
function Compare(const Item1, Item2: TRecID): Boolean;
public
constructor Create(ADataTable : TDADataTable);
destructor Destroy; override;
procedure Clear; // free all bookmarks
function Find(const Item: TRecID; var Index: Integer): Boolean;
function IndexOf(const Item: TRecID): Integer;
property Count: Integer read GetCount;
property CurrentRowSelected: Boolean read GetCurrentRowSelected
write SetCurrentRowSelected;
property Items[Index: Integer]: TRecID read GetItem; default;
function LocateItem(const Index : Integer) : Boolean;
end;
procedure SeleccionarFilasDesdeGrid(const AView : TcxCustomGridView;
var ASelectedRowList : ISelectedRowList);
implementation
uses
DBConsts, cxGridCustomTableView, cxControls, Math, Variants, Dialogs;
{ TSelectedRowList }
constructor TSelectedRowList.Create(ADataTable : TDADataTable);
begin
inherited Create;
FListRecID := TIntegerList.Create;
FDataTable := ADataTable;
end;
destructor TSelectedRowList.Destroy;
begin
Clear;
FListRecID.Free;
FDataTable := NIL;
inherited Destroy;
end;
procedure TSelectedRowList.Clear;
begin
if FListRecID.Count = 0 then
Exit;
FListRecID.Clear;
end;
function TSelectedRowList.Compare(const Item1, Item2: TRecID): Boolean;
begin
Result := (Item1 = Item2);
end;
function TSelectedRowList.CurrentRow: TRecID;
begin
if not FDataTable.Active then
raise EDatabaseError.Create(sDataSetClosed);
Result := FDataTable.RecIDValue;
end;
function TSelectedRowList.GetCurrentRowSelected: Boolean;
var
Index: Integer;
begin
Result := Find(CurrentRow, Index);
end;
function TSelectedRowList.Find(const Item: TRecID; var Index: Integer): Boolean;
begin
Result := FListRecID.Find(Item, Index)
end;
function TSelectedRowList.GetCount: Integer;
begin
Result := FListRecID.Count;
end;
function TSelectedRowList.GetItem(Index: Integer): TRecID;
begin
Result := FListRecID.Integers[Index];
end;
function TSelectedRowList.IndexOf(const Item: TRecID): Integer;
var
AIndex : Integer;
begin
Result := -1;
if FListRecID.Find(Item, AIndex) then
Result := AIndex
end;
procedure TSelectedRowList.SetCurrentRowSelected(Value: Boolean);
var
Index: Integer;
Current: TRecID;
begin
Current := CurrentRow;
if (Find(Current, Index) = Value) then
Exit;
if Value then
FListRecID.Add(Current)
else
FListRecID.Delete(Index);
end;
procedure SeleccionarFilasDesdeGrid(const AView : TcxCustomGridView;
var ASelectedRowList : ISelectedRowList);
var
ADataTable : TDADataTable;
ABookmark : Pointer;
ARecord: TcxCustomGridRecord;
i : Integer;
begin
ADataTable := ASelectedRowList.SelectedRows.FDataTable;
AView.BeginUpdate;
ShowHourglassCursor;
ABookmark := ADataTable.GetBookMark;
try
ASelectedRowList.SelectedRows.Clear;
for i := 0 to TcxCustomGridTableController(AView.Controller).SelectedRecordCount-1 do
begin
ARecord := TcxCustomGridTableController(AView.Controller).SelectedRecords[i];
if (ARecord is TcxGridDataRow) then
begin
(ARecord as TcxGridDataRow).Focused := True;
ASelectedRowList.SelectedRows.CurrentRowSelected := True;
end;
end;
ADataTable.GotoBookmark(ABookmark);
finally
AView.EndUpdate;
ADataTable.FreeBookmark(ABookmark);
HideHourglassCursor;
end;
end;
function TSelectedRowList.LocateItem(const Index: Integer) : Boolean;
begin
if not FDataTable.Active then
raise EDatabaseError.Create(sDataSetClosed);
Result := FDataTable.Locate('RecID', Items[Index], []);
end;
end.