locked
manipulation eines Fensters von außerhalb RRS feed

  • Frage

  • Hallo comunity..

    kurze Beschreibung meines Problems.. es handelt sich hier genauer gesagt um zwei probleme, wo ich glaube dass die lösung die selbe ist.

    Problem 1: Ich habe ein menü in einem Fenster neu gecodet. Doch wenn ich zum Beispiel eine andere Form aufrufen will (mit dem befehl DO formularname ) aber dann wird mir gesagt dass dieses formular nicht definiert wurde. Ich kann auch so nich wirklich auf ein objekt zugreifen, weil das menü kein unterobjekt des fensters ist sondern im arbeitsspeicher erstellt wird, dort selbständig existiert und nur im formular angezeigt wird.. Ich weiß ist ein wenig gemögelt (das fenster ist keine top-layer form) aber  notwendig.. aber ich glaube das ist die begründung wieso nix so funktioniert wie ich es geöhnt bin.. also wie greife ich auf die eigenschaften in fer form zu? und wie öffne ich ein anderes formular???

    Problem 2: Selbe Projekt, Ich habe ein eingabe fenster und ein ausgabe fenster (auch das ist notwendig) wie kann ich jetzt die ausgabe des ausgabe-fensters aufgrund der eingabe des eingabe-fensters beeinflussen??

    Gruß Schosch

    Montag, 29. Oktober 2012 08:55

Antworten

  • Dir ist aber schon klar, daß der Dateiname nicht der Form.Name ist.

    Wenn Du die Name Eigenschaft genau auf den Dateinamen änderst und machst DO FORM pictureform, dann kannst Du die Form mit pictureform schon ansprechen, aber das ist dann keine Objektreferenz, Du kannst den Formularnamen nur in Befehlen verwenden, die Formularnamen verwenden, z.B.

    Move pictureform TO 20,20

    Aber pictureform.Caption = "Bild xyz" geht z.B. nicht.

    Dafür brauchst Du eine Objektreferenz, sozusagen ein Zeiger auf das Objekt bzw. seinen Speicher.

    Und den kriegst du nicht mit

    DO FORM pictureform

    sondern nur mit

    DO FORM pictureform NAME oPicForm

    Danach geht dann schon

    oPicForm.Caption = "Pic abc"

    Du kannst Dir wirklich sparen die Name Eigenschaft eines SCX zu ändern. Ansprechen tust Du ein SCX zum generieren per DO FORM immer nur mit dem Dateinamen und der Name der Objektrefenz ist ein Variablenname und nicht Form.Name. Sonst könnte man auch nie ein Formular mehrfach starten.

    Also: Was hast Du denn bisher gemacht, was nicht funktioniert hat?

    Was ist Dein Dreizeiler rund um Do Form?

    Tschüß, Olaf.

    • Als Antwort markiert Schosch93 Mittwoch, 7. November 2012 09:48
    Donnerstag, 1. November 2012 08:59

