Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-11-2006
Ictiandro Ictiandro is offline
Miembro
 
Registrado: jul 2005
Posts: 13
Poder: 0
Ictiandro Va por buen camino
Error al intentar escribir en un archivos con BlockWrite o FileWrite

Amigos del club delphi, necesito de vuestra ayuda.
Estoy desarrollando una aplicación donde necesito escribir el contenido de una parte de un buffer a un archivo. He intentado realizar esto de dos formas:

Primera Forma:
--------------
type
arreglobyte = array of byte
procedure xxx(param : pointer);
var
buffer : ^arreglobyte;
arch: File;
tamaño, Numbloq, j:integer;
begin
buffer := @param;
...
AssignFile(arch,'ruta de archivo');
rewrite(arch,1);
BlockWrite(arch, buffer^[j], tamaño, Numbloq);
CloseFile(arch);
....
end;


Segunda Forma:
--------------
type
arreglobyte = array of byte
procedure xxx(param : pointer);
var
buffer : ^arreglobyte;
arch: THandle;
tamaño, j:integer;
begin
buffer := @param; //param es de tipo pointer (parametro de entrada)
.....
arch:=filecreate('ruta de archivo');
numbytes := FileWrite(arch,buffer^[j],tamaño);
FileClose(arch);
......
end;

Comentarios:
//tamaño representa cantidad de bytes a escribir del buffer al archivo
//j: posición (en el buffer) desde donde se encuentran los bytes que escribiré al archivo

La mayorìa de las veces este código trabaja de la manera deseada, es decir se toma "n" bytes del buffer ("n" es igual a la variable "tamaño") y escribe exitosamente estos bytes en el archivo.
El problema es que algunas veces para ambos casos cuando se ejecuta la instrucción BlockWrite (en el primer caso), o FileWrite (en el segundo caso), se produce el siguiente error:

Error 1784: El buffer del usuario no es válido para esta operación.

NOTA: Cabe resaltar que el buffer esta bien y conserva correctamente la información que contiene.
Espero que alguien me pueda ayudar a solucionar este problema, o quizas pueda indicar alguna otra manera para escribir un archivo desde un buffer.

Les agradezco de antemano.

Saludos
Responder Con Cita
  #2  
Antiguo 17-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Hola Ictiandro, antes de nada decirte que si usas las etiquetas [delphi][/delphi] tu código se mostrara mucho mejor, y sera mas fácil leerlo.

Con respecto a tu pregunta, no entiendo porque utilizas un array of bytes, creo que es un paso innecesario. De todas formas aqui te dejo como lo haría yo, espero que puedas sacar alguna idea interesante.

Código Delphi [-]
function Guardar(Filename: string; Buffer: Pointer; Pos, Count: Cardinal): Boolean;
var
  F: File;
  Escritos: Cardinal;
begin
  Result:= FALSE;
  AssignFile(F,Filename);
  {$I-}
    Rewrite(F,1);
  {$I+}
  if IOResult=0 then
  begin
    inc(PByte(Buffer),Pos);
    Escritos:= 0;
    BlockWrite(F,Buffer^,Count,Escritos);
    Result:= Escritos = Count;
    CloseFile(F);
  end;
end;



// Ejemplo de uso
var
  Str: String;
begin
  Str:= 'Hola mundo maravilloso';
  Guardar('d:\1.txt',PChar(Str),5,5);
end;
Responder Con Cita
  #3  
Antiguo 17-11-2006
Ictiandro Ictiandro is offline
Miembro
 
Registrado: jul 2005
Posts: 13
Poder: 0
Ictiandro Va por buen camino
Gracias Seoane. Para la siguiente prometo usar las etiquetas [ delphi][ /delphi].

Tengo otra duda.
En el ejemplo que dí tengo el tipo arreglobyte = array of byte, y la variable
buffer : ^arreglobyte;

Que puedo hacer para saber la dirección de memoria de de una de las celdas del buffer.
Por ejemplo quiero saber la dirección de memoria de: buffer^[j], y como puedo hacer para convertir esa dirección a una cadena, para de esa manera poder mostrarla con outputdebugstring o con un showmessage.

Una vez más muchas gracias

Saludos
Responder Con Cita
  #4  
Antiguo 17-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Hola Ictiandro, ¿al final te funciono la funcion que te pase?, lo digo porque todavia sigues preguntando por el "array of byte".

De todas formas ahora preguntas como mostrar la direccion de la memoria de una variable, por cierto no seras amigo de abracadabra

Código Delphi [-]
var
  buffer : ^arreglobyte;
  Str: string;
begin
  Str:= '$'+IntToHex(Cardinal(@(buffer^[j])),8);
  ShowMEssage(Str);
end;
Responder Con Cita
  #5  
Antiguo 18-11-2006
Ictiandro Ictiandro is offline
Miembro
 
Registrado: jul 2005
Posts: 13
Poder: 0
Ictiandro Va por buen camino
Red face

Cita:
Empezado por seoane
Hola Ictiandro, ¿al final te funciono la funcion que te pase?, lo digo porque todavia sigues preguntando por el "array of byte".

De todas formas ahora preguntas como mostrar la direccion de la memoria de una variable, por cierto no seras amigo de abracadabra
Seoane, una vez mas gracias gran maestro. Lo que aportas me sirve mucho. La verdad tengo algunos problemas con lo que tenga que ver con punteros a variables. En el caso del ejemplo anterior lamentablemente se sigue produciendo el error 1784.... En fin uno nunca termina de aprender. Por cierto, si conozco muy bien a abracadabra, somos muy amigos, compartimos dudas.....
Saludos.

Última edición por Ictiandro fecha: 18-11-2006 a las 03:23:48.
Responder Con Cita
Respuesta



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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Me da un error al intentar escribir en un campo memo de access Nbull SQL 13 16-11-2007 14:25:11
Saber cual es el error cuando FileWrite retorna -1 abracadabra Varios 1 16-11-2006 01:44:18
Error al intentar un Preview JulioGO Impresión 2 28-04-2006 22:14:27


La franja horaria es GMT +2. Ahora son las 17:13:58.


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
Copyright 1996-2007 Club Delphi