DbGrid Cellerinde ÜçNokta Olayı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
F.Atagun
Üye
Mesajlar: 158
Kayıt: 01 Oca 2008 01:56

DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen F.Atagun »

S.A.

Dbgride alınan veriler Cell'e sığmıyorsa bazı componentlerde olduğu gibi son karakterine otomatik olarak 3 nokta koymak istiyorum.

Bunu Nasıl yapabilirim acaba
Kullanıcı avatarı
lom
Üye
Mesajlar: 135
Kayıt: 25 Nis 2006 02:37

Re: DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen lom »

s.a yanlış hatırlamıyor isem cxgrid nesnesin de yapılabiliyodu. bi araştırın isterseniz. kolay gelsin.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen mrmarman »

Canvas işlemleriyle standart DBGrid için yapabilirsin.

- Canvas.TextWidth('Muharrem ARMAN') ile bu yazının ilgili canvastaki seçili font ve font özellikleri çerçevesinde ne kadarlık bir genişlik kaplayacağını hesaplatabilir, basit bir döngü ile DBGrid'in ilgili hücresinin genişliği ne kadar ise o kadara kadar bu yazıyı kırpabilirsin. Canvas.TEXTOUT ile de kırptığın bu kadarını, sonuna da '...' basarak yazdırırsan dilediğin olacaktır.

- Bu işlemleri OnDraw..... olayında gerçekleşir.
Resim
Resim ....Resim
F.Atagun
Üye
Mesajlar: 158
Kayıt: 01 Oca 2008 01:56

Re: DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen F.Atagun »

Teşekkür Ederim Hocam
F.Atagun
Üye
Mesajlar: 158
Kayıt: 01 Oca 2008 01:56

Re: DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen F.Atagun »

Mrmarman Hocam,

Ben Bu olayı bir türlü beceremedim. Sizden rica etsem küçük bir örnek vermeniz mümkünmüdür acaba ?

Teşekkürler
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen mrmarman »

Neden olmasın...

Kod şöyle, kod içinde açıklama da bıraktım. Ayrıca hazırlanan örneğin de linkini aşağıda bulacaksın. DBGrid üzerine runtime'da mouse ile hücre boyutlarını kaydırarak değiştirdiğinde hemencecik otomatik olarak bu fonksiyon kendiliğinden devreye girecektir. ftWideString tipinde dedim ( TEXT olanlar için ) sen lazım olduğunda daha da detaylandırırsın.

Kod: Tümünü seç

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
Var
  Veri : String;
  i : Integer;
begin
  if Field.DataType = ftWideString then begin
    if TDBGrid(Sender).Canvas.TextWidth(Field.AsWideString) > (Rect.Right-Rect.Left) then
    begin // Canvas varsayılan font tipine göre, Filed içindeki text veri, eğer
          // DataCell yani hücrenin eninden büyükse. (demek ki devamında örtülü kısım var)
          // Bu durumda örtülü olmayan kısım olana kadar sondan ve fazladan 3 tane fazla kırpıp
          // bu sonradan kırpılan fazlalık kısım yerine ... koyucaz.. nasıl mı ?
      Veri := Field.AsWideString;
      while TDBGrid(Sender).Canvas.TextWidth(Veri) > (Rect.Right-Rect.Left)
        do Delete(Veri, Length(Veri), 1); // Sondan geri doğru kırpıyoruz..
      For i := 1 to 3 do Delete(Veri, Length(Veri), 1); // 3 tane fazla kırptık...
      Veri := Veri + '...';

      TDBGrid(Sender).Canvas.Brush.Color := clYellow;
      TDBGrid(Sender).Canvas.FillRect(Rect); // Önce renk doldur..
      TDBGrid(Sender).Canvas.TextOut( Rect.Left+1, Rect.Top+1, Veri );
    end;
  end;
end;
Örnek resimdeki gibi bir sonuç elde etmiş olursun. Örneğin Rapidshare linkini de vereyim.. http://rapidshare.com/files/175250807/D ... amlama.rar

Resim
Resim
Resim ....Resim
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Re: DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen undefined »

Bir kere işim düşmüştü, Gdi fonksiyonunun zaten böyle birşey içerdiğini görmüştüm: DT_END_ELLIPSIS. Tekrar araştırırken tesadüfen bu linke denk geldim burda senin istediğin davranışları dbgride kazandırmışlar.

Kod: Tümünü seç

  DrawText(gridOwnerDraw.canvas.Handle, PChar(str),  
             length(str), txtRect, 
             DT_SINGLELINE or DT_LEFT or DT_VCENTER or DT_END_ELLIPSIS);
Professional Looking Grids with Custom Drawing
F.Atagun
Üye
Mesajlar: 158
Kayıt: 01 Oca 2008 01:56

Re: DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen F.Atagun »

Hocam Allah Razı Olsun, Çok Duamı Aldınız

Gerçekten Yardımseverliğiniz için Çok Teşekkür Ediyorum
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen mrmarman »

Valla @undefined daha önce ihtiyacım hiç olmamıştı ama soruyu görür görmez aklıma ilk gelen yol buydu. Canvas işlemlerine elim alışmış bir kere ya, o bakımdan daha olmadan olduruveriyoruz. :o

Önerdiğin kısım bütünün bir parçası. Onda da eski verinin silinmesi falan gerekiyor. Bana daha fazla iş gücü istiyormuş gibi geldi ama karşılaştırmak gibi olmasın. Henüz deneme fırsatım olmadı.
Resim
Resim ....Resim
Kullanıcı avatarı
shochan
Üye
Mesajlar: 89
Kayıt: 06 Eki 2008 04:54
Konum: Kayseri

