全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1564
推到 Plurk!
推到 Facebook!

自訂元件的屬性使用陣列問題

尚未結案
chinliang
一般會員


發表:16
回覆:26
積分:13
註冊:2002-06-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-06 18:41:25 IP:61.218.xxx.xxx 未訂閱
小弟想寫一個自訂元件(TArkImage),繼承TImage,然後定義一個record(TArkField),再將array of record(TArkField)放入自訂元件(TArkImage)的ArkField屬性內,寫法如下,不過在property ArkField: array of TArkField read fArkField write SetArkField;,會有錯誤,我用Google搜尋找到了一篇相關的內容(http://www.elists.org/pipermail/delphi-talk/2000-April/003905.html),不過仍是無法理解,請教各位先進該如何完成上述的功能,謝謝。 程式碼如下:
unit ArkImage;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;    type
  TArkField = record
    TAFName: string;
    TAFCaption: string;
    TAFType: string;
    TAFValue: string;
  end;    type
  TArkImage = class(TImage)
  private
    { Private declarations }
    fArkField: TArkField;
    procedure SetArkField(Value: tTTArkField);
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published declarations }
    property ArkField: array of TArkField read fArkField write SetArkField;
  end;    procedure Register;    implementation    procedure Register;
begin
  RegisterComponents('Standard', [TArkImage]);
end;    constructor TArkImage.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;    destructor TArkImage.Destroy;
begin
  inherited Destroy;
end;    procedure TArkImage.SetArkField(Value : array of TArkField);
begin
  if fArkField <> Value then
    fArkField := Value;
end;
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-06 20:08:25 IP:61.56.xxx.xxx 未訂閱
你好: 屬性不能使用陣列當參數,所以你該將陣列宣告成一個類別屬性。 請將你的程式碼修改如下即可。    type   TArkField = record     TAFName: string;     TAFCaption: string;     TAFType: string;     TAFValue: string;   end;      TTArkField = TArkField; TArkImage = class(TImage) private { Private declarations } fArkField: TArkField; procedure SetArkField(Value: TTArkField); protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published declarations } property ArkField: TTArkField read fArkField write SetArkField; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; implementation { TArkImage } constructor TArkImage.Create(AOwner: TComponent); begin inherited; end; destructor TArkImage.Destroy; begin inherited; end; procedure TArkImage.SetArkField(Value: TArkField); begin fArkField := Value; end;
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-07 09:02:39 IP:210.61.xxx.xxx 未訂閱
chinliang兄您的SetArkField宣告和實作的不一致哦 ha0009兄所言"屬性不能使用陣列當參數,所以你該將陣列宣告成一個類別屬性。" 大概的程式碼, 提供您參考
TArrayArkField=array of TArkField;
......
private
  fArkField:TArrayArkField;
  procedure SetArkField(Value: TArrayArkField);
published
  property ArkField:TArrayArkField read fArkField write SetArkField;
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-07 09:34:22 IP:61.30.xxx.xxx 未訂閱
你好: 補充使用 TList 搭配指標的用法 < class="code"> TArkField = record TAFName: string; TAFCaption: string; TAFType: string; TAFValue: string; end; PArkField = ^TArkField; type TArkImage = class(TImage) private { Private declarations } FList : TList; function GetArkField (Index : integer) : TArkField; procedure SetArkField (Index : integer; Value : TArkField); procedure Clear; protected public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure ClearArkField; function AddArkField (Value : TArkField) : integer; procedure DeleteArkField (index : integer); function Count : integer; property ArkField [index : integer] : TArkField read GetArkField write SetArkField; published { Published declarations } end; implementation function TArkImage.AddArkField(Value: TArkField): integer; var Ptr : PArkField; begin New (Ptr); result := FList.Add(Ptr); end; procedure TArkImage.Clear; begin end; procedure TArkImage.ClearArkField; var idx : integer; Ptr : PArkField; begin for idx := 0 to FList.Count - 1 do begin Ptr := FList.Items [idx]; Dispose (Ptr); end; FList.Clear; end; constructor TArkImage.Create(AOwner: TComponent); begin inherited Create(AOwner); FList := TList.Create; end; destructor TArkImage.Destroy; begin ClearArkField; FreeAndNil (FList); inherited Destroy; end; function TArkImage.GetArkField(Index: integer): TArkField; begin if Index > FList.Count then raise Exception.Create('指定編號超出陣列範圍。') else result := PArkField (FList [Index])^; end; procedure TArkImage.DeleteArkField(index: integer); var Ptr : PArkField; begin if Index > FList.Count then raise Exception.Create('指定編號超出陣列範圍。') else begin Ptr := FList [Index]; Dispose (Ptr); FList.Delete(index); end; end; procedure TArkImage.SetArkField(Index: integer; Value: TArkField); begin if Index > FList.Count then raise Exception.Create('指定編號超出陣列範圍。') else begin PArkField (FList [Index])^ := Value; end; end; function TArkImage.Count: integer; begin result := FList.Count; end;
chinliang
一般會員


發表:16
回覆:26
積分:13
註冊:2002-06-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-08 09:22:31 IP:61.218.xxx.xxx 未訂閱
感謝ha0009及pedro兄賜教,昨天已照ha0009版主的方法完成,已達到當初的要求,再次感謝ha0009版主的程式範例,謝謝!
系統時間:2024-05-18 12:14:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!