Alle Antworten

  • Das sind denke ich schon 2 unterschiedliche Probleme.

    Problem 1: Menü. Wie du schon weißt ist das Menü kein Unterobjekt der Form. Das Wurzel"objekt" eines Menüs wird per DEFINE MENU ewrzeugt und hat zur Nutzung in DEFINE BAR und anderem einen Namen. Der Muss eindeutig sein.

    Problem 2: Um von Formular1 ein anderes Formular anzusprechen, brauchst Du dessen Formularreferenz. DO FORM ist dafür in der Grundform ungeeignet, weil es Dir keinerlei Referenz zurückliefert, es startet einfach nur das Formular und so gestartet hast Du keine Referenz, um das Formular von woanders here anzusprechen, außer den Namen. Anders als beim Menü, was nicht OOP ist, ist der Name hier aber nur eine zweitklassige Referenz, denn jedes Form hat als Namen Form1.

    Mach mal zur Anschauung im Command Window Do Form... und dann ACTIVATE WINDOW FORM1 mehrmals, das wird dann immer zwischen beiden Formularen Wechseln. In VFP9 sind wir Objektorientiert und machen Formularklassen, die man instanziiert per oForm = CreateObject("meinFormualr") und dann hat man eine Formularreferenz an der Hand: oForm.

    Rettung naht, denn DO FORM hat noch eine Klausel, mit der man auch so eine Referenz erhalten kann: NAME.

    Kurz gesagt so:
    DO FORM xyzt NAME oForm
    oForm.Caption = "Huhu, mein Windows Titel hat sich geändert..."

    Zehn Schritte zurück: Empfehlenswert ist eine Klasse "Formularmanager", die Formulare Startet, schon gestartete Formulare aktiviert, Formularreferenzen bereitstellen kann, damit zwei Formulare sich gegenseitig beeinflussen können etc. Der Grund dafür ist, daß Formularreferenzen irgendwo so gespeichert werden müssen, daß Sie nicht gleich wieder aus dem Speicher Releast werden, wie Private oder Locale Variablen.

    Da ich Dir so einen Formularmanager jetzt kaum Vorexerzieren kann: Für den Anfang könntest Du zur Lösung des Problems Äbäh) Public Variablen nehmen und jede gestartete Form in eine solche Variable speichern. Auch die müssen natürlich dann jeweils unterschiedlich heißen. Aber damit hättest Du dann auch in Formular1 eine Referenz auf Formular2 und ungekehrt.

    Das Konzept Ausgabefenster ist dabei unüblich, zumindest die Ansteuerung weiterer Formulare. Du hast ja Datenbindung, Du kannst als z.B. das Anzeigeformular mit Grid an eine Tabelle binden und im Formular1 in diese Tabelle schreiben, woraufhin dann im Anzeigeformular diese neue Zeile angezeigt wird, das ist eine sauberere Lösung als Formulare sich gegenseitig per Herumfummeln an Control Values zu beeinflussen.

    Tschüß, Olaf.

    PS: Noch ein Tipp dazu:

    Ein Collection-Objekt ist ideal zum Speichern aller Formularreferenzen aktuell laufender Formulare. Es gibt zwar schon ein Array unter _Screen.Forms(), aber das hält die Formulare nicht am Leben, außerdem kann man bei einer Collection beim Add einen Schlüssel angeben, unter dem man das Formular wiederfinden möchte, was einfach der Formularname sein kann. So kann man dann auch leicht in der Collection schauen, ob ein bestimmtes Formular schon gestartet ist und dann evtl. nur aktiviert werden muss, in _Screen.Forms müsste man dazu alle Formulare auf ihren Namen oder ihre Klasse prüfen. Formularreferenzen tilgen sich auch automatisch aus einer Collection, wenn ein Formular per X oder RElease() geschlossen wird.

    Montag, 29. Oktober 2012 12:55
  • Aber was ist, wenn ich die Namen einer jeden Form beim erstellen geändert habe.. Ich habe beigebracht bekommen, dass bei allem was vom programmier aktive benutzt wird (eigenschaften per code verändert wird) der Objekt-Name sprechen geändert werden sollte um die übersicht zu bewahren. Das heist wenn ich eine form erstelle, die einfach nur ein bild anzeigt, dann nenne ich diese picture_form oder bild_form, jenachdem für welche sprache ich mich am anfang des projektes entscheide.. Das wiederum bedeutet dass kein einziges meiner Formulare auf die referenz FORM1 reagiert.. und es klappt trozdem nicht mit dem Befehl DO FORM..

    Gruß Schosch

    • Bearbeitet Schosch93 Mittwoch, 31. Oktober 2012 15:12
    Mittwoch, 31. Oktober 2012 15:11
  • Dir ist aber schon klar, daß der Dateiname nicht der Form.Name ist.

    Wenn Du die Name Eigenschaft genau auf den Dateinamen änderst und machst DO FORM pictureform, dann kannst Du die Form mit pictureform schon ansprechen, aber das ist dann keine Objektreferenz, Du kannst den Formularnamen nur in Befehlen verwenden, die Formularnamen verwenden, z.B.

    Move pictureform TO 20,20

    Aber pictureform.Caption = "Bild xyz" geht z.B. nicht.

    Dafür brauchst Du eine Objektreferenz, sozusagen ein Zeiger auf das Objekt bzw. seinen Speicher.

    Und den kriegst du nicht mit

    DO FORM pictureform

    sondern nur mit

    DO FORM pictureform NAME oPicForm

    Danach geht dann schon

    oPicForm.Caption = "Pic abc"

    Du kannst Dir wirklich sparen die Name Eigenschaft eines SCX zu ändern. Ansprechen tust Du ein SCX zum generieren per DO FORM immer nur mit dem Dateinamen und der Name der Objektrefenz ist ein Variablenname und nicht Form.Name. Sonst könnte man auch nie ein Formular mehrfach starten.

    Also: Was hast Du denn bisher gemacht, was nicht funktioniert hat?

    Was ist Dein Dreizeiler rund um Do Form?

    Tschüß, Olaf.

    • Als Antwort markiert Schosch93 Mittwoch, 7. November 2012 09:48
    Donnerstag, 1. November 2012 08:59
  • Ahh.. jetzt klatt das auch mit dem fenster aufrufen ;) danke schön..

    Montag, 5. November 2012 07:52
  • Ich hatte ja schon vorher geschrieben:

    >Kurz gesagt so:
    >DO FORM xyzt NAME oForm
    >oForm.Caption = "Huhu, mein Windows Titel hat sich geändert..."

    Mich würde immer noch interessieren, was Du stattdessen gemacht hattest.

    Tschüß, Olaf.

    Dienstag, 6. November 2012 06:39
  • ich habe das Name nicht geschrieben, weil ich ja schon namen vergeben hatte, aber ich wusste nicht das der Objektname und der Dateiname nichts mit dem variabelen namen zu tun haben..
    Dienstag, 6. November 2012 07:04