Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
DBGrid Columns Otomatik Boyutlandırma
#1
Merhabalar,

DBGrid nesnesinin columns bölümlerini otomatik olarak nasıl boyutlandırabilirim?

JQYvGo.png


Olayı bu şekilde tanımlayayım. İsteğim RunTime'de bu özelliğn otomatik ve eş değer biçimde(resimde görüldüğü gibi) nasıl boyutlandırabilirim?

NOT: Tekrar söyliyeyim "properties" ayarlamalarından bahsetmiyorum  Big Grin
kisisel_logo_dark.png
WWW
Cevapla
#2
MErhaba
FMX Projelerinde, Aşağıdaki şekilde AutoColummns yaptırıyorum..:

procedure TForm15.AutoSizeCol(Grid: TStringGrid; Column: integer);
var
  i: integer;
  W, WMax:single;
begin
  WMax := 0;
  for i := 0 to (Grid.RowCount - 1) do begin
    W := Grid.Canvas.TextWidth(Grid.Cells[Column, i]);
    if W > WMax then
      WMax := W;
  end;
  Grid.Columns[column].Width := WMax + 5;
end;

procedure TForm1.q1AfterOpen(DataSet: TDataSet);
  var
 i: integer;
begin
 for i := 0 to StringGridBindSourceDB1.ColumnCount - 1 do
   AutoSizeCol(StringGridBindSourceDB1, 0);
end;
Cevapla
#3
(22-01-2018, Saat: 13:28)mcuyan Adlı Kullanıcıdan Alıntı: MErhaba
FMX Projelerinde, Aşağıdaki şekilde AutoColummns yaptırıyorum..:

procedure TForm15.AutoSizeCol(Grid: TStringGrid; Column: integer);
var
  i: integer;
  W, WMax:single;
begin
  WMax := 0;
  for i := 0 to (Grid.RowCount - 1) do begin
    W := Grid.Canvas.TextWidth(Grid.Cells[Column, i]);
    if W > WMax then
      WMax := W;
  end;
  Grid.Columns[column].Width := WMax + 5;
end;

procedure TForm1.q1AfterOpen(DataSet: TDataSet);
  var
 i: integer;
begin
 for i := 0 to StringGridBindSourceDB1.ColumnCount - 1 do
   AutoSizeCol(StringGridBindSourceDB1, 0);
end;
 Teşekkürler üstadım.

Dün baya ders çalıştığım için Delphi kod yazma fonksiyonumu kaybetmiştim. Şimdi eve geldim biraz matematik biraz Delphi birşeyler yapmaya çalıştım. Amacıma ulaştım. Yazdığım kod belki çoğu kişinin işine yarar.

Saygılarımla.

Uses 
...
Math;

Procedure KolonBoyutla(Grid: TDBGrid);
var
FormGenislik, KolonMiktar, I: Integer;
KolonBasinaDusenBoyut: Real;
begin
 FormGenislik := frmMainPage.Width - 16;
 KolonMiktar := Grid.Columns.Count;
 KolonBasinaDusenBoyut := FormGenislik / KolonMiktar;

 for I := 0 to KolonMiktar - 1 do
   begin
     Grid.Columns.Items[i].Width := Ceil(KolonBasinaDusenBoyut);
   end;
end;

Kod açıklamak gerekirse;

Ilk olarak formunuzun width değerini alıyor(-16 çerçeve payı). Sonrasında Grid'de bulunan kolon sayısını. Bunları bölüp her bir kolona paylaştırıyor.

UPDATE1: "FormConstrainedResize" adlı event ile çalıştırırsanız kod daha sağlıklı çalışıyor.
kisisel_logo_dark.png
WWW
Cevapla
#4
(22-01-2018, Saat: 15:28)hyperxman Adlı Kullanıcıdan Alıntı:
(22-01-2018, Saat: 13:28)mcuyan Adlı Kullanıcıdan Alıntı: MErhaba
FMX Projelerinde, Aşağıdaki şekilde AutoColummns yaptırıyorum..:

