动态创建Fastreport

动态创建Fastreport分以下几个步骤:

1.首先清空Fastreport,定义全局变量,并加载数据集
   frReport.Clear;
   frReport.DataSets.Add(frxDBDataset1);
   DataHeight :=28;
   DataWidth :=80;
   FirstTop := 50;
   FirstLeft := 15;

2.创建frxReportPage,并设置纸张大小
  Page := TfrxReportPage.Create(frReport);
  Page.CreateUniqueName;
  page.Orientation := poLandscape;
  Page.SetDefaults;  //默认大小
  //Page.PaperWidth := 210;
  //Page.PaperHeight := 297;

//以下为动态设置纸张大小

{if (qryPrn.FieldCount-4)<=6 then   //当列小于6
  begin
    Page.PaperWidth := 210;
    Page.PaperHeight := 279.4;
    page.Orientation := poPortrait;
  end
  else
  begin
    page.Orientation := poLandscape;
    iWidth := 40+85+90+(qryPrn.FieldCount-4)*84+30;

//fr01cm=3.77953;
    if iWidth<297*fr01cm then

//fr01cm为frxClass中定义的常量,为每毫米像素值,或PerMillPix :=     25.38/Screen.PixelsPerInch;(25.38为每英寸毫米数)
    begin
      Page.PaperSize :=DMPAPER_A4;   //设置为A4,因为激光打印机不支持自定义纸张的横打
    end
    else
    begin
      Page.PaperWidth :=iWidth/fr01cm;
      Page.PaperHeight := 210;
    end;
  end;}
 
3.生成PageBand,并指定高度
  Band := TfrxPageHeader.Create(Page);        //页首
  Band.Top := 10;
  Band.Height := 150;
 
  BandFoot := TfrxColumnFooter.Create(Page);   //页脚
  BandFoot.Top := 10;
  BandFoot.Height := 50;
 
4.画页脚栏
  //画操作员
  memFoot := TfrxMemoView.Create(BandFoot);
  with memFoot do
  begin
    CreateUniqueName;
    HAlign := haLeft;
    VAlign := vaCenter;
    Memo.Text := ‘操作员:程序员‘;
    SetBounds(40, 10, 150, 20);
    ParentFont := False;
    Font.Name := ‘宋体‘;
    Font.Size := 10;
  end;

//画打印时间
  memFoot := TfrxMemoView.Create(BandFoot);
  with memFoot do
  begin
    CreateUniqueName;
    Align := baLeft;
    HAlign := haLeft;
    VAlign := vaCenter;
    Memo.Text := ‘打印时间:‘ + FormatDateTime(‘yyyy-mm-dd hh:mm:ss‘, Now);
    SetBounds(280, 10, 270, 20);
    ParentFont := False;
    Font.Name := ‘宋体‘;
    Font.Size := 11;
  end;
 
5.画标题栏
  //画标题
  Memo := TfrxMemoView.Create(Band);
  with Memo do
  begin
    CreateUniqueName;
    Align := baCenter;
    Memo.Text := ‘******余额汇总表‘;
    Frame.Typ :=[ftBottom];
    Frame.BottomLine.Style :=fsDouble;   //行类型
    Top := FirstTop;
    Height := 30;
    AutoWidth :=True;
    HAlign := haCenter;
    ParentFont := False;
    Font.Name := ‘黑体‘;
    Font.Size := 16;
  end; 
 
  //画单位
  Memo := TfrxMemoView.Create(Band);
  with Memo do
  begin
    CreateUniqueName;
    HAlign := haLeft;
    VAlign := vaCenter;
    Memo.Text := ‘单位:************‘;
    FirstTop := FirstTop + 40;
    FirstWidth := 200;
    FirstHeight := 30;
    SetBounds(40, FirstTop, FirstWidth, FirstHeight);
    ParentFont := False;
    Font.Name := ‘宋体‘;
    Font.Size := 10;
  end;

//画日期
  Memo := TfrxMemoView.Create(Band);
  with Memo do
  begin
    CreateUniqueName;
    Align := baLeft;
    VAlign := vaCenter;
    HAlign := haLeft;
    Memo.Text := ‘日期:‘ + FormatDateTime(‘yyyy-mm-dd‘, Date);
    FirstWidth := 10 + FirstWidth + 200;
    FirstLeft := FirstLeft + FirstWidth;
    SetBounds(FirstLeft, FirstTop, 200, FirstHeight);
    ParentFont := False;
    Font.Name := ‘宋体‘;
    Font.Size := 10;
  end;

