Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как считать построчно с конца файла Memo Delphi fmx?


yooSee

Вопрос

Привет ребята! Вобщем есть текст в Memo с которого нужно брать строки с конца файла т.е. memo.lines.count-1 в цикле, 

после этого создавая отельно динамически компоненты,  заносить текстовые  строки с memo в эти созданные динамически компоненты, ниже пример:

procedure TVKBaseForm.Button2Click(Sender: TObject);
var
  rec: TRectangle;
  txt: Ttext;
  i: word; // - можно и integer сути не поменяет
begin
  for i := Memo1.Lines.Count - 1 downto 0 do
  begin
    rec := TRectangle.Create(Self);
    rec.Parent := MainLayout1;
    rec.Height := 15;
    rec.Align := TAlignLayout.Top;

    txt := Ttext.Create(Self);
    txt.Parent := rec;
    txt.Align := TAlignLayout.Client;
    txt.Text := Memo1.Lines.Strings[i];
  end;
end;

Работает, но не правильно. Почему выдает не правильный порядок при выводе? почему создает сначала первый файл? Почему создает не все? Может есть какая-то синхронизация? 

Пробовал так же

A: integer;
begin

  A := 1; // Присваеваем единицу

  While A <> Memo1.Lines.Count - 1 do 
  begin
    A := A + 1; 
    s := Memo1.Lines.Strings[A]; 

    Application.ProcessMessages;

    rec := TRectangle.Create(Self);
    rec.Parent := MainLayout1;
    rec.Height := 15;
    rec.Align := TAlignLayout.Top;

    txt := Ttext.Create(Self);
    txt.Parent := rec;
    txt.Align := TAlignLayout.Client;
    txt.Text := s;

Помогите разобраться

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

если я правильно понял проблему, то надо явно указывать координату для компонента, желательно чтобы она была "координата предыдущего + высота предыдущего + 1"

Изменено пользователем sinuke
Ссылка на комментарий
  • 0
46 минут назад, sinuke сказал:

если я правильно понял проблему, то надо явно указывать координату для компонента, желательно чтобы она была "координата предыдущего + высота предыдущего + 1"

не кажется не в этом дело, теряется не пойму где. если делать так то все адекватно выходит. 

var
  i: integer;
begin
for i := memo1.Lines.Count-1 downto 0 do
  begin
    memo2.Lines.Add(memo1.Lines.Strings[i]);
  end;
end;

если делат атк к примеру то выведет сначала последний потом все по порядку, в чем затуп?

var
  i: integer;
  txt: TText;
begin
  for i := Memo1.Lines.Count - 1 downto 0 do
  begin
    txt := TText.Create(self);
    txt.Parent := Form2;
    txt.Align := TALignLayout.Top;
    txt.Text := Memo1.Lines.Strings[i];

  end;
end;

 

Изменено пользователем Роман Фил
Ссылка на комментарий
  • 0

я так понял, что ваш код выдает следующее:

59429ff7edeeb_.PNG.3c4981de56f5821e7ed999d90b459ba4.PNG

 

а надо:

5942a00f04d07_2.PNG.ea6c71cffe7febc20debffb8b68dc0d3.PNG

как я и говорил, нужно просто указывать координату вновь создаваемому компоненту:

var
  i: integer;
  p: Integer;
  txt: TText;
begin
  p := 0;
  for i := Memo1.Lines.Count - 1 downto 0 do
  begin
    txt := TText.Create(self);
    txt.Parent := Form2;
    txt.Position.Y := p + 1;
    txt.Align := TALignLayout.Top;
    txt.Text := Memo1.Lines.Strings[i];
    p := Round(p + txt.Height);
  end;
end;
Ссылка на комментарий
  • 0
18 минут назад, sinuke сказал:

я так понял, что ваш код выдает следующее:

59429ff7edeeb_.PNG.3c4981de56f5821e7ed999d90b459ba4.PNG

 

а надо:

5942a00f04d07_2.PNG.ea6c71cffe7febc20debffb8b68dc0d3.PNG

как я и говорил, нужно просто указывать координату вновь создаваемому компоненту:


var
  i: integer;
  p: Integer;
  txt: TText;
begin
  p := 0;
  for i := Memo1.Lines.Count - 1 downto 0 do
  begin
    txt := TText.Create(self);
    txt.Parent := Form2;
    txt.Position.Y := p + 1;
    txt.Align := TALignLayout.Top;
    txt.Text := Memo1.Lines.Strings[i];
    p := Round(p + txt.Height);
  end;
end;

Спасибо большое помог) 

Ссылка на комментарий
  • 0
30 минут назад, sinuke сказал:

я так понял, что ваш код выдает следующее:

59429ff7edeeb_.PNG.3c4981de56f5821e7ed999d90b459ba4.PNG

 

а надо:

5942a00f04d07_2.PNG.ea6c71cffe7febc20debffb8b68dc0d3.PNG

как я и говорил, нужно просто указывать координату вновь создаваемому компоненту:


var
  i: integer;
  p: Integer;
  txt: TText;
begin
  p := 0;
  for i := Memo1.Lines.Count - 1 downto 0 do
  begin
    txt := TText.Create(self);
    txt.Parent := Form2;
    txt.Position.Y := p + 1;
    txt.Align := TALignLayout.Top;
    txt.Text := Memo1.Lines.Strings[i];
    p := Round(p + txt.Height);
  end;
end;

а если добавилась строка в memo то все компоненты удалять и пересоздавать с новым или проверять на наличие строк и создавать не достающие7 может есть еще какие варианты?

Ссылка на комментарий
  • 0
16 минут назад, Роман Фил сказал:

а если добавилась строка в memo то все компоненты удалять и пересоздавать с новым или проверять на наличие строк и создавать не достающие7 может есть еще какие варианты?

не надо удалять/пересоздавать. просто нужно контролировать эти добавляющиеся строки в Memo. для этого можно использовать свойства Tag и TagString чтобы знать, какой компонент соответствует какой строке.

Ссылка на комментарий
  • 0
В 16.06.2017 в 01:49, sinuke сказал:

не надо удалять/пересоздавать. просто нужно контролировать эти добавляющиеся строки в Memo. для этого можно использовать свойства Tag и TagString чтобы знать, какой компонент соответствует какой строке.

спасибо большое все помогло)

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...