procedure TForm15.AutoSizeCol(Grid: TStringGrid; Column: integer);
var
  i: integer;
  W, WMax:single;
begin
  WMax := 0;
  for i := 0 to (Grid.RowCount - 1) do begin
    W := Grid.Canvas.TextWidth(Grid.Cells[Column, i]);
    if W > WMax then
      WMax := W;
  end;
  Grid.Columns[column].Width := WMax + 5;
end;

procedure TForm1.q1AfterOpen(DataSet: TDataSet);
  var
 i: integer;
begin
 for i := 0 to StringGridBindSourceDB1.ColumnCount - 1 do
   AutoSizeCol(StringGridBindSourceDB1, 0);
end;
 Teşekkürler üstadım.

Dün baya ders çalıştığım için Delphi kod yazma fonksiyonumu kaybetmiştim. Şimdi eve geldim biraz matematik biraz Delphi birşeyler yapmaya çalıştım. Amacıma ulaştım. Yazdığım kod belki çoğu kişinin işine yarar.

Saygılarımla.

Uses 
...
Math;

Procedure KolonBoyutla(Grid: TDBGrid);
var
FormGenislik, KolonMiktar, I: Integer;
KolonBasinaDusenBoyut: Real;
begin
 FormGenislik := frmMainPage.Width - 16;
 KolonMiktar := Grid.Columns.Count;
 KolonBasinaDusenBoyut := FormGenislik / KolonMiktar;

 for I := 0 to KolonMiktar - 1 do
   begin
     Grid.Columns.Items[i].Width := Ceil(KolonBasinaDusenBoyut);
   end;
end;

Kod açıklamak gerekirse;

Ilk olarak formunuzun width değerini alıyor(-16 çerçeve payı). Sonrasında Grid'de bulunan kolon sayısını. Bunları bölüp her bir kolona paylaştırıyor.
Üstadım ellerine sağlık.Ama her sütunun aynı genişlikte olması pek sağlıklı değil.Örneğin ad ve soyadı gösteren bir sütunla doğum yılını gösteren bir sütun aynı olursa sağlıklı olmaz.Herkes 1 ekmekle doymaz,bazısına fazla gelir bazısına az; eşitlik adeletli değildir çoğu zamanSmile Bu yüzden DBGrid.Canvas.TextWidth(ifade:string) ile kolondaki ister en uzun ister ilk değeri alıp ölçer, kolonların boyutunu da ona göre ayarlarsan daha iyi olur kanaatimce.
Herhangi bir basit problem, hakkında yeterince toplantı yapılarak, çözümsüz hale getirilebilir.
https://play.google.com/store/apps/developer?id=ONGUN
WWW
Cevapla
#5
(22-01-2018, Saat: 15:56)savasabd Adlı Kullanıcıdan Alıntı:
(22-01-2018, Saat: 15:28)hyperxman Adlı Kullanıcıdan Alıntı:  Teşekkürler üstadım.

Dün baya ders çalıştığım için Delphi kod yazma fonksiyonumu kaybetmiştim. Şimdi eve geldim biraz matematik biraz Delphi birşeyler yapmaya çalıştım. Amacıma ulaştım. Yazdığım kod belki çoğu kişinin işine yarar.

Saygılarımla.

Uses 
...
Math;

Procedure KolonBoyutla(Grid: TDBGrid);
var
FormGenislik, KolonMiktar, I: Integer;
KolonBasinaDusenBoyut: Real;
begin
 FormGenislik := frmMainPage.Width - 16;
 KolonMiktar := Grid.Columns.Count;
 KolonBasinaDusenBoyut := FormGenislik / KolonMiktar;

 for I := 0 to KolonMiktar - 1 do
   begin
     Grid.Columns.Items[i].Width := Ceil(KolonBasinaDusenBoyut);
   end;
end;

Kod açıklamak gerekirse;

