Konuyu Paylaş : facebook gplus twitter

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
May the force be with you!
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;
WWW
Cevapla
#3
(22-01-2018, Saat: 13:28)mcuyan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMErhaba
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.
May the force be with you!
Cevapla
#4
(22-01-2018, Saat: 15:28)hyperxman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(22-01-2018, Saat: 13:28)mcuyan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMErhaba
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.
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla
#5
(22-01-2018, Saat: 15:56)savasabd Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(22-01-2018, Saat: 15:28)hyperxman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol 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
May the force be with you!
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)
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
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  Confused Confused

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.
May the force be with you!
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

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  split butonu otomatik olarak açma arsl01 1 95 27-06-2018, Saat: 14:56
Son Yorum: SimaWB
  dbgrid de sağ sol tuşlarını kullanma erdogan 6 317 03-04-2018, Saat: 18:40
Son Yorum: erdogan
  DbGrid To Excel & DataSet To Excel yhackup 8 1.155 31-03-2017, Saat: 12:19
Son Yorum: mcuyan
  dbgrid otomatik scroll erdogan 1 470 04-01-2017, Saat: 23:24
Son Yorum: Lord_Ares
  adoquery dbgrid içindeki datalara if else ile kontrol ettirmek emrekilinc1984 6 1.511 05-11-2016, Saat: 17:08
Son Yorum: emrekilinc1984



Konuyu Okuyanlar: 1 Ziyaretçi