2010-04-13 51 views
2
Data.XX.NewValue := Data.XX.SavedValue; 
    Data.XX.OldValue := Data.XX.SavedValue; 

我需要做上述很多次,其中XX表示類中的值。假裝列表中有三項:Tim,Bob,Steve。如果沒有三次輸入上面的代碼,有沒有辦法爲所有三個人完成上述操作?重複類中的每個項目的過程

(數據是包含多個對象,每個鍵入tlist,其中包含的OldValue,和的NewValue一個savedValue的類)

+0

Sory ......我不明白。你能解釋一下爲什麼古典的for循環對於這個不夠?對於I:= 0到Data.Count做 開始 Data [I] .NewValue:= Data [I] .SavedValue; Data [I] .OldValue:= Data [I] .SavedValue; 結束; 親切的問候。 – jachguate 2010-04-14 21:56:49

回答

4

如果我不得不做這樣的事我會做什麼是放多了一個從TList數據,其中包含所有對象的列表。將其填充到構造函數中,然後當您必須執行此類操作時,使用循環將相同的基本操作應用於列表中的每個項目。

-3

我會在這裏小心。我知道誘惑將會是使用一個通用的接口和反射,或者更靈活一些其他的自動化,坦率地說,寫作更有趣。避免這種誘惑。根據您的模式列出列表中的每個項目沒有任何問題。模式很好,代碼可讀性強,易於執行,並且易於修改任何不適合模式的單獨屬性。

低技術的方式來避免打字一切都是使用我們的老朋友Excel。把你所有的屬性在列A,然後在B列使用這個公式:

= CONCATENATE("Data.", A1, ".NewValue := Data.", A1, ".SavedValue;", CHAR(10), "Data.", A1, ".OldValue := Data.", A1, ".SavedValue;", CHAR(10)) 
+0

雖然在Excel中生成代碼是您工具箱中的好東西,但我不同意這種方法。如果他有1000個元素需要處理,那麼您將生成1000行重複代碼。然而,對於像生成語句來操縱數據庫表和結構(創建,選擇,插入,解析等)的東西,這種技術非常適用。 – 2010-04-13 14:22:52

+3

很難想象更多的非Delphi-ish答案。 ;-) – 2010-04-13 17:14:36

+0

您必須檢查所有方法並權衡利弊。這種方法產生許多代碼行並且重複的事實在性能和未來維護方面本身並不是一個缺點。由於只有一個人提出瞭解決方案,而且有一個可行的解決方案,所以我們應該比較這些缺點。我們要爲新房產寫什麼樣的代碼?是不是必須重複列出所有的屬性?現在我們仍然有1000行重複代碼,但我們也有一個全新的數據元素來創建,維護和佔用內存。 – cortijon 2010-04-13 21:02:11

0

也許我不理解就OK了,但... 這裏是面向對象眼前一亮。您爲類定義一個過程,然後申請您創建的任何實例。

TMyPropValue = class(TObject) 
private 
    FNewValue: double; 
    FOldValue: double; 
    procedure SetValue(AValue: double); 
public 
    procedure RestoreOldValue; 
    propety NewValue: double read FNewValue write SetValue; // Raed/write property (write using a procedure) 
    property OldValue: double read FOldValue; // Read only property 
end; 

TMyClass = class(TObject) 
private 
    FProp1: TMyPropValue; 
    FProp2: TMyPropValue; 
public 
    procedure RestoreValues; 
end; 

//.... 

var 
    MyObj1: TMyClass; 
    MyObj2: TMyclass; 

procedure TMyPropValue.SetValue(AValue: double); 
begin 
    FOldValue := FNewValue; 
    FNewValue := AValue; 
end; 

// Restore the Old value of this Prop 
procedure TMyPropValue.RestoreOldValue; 
begin 
    FNewValue := FOldValue; 
end; 

// Restore ald the Values of the class 
procedure TMyClass.RestoreValues; 
begin 
    FProp1.RestoreOldValue; 
    FProp2.RestoreOldValue; 
end; 
// ----------- 

// Creating and populating a couple of objects (instances) 
procedure XXX; 
begin 
    MyObj1 := TMyClass.Create; 
    MyObj1.Prop1.NewValue := 10.25: 
    MyObj1.Prop2.NewValue := 99.10: 

    MyObj2 := TMyClass.Create; 
    MyObj2.Prop1.NewValue := 75.25: 
    MyObj2.Prop2.NewValue := 60.30: 
end; 

// Changing values, the class internaly will save the OldValue 
procedure yyyy; 
begin 
    MyObj1.Prop1.NewValue := 85.26: 
    MyObj1.Prop2.NewValue := 61.20: 

    MyObj2.Prop1.NewValue := 99.20: 
    MyObj2.Prop2.NewValue := 55.23: 
end; 

// Using a procedure from the class 
procedure zzzz; 
begin 
    MyObj1.RestoreValues; 
    MyObj2.RestoreValues; 
end; 

希望這有助於 丹尼爾

0

this postthis post來看,我建議如下:

unit MyAssignment; 

interface 

    type 
    TValueKind = (EconomicGrowth, 
        Inflation, 
        Unemployment, 
        CurrentAccountPosition, 
        AggregateSupply, 
        AggregateDemand, 
        ADGovernmentSpending, 
        ADConsumption, 
        ADInvestment, 
        ADNetExports, 
        OverallTaxation, 
        GovernmentSpending, 
        InterestRates, 
        IncomeTax, 
        Benefits, 
        TrainingEducationSpending); 

     TValue = record 
      NewValue, 
      OldValue, 
      SavedValue : Double; 

      procedure SetValue(aVal : Double); 
      procedure SaveValue(); 
      procedure RestoreValue(); 
     end; 

     TDataArray = array [TValueKind] of TValue; 

     var 
      Data : TDataArray; 

implementation 

    {TValue} 

    procedure TValue.SetValue(aVal : Double); 
    begin 
    OldValue := NewValue; 
    NewValue := aVal; 
    end; 

    procedure TValue.SaveValue; 
    begin 
    SavedValue := NewValue; 
    end; 

    procedure TValue.RestoreValue; 
    begin 
    NewValue := SavedValue; 
    OldValue := SavedValue; 
    end; 


end. 

現在你可以寫這樣的代碼:

  //accessing the values : 
      // Data[XX] instead of Data.XX 

      //examples : 
      ShowMessage(FloatToStr(Data[Inflation].SavedValue)); 
      Data[AgregateSupply].SetValue(10.0); 
      Data[Benefits].SaveValue; 

      //writing loops : 
     procedure RestoreValues(var aData : TDataArray); //the "var" keyword is important here : google "arguments by value" "arguments by reference" 
      var 
      lKind : TValueKind; 
     begin 
      for lKind := Low(TValueKind) to High(TValueKind) do 
      aData[lKind].RestoreValue; 
     end; 

     procedure SaveValues(var aData : TDataArray); 
      var 
      lKind : TValueKind; 
     begin 
      for lKind := Low(TValueKind) to High(TValueKind) do 
      aData[lKind].RestoreValue; 
     end; 

      //calling these functions : 
     SaveValues(Data); 
     RestoreValues(Data); 

如果您需要更復雜的操作在數組中,將它放入類中是一個好主意 - 將僅在TDataArray類型的字段中寫入的字段替換 - 並編寫函數來操作數據作爲此類的方法。

相關問題