2007-09-04 17:25:54 +00:00
|
|
|
unit uDBSelectionListUtils;
|
|
|
|
|
|
|
|
|
|
interface
|
|
|
|
|
|
|
|
|
|
uses
|
|
|
|
|
Classes, DB, cxGridTableView, uDADataTable, uIntegerListUtils, cxGridCustomView;
|
|
|
|
|
|
|
|
|
|
type
|
|
|
|
|
TSelectedRecords = class;
|
|
|
|
|
|
|
|
|
|
ISeleccionable = interface
|
|
|
|
|
['{49B6B6E9-8C91-430B-87BC-7ED070308F2B}']
|
|
|
|
|
function GetSelectedRecords: TSelectedRecords;
|
|
|
|
|
property SelectedRecords : TSelectedRecords read GetSelectedRecords;
|
|
|
|
|
|
|
|
|
|
function GetSelected: Boolean;
|
|
|
|
|
procedure SetSelected(const Value: Boolean);
|
|
|
|
|
property Selected : Boolean read GetSelected write SetSelected;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
ISelectedRecords = interface
|
|
|
|
|
['{C2037B64-AAA7-4DD7-B9EA-C4973BDAD380}']
|
|
|
|
|
function GetCount: Integer;
|
|
|
|
|
property Count: Integer read GetCount;
|
|
|
|
|
|
|
|
|
|
function GetItem(Index: Integer): Integer;
|
|
|
|
|
property Items[Index: Integer]: Integer read GetItem; default;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
TSeleccionable = class(TInterfacedObject, ISeleccionable)
|
|
|
|
|
protected
|
|
|
|
|
FSelectedRecords : TSelectedRecords;
|
|
|
|
|
function GetSelectedRecords: TSelectedRecords;
|
|
|
|
|
function GetSelected: Boolean;
|
|
|
|
|
procedure SetSelected(const Value: Boolean);
|
|
|
|
|
public
|
|
|
|
|
constructor Create(aDataTable: TDADataTable);
|
|
|
|
|
destructor Destroy; override;
|
|
|
|
|
property Selected : Boolean read GetSelected write SetSelected;
|
|
|
|
|
property SelectedRecords : TSelectedRecords read GetSelectedRecords;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
TSelectedRecords = class(TInterfacedObject, ISelectedRecords)
|
|
|
|
|
private
|
|
|
|
|
FDataTable: TDADataTable;
|
|
|
|
|
FListInteger : TIntegerList;
|
|
|
|
|
function GetCount: Integer;
|
|
|
|
|
function GetCurrentRowSelected: Boolean;
|
|
|
|
|
function GetItem(Index: Integer): integer;
|
|
|
|
|
procedure SetCurrentRowSelected(Value: Boolean);
|
|
|
|
|
protected
|
|
|
|
|
function CurrentRow: integer;
|
|
|
|
|
function Compare(const Item1, Item2: integer): Boolean;
|
|
|
|
|
public
|
|
|
|
|
constructor Create(ADataTable : TDADataTable);
|
|
|
|
|
destructor Destroy; override;
|
|
|
|
|
procedure Clear; // free all bookmarks
|
|
|
|
|
function Find(const Item: integer; var Index: Integer): Boolean;
|
|
|
|
|
function IndexOf(const Item: integer): Integer;
|
|
|
|
|
property Count: Integer read GetCount;
|
|
|
|
|
property CurrentRowSelected: Boolean read GetCurrentRowSelected
|
|
|
|
|
write SetCurrentRowSelected;
|
|
|
|
|
property Items[Index: Integer]: integer read GetItem; default;
|
|
|
|
|
function LocateItem(const Index : Integer) : Boolean;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
implementation
|
|
|
|
|
|
|
|
|
|
uses
|
|
|
|
|
SysUtils, DBConsts, cxGridCustomTableView, cxControls, Math, Variants, Dialogs;
|
|
|
|
|
|
|
|
|
|
{ TSelectedRowList }
|
|
|
|
|
|
|
|
|
|
constructor TSelectedRecords.Create(ADataTable : TDADataTable);
|
|
|
|
|
begin
|
|
|
|
|
inherited Create;
|
|
|
|
|
FListInteger := TIntegerList.Create;
|
|
|
|
|
|
|
|
|
|
FDataTable := ADataTable;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
destructor TSelectedRecords.Destroy;
|
|
|
|
|
begin
|
|
|
|
|
Clear;
|
|
|
|
|
FreeAndNil(FListInteger);//.Free;
|
|
|
|
|
FDataTable := NIL;
|
|
|
|
|
inherited Destroy;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TSelectedRecords.Clear;
|
|
|
|
|
begin
|
|
|
|
|
if (not Assigned(FListInteger))
|
|
|
|
|
or (FListInteger.Count = 0) then
|
|
|
|
|
Exit;
|
|
|
|
|
|
|
|
|
|
FListInteger.Clear;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TSelectedRecords.Compare(const Item1, Item2: integer): Boolean;
|
|
|
|
|
begin
|
|
|
|
|
Result := (Item1 = Item2);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TSelectedRecords.CurrentRow: integer;
|
|
|
|
|
begin
|
|
|
|
|
if not FDataTable.Active then
|
|
|
|
|
raise EDatabaseError.Create(sDataSetClosed);
|
2008-07-31 18:11:26 +00:00
|
|
|
Result := FDataTable.GetRowRecIDValue;
|
2007-09-04 17:25:54 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TSelectedRecords.GetCurrentRowSelected: Boolean;
|
|
|
|
|
var
|
|
|
|
|
Index: Integer;
|
|
|
|
|
begin
|
|
|
|
|
Result := Find(CurrentRow, Index);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TSelectedRecords.Find(const Item: integer; var Index: Integer): Boolean;
|
|
|
|
|
begin
|
|
|
|
|
Result := FListInteger.Find(Item, Index)
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TSelectedRecords.GetCount: Integer;
|
|
|
|
|
begin
|
|
|
|
|
Result := FListInteger.Count;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TSelectedRecords.GetItem(Index: Integer): integer;
|
|
|
|
|
begin
|
|
|
|
|
Result := FListInteger.Integers[Index];
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TSelectedRecords.IndexOf(const Item: integer): Integer;
|
|
|
|
|
var
|
|
|
|
|
AIndex : Integer;
|
|
|
|
|
begin
|
|
|
|
|
Result := -1;
|
|
|
|
|
if FListInteger.Find(Item, AIndex) then
|
|
|
|
|
Result := AIndex
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TSelectedRecords.SetCurrentRowSelected(Value: Boolean);
|
|
|
|
|
var
|
|
|
|
|
Index: Integer;
|
|
|
|
|
Current: integer;
|
|
|
|
|
begin
|
|
|
|
|
Current := CurrentRow;
|
|
|
|
|
if (Find(Current, Index) = Value) then
|
|
|
|
|
Exit;
|
|
|
|
|
if Value then
|
|
|
|
|
FListInteger.Add(Current)
|
|
|
|
|
else
|
|
|
|
|
FListInteger.Delete(Index);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TSelectedRecords.LocateItem(const Index: Integer) : Boolean;
|
|
|
|
|
begin
|
|
|
|
|
if not FDataTable.Active then
|
|
|
|
|
raise EDatabaseError.Create(sDataSetClosed);
|
2008-07-31 18:11:26 +00:00
|
|
|
Result := FDataTable.Locate(FDataTable.RecIDField.FieldName, Items[Index], []);
|
|
|
|
|
|
2007-09-04 17:25:54 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{ TSeleccionable }
|
|
|
|
|
|
|
|
|
|
constructor TSeleccionable.Create(aDataTable: TDADataTable);
|
|
|
|
|
begin
|
|
|
|
|
inherited Create;
|
|
|
|
|
FSelectedRecords := TSelectedRecords.Create(aDataTable);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
destructor TSeleccionable.Destroy;
|
|
|
|
|
begin
|
|
|
|
|
FreeAndNIL(FSelectedRecords);
|
|
|
|
|
inherited;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TSeleccionable.GetSelected: Boolean;
|
|
|
|
|
begin
|
|
|
|
|
Result := FSelectedRecords.CurrentRowSelected;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TSeleccionable.GetSelectedRecords: TSelectedRecords;
|
|
|
|
|
begin
|
|
|
|
|
Result := FSelectedRecords;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
procedure TSeleccionable.SetSelected(const Value: Boolean);
|
|
|
|
|
begin
|
|
|
|
|
FSelectedRecords.CurrentRowSelected := True;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
end.
|