Ilk olarak formunuzun width değerini alıyor(-16 çerçeve payı). Sonrasında Grid'de bulunan kolon sayısını. Bunları bölüp her bir kolona paylaştırıyor.
Üstadım ellerine sağlık.Ama her sütunun aynı genişlikte olması pek sağlıklı değil.Örneğin ad ve soyadı gösteren bir sütunla doğum yılını gösteren bir sütun aynı olursa sağlıklı olmaz.Herkes 1 ekmekle doymaz,bazısına fazla gelir bazısına az; eşitlik adeletli değildir çoğu zamanSmile Bu yüzden DBGrid.Canvas.TextWidth(ifade:string) ile kolondaki ister en uzun ister ilk değeri alıp ölçer, kolonların boyutunu da ona göre ayarlarsan daha iyi olur kanaatimce.

 Üstadım;

dediğiniz tabi ki daha iyi. Şu anda yaptığım proje için hepsini eşit olması daha uygun. Dediğiniz üzerinde bugün çalışacağım. Yaptığımda platform üzerinden paylaşırım  Blush
kisisel_logo_dark.png
WWW
Cevapla
#6
Belki bazı veri tipleri için sabit bir genişlik (minimum, caption kadar) olacak şekilde ayarlama da yapılabilir, (mesela boolean, date, datetime, currency gibi alanlar)
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla
#7
UPDATE 2: 

Kod güncelleştirildi. @savasabd hocamın dediği gibi herkes kendi değer uzunluğunu aldı. Ek olarak geliştirici kendi referans boyutunu da ekliyebiliyor.

@uparlayan hocamın dediği de gayet kullanışlı bir fikir lakin sınavıma 4 ayın kalması için pek uğraş veremiyorum  :ss :ss

Kod:

procedure KolonBoyutla(Grid: TDBGrid; EkUzunluk: Integer);
var
KolonMiktar, i: Integer;
begin
KolonMiktar := Grid.Columns.Count;

for i := 0 to KolonMiktar - 1 do
  begin
    Grid.Columns.Items[i].Width := (Grid.Canvas.TextWidth(Grid.Fields[i].AsString)) + EkUzunluk;
  end;
end;

Kullanımı:

procedure TForm1.FormConstrainedResize(Sender: TObject; var MinWidth, MinHeight,
 MaxWidth, MaxHeight: Integer);
begin
KolonBoyutla(DBGrid1, 100);
end;


Saygılarımla.
kisisel_logo_dark.png
WWW
Cevapla
#8
Merhaba,
Genel olarak geliştirmeyi ihtiyaçlara göre yapmaktayız. Yakın bir zamanda benzer bir geliştirmeye benimde ihtiyacım olmuştu.Kendi ihtiyacıma göre hazırladığım yapı;
İyi Çalışmalar.

G9k0rZ.gif

uses
 System.IniFiles,system.Math;
type
 TForm1 = class(TForm)
   DBGrid1: TDBGrid;
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure FormShow(Sender: TObject);
   procedure DBGrid1TitleClick(Column: TColumn);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
 Form1: TForm1;
 c,w,f   :string;
 setting :TIniFile;
implementation

{$R *.dfm}
procedure GridYukle(GridAdi:TDBGrid;GrdCaption,GrdCaptionWith,GrdField:String);
var
 SL:TStringList;
 I :Integer;
begin
 if (GrdCaption='') and (GrdCaptionWith='') and (GrdField='') then Exit;
 GridAdi.Columns.Clear;
 SL := TStringList.Create;
 try
   SL.Delimiter      := ';';
   SL.DelimitedText  :='"' + StringReplace(GrdCaption, ';', '"' + ';' + '"', [rfReplaceAll]) + '"' ;
   for I := 0 to sl.Count-1 do
   Begin
     GridAdi.Columns.Add;
     GridAdi.Columns[I].Title.Caption:=SL.Strings[I];
   End;

   SL.Delimiter      := ';';
   SL.DelimitedText  := GrdCaptionWith;
   for I := 0 to sl.Count-1 do
   GridAdi.Columns[I].Width:=StrToInt(SL.Strings[I]);

   SL.Delimiter      := ';';
   SL.DelimitedText  := '"' + StringReplace(GrdField, ';', '"' + ';' + '"', [rfReplaceAll]) + '"' ;
   for I := 0 to sl.Count-1 do
   Begin
     GridAdi.Columns[I].FieldName  :=SL.Strings[I];
     GridAdi.Columns[I].Font.Size  :=10;
     GridAdi.Columns[I].Font.Style :=[];
   End;
 finally
   SL.Free;
 end;
