2016-12-14 4 views
0

BlockquoteZugriff auf Powerbuilder Fenster Instanzvariablen von General Funktion

ich mehrere Fenster haben, die alle den gleichen Code benötigen, w_emp1, w_emp2, w_emp3 .... usw. Daher erschien es sinnvoll, diesen allgemeinen Code in eine Funktion namens wf_access_test zu stellen.

Jedes dieser Fenster hat seinen eigenen Satz von Instanzvariablen. Say is_text_name, is_text_town, is_text_zip_code ... usw.

Der Code für wf_access_test() ist unten. Beachten Sie, dass ein bestimmtes Fenster (w_emp1) fest codiert wurde. Dadurch kann ich diese spezifische Windows-Instanzvariable aktualisieren.

Was ich brauche, ist eine Methode, die Aufruf Fensternamen Instanzvariablen zu adressieren, aber ersetzen Sie den Hardcoded w_emp1 Qualifier

w_emp1.is_text_name = ‘Text Updated’  //Updating this windows instance variable - This works! 

habe ich versucht, die Funktion mit dem Fensternamen als Wert auf den übergebenen Aufruf Funktion mit einem Argument type = window.

dh. wf_access_test (w_emp_1)

Leider, wenn ich dann versuche, den übergebenen Wert durch die hartcodierte w_emp1 ersetzt gibt es - inkompatible Eigenschaft Typ?

Irgendwelche Experten da draußen, die helfen können? Vielen Dank im Voraus.

+1

Wenn ich Sie richtig verstehe, sollten Sie über objektorientierte Programmierung lesen. Sie müssen eine gemeinsame Basisklasse für Ihre Windows erstellen. Übrigens. Die Verwendung von Setter und Getter ist auf lange Sicht weitaus besser als das direkte Setzen von Instanzvariablen, – user743414

Antwort

1
  1. Erstellen Sie ein erstes Fenster w_emp.
  2. Definieren Sie dort alles, was zwischen Ihren verschiedenen Fenstern w_empxx gemeinsam ist (insbesondere die Instanzvariablen, die Sie benötigen).
  3. Insbesondere definieren die Funktion wf_access_test
  4. erstellen alle anderen Fenster w_empxx wie von w_emp
  5. Spezialisieren Ihre neueren Fenster

geerbt Fertig!

Auf diese Weise nimmt Powerbuilder bei jedem Aufruf von wf_access_test den Vorgänger und verwendet die Instanzvariablen aus dem spezifischen Fenster, von dem aus der Aufruf erfolgt. Natürlich kann dies einige (oder eine Menge) Arbeit erfordern, aber auf lange Sicht ist es viel besser. Zusätzlicher Vorteil: Wenn Sie das Verhalten von wf_access für ein bestimmtes Fenster ändern müssen, können Sie es auf der Ebene des Abkömmlings neu definieren.

+0

OK, danke für dieses Mal - ich werde es in etwa 10 Stunden versuchen. Ich werde dich wissen lassen, wie es läuft! Nochmals vielen Dank im Voraus. – Mike

+0

Hallo Mark, Ausgezeichnete Weise es zu tun. Ich werde das bei neuen Anwendungen, die ich in Zukunft entwickle, verwenden. Leider, weil ich bereits eine Anwendung mit mehreren untergeordneten Bildschirmen definiert habe, werde ich eine hybride Lösung verwenden. Aber das ist definitiv der Weg nach vorne. Danke vielmals! – Mike

0

Ich würde zuerst die gemeinsamen Variablen in eine Struktur einfügen, so dass sie an einem Ort einfacher zu pflegen sind.

Sie können dann eine Funktion in Ihren Fenstern hinzufügen, die ein Argument mit dem Typ dieser Struktur unterstützt, um die Werte in diesem Fenster zu aktualisieren, oder einfach die Struktur in Ihrer Instanz speichern und direkt verwenden.

Um das Argument aufzurufen, sollten Sie in der Lage sein, einen beliebigen gemeinsamen Vorfahren für die von Ihnen verwendeten Fenster zu verwenden, um einen Verweis auf die Instanz zu halten. Wenn Sie die Funktion aufrufen, müssen Sie jedoch einen dynamischen Aufruf verwenden, da die Basisklasse diese Methode nicht verwenden wird.Wenn Sie beispielsweise als gemeinsamen Vorfahren zu w_master wechseln und eine Funktion mit dem Argumenttyp w_master, name aw_ref, festlegen, können Sie den Aufruf aw_ref.DYNAMIC setData(astr_data) verwenden, um die Funktion setData in der untergeordneten Klasse aufzurufen.

Wenn Sie die PowerBuilder-Hilfe für dynamische Anrufe überprüfen, erhalten Sie Informationen zu Überlegungen bei der Verwendung dynamischer Anrufe.

Offensichtlich wäre die bevorzugte Methode, ein eigenes geerbtes Objekt zu haben, um dies zu speichern, aber wenn Sie den Vererbungsbaum nicht ändern wollen, dann könnten dynamische Aufrufe der richtige Weg sein.

Übrigens, wenn Sie einen neuen Typ erstellen, der von einem der gemeinsamen Vorfahren Ihrer Fenster geerbt wurde, können Sie die Basisklasse für Ihre Fenster ändern, indem Sie die Quelle bearbeiten und die Klasse, von der sie erbt, in Ihre neue Klasse ändern; Es gibt nur ein oder zwei Stellen, an denen Sie die Änderung vornehmen müssen. Ich weiß nicht, ob alle Fenster, über die du sprichst, den gleichen Vererbungsbaum haben, also ist es vielleicht nicht wert, wenn die untergeordneten Klassen die gewünschte Funktionalität haben.

+0

Hallo Keteract, das hatte ich von Anfang an berücksichtigt. Allerdings habe ich eine Reihe von Arrays, die ich nicht sehen konnte, wie man in eine Struktur einbaut? Ich hatte darüber nachgedacht, in eine Zeichenkette zu konvertieren und zu arrayen, um sie bei Bedarf wieder zu speichern und zu explodieren. Powerbuilder, mit meinem derzeitigen Wissen, scheint keine solchen Array-Funktionen zu haben - wie PHP. Gibt es weg von Speichern von Arrays in Strukturen? Vielen Dank für Ihr Feedback. Strukturen sind nicht etwas, das ich bisher verwendet habe, aber ich fange wieder an, wieder in den Powerbuilder zu kommen. Es ist eine Weile her! – Mike

+0

Ich habe nicht versucht, ein Array als Strukturwert zu verwenden, aber Sie können immer eine Ebene höher gehen und eine NVO mit Instanzvariablen als Ersatz erstellen; dann könnten Sie sogar Funktionen kapseln, um die Werte in der NVO zu manipulieren; Sie sind effektiv Klassen. – Kateract

+0

Als eine Randnotiz ist es nicht wirklich notwendig, eine Struktur zu verwenden; Ihre Methode könnte eine beliebige Anzahl von Argumenten haben, die den Variablen entsprechen, die Sie festlegen möchten. Durch die Struktur wird der Aufruf übersichtlicher, insbesondere wenn Sie eine große Anzahl an Variablen haben. – Kateract

Verwandte Themen