![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись в файл в Win кодировке используя TFileStream
Frozzen © (2004-12-17 10:53:00)Господа подскажите!
Имею
DFile: TFileStream;
RecordBuffer: array[1..4000] of Char;
DFile.Write(RecordBuffer, FHeader.RecordSize);
или
DFile.WriteBffer(RecordBuffer, FHeader.RecordSize);
как записать это все дело в кодировке win?
Frozzen (2004-12-17 14:18:00) [1]admin@pronto.krsk.info
Fay (2004-12-17 11:27:00) [2]>> for N:=1 to Length(S) do RecordBuffer[Addr-1+N]:=S[N];
Если это настоящий код SetFielData, то выброси этот компонент.
Могу прислать VkDBF - в нём галюнов поменьше 8).
Frozzen (2004-12-17 11:14:00) [3]вот заполнение буфера из SetFielData
for N:=1 to Length(S) do RecordBuffer[Addr-1+N]:=S[N];
Frozzen (2004-12-17 11:12:00) [4]это я уже раскалупал Тдбф
tab.SetFieldData(22,'МЕСТ');
//---------------------------------------------------------
procedure TDbf.SetFieldData(FieldNo: Integer; Data: String);
var
IField: PField;
S, W: String;
N, Addr: Longint;
G, M, D: Word;
begin
if (FieldNo<1) or (FieldNo>FNumFields) then
raise ED.Create('SetFieldData: Неверный номер поля: '+IntToStr(FieldNo)) else
begin
IField:=FieldList.Items[FieldNo-1];
W:=TrimRight(Data); // Удаление пробелов и спецсимволов справа
if (Length(W)<=IField^.FieldSize) or
((IField^.FieldType='L') and (Length(W)<=4)) then
with IField^ do
begin
if W<>'' then // Преобразование данных в зависимости от типа
try
case FieldType of
'L' : if (UpperCase(W)='TRUE') or (UpperCase(W)='YES') then S:='T'
else if (UpperCase(W)='FALSE') or (UpperCase(W)='NO') then
S:='F' else S:=' ';
'D' : begin
G:=StrToInt(Copy(W, 7, 2))+1900; if G<=1950 then G:=G+100;
M:=StrToInt(Copy(W, 4, 2)); D:=StrToInt(Copy(W, 1, 2));
S:=FormatDateTime('yyyymmdd', EncodeDate(G, M, D));
end;
'F','N' : begin
if (Pos('.', W)>0) and (DecimalSeparator=',') then W[Pos('.', W)]:=',';
S:=FloatToStrF(StrToFloat(W), ffFixed, FieldSize, FieldPrecision);
if (FieldPrecision>0) and (DecimalSeparator=',') then
S[Pos(',', S)]:='.';
end
else S:=W; end;
except raise ED.Create('SetFieldData: Ошибка данных - Ряд: '+
IntToStr(FCurrentRecord)+', Поле: '+IntToStr(FieldNo)); end;
case FieldType of
'N','F','M': S:=PadLeft(S, FieldSize) // Дополнить пробелами слева
else
S:=PadRight(S, FieldSize); // Дополнить пробелами справа
end; // case
Addr:=2; N:=0; IField:=FieldList.Items[N];
while N<(FieldNo-1) do
begin Inc(Addr, IField^.FieldSize); Inc(N); IField:=FieldList.Items[N]; end;
for N:=1 to Length(S) do RecordBuffer[Addr-1+N]:=S[N];
FModified:=True; // Буфер dbf-файла обновлен
end else raise ED.Create('SetFieldData: Недопустимый размер данных'+#13+
'Ряд: '+IntToStr(FCurrentRecord)+', Поле: '+IntToStr(FieldNo));
end;
end;
//----------------------------------------------------------
procedure TDbf.WriteRecord;
var Y,M,D: Word;
i : integer;
begin
try
with FHeader do begin Y:=Year; M:=Month; D:=Day; end; Y:=Y+1900;
if EncodeDate(Y,M,D)<>Now then SetDbfDate(Now); // Дата модификации файла изменилась
DFile.Seek(FHeader.HeaderSize+((FCurrentRecord-1)*FHeader.RecordSize), soFromBeginning);
{Buffer}
// for i := 1 to FHeader.RecordSize do
//RecordBuffer[i] :=
DFile.Write(RecordBuffer, FHeader.RecordSize);
FModified:=False;
except
raise ED.Create('WriteRecord: Ошибка сохранения записи');
end;
end;
Fay (2004-12-17 11:08:00) [5]Я чё-то не врубаюсь. Данные в win1251, а записаваются в другой кодировке? Если да, то виноваты космические лучи.
Выкладывайте код.
Frozzen (2004-12-17 10:58:00) [6]s := 'папап'
Frozzen (2004-12-17 10:57:00) [7]буфер заполняю так
s : String;
RecordBuffer[Addr-1+N]:=S[N];
Fay (2004-12-17 10:55:00) [8]А в буфере данные в какой кодировке?