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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2018, 22:01   #1
Алексей0001
Пользователь
 
Регистрация: 25.11.2017
Сообщений: 39
По умолчанию Проблемы с разбиением файла

Добрый день, суть такая есть код

Код:
function DigitSort(L: TStringList; index1, index2: Integer): Integer;
var
  i1, i2: Integer;
begin
  i1 := StrToInt(Copy(L.Strings[index1], 1, Pos(#9, L.Strings[index1]) - 1));
  i2 := StrToInt(Copy(L.Strings[index2], 1, Pos(#9, L.Strings[index2]) - 1));
  result := CompareValue(i1, i2);
end;
 
procedure TForm2.Button_ProcessClick(Sender: TObject);
var
  fName: String; // переменная, куда записываем имя файла
  dL, sL: TStringList; // объявляем стринглисты
  i, tmp: Integer;
begin
    if not OpenDialog1.Execute then // если никакой файл не выбран - прерываем выполнение
    Exit;
  slFile.LoadFromFile(OpenDialog1.FileName); // загружаем файл в стринглист
  StringGrid1.RowCount := slFile.Count; // количество строк в таблице = количеству строк в файле
  dL := TStringList.Create;
  for i := 0 to slFile.Count - 1 do // проходим по строкам стринглиста
  begin
    dL.Delimiter := #9; // устанавливаем разделить строк, рязделяемый символом табуляции(#9)
    dL.DelimitedText := slFile.Strings[i]; // разделяем строку на слова и заполняем стринглист
    if dL.Count > StringGrid1.ColCount then // если количество строк в  больше, чем количество столбцов таблицы
      StringGrid1.ColCount := dL.Count; // тогда количество столбцов таблицы = количеству строк
    StringGrid1.Rows[i].DelimitedText := slFile.Strings[i]; // заполняем очередную строку таблицы очередной строкой, разбив ее на слова
  end;
  dL.Clear; // очищаем стринглист
  fName := ChangeFileExt(OpenDialog1.FileName, '.result');
  // задаем файлу новое расширение
  sL := TStringList.Create; // создем стринглист
  for i := 0 to StringGrid1.RowCount - 1 do
  // циклом проходим по строкам таблицы
  begin
    StringGrid1.Rows[i].Delimiter := #9; // устанавливаем разделитель строк равный символу табуляции
    if TryStrToInt(StringGrid1.Cells[0, i], tmp) then // если данные из первой ячейки текущей строки являются целым числом
      dL.Add(StringGrid1.Rows[i].DelimitedText)
      // тогда записываем эту строку таблицу дл
    else
      sL.Add(StringGrid1.Rows[i].DelimitedText); // иначе записывем в сл
  end;
  if sL.Count > 1 then // если в сл больше одной строки тогда сортируем её по правилам сортировки строк
    sL.Sort;
  if dL.Count > 1 then // если в дл больше одной строки тогда сортируем по правилам сортировки чисел
    dL.CustomSort(DigitSort);
  slFile.Text := dL.Text; // текст slFile=dL
  for i := 0 to sL.Count - 1 do // циклам проходим по сл
    slFile.Add(sL.Strings[i]); // добовляем строку в  slFile
  if not FileExists(fName) then // если нет файла, имя которого определено переменной fName
    slFile.SaveToFile(fName) // тогда сохраняем в файл с именем fName
  else if (MessageBox(Handle, // иначе открывается диалоговое окно с предложение записть под другим именем
      'Обработанный файл с таким именем уже существует.'#13'Вы хотите сохранить файл под другим именем?', 'Запрос.', mb_YesNo or mb_IconQuestion) = idNo) or (not SaveDialog1.Execute) then
  begin
    ShowMessage('Операция отменена. Файл не сохранен!'); // в случаем не согласия сохранить файл с другим именем выводим сообщение на экран
    dL.Free;//уничтожаем  и освобождаем память
    sL.Free;//уничтожаем  и освобождаем память
    Exit; // прерываем выполнение
  end
  else
    slFile.SaveToFile(SaveDialog1.FileName);
  // иначе сохраняем файл с новым именем
  ShowMessage('Сохранение выполнено успешно!');
  dL.Free; //уничтожаем  и освобождаем память
  sL.Free; //уничтожаем  и освобождаем память
end;
 
procedure TForm2.FormCreate(Sender: TObject);
begin
  slFile := TStringList.Create; // создаем стринг лист
end;
 
procedure TForm2.FormDestroy(Sender: TObject);
begin
  slFile.Free; // уничтожаем slFile и освобождаем память
end;
 
end.
В котором идет разбиение файла через символ табуляции(#9).
Программа не стабильно работает, при процедуре
Код:
procedure TForm2.Button_ProcessClick(Sender: TObject);
Если использовать символ табуляции, запятой или пробел то работает нормально, при других все лепит в один столбец.
в чем может быть проблема?
Алексей0001 вне форума Ответить с цитированием
Старый 24.01.2018, 00:47   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Файл-то, бть, где?!
--------
Как ты эту писанину читаешь ваще? У меня глаза кровоточат.
Отделяй блоки-то хотя бы.

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 24.01.2018 в 00:49.
min@y™ вне форума Ответить с цитированием
Старый 24.01.2018, 06:36   #3
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от Алексей0001 Посмотреть сообщение
Код:
StringGrid1.Rows[i].DelimitedText := slFile.Strings[i];
Это что вообще?
Black Fregat вне форума Ответить с цитированием
Старый 24.01.2018, 09:30   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1.
Цитата:
Если использовать символ табуляции, запятой или пробел то работает нормально, при других все лепит в один столбец.
в чем может быть проблема?
Цитата:
Код:
  dL.Delimiter := #9; // устанавливаем разделить строк, рязделяемый символом табуляции(#9)
  dL.DelimitedText := slFile.Strings[i]; // разделяем строку на слова и заполняем стринглист
  ....
  StringGrid1.Rows[i].DelimitedText := slFile.Strings[i]; // заполняем очередную строку таблицы очередной строкой, разбив ее на слова
разделитель(delemiter) у Row[i] совсем не такой как у dl соответственно совсем не такое (в теории) разбиение по строкам
Цитата:
все лепит в один столбец.
Код:
  StringGrid1.Row[i].Text:=dl.Text;
2. сортировать можно и пустой список
Код:
  if sL.Count > 1 then // если в сл больше одной строки тогда сортируем её по правилам сортировки строк
    sL.Sort;
2. добавлять можно СРАЗУ список
Код:
  slFile.Text := dL.Text; // текст slFile=dL
  for i := 0 to sL.Count - 1 do // циклам проходим по сл
    slFile.Add(sL.Strings[i]); // добовляем строку в  slFile
  slFile.Clear;
  slFile.AddStrings(dl);
  slFile.AddStrings(sl);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 24.01.2018 в 09:36.
evg_m вне форума Ответить с цитированием
Старый 24.01.2018, 12:29   #5
Алексей0001
Пользователь
 
Регистрация: 25.11.2017
Сообщений: 39
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Это что вообще?
без этой строки данные не будут отображаться StringGrid
Алексей0001 вне форума Ответить с цитированием
Старый 24.01.2018, 12:33   #6
Алексей0001
Пользователь
 
Регистрация: 25.11.2017
Сообщений: 39
По умолчанию

Заменил
Код:
 StringGrid1.Rows[i].DelimitedText := slFile.Strings[i];
на
Цитата:
Сообщение от evg_m Посмотреть сообщение
StringGrid1.Row[i].Text:=dl.Text;
какой массив для [i] нужно объявлять? компилятор ругается
Алексей0001 вне форума Ответить с цитированием
Старый 24.01.2018, 13:07   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
какой массив для [i] нужно объявлять? компилятор ругается
А здесь (см.ниже) не ругался?
Цитата:
Код:
  for i := 0 to slFile.Count - 1 do // проходим по строкам стринглиста
  begin
    dL.Delimiter := #9; // устанавливаем разделить строк, рязделяемый символом табуляции(#9)
    dL.DelimitedText := slFile.Strings[i]; // разделяем строку на слова и заполняем стринглист
    if dL.Count > StringGrid1.ColCount then // если количество строк в  больше, чем количество столбцов таблицы
      StringGrid1.ColCount := dL.Count; // тогда количество столбцов таблицы = количеству строк
    StringGrid1.Rows[i].DelimitedText := slFile.Strings[i]; // заполняем очередную строку таблицы очередной строкой, разбив ее на слова
  end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 24.01.2018, 15:31   #8
Алексей0001
Пользователь
 
Регистрация: 25.11.2017
Сообщений: 39
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
А здесь (см.ниже) не ругался?
нет, этот код полностью рабочий. вот проект, можете сами посмотреть Задание 1.rar
Алексей0001 вне форума Ответить с цитированием
Старый 24.01.2018, 17:24   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
нет, этот код полностью рабочий. вот проект
так и надо заменить ОЧЕНЬ похожую строчку. там где имеющийся [i] не вводит компилятор в ступор.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 24.01.2018, 19:28   #10
Алексей0001
Пользователь
 
Регистрация: 25.11.2017
Сообщений: 39
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
так и надо заменить ОЧЕНЬ похожую строчку. там где имеющийся [i] не вводит компилятор в ступор.
Код:
StringGrid1.Rows[i].DelimitedText := slFile.Strings[i];
заменил это на
Код:
 StringGrid1.Rows[i].DelimitedText := dL.Text;
и если в коде программы прописать нужное мне значение(#9-табуляция, #46-точка, #44-запятая) программа работает.
Потом в коде
Код:
#9
заменил на переменную v значение которой присваивал через Edit. И программа так перестала работать
Алексей0001 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с отправкой файла Rockot Работа с сетью в Delphi 3 10.05.2017 18:44
Импорт Большого текстового файла (14 млн. строк) с разбиением strannick Microsoft Office Excel 15 01.02.2014 12:55
Проблемы с прокруткой файла excel звездочка Microsoft Office Excel 7 21.02.2012 20:33
Пересчет с разбиением Avel85 Microsoft Office Excel 7 02.09.2011 13:44
проблемы с открытием файла Sparky Общие вопросы C/C++ 1 09.04.2010 19:46