動態生成數組、元件的辦法 |
答題得分者是:jow
|
WoodTiger
初階會員 發表:35 回覆:90 積分:25 註冊:2003-08-01 發送簡訊給我 |
問題一:
讓用戶輸入數組的名稱、長度,自動一個數組,並可以隨時釋放該數組。
如,用戶輸入數組名爲 "AIntSample",長度爲10,則自動建立一個名爲AIntSample長度爲10的Integer型的數組,按“釋放”就可以刪除該數組。
問題二:
可以動態的在TForm上生成TEdit元件,元件的名稱是由用戶輸入的,並可以對它的值進行訪問,最後可以刪除。
請各位先進賜教,謝謝! ==================================
搞得懂就答人,搞不懂就問人,沒有人懂還可以問神!
------
-=-=-=-=-=-=-=-=-=-=-= Eveything as your wish. |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
問題一
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 發送簡訊給我 |
問題二
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |