Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2024, 14:49   #1
Polarman
 
Регистрация: 21.04.2022
Сообщений: 5
По умолчанию Запись в StringGrid из текстового файла

Здравствуйте! Я новичок в Delphi, никак не получается загрузить данные из текстового файла в таблицу! Вроде бы должно быть элементарно, но никак не получается. Кое что я конечно сделал, а вот дальше не продвинуться. Высылаю сам текстовый файл и код. Если не трудно, помогите!
Вложения
Тип файла: 7z 004.7z (190.6 Кб, 3 просмотров)
Polarman вне форума Ответить с цитированием
Старый 10.10.2024, 16:52   #2
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 178
По умолчанию

Код:
procedure TForm1.N2Click(Sender: TObject);
var
  l:TStringList;
  s:string;
  i,j,a,b:Integer;
begin
if OpenDialog1.Execute Then
begin
  l:=TStringList.Create;
   try
   l.LoadFromFile(OpenDialog1.FileName);
   //удаляем лишние строки (в файле CR LF LF)
   for J := l.Count-1 downto 0 do
     if trim(l[J])='' then l.Delete(J);
   with StringGrid1 do
   begin
     ColCount:=17;
     RowCount:=l.Count+2;
     for I := 1 to l.Count do
       begin
         Cells[0,i]:=Format('%u',[i]);
         a:=1;
         j:=1;
         if (l[i-1]='') then Continue;
         while true do
          begin
            b:=pos(#9,l[i-1],a);
            if b=0 then b:=Length(l[i-1]);
            s:=Copy(l[i-1],a,b-a);
            if (j<ColCount)and(i<RowCount) then
            Cells[j,i]:=s;
            a:=b+1;
            inc(j);
            if b=Length(l[i-1]) then Break;
          end;
       end;
   end;
  finally
    l.free;
  end;
end;
end;
Набросал на досуге. Вы же в курсе что в вашем файле строки разделены CL RF RF?
DIONISKA вне форума Ответить с цитированием
Старый 10.10.2024, 18:50   #3
Polarman
 
Регистрация: 21.04.2022
Сообщений: 5
По умолчанию

Здравствуйте. Компилятор ругается на эту строку

b:=pos(#9,l[i-1],a);

Мол перед а надо ставить скобку, а не запятую. Я пробнул, не помогает.

Последний раз редактировалось Polarman; 10.10.2024 в 18:52.
Polarman вне форума Ответить с цитированием
Старый 10.10.2024, 19:11   #4
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 178
По умолчанию

Цитата:
Сообщение от Polarman Посмотреть сообщение
Компилятор ругается на эту строку
не D7 часом? Там PosEx() тогда вместо pos()
DIONISKA вне форума Ответить с цитированием
Старый 11.10.2024, 20:56   #5
Polarman
 
Регистрация: 21.04.2022
Сообщений: 5
По умолчанию

Здравствуйте. Ну с этим я вроде разобрался. Теперь другая проблема! Например я загрузил в StringGrid файл, (он как Вы правильно заметили с CR и LF) поменял там некоторые значения и теперь мне надо его сохранить, но сохраняется он уже совсем по другому. Не посмотрите мой код, где там неправильно. У меня Delphi 7.
Вложения
Тип файла: 7z 005.7z (189.5 Кб, 3 просмотров)
Polarman вне форума Ответить с цитированием
Старый 12.10.2024, 14:10   #6
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 178
По умолчанию

Цитата:
Сообщение от Polarman Посмотреть сообщение
Вы правильно заметили с CR и LF
Не просто CR LF, а "CR LF LF", страшно представить того сумрачного гения, кто это соорудил.

я-бы сделал всё чуть проще:
Код:
procedure TForm1.save(filename: string);
var
  I: Integer;
  L,R:TStringList;
begin
  L:=TStringList.Create;
  R:=TStringList.Create;
  try
  for I := 1 to StringGrid1.RowCount-1 do
   begin
      R.Assign(StringGrid1.Rows[i]);
      R.Delete(0); //Ячейка с порядковым номером
      L.Add(Trim(StringReplace(r.Text,sLineBreak,#9,[rfReplaceAll]))+#10); //добавляем лишний LF в конце 
   end;
  finally
   R.Free;
  end;
  L.SaveToFile(filename);
  L.Free;
end;
Цитата:
Сообщение от Polarman Посмотреть сообщение
Delphi 7
Не понимаю я тех, кто пользуется IDE, которой больше 20 лет. Стандарты языка уже давно поменялись, завезли кучу плюшек, дженерики, хелперы, юникод, анонимные методы и тп Даже сделали бесплатную community версию, но нет.
DIONISKA вне форума Ответить с цитированием
Старый 12.10.2024, 16:01   #7
Polarman
 
Регистрация: 21.04.2022
Сообщений: 5
По умолчанию

Я сейчас объясню почему так и почему я что то пытаюсь сделать в Delphi 7. Немного не по теме конечно, но думаю модераторы меня простят. Дело в том что я на данный момент работаю в Антарктиде. И вот у нас имеется автоматическая метеостанция которая ежеминутно снимает показания различных параметров и записывает их в log-файл. Далее идет обработка этого файла в другой программе, а она никак не хочет принимать даже немного измененный файл. Сама же станция периодически дает сбои, пропуски бывают и по 3-5 часов. Так что интерполировать ручками такие промежутки времени... так себе удовольствие!!! Вот я и решил для себя написать программку. До интерполяции еще не дошел :-). Когда то давно писал программы на Delphi 7. Так что тут старое бы вспомнить, на изучение чего то нового просто времени нет. Кстати, станция финская и ПО разрабатывали они.
Polarman вне форума Ответить с цитированием
Старый 12.10.2024, 17:22   #8
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 178
По умолчанию

Цитата:
Сообщение от Polarman Посмотреть сообщение
не хочет принимать даже немного измененный файл
Посмотрите в ваш лог в любом HEX-редакторе: Там разделитель между столбцами $0x09(табуляция), а между строками 0x0D, 0x0A, 0x0A или #13 #10 #10 (CR LF LF) и сравните с результатом работы вашей программы. Там вместо 0x0D, 0x0A, 0x0A будет 0x0D, 0x0A, 0x0D, 0x0A, т.е. лишний CR, также лишние пробелы перед табуляцией, поэтому скорее всего сторонняя программа отказывается работать с отредактированным файлом.
DIONISKA вне форума Ответить с цитированием
Старый 23.10.2024, 15:40   #9
Polarman
 
Регистрация: 21.04.2022
Сообщений: 5
По умолчанию

Цитата:
Сообщение от DIONISKA Посмотреть сообщение
Не просто CR LF, а "CR LF LF", страшно представить того сумрачного гения, кто это соорудил.

я-бы сделал всё чуть проще:
Код:
procedure TForm1.save(filename: string);
var
  I: Integer;
  L,R:TStringList;
begin
  L:=TStringList.Create;
  R:=TStringList.Create;
  try
  for I := 1 to StringGrid1.RowCount-1 do
   begin
      R.Assign(StringGrid1.Rows[i]);
      R.Delete(0); //Ячейка с порядковым номером
      L.Add(Trim(StringReplace(r.Text,sLineBreak,#9,[rfReplaceAll]))+#10); //добавляем лишний LF в конце 
   end;
  finally
   R.Free;
  end;
  L.SaveToFile(filename);
  L.Free;
end;

Не понимаю я тех, кто пользуется IDE, которой больше 20 лет. Стандарты языка уже давно поменялись, завезли кучу плюшек, дженерики, хелперы, юникод, анонимные методы и тп Даже сделали бесплатную community версию, но нет.
DIONISKA, Доброго времени суток! Послушал Вашего совета и установил себе Embarcadero.Delphi.12.2 Буду осваивать новую IDE.
Polarman вне форума Ответить с цитированием
Старый 23.10.2024, 17:34   #10
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 178
По умолчанию

Цитата:
Сообщение от Polarman Посмотреть сообщение
Embarcadero.Delphi.12.2 Буду осваивать новую IDE
Хороший выбор, удачи.

К слову новые версии IDE позволяет существенно сократить труд, например процедура открытия с проверками может быть такой:
Код:
begin
  if not(OpenDialog1.Execute(Handle)) then Exit;
     var sl:TStringList:=TStringList.Create;
         StringGrid1.BeginUpdate;
         StringGrid1.RowCount:=sl.Count;
         sl.LoadFromFile(OpenDialog1.FileName,TEncoding.UTF8);
     var rowcnt:integer:=1;
      try
           for var i:Integer := 0 to Pred(sl.Count) do
             begin
                if trim(sl[i])='' then Continue;
                StringGrid1.Rows[rowcnt].CommaText:=rowcnt.ToString+#9+sl[i];
                inc(rowcnt);
             end;
      finally
        StringGrid1.RowCount:=rowcnt;
        StringGrid1.EndUpdate;
        sl.Free;
      end;
end;
DIONISKA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись из текстового файла в массив типа int lisica198808 C# (си шарп) 4 03.04.2019 11:25
запись текстового файла в stringgrid Egorza Помощь студентам 1 11.05.2012 00:39
Запись типизированного файла из текстового. Lubawa Паскаль, Turbo Pascal, PascalABC.NET 18 05.11.2011 11:27
Связь текстового файла с StringGrid DgaDga Помощь студентам 9 09.05.2011 23:29
Вывод текстового файла в Stringgrid KingWaR56 Помощь студентам 1 26.04.2011 18:39