//画页码
  Memo := TfrxMemoView.Create(Band);
  with Memo do
  begin
    CreateUniqueName;
    Align := baLeft;
    HAlign := haLeft;
    VAlign := vaCenter;
    Memo.Text := ‘第[Page#]/[TotalPages#]页‘;     //[]中括起来的是FastReport系统变量
    FirstWidth := 10 + FirstWidth;
    FirstLeft := FirstLeft + 200;
    SetBounds(FirstLeft, FirstTop, 100, FirstHeight);
    HAlign := haCenter;
    ParentFont := False;
    Font.Name := ‘宋体‘;
    Font.Size := 10;
  end; 
 
  for i := 1 to qryPrn.FieldCount - 4 do
  begin
    //画数据集的标题
    Memo := TfrxMemoView.Create(Band);
    Memo.CreateUniqueName;
    Memo.ParentFont := False;
    Memo.Font.Name := ‘宋体‘;
    Memo.Font.Size := 10;
    Memo.Text := qryPrn.Fields[i + 3].FieldName;
    Memo.Frame.Typ := [ftTop, ftBottom, ftRight];
    Memo.SetBounds(220 + (i - 1) * DataWidth, Band.Height - DataHeight, DataWidth, DataHeight);
    Memo.HAlign := haCenter;
    Memo.VAlign := vaCenter;
  end;
 
6.画数据集
  DataBand := TfrxMasterData.Create(Page);
  DataBand.CreateUniqueName;
  DataBand.DataSet := frxDBDataset1;
  DataBand.Top := 200;
  DataBand.Height := DataHeight;

Memo1 := TfrxMemoView.Create(DataBand);
  with Memo1 do
  begin
    CreateUniqueName;
    ParentFont := False;
    SetBounds(30, 0, 90, DataHeight);
    VAlign := vaCenter;
    HAlign := haLeft;
    Font.Name := ‘宋体‘;
    Font.Size := 10;
    DataSet := frxDBDataset1;
    DataField := ‘locus‘;
    Frame.Typ := [ftRight, ftBottom, ftLeft];
  end;

Memo1 := TfrxMemoView.Create(DataBand);  
  with Memo1 do
  begin
    CreateUniqueName;
    ParentFont := False;
    SetBounds(120, 0, 100, DataHeight);
    VAlign := vaCenter;
    HAlign := haRight;
    Font.Name := ‘宋体‘;
    Font.Size := 10;
    DataSet := frxDBDataset1;
    DataField := ‘TotalMoney‘;
    Frame.Typ := [ftRight, ftBottom];     //加上右边和底部的边框
  end;

for i := 1 to qryPrn.FieldCount - 4 do
  begin
    Memo1 := TfrxMemoView.Create(DataBand);
    Memo1.CreateUniqueName;
    Memo1.ParentFont := False;
    Memo1.SetBounds(220 + (i - 1) * DataWidth, 0, DataWidth, DataHeight);
    Memo1.DisplayFormat.DecimalSeparator := ‘.‘;
    //Memo1.ExpressionDelimiters := ‘,‘;
    //Memo1.DisplayFormat.FormatStr := ‘%2.2f‘;  定义显示格式
    //Memo1.DisplayFormat.Kind := fkNumeric;
    Memo1.VAlign := vaCenter;
    Memo1.HAlign := haRight;
    Memo1.Font.Name := ‘宋体‘;
    Memo1.Font.Size := 10;
    Memo1.DataSet := frxDBDataset1;
    Memo1.DataField := qryPrn.Fields[i + 3].FieldName;
    Memo1.Frame.Typ := [ftRight, ftBottom];
  end; 
 
7.显示
  frReport.PrepareReport();
  frReport.ShowReport();

8.将以上代码用函数表示

(1)定义

TBandType=(PageHeader,PageFooter);

procedure CreatePage(var           Page:TfrxReportPage;frxReport:TfrxReport;iWidth,iHeight:Double;pDirect:TPrinterOrientation);
procedure CreateBand(var band:TfrxBand;Page:TfrxReportPage;iTop,iHeight:Double;BandType:TBandType);
    procedure CreateDataBand(var band:TfrxMasterData;Page:TfrxReportPage;DbSet:TfrxDBDataset;iTop,iHeight:Integer);
    procedure CreateMemoData(var memView: TfrxMemoView; Band: TfrxBand;
      iLeft, iTop, iWidth, iHeight: Extended; fontname: string; fontsize: Integer;
      Halign: TfrxHAlign; Valign: TfrxVAlign; frxData: TfrxDBDataset; DField: string;
      FrameType: TfrxFrameTypes; Delimiters, ForStr: string; fkKind: TfrxFormatKind);
    procedure CreateMemo(var memView: TfrxMemoView; Band: TfrxBand;
      iLeft, iTop, iWidth, iHeight: Extended; fontname: string; fontsize: Integer;
      Halign: TfrxHAlign; Valign: TfrxVAlign; FrameType: TfrxFrameTypes; sText: string);

(2)实现

procedure TForm1.CreatePage(var Page: TfrxReportPage;
  frxReport: TfrxReport; iWidth, iHeight: Double;
  pDirect: TPrinterOrientation);
begin
  Page := TfrxReportPage.Create(frxReport);
  Page.CreateUniqueName;
  Page.PaperWidth :=iWidth;
  Page.Height :=iHeight;
  Page.Orientation :=pDirect;
end;

procedure TForm1.CreateBand(var band: TfrxBand; Page: TfrxReportPage; iTop,
  iHeight:Double;BandType:TBandType);
begin
  case BandType of
    PageHeader: band :=TfrxPageHeader.Create(Page);
    PageFooter: band :=TfrxPageFooter.Create(Page);
  end;
  band.CreateUniqueName;
  band.Top :=iTop;
  band.Height :=iHeight;
end;

procedure TForm1.CreateDataBand(var band: TfrxMasterData;
  Page: TfrxReportPage; DbSet: TfrxDBDataset; iTop, iHeight: Integer);
begin
  band :=TfrxMasterData.Create(Page);
  band.CreateUniqueName;
  band.DataSet := DbSet;
  band.Top :=iTop;
  band.Height :=iHeight;
end;

procedure TForm1.CreateMemo(var memView: TfrxMemoView; Band: TfrxBand;
  iLeft, iTop, iWidth, iHeight: Extended; fontname: string;
  fontsize: Integer; Halign: TfrxHAlign; Valign: TfrxVAlign;
  FrameType: TfrxFrameTypes; sText: string);
begin
  memView := TfrxMemoView.Create(Band);
  memView.CreateUniqueName;
  memView.ParentFont := False;
  memView.Font.Name := fontname;
  memView.Font.Size := fontsize;
  memView.SetBounds(iLeft, iTop, iWidth, iHeight);
  memView.HAlign := Halign;
  memView.VAlign := Valign;
  memView.Frame.Typ := FrameType;
  memView.Memo.Text := sText;
end;

procedure TForm1.CreateMemoData(var memView: TfrxMemoView; Band: TfrxBand;
  iLeft, iTop, iWidth, iHeight: Extended; fontname: string;
  fontsize: Integer; Halign: TfrxHAlign; Valign: TfrxVAlign;
  frxData: TfrxDBDataset; DField: string; FrameType: TfrxFrameTypes;
  Delimiters, ForStr: string; fkKind: TfrxFormatKind);
begin
  memView := TfrxMemoView.Create(Band);
  memView.CreateUniqueName;
  memView.ParentFont := False;
  memView.Font.Name := fontname;
  memView.Font.Size := fontsize;
  memView.SetBounds(iLeft, iTop, iWidth, iHeight);
  memView.HAlign := Halign;
  memView.VAlign := Valign;
  memView.DataSet := frxData;
  memView.DataField := DField;
  memView.Frame.Typ := FrameType;
  memView.ExpressionDelimiters := Delimiters;
  memView.DisplayFormat.FormatStr := ForStr;
  memView.DisplayFormat.Kind := fkKind;
end;

(3)引用代码

const
  arrFields:array[1..12,1..2] of string=((‘Quantity_Start‘,‘数量‘),(‘Expense_Start‘,‘金额‘),
    (‘Quantity_Buy_Add‘,‘数量‘),(‘Quantity_Buy_Add‘,‘金额‘),
    (‘Quantity_Other_Add‘,‘数量‘),(‘Expense_Other_Add‘,‘金额‘),
    (‘Quantity_Out_Reduce‘,‘数量‘),(‘Expense_Out_Reduce‘,‘金额‘),
    (‘Quantity_Other_Reduce‘,‘数量‘),(‘Expense_Other_Reduce‘,‘金额‘),
    (‘Quantity_End‘,‘数量‘),(‘Expense_End‘,‘金额‘)
    );

var
  FirstTop, FirstWidth, FirstHeight, i, DataWidth, DataHeight, MlWidth: Integer;
  Page: TfrxReportPage;
  BandHeader, BandFoot: TfrxBand;
  DataBand: TfrxMasterData;
  Memo, Memo1, memFoot: TfrxMemoView;
  iLeft, iWidth, iLeft1: Integer;
  PerMillPix: Double;
  iFont: Integer;
  haAl: TfrxHAlign;
  MemArray: array[0..4] of TfrxMemoView;
  MemArray1, MemDataArray: array[0..12] of TfrxMemoView;
  MemArray2, MemArray3: array[0..3] of TfrxMemoView;
  frx:TfrxComponent;
begin
  frReport.Clear;
  iFont := iFont10;
  frxDBDataset1.DataSet := qryPrn;
  frReport.DataSets.Add(frxDBDataset1);
  CreatePage(Page, frReport, 210, 279.4, poLandscape);

//fr01cm :=3.77953;
  DataHeight := 25; //DataHeight*3为栏首高度(目录高度)
  MlWidth := 84; //目录宽度
  DataWidth := 40;
  FirstTop := 40;
  FirstHeight := 30;
  iLeft := 60;
  iLeft1 := 40;

CreateBand(BandHeader, Page, 10, 220, PageHeader);
  CreateBand(BandFoot, Page, 10, 50, PageFooter);

//画操作员
  CreateMemo(memFoot, BandFoot, 65, 10, 150, 20, FName, iFont, haLeft, vaCenter,
    [], ‘操作员:‘+IGlobalVar.GetUserName);
  //画打印时间
  CreateMemo(memFoot, BandFoot, 280, 10, 270, 20, FName, iFont, haLeft, vaCenter,
    [], ‘打印时间:‘ + FormatDateTime(‘yyyy-mm-dd hh:mm:ss‘, Now));

//画标题
  Memo := TfrxMemoView.Create(BandHeader);
  with Memo do
  begin
    CreateUniqueName;
    Align := baCenter;
    Memo.Text := ‘**********汇总表‘;
    Frame.Typ := [ftBottom];
    Frame.BottomLine.Style := fsDouble;
    Top := FirstTop;
    Height := 24;
    AutoWidth := True;
    HAlign := haCenter;
    ParentFont := False;
    Font.Name := ‘黑体‘;
    Font.Size := 16;
  end;

//画单位
  FirstTop := FirstTop + 40;
  FirstWidth := 150;
  CreateMemo(MemArray[0], BandHeader, 65, FirstTop, FirstWidth, FirstHeight, FName, iFont, haLeft,
    vaCenter,
    [], ‘单位:‘+IGlobalVar.GetUnitID);

//画日期
  CreateMemo(MemArray[1], BandHeader, 128, MemArray[0].Top,
    270, FirstHeight, FName, iFont, haLeft, vaCenter,
    [], ‘日期:‘ + FormatDateTime(‘yyyy年mm月dd日‘, Date) + ‘至‘ +
    FormatDateTime(‘yyyy年mm月dd日‘, Date));

//画仓库
  FirstWidth := 170;
  CreateMemo(MemArray[2], BandHeader, MemArray[0].Left, MemArray[0].Top + 20, FirstWidth,
    FirstHeight, FName, iFont, haLeft, vaCenter,
    [], ‘仓库:‘+LcbWh.Text);

//画分类方法
  FirstWidth := 10 + FirstWidth;
  CreateMemo(MemArray[3], BandHeader, MemArray[1].Left, MemArray[2].Top, 200, FirstHeight, ‘宋体‘,
    iFont, haLeft, vaCenter,
    [], ‘分类方法:‘+lcb1.Text);

//画页码
  FirstWidth := 10 + FirstWidth;
  CreateMemo(MemArray[4], BandHeader, MemArray[3].Left + MemArray[3].Width + 100, MemArray[2].Top,
    100, FirstHeight, FName, iFont, haLeft, vaCenter,
    [], ‘第[Page#]页 共[TotalPages#]页‘);

//画栏标题
  iWidth := 32 * Pix10; //14个汉字(28字符)所用的像素值
  CreateMemo(MemArray1[0], BandHeader, iLeft, BandHeader.Height - DataHeight * 3, iWidth, DataHeight
    * 3, FName, iFont,
    haCenter, vaCenter, [ftTop, ftRight, ftBottom, ftLeft], ‘目录‘);
  iLeft := iLeft + iWidth;
  for i := 1 to 12 do
  begin
    if (i = 1) or (i = 2) or (i = 11) or (i = 12) then
      CreateMemo(MemArray1[i], BandHeader, MemArray1[i - 1].Left + MemArray1[i - 1].Width,
        BandHeader.Height -
        DataHeight * 2, GetWidth(i),
        DataHeight * 2,
        FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], arrFields[i, 2])
    else
      CreateMemo(MemArray1[i], BandHeader, MemArray1[i - 1].Left + MemArray1[i - 1].Width,
        BandHeader.Height -
        DataHeight, GetWidth(i),
        DataHeight,
        FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], arrFields[i, 2]);
  end;
  CreateMemo(Memo, BandHeader, MemArray1[3].Left,MemArray1[1].Top,
     MemArray1[3].Width+MemArray1[4].Width,DataHeight,
        FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], ‘外购‘);
  CreateMemo(Memo, BandHeader, MemArray1[5].Left,MemArray1[1].Top,
     MemArray1[5].Width+MemArray1[6].Width,DataHeight,
        FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], ‘其它‘);
  CreateMemo(Memo, BandHeader, MemArray1[7].Left,MemArray1[1].Top,
     MemArray1[7].Width+MemArray1[8].Width,DataHeight,
        FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], ‘报废‘);
  CreateMemo(Memo, BandHeader, MemArray1[9].Left,MemArray1[1].Top,
     MemArray1[9].Width+MemArray1[10].Width,DataHeight,
        FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], ‘其它‘);

