PDA

Ver la Versión Completa : FileWrite Delphi XE


blaiselaborde
29-03-2011, 10:03:25
Tengo un problema con la instrucción SysUtils.FileWrite en Delphi XE y consiste en que le envío la instrucción para que me escriba una línea en un fichero plano y escribe sólo la mitad pero con caracteres [Null] en medio de cada uno de ellos.

La instrucción sigue el ejemplo exacto del que se muestra en la ayuda:

La Línea que intenta escribir es:

'29/03/2011 09:42:01 PAGINADOR: PAGINADOR/INDEXADOR MODO AUTOMATICO'#$D#$A

Y la línea que escribe es:

2[null]9[null]/[null]0[null]3[null]/[null]2[null]0[null]1[null]1[null] [null]0[null]9[null]:[null]4[null]2[null]:[null]0[null]1[null] [null] P[null]A[null]G[null]I[null]N[null]A[null]D[null]O[null]R[null]:[null] [null]P[null]A

La función es:

Function fFileWriteString(aFileHandle: Integer;
aBuffer : String;
aCount : LongWord): Boolean;
Var bBuffer: PChar;
i : Integer;
Begin
Result := True;
Try
GetMem(bBuffer, aCount); // Allocate the buffer.

For i := Uno to aCount do
bBuffer[i - Uno] := aBuffer[i];

i := SysUtils.FileWrite(aFileHandle, bBuffer^, aCount);

If i < Cero then
Result := False;
Finally
FreeMem(bBuffer, aCount);
End; // Try
end; // Funct

blaiselaborde
29-03-2011, 14:35:17
Tengo un problema con la instrucción SysUtils.FileWrite en Delphi XE y consiste en que le envío la instrucción para que me escriba una línea en un fichero plano y escribe sólo la mitad pero con caracteres [Null] en medio de cada uno de ellos.

La instrucción sigue el ejemplo exacto del que se muestra en la ayuda:

La Línea que intenta escribir es:

'29/03/2011 09:42:01 PAGINADOR: PAGINADOR/INDEXADOR MODO AUTOMATICO'#$D#$A

Y la línea que escribe es:

2[null]9[null]/[null]0[null]3[null]/[null]2[null]0[null]1[null]1[null] [null]0[null]9[null]:[null]4[null]2[null]:[null]0[null]1[null] [null] P[null]A[null]G[null]I[null]N[null]A[null]D[null]O[null]R[null]:[null] [null]P[null]A

La función es:

Function fFileWriteString(aFileHandle: Integer;
aBuffer : String;
aCount : LongWord): Boolean;
Var bBuffer: PChar;
i : Integer;
Begin
Result := True;
Try
GetMem(bBuffer, aCount); // Allocate the buffer.

For i := Uno to aCount do
bBuffer[i - Uno] := aBuffer[i];

i := SysUtils.FileWrite(aFileHandle, bBuffer^, aCount);

If i < Cero then
Result := False;
Finally
FreeMem(bBuffer, aCount);
End; // Try
end; // Funct


He podido notar que se muestra la cadena por la mitad pero correctamente, si el tamaño (aCount) es un Número Par (aunque el tamaño del string escrito en realidad es completo, o sea que los nulos los pasa al final), en cambio si el tamaño es un número Impar, se muestra la cadena de igual tamaño, pero con los [Null] incorporados, como en el ejemplo que he mostrado.

FGarcia
29-03-2011, 19:54:39
mmmm..... sin haber probado el codigo diria que es asunto del Unicode. Prueba a cambiar pChar por AnsiPChar y string por AnsiString (jeje no me acuerdo del nombre correcto pero por ahi va) :)