DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
Embarcadero
Üye
Mesajlar: 23
Kayıt: 11 Ağu 2014 03:09

DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen Embarcadero »

Merhaba arkadaşlar, Aşağıdaki gibi bir dbGridim var:

ID ADI SOYADI
1 aa1 bb1
2 aa2 bb2
3 aa3 bb3
4 aa4 bb4
5 aa5 bb5
6 aa6 bb6

Tabloda
1. ID'si 3 olan kaydı sildiğimde cursor ID'si 4 olan kayda gitsin.
2. ID'si 6 olan kaydı sildiğimde cursor ID'si 5 olan kayda gitsin.

Aşağıdaki gibi bir kod yazdım ama 1.seçeneği yapıyor; ama 2.seçenekte ilk kayda konumlanıyor. (6 yı sildiğimde 1 e gidiyor)

Kod: Tümünü seç

NID:=adoSorgu.FieldByName('ID').AsString;
GidilecekID:=NID;

if not adoSorgu.Eof then begin
  adoSorgu.Next;
  GidilecekID:=adoSorgu.FieldByName('ID').AsString;
end else begin
  if not adoSorgu.Bof then begin
    adoSorgu.Prior;
    GidilecekID:=adoSorgu.FieldByName('ID').AsString;
  end;
end;

if GidilecekID=NID then begin
  ShowMessage('Listelenecek Kayıt Kalmadı!...')
end else
  adoSorgu.Locate('ID',GidilecekID,[]);
Yardımcı olursanız çok sevinirim selam ve dua ile...
En son Embarcadero tarafından 12 Ağu 2014 09:31 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
habikus
Üye
Mesajlar: 69
Kayıt: 14 Eyl 2011 04:23

Re: DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen habikus »

Sanırım Bookmark diye bir komut var senin işe yarayabilir.
Kullanıcı avatarı
Embarcadero
Üye
Mesajlar: 23
Kayıt: 11 Ağu 2014 03:09

Re: DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen Embarcadero »

habikus teşekkür ederim. Onu da denedim ama yine olmadı. Sanırım bu konu herkesin çok işine yarayacaktır. Bu konuyla ilgili fikri olan yok mu?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen mrmarman »

Şöyle bir örnek işine yarayacaktır.

Kod: Tümünü seç

Var
  GidilecekID : String;
begin
  ShowMessageFmt('%d / %d', [adoSorgu.RecNo, adoSorgu.RecordCount]);
  if adoSorgu.RecNo < adoSorgu.RecordCount then
  begin
    ShowMessage('ARAKAYIT');
    adoSorgu.Next;
  end else
  begin
    ShowMessage('SONKAYIT');
    adoSorgu.Prior;
  end;
  GidilecekID := adoSorgu.FieldByName('ID').AsString;
  ShowMessage( 'Gidilecek ID = ' + GidilecekID );
end;
Resim
Resim ....Resim
Kullanıcı avatarı
Embarcadero
Üye
Mesajlar: 23
Kayıt: 11 Ağu 2014 03:09

Re: DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen Embarcadero »

Çok çok teşekkür ederim Muharrem Bey. Tıkır tıkır çalışıyor. Selam ve dua ile...
Kullanıcı avatarı
Embarcadero
Üye
Mesajlar: 23
Kayıt: 11 Ağu 2014 03:09

Re: DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen Embarcadero »

Muharrem Bey bir çıkmazım daha var. Rica etsem yardımcı olur musunuz? DBGrid dışında form üzerindeki diğer elemanlar aktif iken (Örneğin Edit focuslu iken) DBGrid üzerine geldiğinde mouse move olayına ne yazılmalı ki hem edit focuslu kalsın hem de dbgrid üzerinde fare tekerleği ile kayıtlar arasında dolaşılabilinsin. Yani o da bir nevi focuslansın.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen mrmarman »

Forma bir tane TApplicationEvents koyup OnMessage property'sine aşağıdaki kodu yaz.

Kod: Tümünü seç

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var
   i: SmallInt;
begin
   if Msg.message = WM_MOUSEWHEEL then
   begin
     i := HiWord(Msg.wParam) ;
     if i > 0
     then adoSorgu.Prior
     else adoSorgu.Next;
     Handled := False;
   end;
