Jump to content


Photo

UniDBGrid with Column Templates, powered by Mustache

unidbgrid template mustache

  • Please log in to reply
4 replies to this topic

#1 ttamturk

ttamturk

    Advanced Member

  • uniGUI Subscriber
  • PipPipPipPip
  • 232 posts

Posted 11 May 2018 - 08:11 AM

Hi everyone,

 

With new uniGUI, GetCellData event became virtual and i just made a sample how to use it with a MVC like template system. You can learn (and download) about mustache and figure a way how to use it. This is just a basic sample.

 

You must download mustache Delphi library from https://mustache.github.io/

 

I made a custom DBGrid, and names as TenDBGrid for this sample, enjoy.

 

Best regards.

Attached Files


  • 1

#2 _Mehmet_

_Mehmet_

    Advanced Member

  • uniGUI Subscriber
  • PipPipPipPip
  • 524 posts
  • LocationAntalya / Turkey

Posted 22 May 2018 - 08:32 AM

teşekkürler.


  • 0

#3 _Mehmet_

_Mehmet_

    Advanced Member

  • uniGUI Subscriber
  • PipPipPipPip
  • 524 posts
  • LocationAntalya / Turkey

Posted 31 May 2018 - 12:24 PM

Tek bir sutun haricinde komple gridi sekillendirmek mümkün müdür?


  • 0

#4 ttamturk

ttamturk

    Advanced Member

  • uniGUI Subscriber
  • PipPipPipPip
  • 232 posts

Posted 07 June 2018 - 09:44 AM

Hmm, DBGrid in her kolonu ayrı cell olarak yaratıldığı için mümkün değil. Bunu sadece örnek olarak koydum, belki ileride daha kapsamlı bir testeği unigui bize sağlayabilir. Ben kendi projelerimde seninle aynı şekilde bir yapıya ihtiyaç duyduğumdan kendimce bir yöntem geliştirdim. Grid üzerinde  tek bir kolon bırakıyorum mesela ID kolonu. GetCellData event i içerisnde oluşturduğum json a bütün dataset sahalarını tanımlıyorum ve bu kolon un template inde kullanıyorum. Kendi kullandığım event kodunu göstereyim.

function GetCellData(const ColNo: Integer; var HasAttr: Boolean): TUniCellRecord;
var template : TaidCrossTemplate;
  mustache: TSynMustache;

  function ParseStrToHtml(AHtml : RawUTF8) : RawUTF8;
  begin
    Result := StringReplace(AHtml, '"', '\"', [rfReplaceAll]);
    Result := StringReplace(StringReplace(Result, #10, ' ', [rfReplaceAll]), #13, ' ', [rfReplaceAll]);
  end;

  function RecordToJSON(ADataSet : TDataSet) : RawUTF8;
  var I : Integer;
  begin
    Result := '';

    if ADataSet.Active then begin
      Result := '{ ';
      for I := 0 to ADataSet.Fields.Count - 1 do begin
        Result := Result + '"' + ADataSet.FieldDefs[I].Name + '": "' + StringReplace(ADataSet.Fields[I].AsString, '"', '\"', [rfReplaceAll]) + '", '
      end;
      Result := LeftStr(Result, Length(Result) - 2) + ' ';
      Result := Result + ' }';
    end;
  end;

begin
  Result := inherited GetCellData(ColNo, HasAttr);

  if FContextNo = 0 then begin
    FContextNo := DataSet.RecNo;
    FContext := RecordToJSON(DataSet);
  end;

  if FContextNo <> DataSet.RecNo then begin
    FContext := RecordToJSON(DataSet);
  end;

  template := TemplateByName(Columns[ColNo].FieldName);
  if template <> nil then begin
    mustache := TSynMustache.Parse(ParseStrToHtml(template.HTML.Text));
    Result.Value := '"' + mustache.RenderJSON(FContext) + '"';
  end;

  if FContextNo = DataSet.RecordCount then FContextNo := 0;
end;

Burada RecordToJSON ile oluşan yapı ile template içerisinde bütün dataset i Field isimleri ile kullanabilirsin.

<b>{{Id}}</b><br /><span>{{TextFieldName}}, {{TimeFieldName}}</span>

gibi.

 

Umarım yardımcı olur.


  • 0

#5 _Mehmet_

_Mehmet_

    Advanced Member

  • uniGUI Subscriber
  • PipPipPipPip
  • 524 posts
  • LocationAntalya / Turkey

Posted 07 June 2018 - 09:54 AM

Teşekkür ederim.


  • 0




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users