Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.02;
Скачать: CL | DM;

Вниз

Запись в файл в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.057 c
14-1102531328
begin...end
2004-12-08 21:42
2005.01.02
Выбор монитора


3-1101984650
Ega23
2004-12-02 13:50
2005.01.02
Средства разработки


14-1102618544
Чеширский_Кот
2004-12-09 21:55
2005.01.02
Слепой музыкант - настоящий гений


1-1103125417
Чайник
2004-12-15 18:43
2005.01.02
Как создать объект по имени его класса


1-1102925519
Алексей Петухов
2004-12-13 11:11
2005.01.02
определить координаты текста WMF