end;
EK : Handled TRUE da olabilir. TRUE olursa MouseWheel'in işi tamamlanmış demektir. Mesaj gereği görüldüğünden başka yerde değerlendirmeye alınmaz.
EK (2): Sürekli seçili olsun demişsin ya, DBGrid'in Options parametrelerinden dgRowSelect,dgAlwaysShowSelection ikilisini de TRUE yaparsan görselin tamamlanır.
En son mrmarman tarafından 12 Ağu 2014 09:52 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
Resim
Resim ....Resim
Kullanıcı avatarı
Embarcadero
Üye
Mesajlar: 23
Kayıt: 11 Ağu 2014 03:09

Re: DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen Embarcadero »

Hızır gibi yetiştiniz Muharrem Bey Allah sizden razı olsun. Çok duamı aldınız bu akşam.
Kullanıcı avatarı
Embarcadero
Üye
Mesajlar: 23
Kayıt: 11 Ağu 2014 03:09

Re: DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen Embarcadero »

EK-1 de Dediğiniz gibi TRUE-FALSE fark etmiyor. EK-2 deki verdiğiniz bilgileri yapmıştım.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen mrmarman »

Embarcadero yazdı:EK-1 de Dediğiniz gibi TRUE-FALSE fark etmiyor. EK-2 deki verdiğiniz bilgileri yapmıştım.

Şöyle örnekleyim :
Mesela formda bir tane TComboBox var. Siz bu TComboBox'dayken de MouseWheel yaparsanız eğer handled FALSE ise ComboBox'daki değerler de değişir. Eğer handled TRUE ise sadece DBGrid değişir, ComboBOx üzerinde olsanız dahi oradaki değerler değişmez.

Bunu kontrol altına almak için şartlı FALSE bırakıp şöyle bir IF kurgusu hazırlarsınız.

Kod: Tümünü seç

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var
   i: SmallInt;
begin
  if ( ActiveControl is TEdit ) AND ( TEdit(ActiveControl) = Edit1 )
  then begin
   if Msg.message = WM_MOUSEWHEEL then
   begin
     i := HiWord(Msg.wParam) ;
     caption := IntToStr(i);
     if i > 0
     then adoSorgu.Prior
     else adoSorgu.Next;
     Handled := True;
   end;
  end
  else Handled := False;
end;
Böylece örneğimizdeki EDIT1 dışındaki MouseWheel'ler orjinali gibi çalışır, sadece EDIT1 içindeyken DBGrid tetiklenir.

Bu da işinize yarayacak bir bilgidir.
Resim
Resim ....Resim
Kullanıcı avatarı
Embarcadero
Üye
Mesajlar: 23
Kayıt: 11 Ağu 2014 03:09

Re: DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen Embarcadero »

İşime yaramaz olur mu? Allah razı olsun. Formumun üzerinde bir tane comboBox vardı. Baktım dediğiniz gibi oluyor o kısmı da değiştirdim. Utanıyorum sormaya; ama çok değerli bilgilerinizden de faydalanmak istiyorum. Söz veriyorum bu günlük son sorum:

Projemde Kullanıcı şifresiyle giriş yaptırmak istiyorum (frmGiris) kullanıcı bu form üzerinde şifresini doğru girip giriş butonuna tıkladığı zaman bu formun gizlenmesini, Ana Formun (frmAna) açılmasını istiyorum aşağıda yazdığım kodu kullandığım zaman access violation hatası alıyorum.

Giriş formundaki giriş butonu kodu:

Kod: Tümünü seç

frmGiris.Hide;
frmGiris.Free;
Application.Initialize;
Application.CreateForm(TfrmAna,frmAna);
Application.Run;
Ana Formun onClose olayına da:
action:=CaFree;
frmAna:=nil;

yazıyorum sonra ana formu kapattığım zaman access violation hatasını alıyorum.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen mrmarman »

Keşke bunu farklı bir başlık altında sorsaydın. Bu konuda soru soracaklar cevabı bulamayabilirler.

Aksine çok daha komplike bir hale de dönüştürmek mümkün ama şöyle basit tarafından örnek ile cevap vermiş olayım. :idea:

Kodların içine açıklamalarla yazdım.