end;
Function GridCaptionSave(GridAdi:TDBGrid):String;
var I:Integer;
   s:string;
begin
 for I :=0 to GridAdi.Columns.Count-1 do
     s :=s+GridAdi.Columns[I].Title.Caption+';';
 Result:=copy(s,1,length(s)-1);
end;

Function GridFieldSave(GridAdi:TDBGrid):String;
var I:Integer;
   f:string;
begin
 for I :=0 to GridAdi.Columns.Count-1 do
     f :=f+GridAdi.Columns[I].FieldName+';';
 Result:=copy(f,1,length(f)-1);
end;

Function GridWithSave(GridAdi:TDBGrid):String;
var I:Integer;
   v:string;
begin
 for I :=0 to GridAdi.Columns.Count-1 do
     v :=v+IntToStr(GridAdi.Columns[I].Width)+';';
 Result:=copy(v,1,length(v)-1);
end;
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
 function CtrlDown : Boolean;
 var
    State : TKeyboardState;
 begin
    GetKeyboardState(State) ;
    Result := ((State[vk_Control] And 128) <> 0) ;
 end;
var deger:AnsiString;
begin
 Caption:=Column.FieldName;
 if CtrlDown=True then
 Begin
   deger:=InputBox('Kolon Başlığı','Eski Değer  : '+Column.Title.Caption+#13+'Yeni Değer :',Column.Title.Caption);
   Column.Title.Caption:=deger;
   Abort;
 end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 setting :=TINIFile.Create(ExtractFilePath(Application.EXEName)+'setting.ini');
 setting.WriteString('GRID_ISLEMLERBASLIK', 'DBGrid1',GridCaptionSave(DBGrid1));
 setting.WriteString('GRID_ISLEMLERWITH',   'DBGrid1',GridWithSave(DBGrid1));
 setting.WriteString('GRID_ISLEMLERFIELD',  'DBGrid1',GridFieldSave(DBGrid1));
 setting.Free;
 Action :=caFree;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
 setting :=TINIFile.Create(ExtractFilePath(Application.EXEName)+'setting.ini');
 c:=setting.ReadString('GRID_ISLEMLERBASLIK', 'DBGrid1','');
 w:=setting.ReadString('GRID_ISLEMLERWITH',   'DBGrid1','');
 f:=setting.ReadString('GRID_ISLEMLERFIELD',  'DBGrid1','');
 setting.Free;
 if (Length©>0) and (Length(w)>0) and  (Length(f)>0)   then
 GridYukle(DBGrid1,c,w,f);
end;

end.

Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  DBGrid Detay Gösterilmesi. OZCANK 19 9.568 05-04-2024, Saat: 00:48
Son Yorum: Pimapen_Nuri
  DbGrid'de Seçili Satırların Fast Reportta Raporlanması [ÇÖZÜLDÜ] bünyamin68 4 784 17-12-2023, Saat: 15:08
Son Yorum: bünyamin68
  DBGRID Otomatik Sıra No Alanı [ÇÖZÜLDÜ] bünyamin68 2 441 18-10-2023, Saat: 21:00
Son Yorum: bünyamin68
  DbGrid tüm satırların yüksekliğini ayarlama delphicim 2 397 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 866 08-09-2023, Saat: 22:47
Son Yorum: m_ekici



Konuyu Okuyanlar: 1 Ziyaretçi