CreateMemo(Memo, BandHeader, MemArray1[1].Left,MemArray1[0].Top,
     MemArray1[1].Width+MemArray1[2].Width,DataHeight,
        FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], ‘期初余额‘);
  CreateMemo(Memo, BandHeader, MemArray1[3].Left,MemArray1[0].Top,
     MemArray1[3].Width+MemArray1[4].Width+MemArray1[5].Width+MemArray1[6].Width,DataHeight,
        FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], ‘本期增加‘);
  CreateMemo(Memo, BandHeader, MemArray1[7].Left,MemArray1[0].Top,
     MemArray1[7].Width+MemArray1[8].Width+MemArray1[9].Width+MemArray1[10].Width,DataHeight,
        FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], ‘本期减少‘);
  CreateMemo(Memo, BandHeader, MemArray1[11].Left,MemArray1[0].Top,
     MemArray1[11].Width+MemArray1[12].Width,DataHeight,
        FName, iFont, haCenter, vaCenter, [ftTop, ftBottom, ftRight], ‘期末余额‘);

CreateDataBand(DataBand, Page, frxDBDataset1, 200, DataHeight);
  iWidth := 85;
  CreateMemoData(MemDataArray[0], DataBand, MemArray1[0].Left, 0, MemArray1[0].Width, DataHeight,
    FName, iFont, haLeft, vaCenter,
    frxDBDataset1, ‘contents‘, [ftRight, ftBottom, ftLeft], ‘‘, ‘‘, fkText);
  frReport.Script.Clear;
  frReport.ScriptLanguage :=‘PascalScript‘;
  frReport.ScriptText.LoadFromFile(‘C:\fr_script.pas‘);         
  MemDataArray[0].OnBeforePrint :=‘MemoOnBeforePrint‘;    //动态定义OnBeforePrint事件

