線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1814
推到 Plurk!
推到 Facebook!

動態生成數組、元件的辦法

答題得分者是:jow
WoodTiger
初階會員


發表:35
回覆:90
積分:25
註冊:2003-08-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-12-05 16:31:36 IP:60.191.xxx.xxx 未訂閱
問題一: 讓用戶輸入數組的名稱、長度,自動一個數組,並可以隨時釋放該數組。 如,用戶輸入數組名爲 "AIntSample",長度爲10,則自動建立一個名爲AIntSample長度爲10的Integer型的數組,按“釋放”就可以刪除該數組。 問題二: 可以動態的在TForm上生成TEdit元件,元件的名稱是由用戶輸入的,並可以對它的值進行訪問,最後可以刪除。 請各位先進賜教,謝謝! ================================== 搞得懂就答人,搞不懂就問人,沒有人懂還可以問神!
------
-=-=-=-=-=-=-=-=-=-=-=
Eveything as your wish.
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-12-05 18:14:18 IP:220.130.xxx.xxx 未訂閱
問題一
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;    type
  TNamedIntArrayObj = class(TPersistent)
  private
    function GetValue(Index: Integer): Integer;
    function GetCount: Integer;
    procedure SetValue(Index: Integer; const Value: Integer);
  protected
    FName: string;
    FValue: array of Integer;
  public
    constructor Create(AName: string; ACount: Integer);
    destructor Destroy; override;
    property Key: string read FName;
    property Name: string read FName;
    property Count: Integer read GetCount;
    property Value[Index: Integer]: Integer read GetValue write SetValue;
  end;      TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    ListBox2: TListBox;
    Label2: TLabel;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure ListBox1DblClick(Sender: TObject);
  private
    ObjList: TStringList;
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    { TNamedIntArrayObj }    constructor TNamedIntArrayObj.Create(AName: string; ACount: Integer);
begin
  inherited Create;
  FName := AName;
  SetLength(FValue, ACount);
end;    destructor TNamedIntArrayObj.Destroy;
begin
  SetLength(FValue, 0);
  inherited;
end;    function TNamedIntArrayObj.GetCount: Integer;
begin
  Result := Length(FValue);
end;    function TNamedIntArrayObj.GetValue(Index: Integer): Integer;
begin
  if (Index > -1) and (Index < Count) then Result := FValue[INdex] else Result := 0;
end;    procedure TNamedIntArrayObj.SetValue(Index: Integer; const Value: Integer);
begin
  if (Index > -1) and (Index < Count) then FValue[Index] := Value;
end;    { TForm1 }    procedure TForm1.FormCreate(Sender: TObject);
begin
  ObjList := TStringList.Create;
  ObjList.Duplicates := dupIgnore;
  ObjList.Sorted := True;
end;    procedure TForm1.FormDestroy(Sender: TObject);
begin
  while ObjList.Count > 0 do
    if Assigned(ObjList.Objects[0]) then
    begin
      ObjList.Objects[0].Free;
      ObjList.Delete(0);
    end;
  FreeAndNil(ObjList);
end;    procedure TForm1.Button1Click(Sender: TObject);
var
  Key: string;
  I, J, Index: Integer;
  Obj: TNamedIntArrayObj;
begin//產生最多 100 個 TNamedIntArrayObj
  for I := 0 to 99 do
  begin
    Key := Format('%4.4d', [Random(100)]);
    if not ObjList.Find(Key, Index) then
    begin//產生新數組物件
      Obj := TNamedIntArrayObj.Create(Key, Random(100)   1);
      Index := ObjList.AddObject(Key, Obj);
    end;
   Obj := TNamedIntArrayObj(ObjList.Objects[Index]);
    //更新數組物件: Obj.Value[]填入亂數
   for J := 0 to Obj.Count-1 do
     Obj.Value[J] := Random(MaxInt);
  end;
  //將物件名稱對應 置入ListBox1;
  ListBox1.Items.Text := ObjList.Text;
  Label1.Caption := IntToStr(ListBox1.Count);
  if ListBox1.Count > 0 then
    ListBox1.ItemIndex := 0
  else ListBox1.ItemIndex := -1;
  ListBox1Click(nil);
end;    procedure TForm1.ListBox1Click(Sender: TObject);
var
  I, Index: Integer;
  Obj: TNamedIntArrayObj;
  LLL: TStringList;
begin
  Index := ListBox1.ItemIndex;
  LLL := TStringList.Create;
  try
    if (Index > -1) and (Index < ObjList.Count) then
    begin
      Obj := TNamedIntArrayObj(ObjList.Objects[Index]);
      for I := 0 to Obj.Count-1 do
      LLL.Add(Format('%4.4d - .10d', [I, Obj.Value[I]]));
    end;
    ListBox2.Items.Text := LLL.Text;
  finally
    FreeAndNil(LLL);
  end;
  Label2.Caption := IntToStr(ListBox2.Count);
end;    procedure TForm1.ListBox1DblClick(Sender: TObject);
var
  Index: Integer;
begin
  if MessageDlg('Delete it?', mtConfirmation, [mbYes, mbNo],0) = mrYes then
  begin
    Index := ListBox1.ItemIndex;
    if (Index > -1) and (Index < ObjList.Count) then
    begin
      ObjList.Objects[Index].Free;
      ObjList.Delete(Index);
      ListBox1.Items.Text := ObjList.Text;
      Label1.Caption := IntToStr(ListBox1.Count);
      ListBox1.ItemIndex := Index;
      ListBox1Click(nil);
    end;
  end;
end;    
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-12-05 18:33:10 IP:220.130.xxx.xxx 未訂閱
問題二
procedure TForm1.Button2Click(Sender: TObject);
var
  AName: string;
  I: Integer;
begin
 for I := 0 to 99 do
  begin
    AName := 'Edit' Format('%4.4d', [Random(100)]);
    if not Assigned(FindComponent(AName)) then
    begin
      with TEdit.Create(Self) do
      begin
              Name := AName;
         //Set Left, Top, Height, Width
         //Set Parent for display
         Width := 50;
         Height := 15;
         Left := (I div 20) * Width;
         Top := (I mod 20) * Height;
         Text := AName;
         Parent := Panel1;
      end;
    end;
  end;
end;    procedure TForm1.Button3Click(Sender: TObject);
var
  AName: string;
  I: Integer;
  AEdit: TEdit;
begin
  AName := 'Edit' Format('%4.4d', [Random(100)]);
  AEdit := TEdit(FindComponent(AName));
  if Assigned(AEdit) then
  begin
    ShowMessage(AEdit.Text);
    AEdit.Free;
  end;
end;    
WoodTiger
初階會員


發表:35
回覆:90
積分:25
註冊:2003-08-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-12-07 14:11:41 IP:60.191.xxx.xxx 未訂閱
jow 真是太感謝你了,謝謝!我好好學習一下。 ================================== 搞得懂就答人,搞不懂就問人,沒有人懂還可以問神!
------
-=-=-=-=-=-=-=-=-=-=-=
Eveything as your wish.
系統時間:2024-05-02 5:54:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!