Yorumları: 1.313
Konuları: 111
Kayıt Tarihi: 01-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 6.983 Üstad
Merhabalar,
DBGrid nesnesinin columns bölümlerini otomatik olarak nasıl boyutlandırabilirim?
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
Yorumları: 1.393
Konuları: 75
Kayıt Tarihi: 20-03-2017
Aktif Kullandığınız Delphi Sürümü:
- Delphi 10.3
- Delphi 10.2
- Delphi 7
- Lazarus / FPC
Rep Puanı: 3.892 Uzman
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;
Yorumları: 1.313
Konuları: 111
Kayıt Tarihi: 01-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 6.983 Üstad
22-01-2018, Saat: 15:28
(Son Düzenleme: 22-01-2018, Saat: 15:49, Düzenleyen: Halil Han BADEM.
Sebep: Math kütüphanesi eklendi.
)
(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.
Yorumları: 357
Konuları: 30
Kayıt Tarihi: 10-07-2017
Aktif Kullandığınız Delphi Sürümü:
- Delphi 10.3
- Lazarus / FPC
Rep Puanı: 4.211 Uzman
(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 zaman 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.
Yorumları: 1.313
Konuları: 111
Kayıt Tarihi: 01-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 6.983 Üstad
(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 zaman 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
Yorumları: 903
Konuları: 68
Kayıt Tarihi: 30-06-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 8.400 Üstad
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
Yorumları: 1.313
Konuları: 111
Kayıt Tarihi: 01-07-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 6.983 Üstad
23-01-2018, Saat: 00:13
(Son Düzenleme: 23-01-2018, Saat: 00:15, Düzenleyen: Halil Han BADEM.
Sebep: Kod Düzenlemesi
)
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.
Yorumları: 342
Konuları: 15
Kayıt Tarihi: 16-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 2.711 Uzman
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.
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.
|