iLeft1 := iLeft1 + iWidth;
  for i := 1 to 12 do
  begin
    if Odd(i) then
      CreateMemoData(MemDataArray[i], DataBand, MemArray1[i].Left, 0, MemArray1[i].Width,
        DataHeight,
        FName, iFont, haCenter, vaCenter, frxDBDataset1, arrFields[i, 1],
        [ftRight, ftBottom], ‘‘, ‘‘, fkText)
    else
      CreateMemoData(MemDataArray[i], DataBand, MemArray1[i].Left, 0, MemArray1[i].Width,
        DataHeight,
        FName, iFont, haRight, vaCenter, frxDBDataset1, arrFields[i, 1],
        [ftRight, ftBottom], ‘,‘, ‘%2.2n‘, fkNumeric);
  end;
  frReport.PrepareReport();
  frReport.ShowReport();
end;

C:\fr_script.pas中写入脚本

procedure MemoOnBeforePrint(Sender: TfrxComponent);
begin
  if Length(TfrxMemoView(Sender).Memo.Text)>10 then
  begin             
    TfrxMemoView(Sender).Memo.Text :=Trim(TfrxMemoView(Sender).Memo.Text);
    TfrxMemoView(Sender).HAlign :=haLeft; 
    //TfrxMemoView(Sender).VAlign :=VaTop;                                  
  end;
