Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-10-2005
lento manu lento manu is offline
Miembro
 
Registrado: oct 2004
Posts: 29
Poder: 0
lento manu Va por buen camino
Componente en si

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
    { Private declarations }
    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
    { Protected declarations }
  public
    { Public declarations }
    Explorador: TfmExControlsTabla;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Execute;
    
  published
    { Published declarations }
    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
    //no destruir si no es modal: error de assigned
    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
        //llamada a los eventos OnClose y FOldOnclose para sobrescribir
        Cerrar(CloseAction);
        Explorador.Free;
     end;
     end
   else
   begin
     try
       Explorador.Show;
     except
       Explorador.Free;
       //OJO: sigue viva
     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;
  //como no modal no puedo llamar estos eventos (ya no existen)
  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.
Responder Con Cita
  #2  
Antiguo 05-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
¿Y este compadre?

Explorador: TfmExControlsTabla;

saludos, tiene buena pinta.
Responder Con Cita
  #3  
Antiguo 06-10-2005
lento manu lento manu is offline
Miembro
 
Registrado: oct 2004
Posts: 29
Poder: 0
lento manu Va por buen camino
lo que genera

Ese es precisamente el Form que se genera y q se declara en el uses:
DBGridCheck,
ExControlsTabla //TfmExControlsTabla;
El DBGriDCheck es un TFrame contenido en el form ExControlsTabla, que esencialmente es toda una aplicación que edita indices, busquedasy filtros, ademas de crear los controles DBImage, DBtext y todos los que quieras.
Como una imagen vale + que 1000 palabras vamos a intentarlo:
http://img386.imageshack.us/img386/8023/dbx5sl.jpg
De modo que pasamos una tabla de un DataModule (en el metodo execute asi: Explorador:= TfmExControlsTabla.CreateTabla(Owner, FTable); )
que tiene sus campos Lookup y otros, personalizados en el doble click del TTable. Solo diseñamos la conexión, el formulario ExControlsTabla, genera edición de campos Blob, y todo lo que queramos escribir.

Última edición por lento manu fecha: 06-10-2005 a las 12:23:34.
Responder Con Cita
  #4  
Antiguo 06-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Código Delphi [-]
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
        //llamada a los eventos OnClose y FOldOnclose para sobrescribir
        Cerrar(CloseAction);
        Explorador.Free;
     end;
     end
   else
   begin
     try
       Explorador.Show;
     except
       Explorador.Free;
       //OJO: sigue viva
     end;
   end;
end;

Execute es publico, por tanto el usuario puede llamarlo varias veces ok¿?, vale, lo llamo una vez, se crea el Explorador. Lo llamo una segunda vez, se vuelve a crear otro Explorador ¿y que pasa con el anterior? pues simplemente se queda perdido en memoria ram, ocupando memoria y sin que nadie lo pueda liberar, ya que Explorador apunta ya al nuevo creado.

solución:
Código Delphi [-]
procedure TDBexplorer.Execute;
begin
   CloseAction:= caFree;
   if not assigned(Explorador) then 
     Explorador:= TfmExControlsTabla.CreateTabla(Owner, FTable);
   if Modal and (Owner<>nil) then
      Explorador.OnDestroy:= OnDie;
...


saludos
Responder Con Cita
  #5  
Antiguo 07-10-2005
lento manu lento manu is offline
Miembro
 
Registrado: oct 2004
Posts: 29
Poder: 0
lento manu Va por buen camino
execute

De nuevo gracias, Lepe, por leerte tan bien el código. Tienes toda la razón, siempre que este llamando el método create desde la propiedad FModal=True. Quizá ha sido un error implementar la creación Modal o NoModal del form Explorador. Si es modal, la aplicación no permite crear ningún 'Explorador' más, ya que no tenemos foco para ello, pero no estaría de más protegerlo además con un Exit (eliminando la opción NoModal):
Código Delphi [-]
   if Modal then
     begin
     if not assigned(Explorador) then
       Explorador:= TfmExControlsTabla.CreateTabla(Owner, FTable);
     end
   else
     //Exit; //eliminaria toda opción NoModal
     Explorador:= TfmExControlsTabla.CreateTabla(Owner, FTable);
Si no quisiera, 'caprichos de usuario', editar en Modal, entonces se generan con el mismo componente tantos exploradores como llamadas haga, desde por ejemplo un menú de Exploración multitabla:
Código Delphi [-]
procedure TForm1.Materiales1Click(Sender: TObject);
begin
    DBX.Table:= fDM.TMateriales;
    DBX.Modal:= CheckBox1.Checked;
    try
      DBX.Execute;
    except
      on E:Exception do
      ShowMessage(E.Message);
    end;
end;
El grave problema o error es que estoy usando Owner como como antecesor de todas esas ventanas, muy peligrosas, que se autodestruyen al morir el form donde reside este componente DBexplorador, posiblemente sería mejor Self, si asigna el compo en si como propietario o Padre. Tendía que hacer las pruebas: Hecho: ningún problema de momento ...Han colado las NoModal apagando desde la principal.
Responder Con Cita
  #6  
Antiguo 07-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Cita:
Empezado por lento manu
Quizá ha sido un error implementar la creación Modal o NoModal del form Explorador.
Más bien el error es crear ese comportamiento desde el TDBExplorer. Eso corresponde a la implementación del TfmExControlsTabla.

Código Delphi [-]
//@J@// estos métodos se sobrescriben y no se ejecutan en TExControlsTabla
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;

Pues quitalos del TDBExplorer y dejalos en TExControlsTabla. No es una buena práctica en OOP modificar cosas que no te pertenecen

Igual que haces con la propiedad Table, haces con la propiedad Explorardor, pasandolo de public a published.

saludos
Responder Con Cita
  #7  
Antiguo 08-10-2005
lento manu lento manu is offline
Miembro
 
Registrado: oct 2004
Posts: 29
Poder: 0
lento manu Va por buen camino
cambiar a Published

Seguramente es una gran idea, y supone rescribir un poco. Y sobre todo testearlo, pero posiblemente la lógica sea más sólida.
De nuevo gracias por tus valoraciones y consejos.
Lo intentaré en cuanto pueda. De todos modos, el objeto es el que crea el complejo Explorador, basados en el form TfmExControlsTabla. A simple vista me parece difícil, lo q comentas, sobre todo para editarlo, pero sin probarlo, no lo puedo saber.
Voy a intentar maquetearlo todo + simple, a ver q pasa.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 23:29:57.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi