Merhaba,
Sizin sorununuz çok fazla verinin ListView'de listelenmesi. Application.ProcessMessages ve Thread kullanmak sorununuzu çözmez. İşin doğrusu daha da kötü hale getirir. Çünkü bu iki yapı da işlem uzun sürerken formun kilitlenmemesini sağlar (Application.ProcessMessages kötü bir yöntem, G.Arkas'ın verdiği Thread örneği de yanlış, çünkü senkronizasyon yapmıyor. VCL bileşenleri thread-safe değildir). Bu da programın listelemek dışındaki işlemler için da vakit harcaması demek. Yapabileceğiniz iki değişiklik var:
1. BeginUpdate/EndUpdate kullanmak
Şu an kullandığınız yapıda, listview'e her yeni Item eklediğinizde ListView kendini güncellemeye çalışıyor. Bu yüzden de işlem çok yavaş oluyor. Oysa kodu şu şekilde yazacak olursanız işlem çok hızlanacaktır:
Kod: Tümünü seç
begin
try
with PLAYLISTQuery do
begin
Close;
SQL.Clear;
SQL.Add('Select * From PLAYLIST');
SQL.Add('Order By SIRANO ASC');
SQL.Add('Limit 0,10000');
Prepared := True;
Open;
ListView.Items.BeginUpdate;
try
ListView.Items.Clear;
while Not Eof do
begin
with ListView.Items.Add do
begin
Caption := IntToStr(PListView.Items.Count);
SubItems.Add(FieldByName('sanatci').AsString);
SubItems.Add(FieldByName('suresi').AsString);
SubItems.Add(FieldByName('tarihi').AsString);
Next;
end;
end;
finally
ListView.Items.EndUpdate;
end;
end;
except
end;
end;
2. Eğer bu yeterli gelmezse ListView'i virtual data ile kullanabilirsiniz. Bunun için OwnerData özelliğini kullanmanız gerekiyor. Anlatması uzun, ama Delphi'nin dokümanlarından okuyabilirsiniz.
Bu iki madde dışında bir iki tavsiyem olacak:
1. with x do yapısını kullanmayın. Kod yazarken pratik gibi görünse de hem okumayı, hem de debug işlemini çok zorlaştırıyor. Ve hatta kimi zamanlarda farkında olmadan hata yapmanıza da sebep olabiliyor.
2. Hiding Exception vs Handling Exceptions konusunu araştırın. Bütün kodu try/except bloğuna almışsınız. Bir hata olduğu zaman bunu kullanıcı bilmeyecek. Kod hata düzeltmeye de çalışmıyor. Sonuçta hatayı saklamış oluyorsunuz. Ayrıca Java, C# gibi dillerde try/catch bloklarının kodun çalışma hızına bir maliyeti yoktur (hata oluşana kadar), ama Delphi, C++ gibi dillerde try/catch/except bloğu kodu inanılmaz derecede yavaşlatır. Bu durum dillerin yapısından kaynaklanıyor. Eğer hatayı yönetmeyecekseniz try/except bloğu kullanmayın. Bırakın program hata versin. Eğer kullanıcıya detay vermek istemiyorsanız Application.OnException eventini kullanın. Burada hem hatayı üreten nesneyi, hem de hata nesnesini alırsınız. Eğer isterseniz log tutarsınız, isterseniz kullanıcıya düzgün bir mesaj verirsiniz.
İyi çalışmalar