Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
DBGrid Detay Gösterilmesi.
#11
(12-04-2019, Saat: 12:27)mrmarman Adlı Kullanıcıdan Alıntı: Örnek :
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 if (DBGrid1.DataSource.DataSet.Active) AND ( NOT DBGrid1.DataSource.DataSet.EOF ) then
 begin
   Showmessage( DBGrid1.DataSource.DataSet.FieldByName('M_Name').AsString );
 end;
end;



// Burası da button taşıma / görüntüleme kısmı
//-------------------------------------------------------
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
 Field: TField; State: TGridDrawState);
begin
 // Buton için uygun column/field hangisisye oraya odaklanacağız...
 if ( Field.FieldName ='Btn' ) then
 begin
   if ( Field.DataSet.RecordCount > 0 ) then
   begin
     // Kayıt Seçili ve Odaklı ise Butonu yerleştir.
     If ( (gdSelected in State) or (gdFocused in State) ) then
     begin
       BitBtn1.Height  := Rect.Bottom-Rect.Top +2;
       BitBtn1.Width   := Rect.Right -Rect.Left;
       BitBtn1.Left    := Rect.Left  + tDBGrid(Sender).Left + 1;
       BitBtn1.Top     := Rect.Top   + tDBGrid(Sender).Top;
       BitBtn1.Visible := True;
       BitBtn1.BringToFront;
     end;
   end;
 end;
end;



eeuxcmieyyv5wugihmio.gif

Hocam delphi 7 de uyguladım ancak, button ilgili satırda görüntülenmedi, hatada yok, anlamadım. !.?
Cevapla
#12
Merhaba

Hata yok dediniz, ilk akla gelen if'i geçememiş olma ihtimali.
İlk sütunun adı 'Btn' olup olmadığı kontrol ediliyor.
Sizde nedir?

gif / video vb bir kod örneği vs koysaydınız mesaj içine daha sonuç odaklı cevap yazabilirdim.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#13
(20-03-2024, Saat: 20:10)mrmarman Adlı Kullanıcıdan Alıntı: Merhaba

Hata yok dediniz, ilk akla gelen if'i geçememiş olma ihtimali.
İlk sütunun adı 'Btn' olup olmadığı kontrol ediliyor.
Sizde nedir?

gif / video vb bir kod örneği vs koysaydınız mesaj içine daha sonuç odaklı cevap yazabilirdim.


Ek Dosyalar Resimler
   
Cevapla
#14
Buton gridin arkasında kalıyor olabilir mi?
Cevapla
#15
Muharrem hocamın kodlarını uyguladım, arkada kaldığını nasıl anlayabilirim acaba...
Cevapla
#16
Formunuza başka bir buton daha koyup aşağıdaki kodu deneyin.

Grid için kullandığınız buton ismi BitBtn1 değilse aşağıdaki kodda gerekli değişikliği yapmayı unutmayınız.

BitBtn1.Left := 40; //buton korrdinatları için sabit değer
BitBtn1.Top := 40;
BitBtn1.Visible := True;
BitBtn1.BringToFront;

Buton burada görünüyorsa DBGrid1DrawDataCell eventindeki IF yapılarındaki kontrollere odaklanın.

Benzer senaryo gösterimi (visible kullanılmıyor sadece bringtofront etkisi gösteriliyor):

k20ei2n.gif

Sonradan aklıma gelen bir ihtimal daha:
DBGrid ve BitBtn1 farklı paneller içerisnde ise bringtofront işlemi sonunda buton panellerin z-order  durumuna göre hiç görünmeyebilir.

Aşağıdaki kullanımda, grid panel1 içinde BitBtn2 ise panel2 içerisinde. BitBtn2 gridin üstüne çıkamıyor. (Panel2 panel1 in arkasında.)

Bu şekilde tahminlerde bulunmak yerine, projenizde sorun yaşadığınız kısmı soyutlayıp ilgili kısmı paylaşırsanız çok daha hızlı çözüme ulaşırsınız.

bnowiyc.gif
Cevapla
#17
Kalan ihtimallerden birisi de ROWSELECT özelliği kapalı olması. Sütunu seçince buton gezer ama kaydı tıklayınca sütun tetiklenmez.

Şu satırı eklemeyi dener misiniz ...

  DBGrid1.Options     := DBGrid1.Options + [dgRowSelect];

Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#18
DrawDataCell de yazıl kodlar devreye girmediğini anlıyorum, bitbutonu visible true yapıp çalıştırdığımda, dbgrid te yaptığım seçimlerde button aynı yerinde kalıyor, tıklanınca istenen alanı show ediyor, muharrem hocam yaptığınız örneği buraya ekleme yapabilirmisiniz. yada mail olarak Pimapen_Nuri@ hotmail.com a gönderirseniz, ben nerede hata yapıyorum görmek isterim. Sizin kodların birebir aynısını projeme uyguluyorum. İlginç bir durumla karşı karşıyayım.
Cevapla
#19
Size bir proje hazırladım oradan bakıp sorunun ne olduğunu anlayabilirsiniz.

Tek fark olarak ilk sütunu ifade edecek şekilde Index vererek, 'Btn' olan sütun ismi şartını kaldırdım ki veritabanı sql sorguları olduğu gibi kullanılabilsin.

Kaynak kodlar ve veritabanı bu mesaj ekindedir...

Kaynak kodların açık hali aşağıda verdiğim şekilde

