好,我想建个通讯录,不用数据库,有一个listbox,三个edit(name,address,telephone),还有添加,输入,修改,删除,保存这个按钮,当输入完,按添加,则将name加到listbox中,加入几个后,点保存,能存在listbox中,想查看时,单击listbox 则在edit中显示
name,address,telephone,请问大虾们怎么能实现?

解决方案 »

  1.   

    参考《Delphi 5 开发人员指南》中有关文件操作的那一章,上面的例子,你只要一比一的修改一下就能满足你的需求!!!
      

  2.   

    也可以啊,听说有个Tlist的类,好像是动态存储的,不知道行不
      

  3.   

    不用了,写好了unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;type
      TFormStatus = (fsNormal, fsAdd, fsEdit);  TMyAddrBookItem = record
        Name    :string;
        Address :string;
        TeleNum :string;
      end;
      PMyAddrBookItem = ^TMyAddrBookItem;  TForm1 = class(TForm)
        Panel1: TPanel;
        pnlListBox: TPanel;
        Label1: TLabel;
        Label2: TLabel;
        lbxNames: TListBox;
        pnlData: TPanel;
        pnlButtons: TPanel;
        Label3: TLabel;
        Label4: TLabel;
        Label5: TLabel;
        edtName: TEdit;
        edtTelephone: TEdit;
        btnAdd: TButton;
        btnSave: TButton;
        btnEdit: TButton;
        btnDelete: TButton;
        btnCancel: TButton;
        edtAddress: TEdit;
        procedure btnAddClick(Sender: TObject);
        procedure btnDeleteClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure lbxNamesClick(Sender: TObject);
        procedure btnEditClick(Sender: TObject);
        procedure btnSaveClick(Sender: TObject);
        procedure btnCancelClick(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
      private
        { Private declarations }
        FStatus :TFormStatus;
        FDataList :TList;    function HasRecord :Boolean;
        function IsModifyMode :Boolean;
        procedure SetBtnStatus;
        procedure SetCtrlStatus;    procedure ClearData;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.btnAddClick(Sender: TObject);
    begin
      FStatus := fsAdd;
      SetBtnStatus;
      ClearData;  edtName.SetFocus;
    end;procedure TForm1.btnDeleteClick(Sender: TObject);
    var
      index :Integer;
      rec :PMyAddrBookItem;
    begin
      index := lbxNames.ItemIndex;  rec := PMyAddrBookItem(FDataList.Items[index]);  FDataList.Delete(index);
      lbxNames.DeleteSelected;
      Dispose(rec);  if index = lbxNames.Count then
        lbxNames.ItemIndex := index - 1
      else
        lbxNames.ItemIndex := index;  if HasRecord then
        lbxNamesClick(nil)
      else
        ClearData;
      SetBtnStatus;
    end;procedure TForm1.ClearData;
    begin
      edtName.Text := '';
      edtTelephone.Text := '';
      edtAddress.Text := '';
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      FDataList := TList.Create;
    end;function TForm1.HasRecord: Boolean;
    begin
      Result := (lbxNames.ItemIndex >= 0);
    end;function TForm1.IsModifyMode: Boolean;
    begin
      Result := (FStatus <> fsNormal);
    end;procedure TForm1.lbxNamesClick(Sender: TObject);
    var
      rec :PMyAddrBookItem;
    begin
      if not HasRecord then
        Exit;  rec := PMyAddrBookItem(FDataList.Items[lbxNames.ItemIndex]);  edtName.Text := rec.Name;
      edtTelephone.Text := rec.TeleNum;
      edtAddress.Text := rec.Address;  SetBtnStatus;
    end;procedure TForm1.SetBtnStatus;
    begin
      btnEdit.Enabled := (not IsModifyMode) and HasRecord;
      btnAdd.Enabled := not IsModifyMode;
      btnSave.Enabled := IsModifyMode;
      btnCancel.Enabled := IsModifyMode;
      btnDelete.Enabled := (not IsModifyMode) and HasRecord;  SetCtrlStatus;
    end;procedure TForm1.SetCtrlStatus;
    var
      i :Integer;
    begin
      lbxNames.Enabled := not IsModifyMode;
      with pnlData do
      begin
        for i:=0 to ControlCount - 1 do
          Controls[i].Enabled := IsModifyMode;
      end;
    end;procedure TForm1.btnEditClick(Sender: TObject);
    begin
      FStatus := fsEdit;
      SetBtnStatus;
      edtName.SetFocus;
      edtName.SelectAll;
    end;procedure TForm1.btnSaveClick(Sender: TObject);
    var
      rec :PMyAddrBookItem;
    begin
      if FStatus = fsAdd then
      begin
        New(rec);
        rec.Name := edtName.Text;
        rec.Address := edtAddress.Text;
        rec.TeleNum := edtTelephone.Text;    FDataList.Add(rec);
        lbxNames.AddItem(rec.Name, nil);
        lbxNames.ItemIndex := lbxNames.Count - 1;
      end
      else
      begin
        rec := PMyAddrBookItem(FDataList.Items[lbxNames.ItemIndex]);
        rec.Name := edtName.Text;
        rec.Address := edtAddress.Text;
        rec.TeleNum := edtTelephone.Text;
      end;
      FStatus := fsNormal;
      SetBtnStatus;
    end;procedure TForm1.btnCancelClick(Sender: TObject);
    begin
      lbxNamesClick(nil);
      FStatus := fsNormal;
      SetBtnStatus;
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
      SetBtnStatus;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    var
      rec :PMyAddrBookItem;
    begin
      while FDataList.Count > 0 do
      begin
        rec := FDataList.Items[0];
        Dispose(rec);
        FDataList.Delete(0);
      end;  FDataList.Free;
    end;procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      if IsModifyMode then
      begin
        ShowMessage('您已经修改了记录,请保存或取消后再退出');
        CanClose := false;
        Exit;
      end;
      CanClose := true;
    end;end.