2016-03-24 10 views
-3

Es mag albern klingen, aber ich begegnete ein paar Situationen, wenn ich möchte, dass die Anwendung nicht zeigt, was passiert, bis eine andere spezifische Aktion passiert (StringGrids sind mit Daten gefüllt, UI ist vorbereitet ...). Gibt es eine Möglichkeit zu verhindern, dass Nachrichten von der Anwendung an das Betriebssystem gesendet werden?Delphi - Halten Sie die Systemmeldungen/verhindern UI Neuzeichnen?

So gibt es einige oposit zu

application.processmessages 

? Etwas wie:

application.stopProcessingMessages; 

fill stringGrids, prepare the UI... 

application.processMessagesAgain; 

?

Natürlich könnte ich die Aktionen in einem separaten Thread ausführen, aber es gibt Situationen, in denen ich entweder nicht möchte oder es nicht in einem separaten Thread tun kann.

+0

Was ist * Raster *? Es gibt keine * Application.StopProcessingMessages *, aber abhängig davon, was Sie gerade tun, gibt es Möglichkeiten, einige Komponenten davon abzuhalten, den Bildschirm zu aktualisieren. Da Sie jedoch keine wirklich relevanten Informationen veröffentlicht haben, ist es schwierig, Vorschläge zu machen. Was Sie für Code gepostet haben, ist ziemlich viel. * Ich habe einen Code, der blah macht, blah, blah. Wie ändere ich das Verhalten dieses Codes ohne irgendwelche Details? * –

+0

Viele verschiedene Möglichkeiten, diesen zu enthüllen. Beginnend mit einem Steuerelement über als ein Gitter. Eine Listenansicht im virtuellen Modus zum Beispiel. Alle Ihre Daten in einer UI-Steuerung zu halten, ist ein schlechtes Design. Sie ernten nur die Konsequenzen davon. Das Unterdrücken von Malen wäre eine Möglichkeit, es zu reparieren. Nicht zu schwer zu erreichen. Sie sollten niemals 'ProcessMessages' aufrufen. Sie würden wahrscheinlich von einem besseren Verständnis der Funktionsweise von Windows-Nachrichten profitieren. –

+0

Ich möchte mich nicht genau an das Rasterbeispiel halten. Aber in diesem Fall spreche ich über TStringGrid –

Antwort

0

Es stellte sich heraus, dass, obwohl ich dachte, dass Die Verwendung der WM_SETREDRAW-Nachricht ist die richtige Lösung, sie hat einige Nachteile. Die größte ist, dass Benutzer, wenn sie verwendet wird, durch das Formular klicken können. So dass die endgültige Lösung einfach eine leere TPanel über die ganze Form wie diese

panel1.Left:= 0; 
    panel1.Top:= 0; 
    panel1.Width:= frmMain.Width; 
    panel1.Height:= frmMain.Height; 

platziert wird, nachdem die Form hergestellt wird, wird die Platte geschrumpft, unsichtbar gemacht usw. zuverlässig jedes Flackern und andere Dinge versteckt, dass doesn‘ t gut aussehen, und ich möchte sie vor dem Benutzer verstecken.

2

prüfen TDataSet.DisableControls für die Datensensitive Steuerelemente und Beginupdate/EndUpdate für einige VCL/RTL-Klassen (einschließlich TStrings) und - spezifisch für die TStringGrid erwähnt - siehe Delphi TStringGrid Flicker

+0

WM_SETREDRAW - genau das habe ich gebraucht. Das von mir bereitgestellte Beispiel ist nicht gut. Wenn ich das Raster in einer for-Schleife aktualisiere, "flackert" es, auch wenn ich in jedem Durchgang eine Zeile hinzufüge. Danke ... –

+0

WM_SETREDRAW? Das wurde viel früher erwähnt. Es ist wahrscheinlich nicht die richtige Lösung für das Problem, das Sie beschrieben haben. –

+0

@DavidHeffernan Es wurde erwähnt, ja aber ich hatte keine Ahnung was es macht, bis ich das hier verlinkte Thema gelesen habe. Ich habe auch deinen Kommentar gewählt, wo du es erwähnt hast. Es ist die richtige Lösung, jeder bleibt einfach bei dem, nicht sehr guten, Beispiel mit der for-Schleife und dem Gitter. Die Frage war ziemlich klar ... –