Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Unigui UnimDBGrid1 Dinamik Yapı
#1
Question 
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;
Cevapla
#2
(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;
Cevapla
#3
@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)
Cevapla
#4
Elinize sağlık güzel bir paylaşım olmuş.
Cevapla
#5
(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ı?
Cevapla
#6
(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;

Cevapla
#7
(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?
Cevapla
#8
(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.
Cevapla
#9
(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.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Unigui Mobile Desktop bydelphi 2 256 01-04-2024, Saat: 09:46
Son Yorum: bydelphi
  unigui formlarını ayrı dosya da tutmak mdagli2003 0 285 13-02-2024, Saat: 15:50
Son Yorum: mdagli2003
  UniGUI'ye Genel Bakış vkamadan 67 81.335 13-02-2024, Saat: 14:06
Son Yorum: mdagli2003
  unigui mobile geolocation bydelphi 1 286 19-01-2024, Saat: 17:18
Son Yorum: delphi.developer
  Unigui ile E-imza bydelphi 5 829 21-10-2023, Saat: 16:50
Son Yorum: bydelphi



Konuyu Okuyanlar: 1 Ziyaretçi