Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   No se crea variable stream (https://www.clubdelphi.com/foros/showthread.php?t=92096)

carlosw1978 22-07-2017 14:01:32

No se crea variable stream
 
Un gran saludo a toda esta comunidad grandiosa y dios los bendiga... Ok se me presentó un problema con un desarrollo que estoy elaborando, el error me parece extraño o quizás falta de conocimiento, desde el formulario principal en oncreate llamo un método ConfigurarInteface que consiste simplemente en activar o desactivar botones de un menú ribbon, la data donde está registrada para activar estos botones es un campo blob con lo cual utilizo las técnicas de crear el stream (como se consigue en la red). Escribo parte del código del como elaboro el stream.

Código Delphi [-]
Blob := FieldByName('as_modulo') as TBlobField;
ST := CreateBlobStream(Blob, bmRead);
ST.Read(TablaAcc, SizeOf(MapAcceso));

La variable TablaAcc es de tipo récord del MapAcceso; lo más curioso es que ese mismo código lo tengo en el formulario de usuarios.

Bueno esto es lo que me está sucediendo espero que me puedan ayudar.

AgustinOrtu 22-07-2017 16:55:31

Y cual es el error?

carlosw1978 23-07-2017 04:11:45

Uy si perdón el error es un mensaje que dice access violation.

AgustinOrtu 23-07-2017 09:05:55

Ok, y si le das a break, en que parte del codigo se para el depurador? Haz probado seguir la ejecucion para saber en que lugar exactamente "se rompe"?

carlosw1978 23-07-2017 11:55:06

Si de hecho lo he ejecutado paso a paso y con el debug y la vista de variable local del debug; justamente cuando pasa por la linea ST.read() la variable TablaAcc pierde el registro y es ahí cuando explota.

AgustinOrtu 23-07-2017 21:04:28

Un Access Violation indica que estas accediendo a memoria que no asignaste antes; en palabras simples, cuando le mandas un mensaje a un objeto que no fue asignado, por ejemplo, un nil. Hay casos mas complicados donde se crea un objeto, se libera y luego se le siguen mandando mensajes:

Código Delphi [-]
var
  obj: TMiClase;
begin
  obj := nil;
  obj.Algo; // EAccessViolation
  
  obj := TMiClase.Create;
  obj.Algo; // todo bien
  
  obj.Free; // liberar memoria, pero notese que obj es distinto de nil
  Assert(obj <> nil);
  obj.Algo; // EAccessViolation
end;

Cuales son los valores de todas las variables cuando rompe el programa? Estan todos los objetos creados e inicializados correctamente?

Cuando recuperas el campo blob 'as_modulo', este te devuelve un objeto de tipo TBlobField? Que dice el depurador del valor de esta variable?
Que ocurre cuando llamas a la funcion CreateBlobStream? Esta termina correctamente?

Cual es el valor del objeto TablaAcc?

carlosw1978 23-07-2017 23:14:45

Código Delphi [-]
implementation

{$R *.dfm}

uses Funciones, U_Configdb, U_FormTablas, U_TUsuario, U_TBanco, U_TCXC, U_TCXP,
  U_TOtrosActivos, U_FormClave, U_ParaEmpresa, U_FormRespaldarBD;

type MapAcceso = record
  Modulo : String;
  Permiso,
  Nuevo,
  Buscar,
  Guardar,
  Eliminar,
  Modificar,
  Primero,
  Anterior,
  Siguiente,
  Ultimo : Boolean;
end;

var
  TablaAcc: MapAcceso;

•
•
•
•
procedure TForm_Principal.ConfigurarInterface;
var
  Blob: TBlobField;
  ST: TStream;
begin
  with dmPrincipal.FDQ_Mapas do
  begin
    Close;
    SQL.Clear;
    SQL.Add('Select AS_IDReng, AS_Usuario, AS_Modulo, AS_NombMod');
    SQL.Add('From AS_MapAcceso');
    SQL.Add('Where UCase(LTrim(RTrim(AS_Usuario))) = ' + QuotedStr(UpperCase(Usuario.Trim)));
    Open;
    First;
    while not Eof do
    begin
      if Eof then
        Exit;
      Blob := FieldByName('AS_Modulo') as TBlobField;
      ST := CreateBlobStream(Blob, bmRead);
      ST.Seek(0,0);
      ST.Read(TablaAcc, SizeOf(TablaAcc));
      MessageDlg(TablaAcc.Modulo,mtInformation,[mbOK],0);
      if UpperCase(TablaAcc.Modulo.Trim) = 'DOCUCAP' then
        Action_TBanco.Enabled := TablaAcc.Permiso;
      if UpperCase(TablaAcc.Modulo.Trim) = 'BANC' then
        Action_TBanco.Enabled := TablaAcc.Permiso;
      if UpperCase(TablaAcc.Modulo.Trim) = 'CXC' then
        Action_TBanco.Enabled := TablaAcc.Permiso;
      if UpperCase(TablaAcc.Modulo.Trim) = 'CXP' then
        Action_TBanco.Enabled := TablaAcc.Permiso;
      if UpperCase(TablaAcc.Modulo.Trim) = 'OACT' then
        Action_TBanco.Enabled := TablaAcc.Permiso;
      if UpperCase(TablaAcc.Modulo.Trim) = 'EMPR' then
        Action_TBanco.Enabled := TablaAcc.Permiso;
      if UpperCase(TablaAcc.Modulo.Trim) = 'USUA' then
        Action_TBanco.Enabled := TablaAcc.Permiso;
      if UpperCase(TablaAcc.Modulo.Trim) = 'PARABD' then
        Action_TBanco.Enabled := TablaAcc.Permiso;
      if UpperCase(TablaAcc.Modulo.Trim) = 'RESPBD' then
        Action_TBanco.Enabled := TablaAcc.Permiso;
      if UpperCase(TablaAcc.Modulo.Trim) = 'RESTBD' then
        Action_TBanco.Enabled := TablaAcc.Permiso;
      if UpperCase(TablaAcc.Modulo.Trim) = 'MANTBD' then
        Action_TBanco.Enabled := TablaAcc.Permiso;
      Next;
    end;
    Close;
  end;
end;

carlosw1978 24-07-2017 01:25:08

Agustín ya encontré el problema me guiaste con la última respuesta que chequeara las iniciaciones de variables y me di cuenta que el récord MapAcceso faltaba un campo adicional y por eso arrojaba el error y no me percataba de esto. Muchas gracias Agustín por tu apoyo


La franja horaria es GMT +2. Ahora son las 18:16:47.

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