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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2013, 04:16   #1
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
Вопрос Копирование нескольких строк из .txt ошибка

У меня проблема с копированием строк из .txt файла, строки копируются нормально код ниже:

Код:
var
s:string;
j,m:integer;
sl:TStringList;
begin
m:=0;
sl:=TStringList.Create;
sl.LoadFromFile(Form1.sFilenameEdit1.FileName);
Randomize;
Form1.sMemo1.Clear;

    for j:=1 to 3 do
    begin
      m:=Random(sl.Count-1);
      s:=sl[m];
      sl.Delete(m);

      Form1.sMemo1.Lines.Add(s);
    end;

sl.Free;
end;
но если строку
Код:
Form1.sMemo1.Lines.Add(s);
поставить после end; то в Memo выдает только 1 строку вместо 3-х, вместо
Код:
Form1.sMemo1.Lines.Add(s);
у меня идет POST запрос перед end; в котором передается переменная s и вместо 3-х строк в ней передается 1 строка, бред какой-то уже полтора часа голову ломаю... если переношу запрос после end; то софт или зависает или выскакивают разные ошибки...

Задача: что бы в переменной s которая подставляется в запрос передавалось 3 рандомных строки из .txt файла и что бы они не повторялись в переменной.

Буду очень признателен за помощь, спасибо.
FleXik вне форума Ответить с цитированием
Старый 04.12.2013, 09:21   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
но если строку
Код:
Form1.sMemo1.Lines.Add(s);
поставить после end; то в Memo выдает только 1 строку вместо 3-х,
Но верно. вы вынесли за цикл. В Memo добавится только одна, причём последняя из случайных строк.

строки в переменной s должны друг от друга отделяться чем-то?!
или слитно должны быть?!

Попробуйте:
Код:
var
s:string;
j,m:integer;
sl:TStringList;
begin
  m:=0;
  sl:=TStringList.Create;
  sl.LoadFromFile(Form1.sFilenameEdit1.FileName);
  Randomize;
  Form1.sMemo1.Clear;

  s := '';  // подготовим строчку к накоплению

  for j:=1 to 3 do
    begin
      m:=Random(sl.Count-1);
      s := s + sl[m]; // вот накопление в строку s
      sl.Delete(m);
    end;
    
    Form1.sMemo1.Lines.Add(s);

    вот тут можете делать ваш post переменной s

sl.Free;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.12.2013, 09:30   #3
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Serge_Bliznykov, да на вас молиться надо, спасибо большущее!!! очень выручили, по поводу разделения тут разве что #13#10 еще раз спасибо

Serge_Bliznykov, эта строка

Код:
sl.Delete(m);
почему-то конфликтит... если ее убрать все ок...


Последний раз редактировалось Stilet; 04.12.2013 в 12:15.
FleXik вне форума Ответить с цитированием
Старый 04.12.2013, 10:39   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

покажите одновлённы код процедуры.
Вы, надеюсь, не вынесли эту строчку ЗА ЦИКЛ ?!!

Цитата:
если ее убрать все ок...
ну, тогда учтите, что возможны повторы строк. Удаление в вашем случае нужно, чтобы повторно одна и та же строка случайно не выпала!


БЛИН!
я догадался в чём проблема.
У Вас в исходном файле НЕТ трёх строчек!!!!

исправьте код на такой:
Код:
  s := '';  // подготовим строчку к накоплению

  for j:=1 to 3 do
    begin
      if  sl.Count > 0 then begin
         m:=Random(sl.Count-1);
         s := s + sl[m]; // вот накопление в строку s
         sl.Delete(m);
      end;
    end;
    
    Form1.sMemo1.Lines.Add(s);

Последний раз редактировалось Serge_Bliznykov; 04.12.2013 в 10:42.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.12.2013, 10:43   #5
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
Вы, надеюсь, не вынесли эту строчку ЗА ЦИКЛ ?!!
конечно же нет

Цитата:
ну, тогда учтите, что возможны повторы строк.
я знаю именно поэтому мне нужна эта строка

