小弟刚从VB转DELPHI,在编写时出现问题,把代码贴出来,大家帮看看:
unit main;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ComCtrls,StdCtrls, XPMan, Math;const
  APPTITLE = 'MyToolsBar' ;type
  TTool = record
    title   : string[100] ;
    apppath : string[255] ;
    para    : string[100] ;
    setpath : string[255] ;
    runpass : string[50]  ;
    autorun : boolean     ;
  end ;  TTools = record
    tools : array of TTool;
    toolscount : integer;
  end;  TToolType = (ttLeft=1,ttRight=2);
  TMyTools = array[ttLeft..ttRight ] of TTools;
  
  TfrmMain = class(TForm)
    PopupMenu1: TPopupMenu;
    mnew: TMenuItem;
    medit: TMenuItem;
    mremove: TMenuItem;
    lv1: TListView;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    Button1: TButton;
    XPManifest1: TXPManifest;
    N1: TMenuItem;
    mup: TMenuItem;
    mdown: TMenuItem;
    N2: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure mnewClick(Sender: TObject);
    procedure shownewform(const toolsindex: integer = 0);
    procedure lv1SelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);  private    { Private declarations }
  public
    { Public declarations }  end;var
  frmMain: TfrmMain;
  mytools : TMyTools;
  seltools: TToolType ;implementationuses edit;{$R *.dfm}
procedure TfrmMain.FormCreate(Sender: TObject);
  begin
  seltools:=ttLeft;
  mytools[ttLeft].toolscount:=0;
  mytools[ttright].toolscount:=0;
  setlength(mytools[ttleft].tools,0);
  setlength(mytools[ttright].tools,0);
end;procedure TfrmMain.Button1Click(Sender: TObject);
var mp,np:tpoint;
begin
    np.x:=button1.Left ;
    np.Y:=button1.Top + button1.Height  ;
    mp:= ClientToScreen(np);    popupmenu1.Popup(mp.X,mp.Y);
end;procedure TfrmMain.mnewClick(Sender: TObject);
  begin
      shownewform(0) ;
  end;procedure TfrmMain.shownewform(const toolsindex: integer = 0);
  var
    editform: tfrmedit;
    index: integer;
    item: tlistitem;
    str: string[1];
  begin
      try
        editform:=tfrmedit.Create(self);
        editform.apptitle:= apptitle;
        editform.saved:= false;
        editform.Position:= poMainFormCenter;
        if toolsindex = 0 then
          begin
            editform.Caption:='New tools';
            editform.Edit1.Text:='';
            editform.Edit2.Text:='';
            editform.Edit3.Text:='';
            editform.Edit4.Text:='';
            editform.CheckBox1.Checked:=false;
          end
        else
          begin
            editform.Caption:= mytools[seltools].tools[toolsindex].title ;
//一到此处,就出现问题。很奇怪,如果是'aa'就不错,如果是'afasdfasdf'就出错。郁!
            editform.Edit1.Text:=mytools[seltools].tools[toolsindex].apppath  ;
            editform.Edit2.Text:=mytools[seltools].tools[toolsindex].para  ;
            editform.Edit3.Text:=mytools[seltools].tools[toolsindex].setpath  ;
            editform.Edit4.Text:=mytools[seltools].tools[toolsindex].runpass  ;
            editform.CheckBox1.Checked:=mytools[seltools].tools[toolsindex].autorun ;
          end;
        editform.ShowModal ;        if editform.saved then
          begin
            if toolsindex = 0 then  //当为新增时
              begin
                mytools[seltools].toolscount:= mytools[seltools].toolscount+1;
                setlength(mytools[seltools].tools ,mytools[seltools].toolscount);
                index:= mytools[seltools].toolscount ;
              end
            else
              index:= toolsindex;            mytools[seltools].tools[index].title:= editform.Edit1.Text;
            mytools[seltools].tools[index].apppath:= editform.Edit2.Text;
            mytools[seltools].tools[index].para:= editform.Edit3.Text;
            mytools[seltools].tools[index].setpath:= editform.Edit4.Text;
            mytools[seltools].tools[index].runpass:= editform.Edit5.Text;
            mytools[seltools].tools[index].autorun:= editform.CheckBox1.Checked ;            item:=lv1.Items.Add;
            item.Caption:=mytools[seltools].tools[index].title;            if mytools[seltools].tools[index].autorun then
              str:='y'
            else
              str:='';
            item.SubItems.Add(str) ;            if length(mytools[seltools].tools[index].runpass)>0 then
              str:='y'
            else
              str:='';
            item.SubItems.Add(str)   ;          end;  // end editform.saved
      finally
        editform.Free ;
        item:=nil;
        item.Free;
      end;  end;procedure TfrmMain.lv1SelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
