Dbgrid Sütun Genişliklerini Otomatik Ayarlama.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
seho
Üye
Mesajlar: 51
Kayıt: 01 Nis 2008 12:40

Dbgrid Sütun Genişliklerini Otomatik Ayarlama.

Mesaj gönderen seho »

S.A

DBGrid nesnesinden yeni bir dbgrid türetmek istiyorum. Yeni türeteceğim dbgridde şöyle bir özellik olmasını istiyorum. Sütün genişlikleri gdbgrid genişliğine göre otomatik ayarlanmasını istiyorum.

Şu şekilde bir hesaplama kullandım ama tam olarak sütünları iki yana yaslayamadım.

Girdde sütünlara şu işlemi uyguladım.

Kod: Tümünü seç

for i:=0 to ColCount-2 do
begin
Columns[i].Width:= Columns[i].Width + Round((Columns[i].Width / DbGRid Genişliği ) *  DbgridGenişliği -  Sütunların toplam genişliği);
end;
Bu şekilde bir işlem uyguladığımda biraz boşluk kalabiliyo son sütünün yanında yada biraz taşabiliyor.

Tabi bu gridin standart hali için. Gridde belki sütün cizgileri olmayabilir, dbIndicator sutunu iptal edilmiş olabilir. Bu işlemleri gözönüne alarak önerebileceğiniz bir yol varmı. Mesela dgIndicator sütunun genişliğini nasıl alabilirm vb. gibi

İyi çalışmalar dilerim.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Dbgrid Sütun Genişliklerini Otomatik Ayarlama.

Mesaj gönderen aslangeri »

s.a.
ben sadece son sütunun genişliğini ayarlamak için aşağıdaki kodu kullanıyorum

Kod: Tümünü seç

Procedure SonSutunGenisliginiAyarla(aGrid:TDBGrid);
var
  i,LastColumn : integer;
  TotWidth : integer;
  VarWidth : integer;
  VisibleColumns:integer;
begin
  TotWidth := 0;
  VisibleColumns := 0;
  LastColumn:=0;
  for i := 0 to -1 + aGrid.Columns.Count do
  begin
    if aGrid.Columns[i].Visible then
    Begin
      TotWidth := TotWidth + aGrid.Columns[i].Width;
      inc(VisibleColumns);
      lastcolumn:=i;
    end;
  end;
  if dgColLines in aGrid.Options then
    TotWidth := TotWidth + VisibleColumns;
  if dgIndicator in aGrid.Options then
    TotWidth := TotWidth + IndicatorWidth;
  VarWidth :=  aGrid.ClientWidth - TotWidth ;
  // if korşılaştırması sütunun boyunu küşültmek istenmezse
  //if VarWidth>0 then
  Begin
     aGrid.Columns[LastColumn].Width:=aGrid.Columns[LastColumn].Width+VarWidth-1;
     if aGrid.Columns[LastColumn].Width <=0 then aGrid.Columns[LastColumn].Width:=50;
  End;
End;
belki işine yarar.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
seho
Üye
Mesajlar: 51
Kayıt: 01 Nis 2008 12:40

Re: Dbgrid Sütun Genişliklerini Otomatik Ayarlama.

Mesaj gönderen seho »

S.A.

son sütunun genişliğini de artırmak güzel bir düşünce kodları ilk fırsatta yeni türeteceğim dbgride uygulayacağım. Oluşturacağım db griddeki bu sadece bir özellik olacak örneğin belirlenen sütünun değerine göre satır reklendirme, sütün çizgilerinin dbgrid yüksekliğince uzaması v.s. bunları uyguladığımda kodları burda da diğer arkadaşların yararlanması için vereceğim belki açık kaynak kodlu kullanışlı bir dbgrid oluşturarak güzel bir çalışma olabilir inş.

İyi çalışmalar dilerim.
seho
Üye
Mesajlar: 51
Kayıt: 01 Nis 2008 12:40

Re: Dbgrid Sütun Genişliklerini Otomatik Ayarlama.

Mesaj gönderen seho »

Aslangeri senin verdiğin kod üzerinden giderek tüm sütunları orantılı şekilde genişletecek bi fonksiyon yazdım.

Şöyle bir sorun var bir kaç sütün gizlediğimizde ve sütün çizgilerini iptal ettiğimizde sütün genişlikleri yine doğru olarak hesaplanmasına rağmen Yatay ScrollBar çubuğu çıkıyor. Son sütün genişliği taşmamasına rağmen.

Kod: Tümünü seç

procedure AutoColWidth(aGrid:TDBGrid);
Var
  i : Byte;
  intTotalColWidth : Integer;
  intOverColWidth : Integer;
  intValue : Integer;
  intWith : Integer;
  intVisibleColCount :integer;
  intLastColumn : Integer;
Begin
  intTotalColWidth:=0;
  intOverColWidth:=0;
  intValue:=0;
  intWith:=0;
  intVisibleColCount:=0;

  for i:=0 to aGrid.Columns.Count-1 do
  begin
    if aGrid.Columns[i].Visible Then
    begin
      intTotalColWidth:=intTotalColWidth+aGrid.Columns[i].Width;
      inc(intVisibleColCount);
      intLastColumn:=i;
    end;
  end;

  intWith:=intTotalColWidth;

  if dgColLines in aGrid.Options then
  begin
    intWith := intWith + intVisibleColCount;
  end else intWith:=intWith-((aGrid.Columns.Count-intVisibleColCount)+1);

  if dgIndicator in aGrid.Options then
    intWith := intWith + IndicatorWidth
  else 
    Dec(intWith);

  intOverColWidth:=(aGrid.ClientWidth-intWith)-1;

  for i:=0 to aGrid.Columns.Count-1 do
  begin
    if aGrid.Columns[i].Visible then
    begin
      intValue:=intValue+Floor((aGrid.Columns[i].Width / intWith) * intOverColWidth);
      aGrid.Columns[i].Width:=aGrid.Columns[i].Width+Floor((aGrid.Columns[i].Width / intWith) * intOverColWidth);
    end;
  end;

  if intOverColWidth>intValue Then aGrid.Columns[intLastColumn].Width:=aGrid.Columns[intLastColumn].Width+(intOverColWidth-intValue);

end;
Cevapla