// LoginFormu FREE ettiğimizde Proje sona ermesin isteriz. Değil mi ?
// Onun için :

// (1) Önce MainFormu Create ediyoruz..
Application.CreateForm(TForm2, Form2);
// (2) Sonra da LoginFormu Create ediyoruz..
Application.CreateForm(TForm1, Form1);
// (3) Login şartı sağlanmış ise Main Formumuz görünür,


Proje Dosyamız.

Kod: Tümünü seç

program Project3;

uses
  Forms,
  Controls,
  Unit1 in 'Unit1.pas' {Form1}, // Login Formumuz...
  Unit2 in 'Unit2.pas' {Form2}; // Main Formumuz...

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;

  // LoginFormu FREE ettiğimizde Proje sona ermesin isteriz. Değil mi ?
  // Onun için :

  // (1) Önce MainFormu Create ediyoruz..
  Application.CreateForm(TForm2, Form2);
  // (2) Sonra da LoginFormu Create ediyoruz..
  Application.CreateForm(TForm1, Form1);

  // (3) Login şartı sağlanmış ise Main Formumuz görünür,
  if Form1.ShowModal = mrOk
  then begin
    Form1.Close;
    Application.ProcessMessages;
    // Form2.ShowModal;
    Application.Run;
  end // Aksi taktirde proje sona erer.
  else Application.Terminate;
end.
UNIT 1 yani Login Formumuz..

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  ModalResult := mrOk;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  ModalResult := mrCancel;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  action := caFree;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Form1 := Nil;
end;
UNIT 2 ( yani Main Formumuz nasıl ise öyle. )
Resim
Resim ....Resim
Kullanıcı avatarı
Embarcadero
Üye
Mesajlar: 23
Kayıt: 11 Ağu 2014 03:09

Re: DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen Embarcadero »

Muharrem Bey denedim sorunsuz bir şekilde çalışıyor. Size ne kadar teşekkür etsem azdır. Allah sizden razı olur İnşaalah. Selam ve dua ile...
Kullanıcı avatarı
Embarcadero
Üye
Mesajlar: 23
Kayıt: 11 Ağu 2014 03:09

Re: DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen Embarcadero »

Muharrem Bey şimdi farkettim giriş formunun (frmGiris) taskbarı yok olmuş. Ana formda (frmAna) sıkıntı yok taskbar görünüyor. Yazmış olduğunuz kodlarla Access Violation hatasından kurtulduğum için pek sorun etmiyorum; ama giriş formunda da taskbar olsaydı fena olmazdı. Forumlarda bir kaç kod görüp uyguladım taskbar çıkıyor ama form başlığıyla değilde proje dosyasının ismiyle çıkıyor
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: DBGrid üzerindeki kayıt silindiğinde cursor sabit kalsın

Mesaj gönderen mrmarman »

Application MainForm henüz create edilmediğinden göremiyorsunuz. Bunun da çaresi var. Dilediğiniz her formu TASKBAR'da gösterebilirsiniz. Bunun için aşağıdaki şekilde bir procedure kurmalısınız.

Kod: Tümünü seç

  private
    procedure CreateParams(var Params: TCreateParams); override;
    { Private declarations }

Kod: Tümünü seç

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle := Params.ExStyle and not WS_EX_TOOLWINDOW or WS_EX_APPWINDOW;
end;
Bu yapıyı hangi forma eklerseniz o form da taskbar'da görünür olacaktır. Kısaca projenizde açık olan her forma bu satırları eklerseniz, taskbar üzerinde form sayınız kadar taskbar butonu görürsünüz.

Ayrıca sonraki create edilen MainForm'unuz arkaya kaçıyor olabilir. Bunu da show ettiğiniz yerde aşağıdaki satırı yazarak öne alabilirsiniz.

Kod: Tümünü seç

    Form2.BringToFront;
Örneğimiz üzerinden gidersek :

Kod: Tümünü seç

  // (3) Login şartı sağlanmış ise Main Formumuz görünür,
  if Form1.ShowModal = mrOk
  then begin
    Form1.Close;
    Application.ProcessMessages;

    Form2.BringToFront;
    Application.Run;
  end // Aksi taktirde proje sona erer.
  else Application.Terminate;
Resim
Resim ....Resim
Cevapla