Is there a way to stop a component from refreshing until I've completed some
processing?
Answer:
Yes. Most controls can be blocked from redrawing by sending a WM_SETREDRAW
message with wParam = 0 to them. Once you have finished the changes you send
another WM_SETREDRAW with wparam = 1. For a grid this would look like this:
}
{
Frage:
Gibt es eine Möglichkeit, dass sich eine Komponente solange nicht neu zeichnet,
bis ich mit einer Verarbeitungsroutine fertig bin?
Antwort:
Ja. Die meisten Controls können "eingefroren" werden, indem man ihnen ein
WM_SETREDRAW Nachricht mit wParam = 0 schickt.
Danach kann man WM_SETREDRAW mit wparam = 1 schicken, um das Updaten wieder zulassen.
Für ein Grid sieht es z.B so aus:
}
procedure LockControl(c: TWinControl; bLock: Boolean); begin
if (c = nil) or (c.Handle = 0) then Exit; if bLock then SendMessage(c.Handle, WM_SETREDRAW, 0, 0) else
begin SendMessage(c.Handle, WM_SETREDRAW, 1, 0);
RedrawWindow(c.Handle, nil, 0,
RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin LockControl(DBGrid1, True); try // do convoluted things to the grid finally LockControl(DBGrid1, False); end; end;
{
A number of controls have a build-in way to do that, the BeginUpdate and
EndUpdate methods. You often find these not on the control itself but on
some object property that manages the controls data, e.g. for a TMemo you use
Lines.BeginUpdate and Lines.EndUpdate. The EndUpdate automatically forces a
redraw of the control.
}
{
Viele Controls besitzen schon die Methoden BeginUpdate und EndUpdate.
Meistens findest man diese Methoden nicht direkt beim Control aber bei
einer Objekt Eigenschaft, welche diese Methoden aufweist.
Bei einem TMemo kann man z.B Lines.BeginUpdate und Lines.EndUpdate aufrufen.
Mit BeginUpdate kann man verhindern, daß die Bildschirmanzeige aktualisiert wird,
wenn Einträge angehängt, gelöscht und eingefügt werden. EndUpdate veranlasst
das Control neu zu zeichnen.
}