Цитата:
БЛИН!
я догадался в чём проблема.
У Вас в исходном файле НЕТ трёх строчек!!!!
procedure begin end; ? если не сарказм, то каких строчек?
FleXik вне форума Ответить с цитированием
Старый 04.12.2013, 11:02   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы грузите в лист текстовый файл:
Цитата:
Код:
sl.LoadFromFile(Form1.sFilenameEdit1.FileName);
а сколько в этом файле строчек?!
Если их больше трёх, то код отработает нормально.
А если меньше (нет ни одной, одна или две)
Мы запускаем цикл, выполняем его 3 раза (не обращая внимание на то, сколько строк считалось в sl), разумеется, при попытке удалить выбранную строку мы получим ошибку (такую, как у Вас на скриншоте), если в списке НЕТ строк (там попытка удаления элемента за пределами списка).
вот так.

код попробуйте выше указанный.

НУ или проверяйте количество строк после чтения файла и прнимайте меры (например, ругайтесь на пользователя и выходите из процедуры)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.12.2013, 11:16   #7
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
а сколько в этом файле строчек?!
5 строчек сейчас попробую еще 5 строчек добавить посмотрю на результат и отпишусь

ппц какой-то если делаю с чистого проэкта все отлично работает без багов и лагов, как только добавлю функцию в свой проэкт сразу ошибки лезут оО хотя сам проэкт работает отлично

причем даже если строк в .txt добавляю все ровно та же ошибка выскакивает получается что оно будто не рандомно эти строки берет ибо строк в .txt 10 оно берет 3 раза по 3 строки и выдает ошибку (будто 2-х строк не хватает чтобы 4-ый раз выдать 3 строки)

------------------------------

ну да все верно оно берет как-то не рандомно типа если строк 10 оно выдаст 3 раза по 3 строки (3х3=9, следующий раз не выдает и выскакивает ошибка) если строк 13 оно выдаст 4 раза по 3 строки (4х3=12, следующий раз не выдает и выскакивает ошибка), если строк 16 оно выдаст 5 раз по 3 строки (5х3=15, следующий раз не выдает и выскакивает ошибка), почему так? и как решить эту траблу?

Последний раз редактировалось Stilet; 04.12.2013 в 12:17.
FleXik вне форума Ответить с цитированием
Старый 04.12.2013, 11:53   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
  sl:=TStringList.Create;
  sl.Sorted:=True;
  sl.Duplicates:=dupIgnore;  //не загружаеть дубликаты 
  sl.CaseSensitive:=False;    //проверка регистронечувствительная
  sl.LoadFromFile(Form1.sFilenameEdit1.FileName);
После загрузки проверить, что бы sl.Count>=3, иначе сообщение, что нельзя выбрать 3 строки и Exit

ADD

Да, и:
Код:
m:=Random(sl.Count);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 04.12.2013 в 11:55.
Аватар вне форума Ответить с цитированием
Старый 04.12.2013, 11:56   #9
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

короче всё, решил, оказалось что

Код:
sl.LoadFromFile(Form1.sFilenameEdit1.FileName);
строка стояла в самом начале перед другими циклами (у меня их несколько), как только переставил эту строку к этой функции сразу все заработало оО сейчас только еще разок на повторы проверю действительно ли удаляет (в новом проэкте с нуля все отлично удаляло), Serge_Bliznykov, Аватар, спасибо

------------------
повторы удаляет всё четко

Последний раз редактировалось FleXik; 04.12.2013 в 12:24.
FleXik вне форума Ответить с цитированием
Старый 04.12.2013, 14:42   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

FleXik, обратите внимание на важное замечание от Аватар

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
m:=Random(sl.Count);

в предложенном Вами коде была сделана неточность (последняя строка никогда не выпадала). А я, не подумав, скопировал...


да и ещё - пожалуйста. всегда рад помочь.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импорт нескольких txt файлов макросом Snekich Microsoft Office Excel 25 06.03.2013 15:42
копирование строк, соответствующих условию фильтра и копирование на новый лист xorek Microsoft Office Excel 0 09.07.2012 18:13
Текст из нескольких txt файлов Federal Помощь студентам 6 28.12.2010 18:34
Создание сразу нескольких txt файлов Nice42ru Помощь студентам 11 11.02.2010 18:35
Копирование нескольких строк из dbgrida в dbgrid eviL_exP БД в Delphi 2 11.06.2009 12:37