2016-10-01 27 views
0

在我的表單中,我有許多TMyQuery組件。他們的名字標識他們使用哪個MySQL表。例如,COMPONENTSTABLE可與組件表一起使用,等等。將組件名稱存儲爲字符串供以後使用

約有30個表格,但未來可能會改變。

我也使用一個基本的字符串列表從一個名爲TIMESTAMPS的表中讀取字段名稱。當發生UPDATE,INSERT或DELETE時,通過觸發器更新此表。 TIMESTAMPS表中的每個字段指的是修改了哪個表。表中只有一個記錄!基於字段值,我可以看到哪些表已更改,因此我可以刷新它而不是刷新所有表。

我不想這樣做;

If fieldbyname['COMPONENTSTABLE'] <> CurrentTimeStamp 
then ComponentsTable.Refresh; 

If fieldbyname['ORDERSTABLE'] <> CurrentTimeStamp 
then OrdersTable.Refresh; 

{ and so on forever } 

我想要做的是;

現在我有一個帶有「名稱/值」的字符串列表。每個「Name」是表中的字段名,「Value」是MySQL觸發器提供的TIMESTAMP。

我得到以下;

For Idx := 0 to MyStringList.Count -1 do 
    Begin 

    If MyStringlist.ValueFromIndex[Idx] <> SomethingElse then 
    Begin 
     with (MyStringList.Names[Idx] as tMyQuery).Refresh; 
    End; 

    End; 

我已經得到了字符串列表的功能,名稱,值等都是正確的。

我的問題是這樣的;

有沒有一種方法可以使用字符串(「名稱」列中的列表)引用一個對象,如果該對象存在?

我已經有一個函數用來通過傳遞一個對象來刷新單個表,但這是一個對象,並且易於使用。我想根據從String中檢索的名稱傳遞「Object」。

我希望這是有道理的,你可以按照我所追求的。

回答

2

我不確定你的問題實際上是什麼。在答案的第一部分中,我假設你並不真正關心對象的名稱,而是希望獲得所有可用表的自動方式引用另一個表中的字段。在那之下,如果你知道它的名字,我會回答你提及的一個對象的問題。處理所有表

這取決於什麼類的對象是

自動化的方式。

從你的描述來看,我假設你的TMyQueryTComponent後裔所擁有的形式。那麼解決方案非常簡單,因爲每個TComponent都有公開的Name和擁有組件的列表Components。然後,您可以使用這樣的事情:

var 
    i: integer; 
    MyQuery: TMyQuery; 
begin 
    for i := 0 to Pred(MyForm.ComponentCount) do 
    if MyForm.Components[i] <> TimeStampsTable then 
     if MyForm.Components[i] is TMyQuery then 
     begin 
     MyQuery := TMyQuery(MyForm.Components[i]); 
     if TimeStampsTable.FieldByName(MyQuery.Name).AsDateTime >= LastAccess then ... 
     end; 
end; 

請注意,您可能需要添加額外的檢查,例如以確保MyQuery.Name不爲空或它存在爲TimeStampsTable中的字段。

如果您的對象只有TObject s,那麼沒有「標準」名稱屬性,也沒有這些對象的標準註冊。名稱可以被處理,顯然你的組件已經有一個,所以這只是一個適當類型的強制問題,但對象註冊是一個不同的問題。您可能必須爲您創建的所有實例創建某種全局列表。

獲得一個對象實例根據該物體的名稱

function TMyForm.GetQueryByName(const Name: string): TMyQuery; 
var 
    Obj: TObject; 
begin 
    Result := nil; 
    Obj := Self.FindComponent(Name); 
    if Obj <> nil then 
    if Obj is TMyQuery then 
     Result := TMyQuery(Obj); 
end; 

或者你可以簡單地遍歷所有Components和使用自己的Name匹配。

+0

謝謝@Pepak,請看下面發佈的答案,謝謝你。 :) –

0

儘管@pepak接受的答案的第一部分不是我正在尋找的(我以前在應用程序中使用過類似的代碼,發現它很慢),但答案的第二部分指出了我的正確的方向。

我(感謝Pepak)最終的解決方案是;

Function RefreshQueryByName(Const Name: String): Boolean; 
    Var 
     Obj: TComponent; 
    Begin 
     Result := False; 
     Obj := Self.FindComponent(Name); 
     If Obj <> nil Then 
     If Obj Is TMyQuery Then 
      With Obj As TMyQuery Do 
       If Active Then 
       Begin 
        Refresh; 
        Result := True; 
       End; 
    End; 

我通過傳遞一個字符串來獲取字符串的值,該字段值用於標識要刷新哪個表。

現在,我的數據庫應用程序會自動刷新其他用戶更改的表格。現在它將刷新其中30個表中的任何一個,而不會刷新所有表,而是被另一個用戶修改。

感謝您的幫助Pepak,我接受了您的答案,並希望這對其他人有用。

相關問題