end;

begin

end.

时间: 2024-08-26 18:23:51

动态创建Fastreport的相关文章

mybatis3动态创建表,判断表是否存在,删除表

1.mybatis3动态创建表,判断表是否存在,删除表 mapper配置文件: <span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/

Android编程动态创建视图View的方法

在Android开 发中,在Activity中关联视图View是一般使用setContentView方法,该方法一种参数是使用XML资源直接创 建:setContentView (int layoutResID),指定layout中的一个XML的ID即可,这种方法简单.另一个方法是 setContentView(android.view.View),参数是指定一个视图View对象,这种方法可以使用自定义的视图类. 在一些场合中,需要对View进行一些定制处理,比如获取到Canvas进行图像绘制,

WinForm用户控件、动态创建添加控件、timer控件--2016年12月12日

好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3 0 0 用户控件: 通过布局将多个控件整合为一个控件,根据自己的需要进行修改,可对用户控件内的所有控件及控件属性进行修改使用 动态创建添加控件: 1 //定义控件类型 2 Button btn = new Button(); 3 //控件名称……等属性,也可以直接绑定各种事件 4 btn.Name = "mybutton" + i.ToString(); 5 //添加到窗体 this 可以替换为 容器控件 6 this.Co

fragment 事务回滚 ---动态创建fragment

