一個在類中實現指針管理的問題。(抱歉﹐我不知道到底應該怎么說)(100分)

  • 主题发起人 主题发起人 dadabox
  • 开始时间 开始时间
D

dadabox

Unregistered / Unconfirmed
GUEST, unregistred user!
各路大俠﹐小弟遇到一個問題。客戶來的訂單一次有多筆﹐而一筆訂單中的SIZE也有多筆
不同。于是小弟想到寫一個類﹐但考慮到訂單與SIZE都有一樣的Add和Delete動作﹐所以
就想寫一個基類﹐在基類中再寫兩個子類作為客戶和SIZE。但基類中增加的那個類型要寫定﹐
而我有兩個類型﹐并且要分開。于是我想到用指針來處理。不知這樣做對不對﹐會不會有什
么后遺症﹖不然﹐我還是老老實實分開寫。我照下面的例子已經實現這個功能﹐但總覺得
在程序中調用時要很小心﹐不然就會出問題。另外﹐在訂單類中我放了一個SIZE類﹐而SIZE
每筆訂單也有不同的數據﹐但我在程序中訪問SIZE時便出錯了。我想是因為我沒有在訂單
類中建立SIZE的緣故﹐但我是用的指針來管理﹐就不知道應該怎樣建這個SIZE類﹖哪位大俠
幫我看看下面的代碼﹐找出其中的問題﹐好嗎﹖謝謝﹗

type TSize=record
; Size:string[8];
; Qry:string[9];
end;

PSize=^TSize;

ObjList=Pointer;

TBaseList=class
; private
; ; DataList:TList;
; ; function GetCount: integer;
; ; function GetItems(ItemIndex: integer): ObjList;
; ; procedure SetItems(ItemIndex: integer; const Value: ObjList);
; public
; ; property Items[ItemIndex:integer]:ObjList read GetItems write SetItems;
; ; property Count:integer read GetCount;

; ; constructor Create;
; ; destructor Destroy; override;
; ; procedure Add(Value:ObjList);virtual;
; ; procedure Delete(ItemIndex:integer);virtual;
; ; procedure Clear;
end;

Type TSizeList=class(TBaseList)
; private
; ; ObjList:PSize;
; public
; ; destructor Destroy; override;
; ; procedure Add(Value:ObjList);override;
; ; procedure Delete(ItemIndex:integer);override;
end;

type
; TCustomerOrder=record
; ; ;Customer_No:string[6];
; ; ;Customer_Order_No:string[16];
; ; ;Customer_Request_Date:string[8];
; ; ;Article_No:string[8];
; ; ;Country:string[3];
; ; ;Status_Date:string[8];

; ; ;Size:TSizeList; ;//這兒我加上了前面的TSizeList類
end;

PCustomerOrder=^TCustomerOrder;

Type TOrdDataBase=class(TBaseList)
; private
; ; ObjList:PCustomerOrder;
; public
; ; destructor Destroy; override;
; ; procedure Add(Value:ObjList);override;
; ; procedure Delete(ItemIndex:integer);override;
end;

implementation

{ TBaseList }

procedure TBaseList.Add(Value: ObjList);
begin
; DataList.Add(Value);
end;

procedure TBaseList.Clear;
var
; i:integer;
begin
; for i := Count - 1 downto 0 do
; begin
; ; ;Delete(i);
; end;
end;

constructor TBaseList.Create;
begin
; DataList:=TList.Create;
end;

procedure TBaseList.Delete(ItemIndex: integer);
begin
; DataList.Delete(ItemIndex);
end;

destructor TBaseList.Destroy;
begin
; Clear;
; DataList.Free;
; inherited;
end;

function TBaseList.GetCount: integer;
begin
; Result := DataList.Count;
end;

function TBaseList.GetItems(ItemIndex: integer): ObjList;
begin
; Result:=DataList.Items[ItemIndex];
end;

procedure TBaseList.SetItems(ItemIndex: integer; const Value: ObjList);
var TheList:ObjList;
begin
; TheList:=DataList.Items[ItemIndex];
end;

{ TSizeList }

procedure TSizeList.Add(Value: ObjList);
begin
; inherited;

end;

procedure TSizeList.Delete(ItemIndex: integer);
begin
; inherited;

end;

destructor TSizeList.Destroy;
begin

; inherited;
end;

{ TCustomerOrder }

procedure TCustomerOrder.Add(Value: ObjList);
begin
; inherited;

end;

procedure TCustomerOrder.Delete(ItemIndex: integer);
begin
; inherited;

end;

destructor TCustomerOrder.Destroy;
begin

; inherited;
end;
 
没有仔细看你程序(喝多了,[:)]), 我觉得你的Add方法只插入一个指针, 但如果指针
指向的内容被释放就会出现问题, 你为什么不改为Add(aValue : TSize)呢?
 
我就得这样做可以,只是使用指针的时候要小心一些,在你使用size指针之前,
应该保证指针可用 是不是可以这样 if assigned(size) then ....
仅供参考。
 
但是這樣子會不會有什么隱患呢﹖我覺得指針不好控制﹐萬一弄得不好﹐以后會不會出問題﹖
 
use dispose(mypointer) to free your pointer
 
先看看。不过,好象分开写比较好。
 
我是問各位大俠﹐這樣做有沒有什么隱患﹐不是可不可行﹐我已經可行了﹐只是調用有些不
便。
 
你可以在Delphi的TList或TObjectList基础上派生嘛,基本工作Delphi都给你做好了。
 
多人接受答案了。
 
后退
顶部