Forma z Labelem i Memo - muli przy zmianie rozmiaru okna.

0

Witam, jak w temacie problem dotyczy wolnego działania przy zmianie rozmiaru okna, gdy Memo z ustawionym pionowym ScrollBarem zawiera dużą liczbę linijek tekstu. Taki program przy przemieszczaniu okna czy też dodawaniu tekstu do Memo np. za pomocą zdarzenia OnMouseMove reaguje niemal natychmiastowo. Jak można obejść problem powolnego reagowania na zmianę rozmiaru okna przy liczbie linijek w Memo >5000 ?
Przykładowy kod:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Label1: TLabel;
    procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormResize(Sender: TObject);
    procedure Memo1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormResize(Sender: TObject);
begin
  Memo1.Lines.Add('Nowy rozmiar okna: '+IntToStr(Form1.ClientWidth)+'x'+IntToStr(Form1.ClientHeight));
end;

procedure TForm1.Memo1Change(Sender: TObject);
begin
  Label1.Caption:=IntToStr(Memo1.Lines.Count);
end;

procedure TForm1.MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Memo1.Lines.Add('Mysz znajduje się w pozycji x='+IntToStr(X)+' y='+IntToStr(y));
end;

end.
 
0

Powyżej takiej liczby to może być problem i niewiele kombinacji może to przyśpieszyć o ile wiem. Ale widzę, że nie próbowałeś Lines.BeginUpdate i Lines.EndUpdate? Chociaż w tym co chcesz wyświetlić jest problem jak to zaimplementować sensownie. Trzeba by chyba było wykryć zmienną globalną typu boolean w trakcie ruszania ustawiać na True, a w wątku sprawdzić później czy mysz się rusza i jeżeli przestałą przez powiedzmy sekundę wtedy pokazać wyniki po odświeżeniu. Ewentualnie loklany hooka na myszkę i analiza zmian koordynatów. Zresztą takie rzeczy jak zmiany położenia myszki powinno się wyświetlać w jakimś komponencie typu Label czy Edit. Czy jest w ogóle sens dodawać je co chwila? Wątpie trochę. A i oczywiscie z takim kodem, jak poniżej nie ma problemów u mnie. Wykonuje się zwykle około 216 milisekund na komputerze z przed dwóch lat pod Windowsem 7 Ultimate 64 bit, o ile to ma jakiś wpływ na szybkość.

procedure TForm1.Button1Click(Sender : TObject);
var
  I : integer;
  Start, Stop : Cardinal;
begin
  Memo1.Clear;
  Start := GetTickCount;
  Memo1.Lines.BeginUpdate;
  for I := 1 to 5555 do
  begin
    Memo1.Lines.Add(IntToStr(I))
  end;
  Memo1.Lines.EndUpdate;
  Stop := GetTickCount;
  ShowMessage(IntToStr(Stop - Start));
end;
1

Udało mi się samodzielnie dojść do rozwiązania.

Wystarczyło jedynie zmienić właściwość WordWrap na false i śmiga jak należy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1