1 import java.util.Date; 2 import java.util.LinkedList; 3 4 import com.qianfeng.gp08_day23_fragment5.fragment.TestFragment; 5 6 import android.os.Bundle; 7 import android.app.Activity; 8 import android.app.Fragment; 9 import android.app.FragmentTrans

BroadcastReceiver接收电量变化的广播-------在代码中动态创建接受者

本例为动态创建广播接收者即不是在AndroidManifest.xml文件中定义的广播接收着 代码: 1 package com.qf.broadcastreceiver01; 2 3 import android.app.Activity; 4 import android.app.AlertDialog; 5 import android.content.BroadcastReceiver; 6 import android.content.Context; 7 import android

oaf 动态创建table vo (转)

原文地址:如何动态创建table 需求: 因为系统中有几千个QA plan 但是不能手动创建几千个 质量收集页面所有需要根据 不同的plan 动态创建对应的 质量收集页面. 但是创建tabel 都要绑定一个 具体的vo  而我需要一个动态的如果用 select ... from dual 的话 字段的个数如何动态? 感谢答主sumury 方案0.1版本 //用以下的代码可以实现,但是有一点不足,就是当数据量比较多的时候,无法按照指定的行数进行分页显示. //先在页面上创建一个advancedTa

MVVM下 利用反射动态创建ViewModel 实现单例

在MVVM一般情况下都会希望ViewModel 在整个应用程序中只有一份实例 传统的做法是用单例模式去实现 : public class ViewModelTest { private ViewModelTest() { } private static ViewModelTest viewModelInstace; public static ViewModelTest GetViewModelTestInstace() { if (viewModelInstace == null) { vi

Delphi 动态创建组件,单个创建、单个销毁

效果图如下: 实现部分代码如下: var rec: Integer = 0; //记录增行按钮点击次数 implementation {$R *.dfm} //动态释放单个组件内存,即销毁组件 procedure TForm1.DeleteRow(Sender: TObject); begin if rec < 1 then Exit else begin TPanel(Panel1.Controls[rec]).Free; //释放单个控件内存 TComboBox(Panel2.Control

Sql语句不能识别Go的解决办法(动态创建表的触发器)

问题来源 用sqlserver直接打开sql文本,执行没问题,但是当用Sqlcommand类执行cmdtext命令文本时总是失败报错. 原因分析及解决 用数据库直接执行sql语句没问题,甚至还可以用Go来进行分批处理,但是当你用链接类访问数据库,并执行sql语句时就有些限制,如下: System.Data.SqlClient.SqlCommand cmd; try { using (System.Data.SqlClient.SqlConnection newconn = new System.