我照着<西安电子科技大学出版社>朱振元出的数据结构,线性表一章写了以下界面程序:
结果每次运行就提示"From'sxbForm'references form'sxbForm'declared in unit 'list'which is not in your USES list,Do you wish to add it?",点yes后就在implementation后加了一句:uses list; 又说list不能引用自己,就什么反应都没了. 我不明白以下问题:
1.unit 的名字取什么都可以还是要和Form的名字一样?
2.我有两个类:窗体类sxbForm和链表类Tsxb,可以写在一个unit里吗?还是Tsxb写在另一个unit里更好?
3.为什么我给窗体取的Name是sxbForm而程序自动改成TsxbForm?
4.我的程序还有哪些问题,怎么改才能调通并显示结果?unit list;interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, ExtCtrls;type
    TsxbForm = class(TForm)
    Label1: TLabel;
    Comb1: TComboBox;
    PaintBox1: TPaintBox;
    Sp1: TSpinEdit;
    Label2: TLabel;
    Label3: TLabel;
    ButQk: TButton;
    Cr: TButton;
    Sc: TButton;
    Tc: TButton;
    procedure ButQkClick(Sender: TObject);
    procedure CrClick(Sender: TObject);
    procedure ScClick(Sender: TObject);
    procedure TcClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;elemtp = char;
const maxlen=30;
type
Tsxb = class
  private
    elem:array[1..maxlen] of elemtp;
    curlen:0..maxlen;
  public
    procedure init;
    procedure prnt;
    function dele(loc:integer):elemtp;
    procedure inst(loc:integer;el:elemtp);
 end;implementation
var
  TsxbForm:TsxbForm;
  sxb1:Tsxb;
procedure Tsxb.init;
begin
  curlen:=0;
end;procedure Tsxb.prnt;
var i,ix,iy:integer;rect1:Trect;s:char;
begin
  rect1:=rect(0,0,550,100);
  sxbForm.PaintBox1.Canvas.Brush.Color:=clBtnFace;
  sxbForm.PaintBox1.Canvas.FillRect(rect1);
  sxbForm.PaintBox1.Canvas.Brush.Color:=clwhite;
  sxbForm.PaintBox1.Canvas.Pen.Color:=$0080FF80;
  sxbForm.PaintBox1.Canvas.Pen.Width:=2;
  sxbForm.PaintBox1.Canvas.Font.Color:=clred;
  sxbForm.PaintBox1.Canvas.Font.Size:=18;
  ix:=10;iy:=0;
  if curlen>0 then
  for i:=1 to curlen do
    begin
      s:=elem[i];
      sxbForm.PaintBox1.Canvas.MoveTo(ix-10,30);
      sxbForm.PaintBox1.Canvas.LineTo(ix,30);
      sxbForm.PaintBox1.Canvas.MoveTo(ix-5,35);
      sxbForm.PaintBox1.Canvas.LineTo(ix,30);
      sxbForm.PaintBox1.Canvas.MoveTo(ix-5,25);
      sxbForm.PaintBox1.Canvas.LineTo(ix,30);
      sxbForm.PaintBox1.Canvas.Rectangle(ix,iy,ix+50,iy+60);
      sxbForm.PaintBox1.Canvas.TextOut(ix+20,iy+12,s);
      ix:=ix+60
    end;
end;function Tsxb.dele(loc:integer):char;
var i:integer;
begin
  if(loc<1)or(loc>curlen) then showmessage('infeasible')
    else
      begin
        for i:=loc+1 to curlen do
          elem[i-1]:=elem[i];
        curlen:=curlen-1
      end;
end;procedure Tsxb.inst(loc:integer;el:char);
var i:integer;
begin
  if(loc<1)or(loc>curlen+1) then showmessage('infeasible')
    else if curlen>=maxlen then showmessage('showflow')
      else
        begin
          for i:=curlen downto loc do
            elem[i+1]:=elem[i];
          elem[loc]:=el;
          curlen:=curlen+1
        end;
