2016-03-24 22 views
-3

Kulağa aptalca gelebilir, ancak birkaç özel durumla karşılaştım, uygulamanın ne olduğunu göstermemesi için, başka bir özel eylem gerçekleşene kadar (stringGrids verilerle doldu, UI hazırlandı ...). İletilerin uygulamadan OS'ye gönderilmesini engellemenin bir yolu var mı?Delphi - sistem mesajlarını tutun/UI'yı yeniden çizmeyi engelleyin?

Yani,

application.processmessages 

bazı oposit var mı? Şun gibi bir şey:

application.stopProcessingMessages; 

fill stringGrids, prepare the UI... 

application.processMessagesAgain; 

?

Elbette, eylemleri ayrı bir iş parçacığında çalıştırabilirim, ancak istemediğim veya ayrı bir iş parçacığında yapamadığım durumlar var.

+0

* grid * nedir? Hiçbir * Application.StopProcessingMessages * yoktur, ancak özellikle ne yaptığınıza bağlı olarak bazı bileşenleri ekranın güncellenmesini durdurmanın yolları vardır. Ancak, gerçek bir alakalı bilgi yayınlamadığınız için önerilerin sunulması zordur. Kod için yazdığın şey oldukça fazla * Bende blah yapan bir kod var, falan filan. Herhangi bir detay olmadan, bu kodun davranışını nasıl değiştirebilirim? * –

+0

Bunu düzeltmenin birçok farklı yolu. Bir ızgara üzerinde kontrol kullanmaktan başlayarak. Örneğin bir sanal mod listesi görünümü. Tüm verilerinizi bir UI denetiminde tutmak zayıf tasarımdır. Sadece bunun sonuçlarına bakıyorsunuz. Bastırmayı kaldırmak, onu düzeltmenin bir yolu olurdu. Elde etmek zor değil. Hiçbir zaman ProcessMessages'ı çağırmamalısınız. Muhtemelen Windows mesajlarının nasıl çalıştığı hakkında daha iyi bir anlayışa sahip olursunuz. –

+0

Tam olarak ızgara örneğine bağlı kalmak istemiyorum. Ama bu durumda TStringGrid –

cevap

0

görmek WM_SETREDRAW mesajının kullanılması doğru çözümdür, birkaç dezavantajı vardır. En büyük olanı, eğer kullanılıyorsa, kullanıcı formu doldurabilir. Yani son çözüm şekli hazırlandıktan sonra bu

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

gibi bütün formu üzerine yerleştirilen boş TPanel basitçe, panel o kokan, güvenilir şekilde her titrek ve diğer şeyleri gizler vb görünmez yapılan küçüldü edilir İyi görünüyorsun ve onları kullanıcıdan gizlemek istiyorum.

2

(TStrings dahil) bazı VCL/RTL sınıfları veri farkında kontroller için kontrol TDataSet.DisableControls ve BeginUpdate/EndUpdate ve - söz TStringGrid özgü - Düşündüğümden rağmen, ortaya çıktı Delphi TStringGrid Flicker

+0

WM_SETREDRAW - tam ihtiyacım olan şey bu. Sağladığım örnek iyi değil. Izgarayı for döngüsünde güncellerseniz, her geçişte bir satır eklesem bile "titriyor". Teşekkür ederiz ... –

+0

WM_SETREDRAW? Daha önce bahsedildi. Muhtemelen tarif ettiğin sorunun doğru çözümü değil. –

+0

@DavidHeffernan Evet, ama burada bağlantılı olan konuyu okuyana kadar ne yaptığının hiçbir fikrim yoktu. Ayrıca bahsettiğin, yorumunu yaptım, oy verdim. Bu doğru çözümdür, herkes sadece döngü ve ızgara ile çok iyi değil, örnek, sopa. Soru oldukça açıktı ... –