procedure TForm1.BitBtn1Click(Sender: TObject);
const
  LConnStr = 'Provider=Microsoft.Jet.OLEDB.4.0;'
           + 'Data Source=%s;'
           + 'Jet OLEDB:Database Password=%s;';
  LPwd     = '';
var
  LSourceMDB : string;
  i : Integer;
begin
  DBGrid1.Font.Name := 'Courier New';
  DBGrid1.Font.Size := 12;

  LSourceMDB := ExtractFilePath(ParamStr(0)) + 'data\movies.mdb';

  ADOConnection1.LoginPrompt                  := False;
  ADOConnection1.ConnectionString := Format( LConnStr, [LSourceMDB, LPwd] );
  ADOConnection1.Connected                    := True;

  DataSource1.DataSet   := ADOQuery1;
  DBGrid1.DataSource    := DataSource1;
  DBGrid1.Options       := DBGrid1.Options + [dgRowSelect];

  ADOQuery1.SQL.Text    := ''
   + sLineBreak + 'SELECT ''.'' as [*]'
   + sLineBreak + '     , M_Name as [Film Adı]'
   + sLineBreak + '     , M_Year as [Yıl]'
   + sLineBreak + '     , M_Directed as [Yönetmen]'
   + sLineBreak + '     , M_Genre as [Tür]'
   + sLineBreak + '     , LEFT(TRIM(M_Plot_TR), 255) AS [Özet]'
   + sLineBreak + 'FROM [Movies]';
  ADOQuery1.Connection  := ADOConnection1;
  ADOQuery1.Active      := true;

  for i := 0 to DBGrid1.Columns.Count-1
    do
      if DBGrid1.Columns[i].Width > 255
        then
          DBGrid1.Columns[i].Width := 255;

  DBGrid1.Columns[0].Width := BitBtn2.Width;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
  LRecord : String;
begin

  LRecord := '';
  if (DBGrid1.DataSource = nil) then exit;

  With DBGrid1.DataSource.DataSet do
    if  (Active   )
    AND (RecNo > 0)
    then
      LRecord := Format(  'Film "%s" (%s)'  + sLineBreak
                        + 'Yönetmen "%s"'   + sLineBreak
                        + '%s' + sLineBreak + sLineBreak
                        + '%s',
        [
          FieldByName('Film Adı').AsString
         ,FieldByName('Yıl').AsString
         ,FieldByName('Yönetmen').AsString
         ,FieldByName('Tür').AsString
         ,trim( FieldByName('Özet').AsString )
        ]);

  if LRecord = '' then exit;

  MessageDlg( LRecord, TMsgDlgType.mtInformation, [TMsgDlgBtn.mbOk], 0 );
  DBGrid1.SetFocus;

end;

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
var
  LMoveControl : TControl;
begin
 // Buton için uygun column/field hangisisye oraya odaklanacağız...
 LMoveControl := BitBtn2;

 if ( Field.FieldNo = 1 ) then
 begin
   if ( Field.DataSet.RecordCount > 0 ) then
   begin
     // Kayıt Seçili ve Odaklı ise Butonu yerleştir.
     If ( (gdSelected in State) or (gdFocused in State) ) then
     begin
       LMoveControl.Height  := Rect.Bottom-Rect.Top +2;
       LMoveControl.Width   := Rect.Right -Rect.Left;
       LMoveControl.Left    := Rect.Left  + tDBGrid(Sender).Left + 1;
       LMoveControl.Top     := Rect.Top   + tDBGrid(Sender).Top;
       LMoveControl.Visible := True;
       LMoveControl.BringToFront;
     end;
   end;
 end;
end;



w1d7jg7xdy4kxa2vqqyc.gif


Ek Dosyalar
.zip   VCL_MoveButtonToRecord_Sample.zip (Dosya Boyutu: 514,93 KB / İndirme Sayısı: 13)
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#20
Teşekkürler Muharrem hocam, son örneğiniz sorunsuz çalışıyor, projemde uyguladım.
Delphi 7 de
MessageDlg( LRecord, TMsgDlgType.mtInformation, [TMsgDlgBtn.mbOk], 0 ); // Object or class type required
ReportMemoryLeaksOnShutdown := true; // Undeclared identifier
hataları mevcut
delphi 10.2 de sorun olmuyor,
Sanırım delphi 7 ye veda etme zamanı geldi. Smile
Allah ilizyon ilminizi artırsın...
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  DbGrid'de Seçili Satırların Fast Reportta Raporlanması [ÇÖZÜLDÜ] bünyamin68 4 709 17-12-2023, Saat: 15:08
Son Yorum: bünyamin68
  DBGRID Otomatik Sıra No Alanı [ÇÖZÜLDÜ] bünyamin68 2 423 18-10-2023, Saat: 21:00
Son Yorum: bünyamin68
  DbGrid tüm satırların yüksekliğini ayarlama delphicim 2 363 16-10-2023, Saat: 23:06
Son Yorum: delphicim
  DBGRID yeni sütun ekle veri gir diğer sütundaki veriyi değiştir stevenskat 8 812 08-09-2023, Saat: 22:47
Son Yorum: m_ekici
  Mouse Orta tuşu ile Dbgrid Scroll unu hareket ettirme stevenskat 2 394 22-08-2023, Saat: 22:37
Son Yorum: stevenskat



Konuyu Okuyanlar: 1 Ziyaretçi