Главная страница
    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.037 c
1-1103198318
Zilog
2004-12-16 14:58
2005.01.02
Как из своего класса обрабатывать сообщения некого окна?


14-1103121552
gn
2004-12-15 17:39
2005.01.02
Интересное интерьвю:-))


4-1100536437
Ale}{(is)
2004-11-15 19:33
2005.01.02
UPX 1.xx, Aspack 2.xx, Shrink


14-1102777344
Gusto
2004-12-11 18:02
2005.01.02
ASMEdit 3.5 - GUI-оболочка ассемблера.


1-1103111248
Пат
2004-12-15 14:47
2005.01.02
Как скопировать текст - FindWindowEX( SysListView32 );





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский