Delphi/C++ TTable field içeriğini değiştirmek

Başlatan Klein, 22 Şubat 2013, 02:21:14

Klein

Sabit kayıt sayısına sahip bir paradox tablom var. Buna bağlı bir de Grid var.
Bu tablonun herhan gi bir kaydının içeriğini kod içinde değiştirmek istiyorum.

Kood içinde Tabloda hareket ederek  istediğim kaydı değiştirebiliyorum. Ancak bu hareketleri kullanıcı da gridden görüyor.
Hareketler gridde görünmesin deiye DisableControls metodu ile gridin bağlantısını kesip , tabloyu kaydettikten sonra tekrar bağlantı sağlarsam yine sorun yok.
Fakat bu işi çok hızlıve kesintisiz yaparsam, bu sefer de kullanıcı grid üzerinde hiç bir işlem yapamıyor.

Bir tablonun herhangi bir kaydının içeriği  , kullanıcı kontrollerini engellemeden  nasıl değiştirirlir? 

GreeN

istediğiniz index'e setkey() gotokey() ilemi gidiorsunuz tablo üzerinde ?

Terörü Lanetliyoruz.

t2

Alıntı YapBir tablonun herhangi bir kaydının içeriği  , kullanıcı kontrollerini engellemeden  nasıl değiştirirlir? 

Thread kullanılır, isterseniz  thread componentini kullanabilirsiniz.

Delphi Background Worker Component

Alıntı YapTBackgroundWorker component is the Delphi implementation of .NET BackgroundWorker component.

TBackgroundWorker component allows you to run an operation on a separate, dedicated thread. Time-consuming operations like downloads and database transactions can cause your user interface (UI) to seem as though it has stopped responding while they are running. When you want a responsive UI and you are faced with long delays associated with such operations, TBackgroundWorker component provides a convenient solution.

To execute a time-consuming operation in the background, use TBackgroundWorker component and listen for events that report the progress of your operation and signal when the operation is finished.

Klein

Alıntı yapılan: GreeN - 22 Şubat 2013, 10:30:41
istediğiniz index'e setkey() gotokey() ilemi gidiorsunuz tablo üzerinde ?

Next(),Prior()  ile veya doğrudan RecNo  ile geziniyorum tablo üzerinde.

@T2
Sorun işlem hızından dolayı kontrollere zaman kalmaması değil tam olarak. Tablo üzerinde gezinirken DbGrid ile tablonun bağlantısını kesmem gerekiyor. Kestiğim zaman  DBGrid işlevsiz kaldığı için kullanıcı tablo üzerinde hiç bir şey yapamıyor. 
Thread kullanımının da sorunu çözeğini pek sanmıyorum. 

t2

Kullanıcının işlem yaptığı tablo ile sizin işlem yaptığınız  tablo ayrı olsun. Müsait zaman bunları senkronize edin. mesela kullanıcı çalışıyorken bir kopyası alınır işlem yapılır. sonra kullanıcı kendi tablosunda ne yapmış ona bakılıp ortaya bir karışık yapılır. 2 si birbirine zıt işlem yapmışsa ne olacak kimin yaptığı dikkate alınacak?

mesaj birleştirme:: 22 Şubat 2013, 13:06:01

Ya da siz işlemi tablo üzerinde yapmaya çalışmayın doğrudan DBGrid  üzerinde yapın.
DBGrid.beginupdate, DBGrid.Endupdate,  gibiözelik olması lazım bunların arasında yapılabilir.

Klein

Tablonun  senkronize ederken yine  tablo ile gridin ilişkisini gesmem gerekebilir. Senkronize etmek için Tablonun birini okuyup, Diğerine yazmam gerek. Tabloya yazarken yine aynı sorunla karşılaşacağım. Tabloyu okuyup diğer tabloya yazmanın dışında bir senkronizasyon yöntemi var mı bimiyorum. 

t2

Kullanıcı DBGrid üzerinde işlem yapınca veritabanı tablosu kendiliğinden güncelleşiyor mu? Eğer öyle ise kod ile DBGrid üzerinde işlem yapılabilir.
Şöyle de olur:

var
  pdata: pbyte;
  data: byte;

begin
  pdata := @data;

  DBGrid1.Columns.SaveToStream(hasmemorystream);
  hasmemorystream.ReadBuffer(pdata^, 1);
  //datayı okuduk.
  // memorystream üzerinde işlemler. yapılıyor.

  data := data +3; //datayı güzeleştirdik ;
  hasmemorystream.position := hasmemorystream.position -1; // geri gidip üzerine yazdık.
  hasmemorystream.WriteBuffer(pdata^, 1);
  //  bitti.
  DBGrid1.Columns.LoadFromStream(hasmemorystream); // yerine yerleştiriyoruz.