Re: DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen shochan »

S.a konu dbgridden açılmışken bende bu konu altında bi soru sorayım dbgridle ilgili. Fazladan konu açmak istemedim.
mrmarman hocam birde bazı programlarda şunu görüyorum dbgridde bir hücreye tıkladığımızda o hücrenin bulunduğu satırı komple seçiyo bunun için bi kod mu kullanmamız gereyio yoksa dbgridin bir özelliğini fln mı aktif etmemiz gerekio örnek bir resimde ekleyim daha açıklayıcı olsun

Resim

Yardımcı olursanız sevinirim saygılarımla iyi çalışmalar.
  • Devler Gibi İşler Yapmak İçin Karıncalar Gibi Çalışmak Lazım ...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen mrmarman »

Merhaba.

Bunu TDBGrid'in Option kısmını açtığında karşına gelen seçeneklerden RowSelect özelliğini TRUE yaparsan elde edebilirsin. Ancak bu durumda hücreleri EDIT ( DBgrid üzerinden kayıt üzerinde değişiklik ) opsiyonunu kaybedersin. Tercihi bunu değerlendirerek yapmak lazım.

Resim

Diğer yandan yine bir önceki örnek gibi canvas operasyonları ile kendin toplu satırı boyama işlemi yaparsan, bu opsiyonu kendin elle halletmiş olursun ki o zaman hem EDIT etme hakkın saklı kalır hem de istediğin satırın boydan boya seçilmesi (ya da öyle görünmesi diyelim) imkanı elde etmiş olursun.
Resim
Resim ....Resim
Kullanıcı avatarı
shochan
Üye
Mesajlar: 89
Kayıt: 06 Eki 2008 04:54
Konum: Kayseri

Re: DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen shochan »

Sağolun hocam ilk söylediğiniz şuan yapmakta olduğum programda müşterileri listelemede kullandığım dbgridde olur çünkü o dbgridlerde edit olayı olmayacak. İkinci dediğinizde biraz önce forumda başka konudada okudum tam dediğiniz gibi deilde benzeri bir olaydı fakat uyguladığımda sizin dediğiniz gibi olmadı kodu tam çeviremedim kendi istediğim şekle şuan için zaten hem tüm satırı seçtirip hemde dbgrid üzerinde edit yaptırma gibi bir durum söz konusu değil ama yinede o konudada fikir sahibi olmamı sağladığınız için çok tşk ederim.

Saygılar iyi çalışmalar.
  • Devler Gibi İşler Yapmak İçin Karıncalar Gibi Çalışmak Lazım ...
F.Atagun
Üye
Mesajlar: 158
Kayıt: 01 Oca 2008 01:56

Re: DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen F.Atagun »

@mrmarman Hocam,

Birşey farkettim.
Bazı dbgridlerimin DrawColumnCell'inde aşağıdaki gibi satır satır renklendirme var. Eğer DrawColumnCell'inde bu kod varsa çalışmıyor 3 nokta olayımız

Ne yapmamızı önerirsiniz ?

Kod: Tümünü seç

procedure TForm1.dbgrd1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
        If (gdSelected in state) then // eğer seçili ise
        begin
        DBGrd1.Canvas.Brush.Color := $00FD959C; // zemin rengi
        DbGrd1.Canvas.Font.Color := clYellow; // font rengi
       end
        else
        begin
            if (DBGrd1.datasource.dataset.recno mod 2) =0
            then DBGrd1.Canvas.Brush.Color := $00C8FBFD
            else DBGrd1.Canvas.Brush.Color := $00BFD7B5;
        dbGrd1.Canvas.Font.Color:=clRED; // Fontun rengini değiştirir..
        DBGrd1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
        end;
end;
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen mrmarman »

O zaman bütün renklendirmeleri aynı procedure içine taşıma opsiyonunu kullanabilirsin. Aynı procedure'de de sıralama hatası yaparsan aynı olumsuz sonucu elde edersin.

Kod: Tümünü seç

DBGrd1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
Bu satırı koyduktan sonra ilgili değişikliği yaprsanız, önce varsayılan renklendirme yapılmış olur, ondan sonra senin yapacakların işleme alınır.

Eğer tersini, yani önce kendi istediğin üç noktalı işlemi yapıp ardından bu satırı eklersen ne olur ? Önce üç nokta koyar, ardından da eski varsayılan haline döndürür.

Kısaca yapacağın işlem, önce default renklendirmenin yapılmasını sağlayacak, ondan sonra dilediğin modifikasyonun oluşmasını sağlamalısın.
Resim
Resim ....Resim
F.Atagun
Üye
Mesajlar: 158
Kayıt: 01 Oca 2008 01:56

Re: DbGrid Cellerinde ÜçNokta Olayı

Mesaj gönderen F.Atagun »

mrmarman yazdı:O zaman bütün renklendirmeleri aynı procedure içine taşıma opsiyonunu kullanabilirsin. Aynı procedure'de de sıralama hatası yaparsan aynı olumsuz sonucu elde edersin.
@mrmarman Hocam,

Hep Olumsuz sonuçları elde ediyorum. Tüm kombinasyonları uyguladım, farklı şeyler denedim, yapamadım bir türlü.

Son bir rica etsem,
Kodun son halini bir toplayabilirmisiniz acaba ?
Cevapla