2010-04-09 25 views
1

對不起,我是OOP的新手,所以我不知道我需要做什麼。如何製作這個面向對象?

我,說,繼承一個Object.They 10個不同的對象有不同的量和類成員的類型,但他們都有一個共同的特性 - 可見。

type TSObject=class(TObject); 
    protected 
    Visible:boolean; 
    end; 

type 
    TObj1=class(TSObject) 
    private 
    a:integer; 
    ...(More members) 
end; 
    TObj2=class(TSObject) 
    private 
    b:String; 
    ...(More members) 
end; 

...(Other 8 objects) 

對於他們每個人我有一個變量。

var Obj1:TObj1; 
    Obj2:TObj2; 
    Obj3:TObj3; 
    ....(Other 7 objects) 

規則1:只有一個對象可以一次(其他人將被釋放)來初始化可見。

對於這個規則我有一個全局變量

var CurrentVisibleObj:TSObject; //Because they all inherit TSObject 

最後有改變的知名度的過程。

procedure ChangeObjVisibility(newObj:TSObject); 
begin 
    CurrentVisibleObj.Free; //Free the old object 
    CurrentVisibleObj:=newObj; //assign the new object 
    CurrentVisibleObj:= ??? //Create new object 
    CurrentVisibleObj.Visible:=true; //Set visibility to new object 
end; 

有我的問題,我不知道如何對其進行初始化,因爲派生類是未知的(TObj1,TOBJ2,Tobj3 ......哪一個?)。

我該怎麼做?

我簡化說明,在該項目有TFrames各自具有不同的控制和我必須設置可見/不相同的方式可見(通過只留下一個初始化幀)。

對不起再次爲冠軍,我非常 OOP的。

回答

1

其中之一這裏第一個問題是,你似乎認爲你可以將一個未初始化的變量傳遞給ChangeObjVisibility。

ChangeObjVisibility(Obj3); 

這裏,如果OBJ 3爲零(或更糟的是,一個懸擺指針),ChangeObjVisibility沒有辦法知道什麼是需要創建的對象的類型。

您可以獲得要創建的框架類的方法之一是使用const的數組或帶有大小寫的函數。

type 
    TSObjectClass = class of TSObject; 
const 
    ObjectClasses = array[0..X] of TSObjectClass = (TObj1, TObj2, TObj3, ...) 

function GetFrameclass(Index : Integer) : TSObjectClass; 
begin 
    Result := ObjectClasses[Index] 

    OR 

    case Index of 
    0 : Result := TObj1; 
    1 : Result := TObj2; 
    (...) 
    end; 
end; 

如果幀不需要任何特殊的初始化,這將工作。

接下來,你可以有這樣一個電話:

procedure ChangeCurrentFrame(NewFrameIndex : Integer); 
var FrameClass : TSObjectclass; 
    vFrame : TSObject; 
begin 
    FrameClass := GetFrameClass(NewFrameIndex); 
    if CurrentVisibleObj.ClassType <> FrameClass then 
    begin 
    vFrame := FrameClass.Create(nil); 
    SetCurrentFrame(vFrame); 
    end; 
end; 

procedure SetCurrentFrame(newObj:TSObject); 
begin 
    if Assigned(CurrentVisibleObj) then 
    CurrentVisibleObj.Free; //Free the old object 
    CurrentVisibleObj:=newObj; //assign the new object 
    if Assigned(CurrentVisibleObj) then 
    CurrentVisibleObj.Visible:=true; //Set visibility to new object 
end; 

在這裏,SetCurrentFrame代替你ChangeObjVisibility(你真正在這裏做的是改變當前幀,改變了知名度只是一個「副作用」 )

+0

我用另一種方式傳遞類的類型。我覺得更好,但是你寫的東西需要花時間,對此我很感激。+ 1&Accept。 – 2010-04-09 17:44:51

+0

將類傳遞給ChangeObjVisibility將爲每個類的初始化創建一些限制。我更喜歡傳遞一個已經初始化的對象,而不是因爲這個原因傳遞classtype。它使設計更加靈活。 – 2010-04-09 20:21:14

0

由於is-a關係,即使在派生對象上也可以訪問基本屬性。在你的情況下,你想在幾個對象之間有一個共享狀態,考慮這個問題的一種方法是創建一個管理器類來保存對象。它只會將一個對象選作可見對象。您可能不需要包含對象上的可見屬性,但此設計也允許這樣做。

容器

List MyObjects; Object MyVisibleObject;

0

你不應該創建和你想改變自己的知名度,每次釋放你的框架 - 它們應該總是所有的時間進行初始化。

+0

但是它們的價值是30MB內存,而且它們都超過了10.我認爲每次切換時創建它們會更好。 – 2010-04-09 15:35:58

+1

@John - 我明白你的觀點。我們有一個VB承包商,他用大量的框架構建了一個大型的客戶檔案表格,他只是翻轉框架以顯示不同類型的信息。並且因爲它使用瞭如此多的資源而拖拉了系統。但那是1997年,Pentium II處理器,256MB RAM(可能更少?我不記得了),以及... Windows 3.1。國際海事組織,對用戶界面過於吝嗇可能會導致過度延遲,而你創建/銷燬用戶界面元素。只是說... – 2010-04-09 15:46:01

+0

@約翰:這是另一個有利於不分配他們,每次釋放他們!每次用戶切換幀時,您都不希望分配大量內存 - 這將會持續很長時間。 – David 2010-04-09 16:02:27

1

如果這是講述一羣TFRAME控制的,而你只想要其中一個是在同一時間可見,你不需要去釋放和創造他們所有的時間。您可以將每個框架放在TPageControl的一個頁面上,然後隱藏選項卡條並使用TPageControl的ActivePage屬性更改可見框架。

+0

+1啓動應用程序可能需要幾個額外的毫秒數,但在此之後,事情會變得快速而平穩。另一個優勢是當你來回翻轉時,幀的狀態保持不變。像這樣在IDE中維護GUI要容易得多。 – 2010-04-10 00:22:39

1

有我的問題,我不知道該怎麼 初始化它,因爲派生 類是 未知(TObj1,TOBJ2,Tobj3 ...這 一個?)。

好了,基本上有兩種選擇:

  • 無論您在對象類型傳遞到創建作爲參數傳遞給你的方法,例如來電者必須告訴你它想要創建什麼

  • 您可以確定從其他信息創建的類型;一個簡單的方法是創建同一類型的,你在最初傳遞的一個對象(不知道是不是在你的情況下才有意義)

這已經有一段時間,因爲我做的任何嚴重的德爾福工作,但我想我隱約記得德爾福有一種方式來表達你想要的「類型」。或者,你甚至可以創建一個給定類型的實例,根據類型的名稱作爲一個字符串(例如,基於傳入的字符串「TObj2」創建一個實例TObj2

+0

+ 1,我用第一個想法。想我可以++更多。 :) – 2010-04-09 17:45:46