自訂元件的屬性使用陣列問題 |
尚未結案
|
chinliang
一般會員 發表:16 回覆:26 積分:13 註冊:2002-06-17 發送簡訊給我 |
小弟想寫一個自訂元件(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 發送簡訊給我 |
你好:
屬性不能使用陣列當參數,所以你該將陣列宣告成一個類別屬性。
請將你的程式碼修改如下即可。 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 發送簡訊給我 |
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 發送簡訊給我 |
你好:
補充使用 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |