Yorumları: 236
Konuları: 28
Kayıt Tarihi: 05-05-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.184 Programcı
14-08-2018, Saat: 10:08
(Son Düzenleme: 14-08-2018, Saat: 10:25, Düzenleyen: elixir84.)
Merhaba,
Unigui de Touch (mobil) kısmında dinamik DBGrid yapmak istiyorum. Yani Query göre UnimDBGrid1 Column ları oluşacak ve bunlara autofit özelliği verilecek.
Hiç bişey yapamadan Datasource bağlayınca listeleniyor ama columnlara autofit özelliği veremedim. Yada columnlara Width değerlerini kodla verebiliyormuyuz. Bunu Unigui Touch (mobil) kısmında yapmaya çalışıyorum.
Çok özür dileyerek şöyle bir kod buldum..
procedure FitGridColumns(Grid: TUnimDBGrid; theForm:TUnimForm);
const
C_Add=3;
var
ds: TDataSet;
bm: TBookmark;
i: Integer;
w,tw, ShortestLength: Integer;
a: Array of Integer;
Function GetTheTextWidth(StrIn:String):Integer;
var c: TBitmap;
Begin
Result := 0;
c := TBitmap.Create;
try
c.Canvas.Font.Name := theForm.Font.Name;
c.Canvas.Font.Size := theForm.Font.Size+2;
Result := c.Canvas.TextWidth(StrIn);
finally
c.Free;
end;
End;
begin
ds := Grid.DataSource.DataSet;
if Assigned(ds) then
begin
bm := ds.GetBookmark;
try
if Grid.Columns.Count = 1 then
Begin
Grid.Columns[0].Width := grid.Width;
End
Else
Begin
if ds.RecordCount > 0 then
Begin
ds.First;
SetLength(a, Grid.Columns.Count);
while not ds.Eof do
begin
for I := 0 to Grid.Columns.Count - 1 do
begin
if Assigned(Grid.Columns[i].Field) then
begin
tw := GetTheTextWidth(Grid.Columns[i].Title.Caption)+40;
w := GetTheTextWidth(ds.FieldByName(Grid.Columns[i].Field.FieldName).DisplayText)+40;
if w < tw then
w := tw;
if a[i] < w then
a[i] := w ;
end;
end;
ds.Next;
end;
for I := 0 to Grid.Columns.Count - 1 do
Begin
Grid.Columns[i].Width := a[i] + C_Add;
End;
End
Else
Begin
for I := 0 to Grid.Columns.Count - 1 do
begin
Grid.Columns[i].Width := GetTheTextWidth(Grid.Columns[i].Title.Caption)+40;
end;
End;
End;
ds.GotoBookmark(bm);
finally
ds.FreeBookmark(bm);
end;
end;
end;
Yorumları: 15
Konuları: 2
Kayıt Tarihi: 07-07-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 10 Başlangıç
(14-08-2018, Saat: 10:08)elixir84 Adlı Kullanıcıdan Alıntı: Merhaba,
Unigui de Touch (mobil) kısmında dinamik DBGrid yapmak istiyorum. Yani Query göre UnimDBGrid1 Column ları oluşacak ve bunlara autofit özelliği verilecek.
Hiç bişey yapamadan Datasource bağlayınca listeleniyor ama columnlara autofit özelliği veremedim. Yada columnlara Width değerlerini kodla verebiliyormuyuz. Bunu Unigui Touch (mobil) kısmında yapmaya çalışıyorum.
Çok özür dileyerek şöyle bir kod buldum..
procedure FitGridColumns(Grid: TUnimDBGrid; theForm:TUnimForm);
const
C_Add=3;
var
ds: TDataSet;
bm: TBookmark;
i: Integer;
w,tw, ShortestLength: Integer;
a: Array of Integer;
Function GetTheTextWidth(StrIn:String):Integer;
var c: TBitmap;
Begin
Result := 0;
c := TBitmap.Create;
try
c.Canvas.Font.Name := theForm.Font.Name;
c.Canvas.Font.Size := theForm.Font.Size+2;
Result := c.Canvas.TextWidth(StrIn);
finally
c.Free;
end;
End;
begin
ds := Grid.DataSource.DataSet;
if Assigned(ds) then
begin
bm := ds.GetBookmark;
try
if Grid.Columns.Count = 1 then
Begin
Grid.Columns[0].Width := grid.Width;
End
Else
Begin
if ds.RecordCount > 0 then
Begin
ds.First;
SetLength(a, Grid.Columns.Count);
while not ds.Eof do
begin
for I := 0 to Grid.Columns.Count - 1 do
begin
if Assigned(Grid.Columns[i].Field) then
begin
tw := GetTheTextWidth(Grid.Columns[i].Title.Caption)+40;
w := GetTheTextWidth(ds.FieldByName(Grid.Columns[i].Field.FieldName).DisplayText)+40;
if w < tw then
w := tw;
if a[i] < w then
a[i] := w ;
end;
end;
ds.Next;
end;
for I := 0 to Grid.Columns.Count - 1 do
Begin
Grid.Columns[i].Width := a[i] + C_Add;
End;
End
Else
Begin
for I := 0 to Grid.Columns.Count - 1 do
begin
Grid.Columns[i].Width := GetTheTextWidth(Grid.Columns[i].Title.Caption)+40;
end;
End;
End;
ds.GotoBookmark(bm);
finally
ds.FreeBookmark(bm);
end;
end;
end;
Ben şöyle bir yöntem buldum.
UnimDBGrid1.Columns[0].Width:=60;
UnimDBGrid1.Columns[1].Width:=55;
UnimDBGrid1.Columns[2].Width:=40;
Yorumları: 236
Konuları: 28
Kayıt Tarihi: 05-05-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.184 Programcı
@ selchuk Dinamik bir yapıda olacağı için şu şekilde çözdüm.
UnimDBGrid1.Columns.Clear;
UnimDBGrid1.Columns.BeginUpdate;
with UnimDBGrid1 do
begin
with Columns.Add do
begin
FieldName := ALAN_ADI
Title.Caption := ALAN_BASLIK
Width := GENISLIK
Font.Charset := ANSI_CHARSET;
Font.Name := 'Verdana';
DisplayMemo := True;
Sortable := False;
ShowSummary:=true;
end;
end;
UnimDBGrid1.Columns.EndUpdate;
Proje bitti. Kısaca özetlersem desktop uygulamamda sql cumleyi, alanları, başlıklarını, genişliğini, toplam olacak alanları, sıralamayı ve aralık kısmını ayarlıyorum. unigui ile bunu UnimDBGrid e veriyorum. iç içe 5 rapora kadar girebiliyorum. Bunların PDF sinide Fastraporda cıkartıyorum. Webden pratik raporlama..(Kasa,Cari Bakiye,Stok Listesi)
Yorumları: 1.038
Konuları: 148
Kayıt Tarihi: 14-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 4.042 Uzman
Elinize sağlık güzel bir paylaşım olmuş.
Yorumları: 15
Konuları: 2
Kayıt Tarihi: 07-07-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 10 Başlangıç
(11-09-2018, Saat: 08:49)elixir84 Adlı Kullanıcıdan Alıntı: @selchuk Dinamik bir yapıda olacağı için şu şekilde çözdüm.
UnimDBGrid1.Columns.Clear;
UnimDBGrid1.Columns.BeginUpdate;
with UnimDBGrid1 do
begin
with Columns.Add do
begin
FieldName := ALAN_ADI
Title.Caption := ALAN_BASLIK
Width := GENISLIK
Font.Charset := ANSI_CHARSET;
Font.Name := 'Verdana';
DisplayMemo := True;
Sortable := False;
ShowSummary:=true;
end;
end;
UnimDBGrid1.Columns.EndUpdate;
Proje bitti. Kısaca özetlersem desktop uygulamamda sql cumleyi, alanları, başlıklarını, genişliğini, toplam olacak alanları, sıralamayı ve aralık kısmını ayarlıyorum. unigui ile bunu UnimDBGrid e veriyorum. iç içe 5 rapora kadar girebiliyorum. Bunların PDF sinide Fastraporda cıkartıyorum. Webden pratik raporlama..(Kasa,Cari Bakiye,Stok Listesi)
Merhaba,
SQL sorgu içerisinde convert komutuyla parasal alanları formatlayabiliyorum. Tek sorunum sağa dayalı biçimde hizalayamadım. Bu konuda pratik bir çözümünüz var mı?
Yorumları: 236
Konuları: 28
Kayıt Tarihi: 05-05-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.184 Programcı
(13-09-2018, Saat: 01:44)selchuk Adlı Kullanıcıdan Alıntı: (11-09-2018, Saat: 08:49)elixir84 Adlı Kullanıcıdan Alıntı: @selchuk Dinamik bir yapıda olacağı için şu şekilde çözdüm.
UnimDBGrid1.Columns.Clear;
UnimDBGrid1.Columns.BeginUpdate;
with UnimDBGrid1 do
begin
with Columns.Add do
begin
FieldName := ALAN_ADI
Title.Caption := ALAN_BASLIK
Width := GENISLIK
Font.Charset := ANSI_CHARSET;
Font.Name := 'Verdana';
DisplayMemo := True;
Sortable := False;
ShowSummary:=true;
end;
end;
UnimDBGrid1.Columns.EndUpdate;
Proje bitti. Kısaca özetlersem desktop uygulamamda sql cumleyi, alanları, başlıklarını, genişliğini, toplam olacak alanları, sıralamayı ve aralık kısmını ayarlıyorum. unigui ile bunu UnimDBGrid e veriyorum. iç içe 5 rapora kadar girebiliyorum. Bunların PDF sinide Fastraporda cıkartıyorum. Webden pratik raporlama..(Kasa,Cari Bakiye,Stok Listesi)
Merhaba,
SQL sorgu içerisinde convert komutuyla parasal alanları formatlayabiliyorum. Tek sorunum sağa dayalı biçimde hizalayamadım. Bu konuda pratik bir çözümünüz var mı?
Konu UnimiDBGrid ile ilgili olduğunu varsayıyorum.
sahalar.Close;
sahalar.SQL.Clear;
sahalar.SQL.Add('SELECT COLUMN_NAME,ORDINAL_POSITION,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TABLO' AND COLUMN_NAME='ALANADI');
sahalar.Open;
Sql sorgu ile alanın Decimal veya Float olup olmadığına göre;
procedure Traporfrm.sayiformat2(Sender: TField; var Text: String; DisplayText: Boolean);
begin
text:=FormatFloat ('#,##0.00', TField (Sender) .AsFloat);
end;
if sahalar.FieldByName('DATA_TYPE').AsString='Decimal' or sahalar.FieldByName('DATA_TYPE').AsString='float' then liste.FieldByName(ALANADI).OnGetText:=sayiformat2;
Yorumları: 15
Konuları: 2
Kayıt Tarihi: 07-07-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 10 Başlangıç
(13-09-2018, Saat: 09:35)elixir84 Adlı Kullanıcıdan Alıntı: (13-09-2018, Saat: 01:44)selchuk Adlı Kullanıcıdan Alıntı: Merhaba,
SQL sorgu içerisinde convert komutuyla parasal alanları formatlayabiliyorum. Tek sorunum sağa dayalı biçimde hizalayamadım. Bu konuda pratik bir çözümünüz var mı?
Konu UnimiDBGrid ile ilgili olduğunu varsayıyorum.
sahalar.Close;
sahalar.SQL.Clear;
sahalar.SQL.Add('SELECT COLUMN_NAME,ORDINAL_POSITION,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TABLO' AND COLUMN_NAME='ALANADI');
sahalar.Open;
Sql sorgu ile alanın Decimal veya Float olup olmadığına göre;
procedure Traporfrm.sayiformat2(Sender: TField; var Text: String; DisplayText: Boolean);
begin
text:=FormatFloat ('#,##0.00', TField (Sender) .AsFloat);
end;
if sahalar.FieldByName('DATA_TYPE').AsString='Decimal' or sahalar.FieldByName('DATA_TYPE').AsString='float' then liste.FieldByName(ALANADI).OnGetText:=sayiformat2;
Dostum teşekkürler fakat bu çalışma benim Sql query 'de convert komutuyla yaptığımın uzun yolu ve rakamlar gene sola dayalı çıktı.
Benim istediğim sağa dayalı çıkması. Eski dbgrid'de field 'lar üzerinde object inspector'dan Aligment'ı taRightJustify seçtiğimizde olan bölümü Unimdbgrid 'de yapmak istiyorum.
Senin çalışmanda ki ORDINAL_POSITION tam olarak nedir? O bu işler için kullanılabilir mi?
Yorumları: 236
Konuları: 28
Kayıt Tarihi: 05-05-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.184 Programcı
(13-09-2018, Saat: 13:56)selchuk Adlı Kullanıcıdan Alıntı: (13-09-2018, Saat: 09:35)elixir84 Adlı Kullanıcıdan Alıntı: Konu UnimiDBGrid ile ilgili olduğunu varsayıyorum.
sahalar.Close;
sahalar.SQL.Clear;
sahalar.SQL.Add('SELECT COLUMN_NAME,ORDINAL_POSITION,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TABLO' AND COLUMN_NAME='ALANADI');
sahalar.Open;
Sql sorgu ile alanın Decimal veya Float olup olmadığına göre;
procedure Traporfrm.sayiformat2(Sender: TField; var Text: String; DisplayText: Boolean);
begin
text:=FormatFloat ('#,##0.00', TField (Sender) .AsFloat);
end;
if sahalar.FieldByName('DATA_TYPE').AsString='Decimal' or sahalar.FieldByName('DATA_TYPE').AsString='float' then liste.FieldByName(ALANADI).OnGetText:=sayiformat2;
Dostum teşekkürler fakat bu çalışma benim Sql query 'de convert komutuyla yaptığımın uzun yolu ve rakamlar gene sola dayalı çıktı.
Benim istediğim sağa dayalı çıkması. Eski dbgrid'de field 'lar üzerinde object inspector'dan Aligment'ı taRightJustify seçtiğimizde olan bölümü Unimdbgrid 'de yapmak istiyorum.
Senin çalışmanda ki ORDINAL_POSITION tam olarak nedir? O bu işler için kullanılabilir mi?
Veriyi Tablodan mı alıyorsunuz view den mi ? Eğer alan değeri float veya decimal ise grid de otomatikman sağa dayalı Çıkıyor.
Yorumları: 15
Konuları: 2
Kayıt Tarihi: 07-07-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 10 Başlangıç
(13-09-2018, Saat: 14:36)elixir84 Adlı Kullanıcıdan Alıntı: (13-09-2018, Saat: 13:56)selchuk Adlı Kullanıcıdan Alıntı: Dostum teşekkürler fakat bu çalışma benim Sql query 'de convert komutuyla yaptığımın uzun yolu ve rakamlar gene sola dayalı çıktı.
Benim istediğim sağa dayalı çıkması. Eski dbgrid'de field 'lar üzerinde object inspector'dan Aligment'ı taRightJustify seçtiğimizde olan bölümü Unimdbgrid 'de yapmak istiyorum.
Senin çalışmanda ki ORDINAL_POSITION tam olarak nedir? O bu işler için kullanılabilir mi?
Veriyi Tablodan mı alıyorsunuz view den mi ? Eğer alan değeri float veya decimal ise grid de otomatikman sağa dayalı Çıkıyor.
Veriyi Logo muhasebe programı veritabanından alıyorum.
Şu anki çalışmama tablodan okuyor. Viewe 'dan okuyanlarda olacak.
|