以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  陷入错误的死循环了  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=89128)

--  作者:天若千颖
--  发布时间:2016/8/16 9:19:00
--  陷入错误的死循环了
昨天在窗口的AfterLoad中加入了如下代码:

\'预先加载最新评估储量图
Dim g As New GroupTableBuilder("临时表", DataTables("总储量明细表"))
g.Groups.AddDef("勘探区块")
g.Totals.AddDef("总储量_1P")
g.Totals.AddDef("总储量_2P")
g.Totals.AddDef("总储量_3P")
g.Totals.AddDef("总储量_1C")
g.Totals.AddDef("总储量_2C")
g.Totals.AddDef("总储量_3C")
g.Filter = "[版本号]= \'2015.08.25\'"
g.Build()
Dim Chart As WinForm.Chart \'定义一个图表变量
Dim Series As WinForm.ChartSeries \'定义一个图系变量
Dim t As Table = Tables("临时表") \'定义一个变量t引用数据表
Chart = e.Form.Controls("Chart1") \' 引用窗口中的图表
Chart.ChartType = ChartTypeEnum.Bar \'图表类型改为Bar(条形)
Chart.DataSource = "临时表" \'设置绑定表
Chart.SeriesList.Clear() \'清除图表原来的图系
For Each c As Col In t.Cols
    If c.Name <> "勘探区块" Then
        Series = Chart.SeriesList.Add() \'增加一个图系
        Series.Text = c.Name \'设置图系的标题
        Series.X.DataField = "勘探区块" \'X轴绑定到产品列
        Series.Y.DataField = c.Name \'设置Y轴的绑定列
       Series.TooltipText = "Y = {#YVAL}" \'动态显示X/Y值
    End If
Next

\'-----------------------个性化图表------------------------
Chart.AxisX.AnnoRotation = - 90 \'X轴标示逆时针旋转90度
Chart.LegendVisible = True \'显示图列
Chart.LegendCompass= CompassEnum.South \'图列显示在南方(底端) 
Series.DataLabelCompass =LabelCompassEnum.North \'Y值显示在柱子的下面
Chart.AxisX.GridMajorVisible = False \'隐藏X轴的网格线
Chart.AxisY.GridMajorVisible = False \'隐藏Y轴的网格线
Chart.HeaderText= "最新储量评估结果(2015年8月25日)" \'显示图名

当预览窗口的时候,一直弹出错误提示,提示信息为:未将对象引用到对象的实例;错误窗口一直弹出,没法关闭。
详细信息大概是和SystemIdle相关的。
我的项目的Systemidel中代码为:

If Forms.activeform IsNot Nothing Then
    StatusBar.Message1 = "当前窗口:" & Forms.Activeform.name
Else
    StatusBar.Message1 = ""
End If

这个问题如何解决呢?
 
窗口文件如下:
 
 
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:储量.rar

[此贴子已经被作者于2016/8/16 9:29:13编辑过]

--  作者:Hyphen
--  发布时间:2016/8/16 10:57:00
--  
去掉Systemidel代码还有没有问题。

上面Systemidel的代码花俏又耗资源,没有必要

--  作者:天若千颖
--  发布时间:2016/8/16 11:01:00
--  
我的主界面是这样的 :http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=87033&replyID=&skin=1

那我如何在状态栏显示当前窗口的名称呢?

--  作者:天若千颖
--  发布时间:2016/8/16 11:03:00
--  
取消Systemidel之后,状态栏一直显示第一个窗口的状态栏文字,不变了。
--  作者:天若千颖
--  发布时间:2016/8/16 11:24:00
--  
Hypen老师,不是项目Systemidel事件的问题,我删除了这个代码。

这个死循环同样存在。

--  作者:天若千颖
--  发布时间:2016/8/16 11:45:00
--  
算了,我把绘图代码删了。重写绘图的代码。
--  作者:天若千颖
--  发布时间:2016/8/17 8:38:00
--  
不知为何,这一段代码也会出现同样的错误,窗口打开时会弹出无数个错误提示,除了关闭进程之外,完全无法终止。

是这样的,我有一个表,两列,登录用户名和登录频次,用户每登录一次,频次为1.
然后生成一个临时表统计总的登录次数,并利用临时表生成一个柱状图。
代码放在窗口的AfterLoad中。
为什么会出现这种错误的死循环呢?

Dim g As New GroupTableBuilder("统计表8", DataTables("系统日志表"))
g.Groups.AddDef("登录用户")
g.Totals.AddDef("登录频次")
g.Build()
Forms("系统登录日志窗口").Controls("Table1").Table.DataSource = g.BuildDataSource()
\'绘图代码
Dim Chart As WinForm.Chart \'定义一个图表变量
Dim Series As WinForm.ChartSeries \'定义一个图系变量
Dim t As Table = Tables("统计表8") \'定义一个变量t引用数据表
Chart= Forms("系统登录日志窗口").Controls("Chart1") \' 引用窗口中的图表
Chart.SeriesList.Clear() \'清除图表原来的图系
Chart.AxisX.ClearValueLabel
Series = Chart.SeriesList.Add() \'增加一个图系
Chart.ChartType = ChartTypeEnum.Bar \'图表类型该为Bar(条形)
Series.Length = t.Rows.Count \'设置图系的长度
For i As Integer = 0 To t.Rows.Count - 1 \'指定每个数据点的位置
    Series.X(i) = i \'指定水平坐标
    Series.Y(i) = t.Rows(i)("登录频次") \'指定垂直坐标
    Chart.AxisX.SetValueLabel(i, t.Rows(i)("登录用户")) \'指定字符表示
     Series.DataLabelText = "{#YVAL}" \'柱子上显示Y值
     Series.DataLabelCompass =LabelCompassEnum.North \'Y值显示在柱子的下面
Next
Chart.AxisX.AnnoWithLabels = True \'启用字符标示
\'图片美化
Chart.AxisX.AnnoRotation = - 90 \'X轴标示逆时针旋转90度
Chart.VisualEffect = False \'加上这一行,让图表更漂亮
Chart.AxisX.GridMajorVisible = False \'隐藏X轴的网格线
Chart.AxisY.GridMajorVisible = False \'隐藏Y轴的网格线
Chart.LegendVisible = False \'显示图列
Chart.LegendCompass= CompassEnum.South \'图列显示在南方(底端)

--  作者:Hyphen
--  发布时间:2016/8/17 9:04:00
--  
可能是有事件互相影响到了。上例子测试
--  作者:大红袍
--  发布时间:2016/8/17 9:16:00
--  

 不要build两次啊

 

Dim g As New GroupTableBuilder("统计表8", DataTables("系统日志表"))
g.Groups.AddDef("登录用户")
g.Totals.AddDef("登录频次")
Forms("系统登录日志窗口").Controls("Table1").Table.DataSource = g.BuildDataSource()

--  作者:天若千颖
--  发布时间:2016/8/17 9:45:00
--  
和Build无关吧。
1楼的就只有1次。
这个系统登录窗口,第一次Build是生成一个临时表,第二次Build是在窗口表中引用这个临时表。