Главная страница
    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
3-1102316898
antoxa
2004-12-06 10:08
2005.01.02
Помогите физически удалить записи в DBF файлых


1-1103443089
Logun
2004-12-19 10:58
2005.01.02
Delphi и капризный Flash


1-1103132158
dredd
2004-12-15 20:35
2005.01.02
простенькая задачька на как?


4-1100592227
MaxxSoft
2004-11-16 11:03
2005.01.02
System Tray


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