Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => Delphi => Konuyu başlatan: Klein - 22 Şubat 2013, 02:21:14

Başlık: Delphi/C++ TTable field içeriğini değiştirmek
Gönderen: Klein - 22 Şubat 2013, 02:21:14
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? 
Başlık: Ynt: Delphi/C++ TTable field içeriğini değiştirmek
Gönderen: GreeN - 22 Şubat 2013, 10:30:41
istediğiniz index'e setkey() gotokey() ilemi gidiorsunuz tablo üzerinde ?

Başlık: Ynt: Delphi/C++ TTable field içeriğini değiştirmek
Gönderen: t2 - 22 Şubat 2013, 11:57:37
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 (http://www.delphiarea.com/products/delphi-components/backgroundworker/)

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.
Başlık: Ynt: Delphi/C++ TTable field içeriğini değiştirmek
Gönderen: Klein - 22 Şubat 2013, 12:52:51
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. 
Başlık: Ynt: Delphi/C++ TTable field içeriğini değiştirmek
Gönderen: t2 - 22 Şubat 2013, 13:01:08
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.
Başlık: Ynt: Delphi/C++ TTable field içeriğini değiştirmek
Gönderen: Klein - 22 Şubat 2013, 13:16:49
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. 
Başlık: Ynt: Delphi/C++ TTable field içeriğini değiştirmek
Gönderen: t2 - 22 Şubat 2013, 13:58:10
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.