var
  selitem: integer;
begin  selitem:= lv1.ItemIndex+1;  if selitem >0 then
    shownewform(selitem);
end;
end.

解决方案 »

  1.   

    if toolsindex = 0 then  //当为新增时
                  begin
                    mytools[seltools].toolscount:= mytools[seltools].toolscount+1;
                    setlength(mytools[seltools].tools ,mytools[seltools].toolscount);
                    index:= mytools[seltools].toolscount ; <<<<<<<<<<<<<
                  end
                else
                  index:= toolsindex;
    index:= mytools[seltools].toolscount;
    ----->>>>>>>>
    index := mytools[seltools].toolscount - 1;
      

  2.   

    还是不行呀,
    index 我的原意是刚才加完后的内容,我一对 mytools[seltools].tools[n].title 赋值就出错。
      

  3.   

    我重新发一下代码,刚才改动一下。
    unit main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus, ComCtrls,StdCtrls, XPMan, Math;const
      APPTITLE = 'MyToolsBar' ;type
      TTool = record
        title   : string[100] ;
        apppath : string[255] ;
        para    : string[100] ;
        setpath : string[255] ;
        runpass : string[50]  ;
        autorun : boolean     ;
      end ;  TTools = record
        tools : array of TTool;
        toolscount : integer;
      end;  TToolType = (ttLeft=1,ttRight=2);
      TMyTools = array[ttLeft..ttRight ] of TTools;  TfrmMain = class(TForm)
        PopupMenu1: TPopupMenu;
        mnew: TMenuItem;
        medit: TMenuItem;
        mremove: TMenuItem;
        lv1: TListView;
        RadioButton1: TRadioButton;
        RadioButton2: TRadioButton;
        Button1: TButton;
        XPManifest1: TXPManifest;
        N1: TMenuItem;
        mup: TMenuItem;
        mdown: TMenuItem;
        N2: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure mnewClick(Sender: TObject);
        procedure shownewform(const toolsindex: integer = 0);
        procedure refreshlv();
        procedure RadioButton1Click(Sender: TObject);
        procedure meditClick(Sender: TObject);  private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frmMain: TfrmMain;
      mytools : TMyTools;
      seltools: TToolType ;implementationuses edit;{$R *.dfm}procedure TfrmMain.FormCreate(Sender: TObject);
      begin
      seltools:=ttLeft;
      mytools[ttLeft].toolscount:=0;
      mytools[ttright].toolscount:=0;
      setlength(mytools[ttleft].tools,0);
      setlength(mytools[ttright].tools,0);
    end;procedure TfrmMain.Button1Click(Sender: TObject);
    var mp,np:tpoint;
    begin
        np.x:=button1.Left ;
        np.Y:=button1.Top + button1.Height  ;
        mp:= ClientToScreen(np);    popupmenu1.Popup(mp.X,mp.Y);
    end;procedure TfrmMain.mnewClick(Sender: TObject);
      begin
          shownewform(0) ;
      end;procedure TfrmMain.shownewform(const toolsindex: integer = 0);
      var
        editform: tfrmedit;
        index: integer;
        item: tlistitem;
        str: string[1];
        aa: TTools;
        ss: string;
      begin
          try
            editform:=tfrmedit.Create(self);
            editform.apptitle:= apptitle;
            editform.saved:= false;
            editform.Position:= poMainFormCenter;
            if toolsindex = 0 then
              begin
                editform.Caption:='New tools';
                editform.Edit1.Text:='';
                editform.Edit2.Text:='';
                editform.Edit3.Text:='';
                editform.Edit4.Text:='';
                editform.CheckBox1.Checked:=false;
              end
            else
              begin
                //在这出现问题,经常报错,是否动态数组我使用的不对。而且当不错时,我用 meditClick 时,显示的并不是我保存的内容,而是一些乱码和内存中其他的字符。!
                editform.Caption:= mytools[seltools].tools[toolsindex].title ;
                editform.Edit1.Text:=mytools[seltools].tools[toolsindex].apppath  ;
                editform.Edit2.Text:=mytools[seltools].tools[toolsindex].para  ;
                editform.Edit3.Text:=mytools[seltools].tools[toolsindex].setpath  ;
                editform.Edit4.Text:=mytools[seltools].tools[toolsindex].runpass  ;
                editform.CheckBox1.Checked:=mytools[seltools].tools[toolsindex].autorun ;
              end;
            editform.ShowModal ;        if editform.saved then
              begin
                if toolsindex = 0 then  //当为新增时
                  begin
                    mytools[seltools].toolscount:= mytools[seltools].toolscount+1;
                    setlength(mytools[seltools].tools ,mytools[seltools].toolscount);
                    index:= mytools[seltools].toolscount -1 ;
                  end
                else
                  index:= toolsindex;            mytools[seltools].tools[index].title:= editform.Edit1.Text;
                mytools[seltools].tools[index].apppath:= editform.Edit2.Text;
                mytools[seltools].tools[index].para:= editform.Edit3.Text;
                mytools[seltools].tools[index].setpath:= editform.Edit4.Text;
                mytools[seltools].tools[index].runpass:= editform.Edit5.Text;
                mytools[seltools].tools[index].autorun:= editform.CheckBox1.Checked ;
                if toolsindex = 0 then
                  item:=lv1.Items.Add
                else
                  item:=lv1.Items[toolsindex-1];            item.Caption:=mytools[seltools].tools[index].title;            if mytools[seltools].tools[index].autorun then
                  str:='y'
                else
                  str:='';
                item.SubItems.Add(str) ;            if length(mytools[seltools].tools[index].runpass)>0 then
                  str:='y'
                else
                  str:='';
                item.SubItems.Add(str)   ;          end;  // end editform.saved
          finally
            editform.Free ;
            item:=nil;
            item.Free;
          end;  end;procedure TfrmMain.refreshlv();var
      index: integer;
      item: tlistitem;
      str: string[1];
    begin
      lv1.Clear;
      for index:=1 to mytools[seltools].toolscount  do  begin    item:=lv1.Items.Add;
        item.Caption:=mytools[seltools].tools[index].title;    if mytools[seltools].tools[index].autorun then
          str:='y'
        else
          str:='';
        item.SubItems.Add(str) ;    if length(mytools[seltools].tools[index].runpass)>0 then
          str:='y'
        else
          str:='';
        item.SubItems.Add(str)   ;  end;
        ;
    ;
    end;procedure TfrmMain.RadioButton1Click(Sender: TObject);
    begin
      if tradiobutton(sender).Name ='RadioButton1' then
        seltools:=ttleft
      else
        seltools:=ttright;
      refreshlv;
    end;procedure TfrmMain.meditClick(Sender: TObject);
    var
      index: integer;
    begin
      index:= lv1.ItemIndex+1;
      if index >0 then
        shownewform(index);
    end;end.
      

  4.   

    你把dfm也贴出来
    还有edit的pas和dfm
    我这里好搭建你的环境调试
    还有调试步骤说清楚。
      

  5.   

    不能这样重复地调用Setlength来设置同一个动态数组, 因为每次调用并不会保留原来已有的数据的(或者说每次动态分配的首地址并不保证是同一个值)。
      

  6.   

    zswang  
    我的信箱是 [email protected] ,请发信给我,我回复时附带程序的整个工程压缩文件。
      

  7.   

    //问题找到,动态数组的参数是从0开始的,不是一
    //toolsindex 0表示新建,那么toolsindex+1调用后就要还原为toolsindex-1
    //你的代码风格需要改进啊,太乱
    //如果有时间我给你写个样本。          begin
                editform.Caption:= mytools[seltools].tools[toolsindex-1].title ;   //<<<<<<<
                editform.Edit1.Text:=mytools[seltools].tools[toolsindex-1].apppath  ; //<<<<<<<
                editform.Edit2.Text:=mytools[seltools].tools[toolsindex-1].para  ; //<<<<<<<
                editform.Edit3.Text:=mytools[seltools].tools[toolsindex-1].setpath  ; //<<<<<<<
                editform.Edit4.Text:=mytools[seltools].tools[toolsindex-1].runpass  ; //<<<<<<<
                editform.CheckBox1.Checked:=mytools[seltools].tools[toolsindex-1].autorun ; //<<<<<<<
              end;
            editform.ShowModal ;        if editform.saved then
              begin
                if toolsindex = 0 then  //当为新增时
                  begin
                    mytools[seltools].toolscount:= mytools[seltools].toolscount+1;
                    setlength(mytools[seltools].tools ,mytools[seltools].toolscount);
                    index:= mytools[seltools].toolscount - 1;    //<<<<<<<<<<<
                  end
                else
      

  8.   

    谢谢zswang了,我要下班了,回家我再看看去 。
    对了,因为我是从VB转过来了,所以我是按VB的代码风格来处理,我还特意按我的风格改进了代码的风格,能否指教一下DELPHI的代码风格是什么样的?能给个示例不?再次谢谢了!
      

  9.   

    CSDN - 技术社区 - .... 回复 | 收藏此页 | 专题 | 公告 | [[[[管理]]]] | 保存 | 关闭窗口   
     点上门的管理后按提示操作即可