Принудительное обновление TMemo

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Принудительное обновление TMemo

Сообщение Osmiy » 08.12.2021 18:23:16

Вывожу последовательно строки в TMemo и пытаюсь их обновить. Но пока процедура не закончится, строки не появляются. Использую вот такой код
Код: Выделить всё
  Memo4.Width:= Memo4.Width+1;
  Memo4.Width:= Memo4.Width-1;
  Memo4.Refresh;
  Memo4.Repaint;
  Memo4.Refresh;
  Memo4.Update;
  Memo4.Invalidate;
  Memo4.Refresh;
  Memo4.Repaint;
  Memo4.Refresh;
  Memo4.Refresh;
  Memo4.Repaint;
  Memo4.Refresh;
  Memo4.Update;
  Memo4.Invalidate;
  Memo4.Refresh;
  Memo4.Repaint;
  Memo4.Refresh;
  for I:= 0 to 100 do
    Application.ProcessMessages;

Создавать отдельный поток неохота. Как его принудительно обновить?
Osmiy
новенький
 
Сообщения: 36
Зарегистрирован: 07.05.2016 21:18:39

Re: Принудительное обновление TMemo

Сообщение DedFrend » 08.12.2021 18:36:01

Проблема явно в чем-то другом, но основной код отсутствует
DedFrend
постоялец
 
Сообщения: 156
Зарегистрирован: 25.11.2018 12:21:50

Re: Принудительное обновление TMemo

Сообщение Osmiy » 08.12.2021 18:55:35

Не думаю, что основной код прояснит ситуацию. Но вот он
Код: Выделить всё
procedure TForm1.Button6Click(Sender: TObject);
var
  AK: TArrayStr;
  K: TKernelCL;
  I: Integer;
begin
  Memo4.Clear;
  Builder.BildInit(ComboBox1.ItemIndex);
  Memo4.Lines.Add('Compile ''%s''...',[Builder.Cont.Device.OpenCL_C_v]);
  Memo4.Width:= Memo4.Width+1;
  Memo4.Width:= Memo4.Width-1;
  Memo4.Refresh;
  Memo4.Repaint;
  Memo4.Refresh;
  Memo4.Update;
  Memo4.Invalidate;
  Memo4.Refresh;
  Memo4.Repaint;
  Memo4.Refresh;
  Memo4.Refresh;
  Memo4.Repaint;
  Memo4.Refresh;
  Memo4.Update;
  Memo4.Invalidate;
  Memo4.Refresh;
  Memo4.Repaint;
  Memo4.Refresh;
  for I:= 0 to 100 do
    Application.ProcessMessages;

  Memo4.Lines.Add('----------LOG----------');
  Builder.Bild(SynEdit1.Text);
  Memo4.Text:= Memo4.Text + Builder.Prog.BuildLog;
  Memo4.Lines.Add('-----------------------');

  Application.ProcessMessages;

  if Builder.Prog.BuildStatus then
    Memo4.Lines.Add('The program is compiled.')
  else
    begin
      Memo4.Lines.Add('The program is not compiled.');
      Memo4.Lines.Add('Error: %s (%d)',[ErrorCL(Builder.Prog.BuildError),
                                                Builder.Prog.BuildError]);
    end;

  if Builder.Prog.BuildStatus then
    begin
      Memo4.Lines.Add('Kernels: %s',[Builder.Prog.BuildKernels]);
      Memo4.Lines.Add('');
      ParseStr(Builder.Prog.BuildKernels,';',AK);

      for I:= 0 to Length(AK)-1 do
        begin
          K:= Builder.Prog.CreateKernel(AK[I]);
          Memo4.Lines.Add('Kernel ''%s''',[K.Name]);
          Memo4.Lines.Add('Attributes: %s',[K.Attributes]);
          Memo4.Lines.Add('Local mem.: %d',[K.LocalMemWG]);
          Memo4.Lines.Add('Private mem.: %d',[K.PrivateMemWG]);
          Memo4.Lines.Add('Max WG size: %d',[K.MaxSizeWG]);
          Memo4.Lines.Add('WG size: %d',[K.PreferredSizeWG]);
          //Memo4.Lines.Add('Global WG size: %s',[PrintDim3(K.GlobalSizeWG)]);
          Memo4.Lines.Add('Compile WG size: %s',[PrintDim3(K.CompileSizeWG)]);
          Memo4.Lines.Add('');
          K.Free;
        end;
    end;
  Application.ProcessMessages;

  Builder.BildFree;
end; 


Добавлено спустя 7 минут 56 секунд:
Самые долгие вызовы это:
Код: Выделить всё
Builder.Bild(SynEdit1.Text);
Builder.BildFree;
Остальное работает быстро.
Osmiy
новенький
 
Сообщения: 36
Зарегистрирован: 07.05.2016 21:18:39

Re: Принудительное обновление TMemo

Сообщение Alex2013 » 08.12.2021 19:26:54

Osmiy писал(а):Создавать отдельный поток неохота. Как его принудительно обновить?

Попробуй обновить все скопом !
Form1.Refresh;
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Принудительное обновление TMemo

Сообщение Osmiy » 08.12.2021 19:29:01

Алелуя! Оказалось, что Builder.BildInit(ComboBox1.ItemIndex) тоже работает медленно. Из-за этого ошибочно создавалось впечатление, что TMemo не обновляется. Поменял логику выводя строк. Теперь достаточно одного Application.ProcessMessages для обновления.
Вопрос решён.
Osmiy
новенький
 
Сообщения: 36
Зарегистрирован: 07.05.2016 21:18:39


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 24

Рейтинг@Mail.ru