2016-10-01 17 views
0

Auf meinem Formular habe ich eine Reihe von TMyQuery-Komponenten. Ihre Namen geben an, mit welchen MySQL-Tabellen sie arbeiten. Zum Beispiel arbeitet COMPONENTSTABLE mit der COMPONENTS TABLE usw.Speichern des Komponentennamens als Zeichenfolge für die spätere Verwendung

Es gibt etwa 30 Tabellen, aber das könnte sich in der Zukunft ändern.

Ich verwende auch eine grundlegende String-Liste, um Feldnamen aus einer Tabelle namens TIMESTAMPS zu lesen. Diese Tabelle wird über Trigger aktualisiert, wenn ein UPDATE, INSERT oder DELETE auftritt. Jedes Feld innerhalb der TIMESTAMPS-Tabelle bezieht sich auf die Tabelle, die geändert wurde. Es gibt nur einen Datensatz in der Tabelle! Anhand der Feldwerte kann ich sehen, welche Tabelle sich geändert hat, damit ich sie aktualisieren kann, anstatt sie alle zu aktualisieren.

Ich möchte dies nicht tun;

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

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

{ and so on forever } 

Was ich will, ist zu tun;

Momentan habe ich eine String-Liste mit "Names/Values". Jeder "Name" ist der Feldname innerhalb der Tabelle und "Value" ist der von MySQL Triggers bereitgestellte TIMESTAMP.

Ich habe folgendes;

Ich habe die String List funktioniert, die Namen, die Werte usw. sind alle korrekt.

Meine Frage ist das;

Gibt es eine Möglichkeit ich einen String verwenden kann („Namen“ Spalte in der Liste) zu einem Objekt zu verweisen, wenn das Objekt vorhanden ist?

Ich habe bereits eine Funktion, die ich benutze, um einzelne Tabellen zu aktualisieren, indem Sie ein Objekt daran übergeben, aber das ist ein Objekt und einfach zu arbeiten. Ich würde gerne das "Objekt" übergeben, basierend auf seinem Namen, der aus einem String abgerufen wurde.

Ich hoffe, das macht Sinn und Sie können verfolgen, was ich will.

Antwort

2

Ich bin mir nicht sicher, was Ihre Frage eigentlich ist. Im ersten Teil der Antwort gehe ich davon aus, dass Sie sich nicht wirklich um die Namen der Objekte kümmern, sondern einen automatisierten Weg, alle verfügbaren Tabellen zu bekommen, auf ein Feld in einer anderen Tabelle beziehen wollen. Darunter beantworte ich Ihre Frage zum Bezug auf ein Objekt, wenn Sie seinen Namen kennen.

automatisiert alle Tabellen der Handhabung

Es hängt davon ab, welche Klasse Sie Ihre Objekte sind.

Von Ihrer Beschreibung nehme ich an, dass Ihre TMyQueryTComponent Nachkommen sind, die dem Formular gehören. Dann ist die Lösung sehr einfach, da jeder TComponent sowohl eine öffentliche Name als auch eine Liste der eigenen Komponenten Components hat. Sie können dann etwas wie folgt verwenden:

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; 

Beachten Sie, dass Sie zusätzliche Prüfungen hinzufügen möchten, z. um sicherzustellen, dass MyQuery.Name nicht leer ist oder dass es als Feld in TimeStampsTable existiert.

Wenn Ihre Objekte nur TObject s sind, dann gibt es keine "Standard" -Namenseigenschaft und keine Standardregistrierung dieser Objekte. Name kann gehandhabt werden, anscheinend hat Ihre Komponente bereits einen, also ist es nur eine Frage eines richtigen Typenzwangs, aber Objektregistrierung ist eine andere Sache. Möglicherweise müssen Sie eine Art globale Liste für alle Ihre erstellten TMyQuery Instanzen erstellen.

Erste eine Objektinstanz basiert auf dem Namen des Objekts

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; 

Oder Sie könnten einfach eine Schleife über alle Components und Ihr eigenes Name Matching verwenden.

+0

Dank @Pepak, bitte beachten Sie die Antwort, die ich unten, danke an Sie geschrieben habe. :) –

0

Während der erste Teil der angenommenen Antwort von @pepak ist nicht das, was ich gesucht habe (Ich habe ähnlichen Code in der App zuvor verwendet und fand es langsam), der zweite Teil der Antwort zeigte meine in der richtige Richtung.

Meine (dank Pepak) eventuelle Lösung war;

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; 

, die ich verwenden, indem Sie durch einen String übergeben ich von einem Feldwert erhalten, welche Tabelle Ich möchte aktualisieren identifiziert.

Jetzt aktualisiert meine Datenbank-App automatisch eine Tabelle, die von anderen Benutzern geändert wurde. Es wird jetzt jede der 30 Tabellen aktualisieren, die von einem anderen Benutzer geändert wurden, ohne alle Tabellen zu aktualisieren.

Vielen Dank für Ihre Hilfe Pepak, ich habe Ihre Antwort akzeptiert und hoffe, dass es für andere nützlich ist.

Verwandte Themen