Por si a alguien le interesa, este es mi componente final (de momento) que genera un Explorador TTable o TAdoTable, pero se puede aplicar a cualquier gestion SQL genérica con TQuery en vez de TTable. El asunto es crear un superForm dedicado a una conexión DB:
Código Delphi
[-]
unit DBX;
interface
uses
Windows,
Messages,
Controls,
SysUtils,
Classes,
Forms,
DB,
DBTables,
DBGridCheck,
ExControlsTabla;
type
TEndDragEvent = procedure(Sender, Target: TObject; X, Y: Integer) of object;
TDBexplorer = class(TComponent);
private
FTable: TDataSet;
FModal: boolean;
FOldOnActivate: TNotifyEvent;
FOnActivate: TNotifyEvent;
FOnShow: TNotifyEvent;
FOldOnClose: TCloseEvent;
FOnDie: TNotifyEvent;
FOnClose: TCloseEvent;
FOnEndDock: TEndDragEvent;
CloseAction: TCloseAction;
function GetTable: TDataSet;
procedure SetTable (value: TDataSet);
procedure Activate(Sender: TObject);
procedure Cerrar(var Action: TCloseAction);
protected
public
Explorador: TfmExControlsTabla;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Execute;
published
property Table: TDataSet read GetTable write SetTable;
property Modal: boolean read FModal write FModal default True;
property OnActivate: TNotifyEvent read FOnActivate write FOnActivate;
property OnShow: TNotifyEvent read FOnShow write FOnShow;
property OnDie: TNotifyEvent read FOnDie write FOnDie;
property OnClose: TCloseEvent read FOnClose write FOnClose;
property OnEndDock: TEndDragEvent read FOnEndDock write FOnEndDock;
end;
procedure Register;
implementation
constructor TDBexplorer.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FModal := True;
end;
destructor TDBexplorer.Destroy;
begin
if Modal then
begin
if Assigned(Explorador) then
FreeAndNil(Explorador);
end;
inherited Destroy;
end;
function TDBexplorer.GetTable :TDataSet;
begin
Result:= FTable;
end;
procedure TDBexplorer.SetTable(value: TDataSet);
begin
if FTable <> value then
begin
FTable:= Value;
if value <> nil then
value.FreeNotification(Self);
end;
end;
procedure TDBexplorer.Execute;
begin
CloseAction:= caFree;
Explorador:= TfmExControlsTabla.CreateTabla(Owner, FTable);
if Modal and (Owner<>nil) then
Explorador.OnDestroy:= OnDie;
.
FOldOnClose:= Explorador.OnClose;
FOldOnActivate := Explorador.OnActivate;
Explorador.OnActivate:= Activate;
Explorador.OnShow:= OnShow;
Explorador.OnEndDock:= OnEndDock;
Explorador.OnClose:= OnClose;
if FModal then
try
Explorador.ShowModal;
finally
begin
Cerrar(CloseAction);
Explorador.Free;
end;
end
else
begin
try
Explorador.Show;
except
Explorador.Free;
end;
end;
end;
procedure Register;
begin
RegisterComponents('Data Controls', [TDBexplorer]);
end;
procedure TDBexplorer.Activate(Sender: TObject);
begin
inherited;
if Assigned(Explorador) then
begin
if Assigned(FOldOnActivate) then
FOLdOnActivate(Sender);
if Assigned(FOnActivate) then
FOnActivate(Sender);
end;
end;
procedure TDBexplorer.Cerrar(var Action: TCloseAction);
begin
inherited;
if Modal then
begin
if Assigned(FOldOnClose) then
begin
if Assigned (Explorador.Tabla) then
begin
if Explorador.Tabla.Active then
Explorador.Tabla.Close;
FOldOnClose(Self, Action);
end;
end;
if Assigned(FOnClose) then
FOnClose(Self, Action);
if Explorador <> nil then
Explorador:= nil;
end;
end;
end.
Espero que os pueda servir.