delphi 如何防止 FMX TMemo 在加载数据时更新  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi 如何防止 FMX TMemo 在加载数据时更新


最简单的方法是不直接更新备忘录,而是通过另一个对象,如 TStringList:


procedure TForm2.Memo1DblClick(Sender: TObject);

var

  i: Integer;

  sl: TStrings;

const

  Line = '1234567890_1234567890_1234567890_1234567890_1234567890_1234567890';

begin

  Memo1.ControlType := TControlType.Platform;

  sl:=TStringList.Create;

  try

    for i := 1 to 1000 do

      sl.Add(Line);

    ..either..

    Memo1.Lines.Clear;

    Memo1.Lines.AddStrings(sl);

    ..or..

    Memo1.Lines.Text:=s1.Text;

  finally

    sl.free

  end

end;

另一种方法(仅限 WINDOWS)是在添加时禁用屏幕更新:


Uses WinAPI.Windows, WinAPI.Messages, FMX.Platform.Win;


procedure TForm2.Memo1DblClick(Sender: TObject);

var

  i: Integer;

const

  Line = '1234567890_1234567890_1234567890_1234567890_1234567890_1234567890';

begin

  Memo1.Lines.Clear;

  Memo1.ControlType := TControlType.Platform;

  PostMessage(FmxHandleToHWND(Handle),WM_SETREDRAW,0,0);

  try

    for i := 1 to 1000 do

      Memo1.Lines.Add(Line);

  finally

    PostMessage(FmxHandleToHWND(Handle),WM_SETREDRAW,1,0);

    Memo1.Invalidate // May be unnecessary //

  end;

end;

这将在更新时禁用表单的所有屏幕更新。我相信它也会禁用 Memo1 屏幕更新。不幸的是,FMX 对象不是 Windows 对象,因此您不能直接为备忘录本身禁用屏幕更新。


您可以通过包含以下 CLASS HELPER 在 TForm 级别实现 LockDrawing/UnlockDrawing:


{$IFDEF MSWINDOWS }

  Uses WinAPI.Windows, WinAPI.Messages, FMX.Platform.Win;

{$ENDIF }


TYPE

  TFormHelper   = CLASS HELPER FOR TForm

                    PROCEDURE   LockDrawing;

                    PROCEDURE   UnlockDrawing;

                  END;


{ TFormHelper }


PROCEDURE TFormHelper.LockDrawing;

  BEGIN

    {$IFDEF MSWINDOWS }

      PostMessage(FmxHandleToHWND(Handle),WM_SETREDRAW,0,0);

    {$ENDIF }

  END;


PROCEDURE TFormHelper.UnlockDrawing;

  BEGIN

    {$IFDEF MSWINDOWS }

      PostMessage(FmxHandleToHWND(Handle),WM_SETREDRAW,1,0);

      RedrawWindow(FmxHandleToHWND(Handle),NIL,0,RDW_ERASE OR RDW_FRAME OR RDW_INVALIDATE OR RDW_ALLCHILDREN)

    {$ENDIF }

  END;

这将使您的事件处理程序看起来像这样:


procedure TForm2.Memo1DblClick(Sender: TObject);

var

  i: Integer;

const

  Line = '1234567890_1234567890_1234567890_1234567890_1234567890_1234567890';

begin

  Memo1.Lines.Clear;

  Memo1.ControlType := TControlType.Platform;

  LockDrawing;

  try

    for i := 1 to 1000 do

      Memo1.Lines.Add(Line);

  finally

    UnlockDrawing

  end;

end;



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.031612873077393 seconds