Данные из StringList в StringGrid c определенной строки....

m.medvedb
Дата: 29.09.2019 13:01:09
Добрый день.
Текст файл в нем данные разделены на блоки. Мне нужно заполнить в StringGrid с определенной строки. Номер искомой строки определяю так. ..
procedure TFormFirst.Button1Click(Sender: TObject);
Var
SL_Row1:TStringList;
i,i1:Integer;
Block_Num:string;
begin
  SL_Row1:=TStringList.Create;
  SL_Row1.LoadFromFile('1.txt');
  Block_Num:='~Value';
 for i:=0 to SL_Row1.Count - 1 do
  if pos (Block_Num, SL_Row1.Strings[i]) > 0 then
..............


      SL_Row1.Free;
 End;
end;
ёёёёё
Дата: 29.09.2019 13:05:57
m.medvedb,
и где вопрос?
Dimitry Sibiryakov
Дата: 29.09.2019 13:07:50

m.medvedb
Мне нужно заполнить в StringGrid с определенной строки.

Оператор присвоения в цикле ты уже пробовал? Вдруг получится...

Posted via ActualForum NNTP Server 1.5

m.medvedb
Дата: 29.09.2019 20:21:03
Ну как в Grid закинуть разобрался... Но вот как сделать выборку по индексу пока не осиливаю. Вопрос как....
DimaBr
Дата: 29.09.2019 20:30:32
m.medvedb
Ну как в Grid закинуть разобрался... Но вот как сделать выборку по индексу пока не осиливаю. Вопрос как....

В правильно поставленом вопросе содержится половина ответа.
Dimitry Sibiryakov
Дата: 29.09.2019 21:00:49

m.medvedb
как сделать выборку по индексу

Обычно для этого используют квадратные скобки, но некоторые классы предлагают метод get().

Posted via ActualForum NNTP Server 1.5

m.medvedb
Дата: 29.09.2019 23:47:49
Вот суть задачи:
есть txt файл разделенный на блоки

#Description Описание
............
#Name Название столбцов
.........
 ~Value Значения в числах.

В идеале я хочу сделать грамотный открыватор-редактор файла.

Но пока знаний не хватает я пытаюсь сделать по принципу лижбы работало....

В начале я хочу разобраться как находить номер строки блока ~Value и номер последней строки файла для загрузки в StringGrid. В процессе тренировок смотрю результат в Memo.

Что я понял на данный момент
Потренировавшись со StringList я понял , что если строк много(у меня около 10 000) то построчный поиск довольно долгое занятие.

Var
  SL_Row1: TStringList;
  i, n1: Integer;
  Block_Num: string;
begin
  SL_Row1 := TStringList.Create;
  SL_Row1.LoadFromFile('1.TXT');
   Block_Num := '~Value';
    for i := 0 to SL_Row1.Count - 1 do
      if pos(Block_Num, SL_Row1.Strings[i]) > 0 then
        break;
  begin
    n1 := i+1;
    for i:= n1 to SL_Row1.Count - 1 do
      Memo1.lines.add(SL_Row1.Strings[i]); // тут смотрю быстрый результат
       End;
        SL_Row1.Free;
end;


А в этом мне убедиться помог вот этот код (тут количество строк определяется мгновенно)

var
  F : TextFile;
  S : String;
  Cnt : Integer;
begin
  AssignFile(f,'1.las');
  Reset(F);
  Cnt := 0;
  while not Eof(F) do begin
    Read(F, S);
    if Eoln(F) then Inc(Cnt);
    Readln(F);
  end;
  CloseFile(F);
   //Ответ.
  ShowMessage('Всего строк в файле: ' + IntToStr(Cnt));


end;

Вообщем я начал не с того.

В данный момент изучаю примеры по работе с TextFile;
Василий 2
Дата: 30.09.2019 10:31:30
m.medvedb
Потренировавшись со StringList я понял , что если строк много(у меня около 10 000) то построчный поиск довольно долгое занятие.
...

А в этом мне убедиться помог вот этот код (тут количество строк определяется мгновенно)

Очень странные наблюдения. Неоптимальный поиск по подстрокам медленный, а убедиться в этом помогло построчное чтение из файла.
pos(Block_Num, SL_Row1.Strings[i]) выполняет поиск подстроки по всей строке, тебе это совсем не нужно. Если тильда - служебный символ, который встречается редко, можно сравнивать сначала его, а потом CompareMem(Pointer(Str), Pointer(SubStr), Length(SubStr)*SizeOf(Char))
s62
Дата: 30.09.2019 18:14:10
m.medvedb,

подозреваю, что в коде медленный не поиск, а добавление тысяч строк (если общее количество порядка 10000) в Memo, впридачу без отключения перерисовки в процессе (отключается через Memo.Lines.BeginUpdate - Memo.Lines.EndUpdate).