起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 183|回复: 5

【搞定】使用TStrings类型的变量出错的问题**

[复制链接]
发表于 2007-4-9 09:31:27 | 显示全部楼层 |阅读模式
我定义了一个TStrings类型的变量AList,将数据集中的一个字符类型的变量循环插入到AList中,我的代码如下:

AList := TStrings;

while not DataSetQSZ.Eof do
begin
    lCC := DataSetQSZ.FieldByName('LINENUM').AsString; //将DataSetQSZ数据集中的"车站名称"列赋给
    DataSetZZZ.First;//
    while not DataSetZZZ.Eof do
    begin
      lZZ : = DataSetZZZ.FieldByName('LINENUM').AsString;
      if lCC = lZZ then
        AList.Add(lCC);//将lCC循环加入AList中
    DataSetZZZ.Next;//指向DataSetZZZ数据集中的下一行
    end;
    DataSetQSZ.Next;
  end;

编译已经通过了,但是运行的时候报错:“引用的对象类型为空”,也就是说变量AList为空。

应该如何解决,使我的代码写错了吗?
回复

使用道具 举报

发表于 2007-4-9 09:42:31 | 显示全部楼层
你把代码贴全了,我看看,

编译过了,只能说明语法没有问题,不能保证运行肯定正常
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-9 09:45:56 | 显示全部楼层

全部代码

unit JCBYWXX;

interface

uses
  Business.System, Business.Model, Business.Data,Business.Forms;

type
  TJCBYWXX = class(TInfo)
    DataSetQSZ: TSQLDataSet;
    DataSetZZZ: TSQLDataSet;
    DataSetBZSJJ2: TSQLDataSet;
    DataSetBZSJJ3: TSQLDataSet;
    DataSetBZSJJ4: TSQLDataSet;
    DataSetXLXXXXBZSJJ: TSQLDataSet;
    DataSetSJGDCZ: TSQLDataSet;
    DataSetXLGK: TSQLDataSet;
  private
    {private declarations}
  public
    function GetStation(AStart,AEnd:string):TStrings;//尽量不要用数组类型,而用TStrings类型代替数组类型
  end;

implementation

function TJCBYWXX.GetStation(AStart,AEnd:string):TStrings;
var
  lCC : string;
  lZZ : string;
  AList : TStrings;
  lBoolean : Boolean;

begin
//  AList.Clear;

//对数据集的操作过程:先将数据集DataSetQSZ关闭,对数据集中定义的参数赋值,最后将数据集打开
  DataSetQSZ.Close;
  DataSetQSZ.Params.ParamByName('PStart').AsString := AStart;

//PStart是在"交叉表业务信息集/起始站/SQL构造器/条件"中定义的参数;AStart是本函数中定义的参数
//将AStart的值赋给参数,进而将DataSetQSZ数据集过滤。过滤条件在"交叉表业务信息集/起始站/SQL构造器/条件"中的"站牌信息表.车站名称 = Start"
//将DataSetQSZ数据集中的车站名称为PStart的所有项提取出来,并保存到DataSetQSZ数据集中
  DataSetQSZ.OPen;

  DataSetZZZ.Close;
  DataSetZZZ.Params.ParamByName('PEnd').AsString := AEnd;
  DataSetZZZ.OPen;
//取数据集中某个数据的方式:先取出某一行数据(DataSetQSZ.First),再取出这一行中的某一列数据(lCC := DataSetQSZ.FieldByName('LINENUM').AsString)
  DataSetQSZ.First ;//取出DataSetQSZ数据集中的第一条数据

  while not DataSetQSZ.Eof do  //Eof means end-of-file; 用not DataSetQSZ.Eof来判断数据集DataSetQSZ是否已经到最后一条记录或为空
  //对于数据集中每条记录的循环用while循环
  begin
    lCC := DataSetQSZ.FieldByName('LINENUM').AsString; //将DataSetQSZ数据集中的"车站名称"列赋给
    DataSetZZZ.First;//
    while not DataSetZZZ.Eof do
    begin
      lZZ := DataSetZZZ.FieldByName('LINENUM').AsString;
      if lCC = lZZ then
        AList.Add(lCC);//将lCC循环加入AList中
      DataSetZZZ.Next;//指向DataSetZZZ数据集中的下一行
    end;
    DataSetQSZ.Next;
  end;
  Result := AList;
  lBoolean := Result.Count >0;
  if not lBoolean then
    jsDialogs.ShowWarning('两车站间没有直达车!','注意!')//弹出对话框
end;

end.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-9 09:55:47 | 显示全部楼层

分步运行报错的位置

分步运行报错的位置:AList.Add(lCC); 报错:“引用的对象类型为空”,此时AList变量在局部变量中的值:(空对象)。是不是没有赋初值的问题?如何赋初值?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-9 10:34:10 | 显示全部楼层
自己搞定了!谢谢atiger,可以结帖子了!!!
回复 支持 反对

使用道具 举报

发表于 2007-4-9 12:03:57 | 显示全部楼层
ok,你就定义了AList ,是因为没有创建吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-7 22:40 , Processed in 0.038252 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表