Форум: "Основная";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
ВнизЗапись в файл в Win кодировке используя TFileStream Найти похожие ветки
← →
Frozzen (2004-12-17 10:53) [0]Господа подскажите!
Имею
DFile: TFileStream;
RecordBuffer: array[1..4000] of Char;
DFile.Write(RecordBuffer, FHeader.RecordSize);
или
DFile.WriteBffer(RecordBuffer, FHeader.RecordSize);
как записать это все дело в кодировке win?
← →
Fay © (2004-12-17 10:55) [1]А в буфере данные в какой кодировке?
← →
Frozzen (2004-12-17 10:57) [2]буфер заполняю так
s : String;
RecordBuffer[Addr-1+N]:=S[N];
← →
Frozzen (2004-12-17 10:58) [3]s := "папап"
← →
Fay © (2004-12-17 11:08) [4]Я чё-то не врубаюсь. Данные в win1251, а записаваются в другой кодировке? Если да, то виноваты космические лучи.
Выкладывайте код.
← →
Frozzen (2004-12-17 11:12) [5]это я уже раскалупал Тдбф
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;
← →
Frozzen (2004-12-17 11:14) [6]вот заполнение буфера из SetFielData
for N:=1 to Length(S) do RecordBuffer[Addr-1+N]:=S[N];
← →
Fay © (2004-12-17 11:27) [7]>> for N:=1 to Length(S) do RecordBuffer[Addr-1+N]:=S[N];
Если это настоящий код SetFielData, то выброси этот компонент.
Могу прислать VkDBF - в нём галюнов поменьше 8).
← →
Frozzen (2004-12-17 14:18) [8]admin@pronto.krsk.info
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c