end;procedure TsxbForm.FormCreate(Sender:TObject);
begin
  sxb1:=Tsxb.Create;
  sxb1.init;
end;{$R *.dfm}procedure TsxbForm.ButQkClick(Sender: TObject);
begin
  sxb1.init;
  sxb1.prnt;
end;procedure TsxbForm.CrClick(Sender: TObject);
var el:char;loc:integer;
begin
  el:=comb1.text[1];
  loc:=sp1.Value;
  sxb1.inst(loc,el);
  sxb1.prnt
end;procedure TsxbForm.ScClick(Sender: TObject);
var loc:integer;
begin
  loc:=sp1.Value;
  sxb1.dele(loc);
  sxb1.prnt
end;procedure TsxbForm.TcClick(Sender: TObject);
begin
  sxb1.Free;
  close;
  release;
end;end.

解决方案 »

  1.   

    1.unit 的名字取什么都可以还是要和Form的名字一样?//取什么都可以;
    2.我有两个类:窗体类sxbForm和链表类Tsxb,可以写在一个unit里吗?还是Tsxb写在另一个unit里更好?
    //写在一个unit里也没有什么问题,你的TsxbForm是一个继承下来的窗口呀,而Tsxb是一个不可视的,一个单元里面允许这样写的哟;
    3.3.为什么我给窗体取的Name是sxbForm而程序自动改成TsxbForm?//把什么改成TsxbForm?
      

  2.   

    type
    Tsxb = class
      private
        elem:array[1..maxlen] of elemtp;
        curlen:0..maxlen;
      public
        procedure init;//这里为什么不用create()函数来实现?构造对像时就初始化才是面向对象程序的思想呀;
        procedure prnt;
        function dele(loc:integer):elemtp;
        procedure inst(loc:integer;el:elemtp);
     end;
      

  3.   

    3.我在窗体的properties里,将Name定义为:sxbForm结果Delphi自动将其改成TsxbForm
    type
        TsxbForm = class(TForm)
        Label1: TLabel;
        Comb1: TComboBox;
        PaintBox1: TPaintBox;
        Sp1: TSpinEdit;
        Label2: TLabel;
        Label3: TLabel;
        ButQk: TButton;
        Cr: TButton;
        Sc: TButton;
        Tc: TButton;
        procedure ButQkClick(Sender: TObject);
        procedure CrClick(Sender: TObject);
        procedure ScClick(Sender: TObject);
        procedure TcClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    书上用的init函数,函数名无所谓吧!
    你运行我的程序有结果吗?
      

  4.   

    程序我搞定了,不过对Delphi语法还是不很清楚,多问一句:
    如果我将线性表类Tsxb写在另一个unit2里,那么在unit1要用到Tsxb类该加点什么?
    uses                   uses
    unit2  ???????  还是   Tsxb ??????
      

  5.   

    uses unit2;然后就可以用Tsxb这个类了,
      

  6.   

    1.unit 的名字取什么都可以还是要和Form的名字一样?
    随便起,但不要和已经声明的其他变量重名
    2.我有两个类:窗体类sxbForm和链表类Tsxb,可以写在一个unit里吗?还是Tsxb写在另一个unit里更好?
    写那里都行,没有好不好的,看习惯
    3.为什么我给窗体取的Name是sxbForm而程序自动改成TsxbForm?
    这个不大可能,你是不是看错了
    4.我的程序还有哪些问题,怎么改才能调通并显示结果?Tsxb = class
      private
        elem:array[1..maxlen] of elemtp;
        curlen:0..maxlen;//这里可以编译通过么?
      public
        procedure init;
        procedure prnt;
        function dele(loc:integer):elemtp;
        procedure inst(loc:integer;el:elemtp);
     end;
    从你下面的程序看这不不太像是链表阿,elem:array[1..maxlen] of elemtp这个就已经是个双链表了,数组名就是头指针
      

  7.   

    這裡有比較好東西可能對你有用。
    DELPHI入門方面的,你可以下載下來看看。
    http://www.pcdog.com/book/html/2004126/61220042816_1.htm