我按照书上的例子编了一个简单的绘图程序,可是运行时提示出错:
Project Project1.exe rasied exception clss ElistError with message 'List index out of bound(0)!'Process stopped.Use Step or Run to continue.
再运行提示List index out of bounds(0) 后,可以执行。
这是什么原因呢?

解决方案 »

  1.   

    代码比较长,是这样的:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, ComCtrls, ToolWin, ImgList, Menus, ColorGrd, StdCtrls;type
      TForm1 = class(TForm)
        StatusBar1: TStatusBar;
        Panel1: TPanel;
        Panel2: TPanel;
        CoolBar1: TCoolBar;
        ToolBar1: TToolBar;
        ToolBar2: TToolBar;
        ToolBar3: TToolBar;
        ToolBar4: TToolBar;
        line: TToolButton;
        pencil: TToolButton;
        eraser: TToolButton;
        square: TToolButton;
        fsquare: TToolButton;
        rsquare: TToolButton;
        frsquare: TToolButton;
        circle: TToolButton;
        fcircle: TToolButton;
        ImageList1: TImageList;
        ColorGrid1: TColorGrid;
        PaintBox1: TPaintBox;
        PopupMenu1: TPopupMenu;
        N1: TMenuItem;
        SaveDialog1: TSaveDialog;
        procedure LineClick(Sender: TObject);
        procedure ColorGrid1Change(Sender: TObject);
        procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure FormCreate(Sender: TObject);
        procedure displayhint(sender:Tobject);
        procedure N1Click(Sender:Tobject);
      private
      IsDown:boolean;
      startP,endP:Tpoint;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure SetButtonValid;
    var
     i:integer;
    begin
      for i:=0 to form1.ComponentCount -1 do
      begin
        if form1.Components[i] is TToolbutton then
        (form1.Components [i] as TToolbutton).Down :=false;
      end;
    end;procedure TForm1.LineClick(Sender: TObject);
    begin
     if sender is Ttoolbutton then
       begin
          setbuttonvalid;  //引用自定义过程setbuttonvalid
          with sender as Ttoolbutton do        down:=true;
       end;
    end;
    procedure TForm1.ColorGrid1Change(Sender: TObject);
    begin
    paintbox1.Canvas .pen.Color :=colorgrid1.ForegroundColor ;
    end;
    procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
           IsDown:=true;          //将鼠标按下的标志设置为真,表示开始画
           if pencil.down then                    //如果用铅笔画
              paintbox1.Canvas .MoveTo(x,y);
           if line.Down then                      //如果画直线
           begin
             startp.x:=x;                    //设置开始和结束点坐标
             startp.y:=y;
             endp.x:=x;
             endp.y:=y;
           end;
           if square.down or rsquare.down or circle.down then //如果是绘制空心矩形
                                                      //或是空心圆角矩形,空心椭圆
           begin
              startp.x:=x;                    //设置开始和结束点坐标
              startp.y:=y;
              endp.x:=x;
              endp.y:=y;
           end;       if Fsquare.down or Frsquare.down or Fcircle.down then //如果是绘制
                               //实心矩形或是实心圆角矩形,实心椭圆
           begin
              paintbox1.Canvas .brush.Color :=colorgrid1.BackgroundColor ;
                                               //设置填充颜色          startp.x:=x;                    //设置开始和结束点坐标
              startp.y:=y;
              endp.x:=x;
              endp.y:=y;
           end;
    end;procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      IsDown:=false;
    end;
      

  2.   

    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
           if Isdown then                    //如鼠标被按下,则进行分析
           begin
                if pencil.down then          //如使用铅笔,直接连线到新的点
                   paintbox1.Canvas.LineTo(x,y) ;    
                if line.down then               //如是绘制直线
                begin
                 with paintbox1 do
                 begin                         //对Paintbox的canvas进行设置,包括
                   canvas.Pen.color:=clwhite;  //画笔颜色、起始坐标点位置
                   canvas.MoveTo (startp.x,startp.y);
                   canvas.LineTo (endp.X,endp.Y );
                   canvas.pen.Color :=colorgrid1.ForegroundColor;
                   canvas.MoveTo(startp.x,startP.y);
                   canvas.LineTo (x,y);
                   endp.x:=x;
                   endp.y:=y;
                 end;
               end;           if eraser.down then              //如用橡皮
               begin
                  with paintbox1.Canvas do
                  begin
                     brush.Color :=clwhite;   //设置橡皮擦除后面板的颜色及
                     FillRect(rect(x-10,y-10,x+15,y+15)); //擦除的图案区域
                  end;
               end;           if square.down then           //如选择绘制矩形
               begin
                  with paintbox1.Canvas  do
                  begin
                    brush.Color :=clwhite;
                    framerect(rect(startp.x,startp.Y,endp.X,endp.y));//设置画刷
                    endp.X:=x;                                    //颜色和绘制
                    endp.Y:=y;                                   //矩形框的区域
                    brush.Color:=colorgrid1.ForegroundColor;
                    framerect(rect(startp.x,startp.Y,endp.X,endp.y));
                  end;
                end;            if Fsquare.down then           //如选择绘制带有颜色填充矩形
                begin
                  with paintbox1.Canvas  do
                  begin
                    brush.Color :=clwhite;
                    fillrect(rect(startp.x,startp.Y,endp.X,endp.y));//设置绘制
                    endp.X:=x;                                    // 矩形框的区域
                    endp.Y:=y;                                   //和内部填充颜色
                    brush.Color:=colorgrid1.BackgroundColor;
                    fillrect(rect(startp.x,startp.Y,endp.X,endp.y));
                    brush.Color:=colorgrid1.ForegroundColor;
                    framerect(rect(startp.x,startp.Y,endp.X,endp.y));
                  end;
                end;
                if Rsquare.down then           //如选择绘制圆角矩形
                begin
                  with paintbox1.Canvas  do
                  begin
                    brush.Color :=clwhite;           //设置圆角矩形区域
                    pen.color:=clwhite;
                         roundrect(startp.x,startp.y,endp.x,endp.y,(startp.x-endp.x) div 2,(startp.y-endp.y) div 2);
                         endp.x:=x;
                           endp.y:=y;
                           pen.color:=colorgrid1.ForegroundColor; //设置画笔的颜色
                           roundrect(startp.x,startp.y,endp.x,endp.y,(startp.x-endp.x) div 2,(startp.y-endp.y) div 2) ;               end;
                end;            if FRsquare.down then           //如是用色彩填充圆角矩形
                begin
                  with paintbox1.Canvas  do
                  begin
                    brush.Color :=clwhite;
                    pen.color:=clwhite;
                         roundrect(startp.x,startp.y,endp.x,endp.y,(startp.x-endp.x) div 2,(startp.y-endp.y) div 2);
                    endp.x:=x;                             //设置圆角矩形的区域
                    endp.y:=y;                             // 和内部填充颜色
                    pen.color:=colorgrid1.ForegroundColor;
                    brush.Color:=colorgrid1.BackgroundColor;
                        roundrect(startp.x,startp.y,endp.x,endp.y,(startp.x-endp.x) div 2,(startp.y-endp.y) div 2);
                  end;
                end;            if circle.down then            //如选择绘制椭圆
                begin
                  with paintbox1.Canvas do
                  begin
                    pen.color:=clwhite;
                    arc(startp.x,startp.y,endp.x,endp.y,startp.x,startp.y,startp.x,startp.y);
                                             //设置画笔的颜色和绘制椭圆的区域
                    endp.x:=x;
                    endp.y:=y;
                    pen.color:=colorgrid1.ForegroundColor;
                    arc(startp.x,startp.y,endp.x,endp.y,startp.x,startp.y,startp.x,startp.y);
                  end;
                end;            if Fcircle.down then         //如选择绘制带有彩色填充的椭圆
                begin
                   with paintbox1.Canvas do
                   begin
                      brush.color:=clwhite;
                      pen.color:=clwhite;
                      ellipse(startp.x,startp.y,endp.x,endp.y);//设置画笔颜色、
                      endp.x:=x;                            //椭圆内部填充颜色、
                      endp.y:=y;                            //椭圆形的区域
                      pen.color:=colorgrid1.ForegroundColor;
                      brush.Color:=Colorgrid1.BackgroundColor;
                      ellipse(startp.x,startp.y,endp.x,endp.y);
                      arc(startp.x,startp.y,endp.x,endp.y,startp.x,startp.y,startp.x,startp.y);
                   end;
                end;
          end;end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
       application.onhint:=displayhint;
    end;procedure TForm1.displayhint(sender:Tobject);
    begin
       statusbar1.panels[0].text:=application.hint;
       statusbar1.refresh;
    end;procedure TForm1.N1Click(Sender:Tobject);
    var
        rect: Trect;
        filename: string;
    begin
       if savedialog1.Execute then
         rect.left :=0;
         rect.top:=0;
         rect.right:=paintbox1.width;
         rect.bottom:=paintbox1.height;
         with Tbitmap.create do
         begin
            try
             width:=rect.right;
              height:=rect.bottom;
              canvas.Copyrect(rect,paintbox1.canvas,rect) ;
              filename:=savedialog1.FileName;
              if extractfileext(filename)=''then
              Filename:=filename+'.bmp';
              saveTofile(filename);
            finally
            free;
            end;
          end;
    end;end.
      

  3.   

    运行后的程序基本可以执行,只是好像有一点bug.凡是鼠标按下后移动的位置,就会被清除
      

  4.   

    这个很正常,paintbox不会保存你画的东东,一旦form有刷新,就没了。你可以改用timage控件来实现