Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Guardar Config. del formulario en BD (https://www.clubdelphi.com/foros/showthread.php?t=32091)

DANY 26-05-2006 02:17:56

Guardar Config. del formulario en BD
 
Necesito grabar la configuracion de un formulario en la base de datos. La idea central es que un usuario con permisos alterre las propiedades de los componentes (Visible, enabled, posicion, etc.) y lo guarde en un determinado perfil para manejo de seguridad.
El codigo de roman que encontre hace lo que necesito.
pero grabando en un archivo y lo necesito grabar en la BD. para ello utilizo un campo Imgen en SQL Server, utilizo ADO.
El Codigo de roman decia:
Código Delphi [-]
function TForm1.FormFileName: String;
begin
  Result := ExtractFilePath(Application.ExeName) + ClassName + '.bin';
end;

procedure TForm1.Load;
var
  Stream: TFileStream;

begin
  Stream := TFileStream.Create(FormFileName, fmOpenRead or fmShareDenyWrite);

  try
    Stream.ReadComponent(Self);
  finally
    Stream.Free;
  end;
end;

procedure TForm1.Save;
var
  Stream: TFileStream;

begin
  Stream := TFileStream.Create(FormFileName, fmCreate);

  try
    Stream.WriteComponent(Self);
  finally
    Stream.Free;
  end;
end;

Necesito los metodos load y save pero leyendo de la base.
Gracias...

waltergomez 26-05-2006 17:03:44

Copy y Paste del Help de Delphi

Código Delphi [-]
function ComponentToString(Component: TComponent): string;

var
  BinStream:TMemoryStream;
  StrStream: TStringStream;
  s: string;
begin
  BinStream := TMemoryStream.Create;
  try
    StrStream := TStringStream.Create(s);
    try
      BinStream.WriteComponent(Component);
      BinStream.Seek(0, soFromBeginning);
      ObjectBinaryToText(BinStream, StrStream);
      StrStream.Seek(0, soFromBeginning);
      Result:= StrStream.DataString;
    finally
      StrStream.Free;

    end;
  finally
    BinStream.Free
  end;
end;

function StringToComponent(Value: string): TComponent;
var
  StrStream:TStringStream;
  BinStream: TMemoryStream;
begin
  StrStream := TStringStream.Create(Value);
  try
    BinStream := TMemoryStream.Create;
    try
      ObjectTextToBinary(StrStream, BinStream);
      BinStream.Seek(0, soFromBeginning);
      Result := BinStream.ReadComponent(nil);

    finally
      BinStream.Free;
    end;
  finally
    StrStream.Free;
  end;
end;

Salu2

DANY 26-05-2006 23:02:24

Esto es lo que intente
 
lo estoy grabando en un campo text de sql server, la grabacion funciona bien, el problema lo tengo cuando construyo el formulario. Muestro como creo los formularios, qu son MDIChild.
Código Delphi [-]
procedure CrearFormulario(ClaseFormulario : TFormClass; var Formulario);
var PermisosFormularios: TPermisosFormularios ;
    Stream: TStringStream ;
begin


  if TComponent(Formulario) = nil then
      Application.CreateForm(ClaseFormulario,Formulario)
  else
  begin
    TForm(Formulario).WindowState := wsNormal;
    TForm(Formulario).Show;
  end;

// Hasta aca lo creo como siempre.
  try
    PermisosFormularios := TPermisosFormularios.CrearParaPonerPermisos(TComponent(Formulario).Name ) ;
    TComponent(Formulario) :=StringToComponent(PermisosFormularios.Propiedades ) ;// aca me da el error
  finally
    FreeAndNil(PermisosFormularios );

  End;


end;

El error es: class TFPlanillaMarcas not found.
Seguro me estoy ahgando en un vaso de agua (del que estoy viendo la mitad vacia).
Muchas gracias por su valioso tiempo.

waltergomez 27-05-2006 01:59:02

No lo probe pero estimo que funcionara. Formulario es de tipo TCustomForm no necesitas hacer tanto casting.

Código Delphi [-]
procedure CrearFormulario(ClaseFormulario : TFormClass; var Formulario : TCustomForm ?);
var PermisosFormularios: TPermisosFormularios ;
    Stream: TStringStream ;
begin


  if not Assigned(Formulario) then
      Application.CreateForm(ClaseFormulario,Formulario)
  else
  begin
    Formulario.WindowState := wsNormal;
    Formulario.Show;
  end;

// Hasta aca lo creo como siempre.
  try
    PermisosFormularios := TPermisosFormularios.CrearParaPonerPermisos(Formulario.Name) ;


    RegisterClass(TFPlanillaMarcas);

// Esta asignacion no la entiendo, pero igual

    Formulario := StringToComponent(PermisosFormularios.Propiedades ) ;// aca me da el error
  finally
    FreeAndNil(PermisosFormularios );

  End;


end;


Salu2,

DANY 27-05-2006 02:22:25

en la linea de asignacion que no entiendes ahora me da error que los componentes ya estan creados, y es medio obvio. pero como llamo al metodo
para crear el formulario ??.

pasandole como parametro: StringToComponent(PermisosFormularios.Propiedades ))

DANY 01-06-2006 17:48:22

Ya lo resolvi
 
la unica manera fue, como decia roman en un foro que consulte al respecto redefinir el create del form. Si no, no encontre la forma de asignar el contenido del Blob de la BD al Form.
Este es el Codigo:
Código Delphi [-]
constructor TfPlanillaABM.Create(AOwner: TComponent);
var    Stream: TStringStream ;
       PermisosAColocar: TPermisosUsuariosFormularios ;
begin

  CreateNew(AOwner);
  PermisosAColocar := TPermisosUsuariosFormularios.CrearParaColocarPermisos(FormularioActivo,UsuarioActivo.CodigoUsuario ); 
  if PermisosAColocar.ExistenPermisosDeUsuarioEnFormulario  then
  Begin
    try
      Stream := TStringStream.Create(PermisosAColocar.DevuelveCadenaStringDelFrmulario );
      Stream.ReadComponent(Self);

    finally
      FreeAndNil(Stream);
      FreeAndNil(PermisosAColocar); 
    End;
  End
  Else
    inherited Create(AOwner);

  PrepararFormulario ;
  
end;
en donde permisos a colocar hace una consulta a la base que lee el campo blob guardado y lo devuelve como string.
Muchas gracias por la ayuda y pos su tiempo


La franja horaria es GMT +2. Ahora son las 13:05:52.

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