Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1102616026
Gero
2004-12-09 21:13
2005.01.02
Быстрый ввод некоторых символов


1-1102604360
Delpher_Gray
2004-12-09 17:59
2005.01.02
Плагин к Internet Explorer - тулбар


4-1100590952
Gefest
2004-11-16 10:42
2005.01.02
Как перехватывать нажатия клавиш?


14-1102571731
Dmitriy O.
2004-12-09 08:55
2005.01.02
Почему хранение данных в Эксель занимают так много места ?


14-1102688066
z_man
2004-12-10 17:14
2005.01.02
Как скопировать файл по сетке?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский