(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;

Hocam delphi 7 de uyguladım ancak, button ilgili satırda görüntülenmedi, hatada yok, anlamadım. !.?
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.
Buton gridin arkasında kalıyor olabilir mi?
Muharrem hocamın kodlarını uyguladım, arkada kaldığını nasıl anlayabilirim acaba...
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):
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.

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];
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.
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;

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.

Allah ilizyon ilminizi artırsın...