Property ByRef mögich?

  1. last week

    Sascha C

    Dec 2 Pre-Release Testers, Xojo Pro

    Hallo zusammen,
    ist es irgend wie möglich, ein Property ByRef als Parameter zu verwenden?
    Hintergrund ist, dass ich ein Custom- TextField erstellt habe mit einer Eigenschaft zur Bindung an ein RowSet.
    Das RowSet ist vorhanden und es soll keines neu angelegt werden. Allerdings finde ich keine Möglichkeit das RowSet ByRef zuzuweisen.
    Beispielsweise:
    MyTextfield1.Binding = AktuelleArtikel
    AktuelleArtikel ist eine Eigenschaft eines Moduls vom Type RowSet.
    Standartmäßig wird allerdings ein Neues RowSet erstellt da ByVal, dass hatte ich auch schon getestet

    Währe schön, wenn mir da jemand weiterhelfen kann.

    LG
    Sascha

  2. Sascha C

    Dec 3 Pre-Release Testers, Xojo Pro

    ok, ich versuche es genauer zu erklären :)

    Ich habe ein Modul namens "Datenbank" in dem die Funktionalität einer Datenbank geregelt werden - connecten usw. Es gibt auch ein Property namens "AKlient" des Types RowSet, Scope Public.
    Diesem RowSet wird immer der in einer Liste aktuell ausgewählten Klienten- RowSet zugewiesen:

    AKlient = DB.SelectSQL(...)

    Das funktioniert wunderbar.

    Jetzt habe ich ein TextField erstellt das eine Eigenschaft "Bindig" des Types RowSet. Dieses Property soll auf AKlient verweisen damit man beispielsweise bei LostFocus ein Update Statement automatisieren kann.
    Egal wie ich es anstelle, ich schaffe es nicht, eine Referenz zu AKlient zu bekommen. Einzige Ausnahme, ich weise bei Auswahl eines neuen Klienten Bindig direkt das RowSet zu, wie bei AKlient. Das ist aber nicht sinn der Sache.

    Wie also erhalte ich eine Reference die immer auf AKlient zeigt?

    LG
    Sascha

  3. Christian S

    Dec 3 Pre-Release Testers, Xojo Pro, XDC Speakers, Third Party Store Germany

    byref mit properties, die per getter/setter implementiert sind, wird nicht gehen.

    Da muss schon ein einfaches property sein, damit das eventuell geht.

  4. Markus R

    Dec 3 Pre-Release Testers, Xojo Pro Europe / Germany

    komisch, Objekte werden eigentlich immer als ByRef übergeben

  5. Christian S

    Dec 3 Pre-Release Testers, Xojo Pro, XDC Speakers, Third Party Store Germany

    Nein. Default ist byVal.

  6. Carsten B

    Dec 3 Pre-Release Testers, Xojo Pro Germany, NRW, Europe

    Wird ByVal ein Verweis auf das RowSet-Objekt übergeben, ist das nicht das Gleiche wie ByRef!

    Ich denke, Du wirst nicht drumrum kommen, das RowSet per Code zuzuweisen. Aber wo ist dabei das Problem?

  7. Sascha C

    Dec 3 Pre-Release Testers, Xojo Pro

    Das funktioniert weder mit einem einfachen Property noch mit geter und seter.
    Ich habe sogar versucht, mit einer Methode des TextFieds ByRef AKlient zu übergeben und dies dann Binding zuzuweisen. Funktioniert aber nicht.
    Binding ist Nil.

    Getestet hatte ich auch, in der Methode, in der ich AKlient beim Wechsel zum nächsten Klienten zuweise bei Binding = Nil einmalig Binding zu initialisieren:

    if txt_Vorname.Binding = Nil Then
    txt_Vorname.Binding = AKlient
    End If

    Das macht er dann auch nur einmal. Beim Testen bleibt Binding aber dann RowSet vom ersten AKlient. Bedeutet, dass keine Referenz besteht sondern neu angelegt wird.

    LG
    Sascha

  8. Sascha C

    Dec 3 Pre-Release Testers, Xojo Pro

    @Carsten B Wird ByVal ein Verweis auf das RowSet-Objekt übergeben, ist das nicht das Gleiche wie ByRef!

    Ich denke, Du wirst nicht drumrum kommen, das RowSet per Code zuzuweisen. Aber wo ist dabei das Problem?

    Sinn und Zweck soll sein, dass ich TextFielder habe, die sich selbst updaten können weil sie Zugriff auf den aktuellen RowSet haben und es ebenfalls eine Eigenschaft mit dem Column- Namen haben.
    Hätte ich nur mit einer Tablle der Klienten zu tun, wäre dies kein Problem, die Textfelder müssen aber auch für andere Tabellen, wie bsp. Mitarbeiter, herhalten.
    Ohne diese Bindung müsste ich nach jedem Wechsel des Klienten alle Textfelder einzeln "bestüken".

    Da es sich um sehr viele Felder handelt, würde ich mir auf diesem Wege sehr viel Schreibarbeit und Resousen sparen. Und das muss doch auch irgend wie möglich sein.

  9. Carsten B

    Dec 3 Pre-Release Testers, Xojo Pro Germany, NRW, Europe

    Ein RowSet ist ein Objekt, das durch ein Select-Statement erzeugt wird. Das Objekt kannst Du beliebig vielen Properties zuweisen. Dadurch wird es aber niemals kopiert. ByVal erzeugt dabei lediglich eine neue Adresse, die aber jedesmal auf dasselbe Objekt (RowSet) verweist.

  10. Carsten B

    Dec 3 Pre-Release Testers, Xojo Pro Germany, NRW, Europe

    Du musst den entspr. Feldern auf jeden Fall mitteilen, dass sie sich aktualisieren müssen, also Wert aus RowSet zuweisen.

  11. Beatrix W

    Dec 3 Pre-Release Testers, Third Party Store Europe (Germany)

    Können Deine Controls nicht Observer sein vom RowSet?

  12. Sascha C

    Dec 3 Pre-Release Testers, Xojo Pro

    @Carsten B Du musst den entspr. Feldern auf jeden Fall mitteilen, dass sie sich aktualisieren müssen, also Wert aus RowSet zuweisen.

    Ist mir völlig unverständlich. Es ist mir schon an so manchen Stelle aufgefallen, dass Xojo, trotz c++ Base, nicht ganz durchdacht ist. Stelle ich das in c# nach, gibt da gar keine Probleme.

    Wenn ich das aktualisieren muss, mir erscheint dann beim GetFocus- Event der richtige Zeitpunkt, brauch ich das vorher auch nicht "initialisieren".

    LG
    Sascha

  13. Carsten B

    Dec 3 Pre-Release Testers, Xojo Pro Germany, NRW, Europe

    Ne, die Aktualisierung muss ein Zeilenwechsel im RowSet und ein Update auf das RowSet triggern. Denk mal über Hinweis von Beatrix zum Observer-Pattern nach. Das ist der richtige Weg.

    Du musst doch allerdings schon irgendwas an Logik implementiert haben; nur das RowSet einem Property zuzuweisen bewirkt doch erstmal gar nichts.

  14. Sascha C

    Dec 3 Pre-Release Testers, Xojo Pro

    @Beatrix W Können Deine Controls nicht Observer sein vom RowSet?

    Wenn ich aus dem Property "AKlient" ein computed Property mache, könnte ich sicher via set entsprechend die TextFelder "informieren" - ich denke, dass du dieses Konzept des Observers meinst.
    Allerdings ist der Aufwand ungleich größer als mit "meiner" Variante da ich wieder alle Textfelder beschießen mus.

    Ob es eine Möglichkeit in Xojo gibt, ein Objekt zu überwachen, etwa eine Eigenschaft o.ä., um bei Änderung darauf zu reagieren weiß ich nicht.

    LG
    Sascha

  15. Sascha C

    Dec 3 Pre-Release Testers, Xojo Pro

    @Carsten B Ne, die Aktualisierung muss ein Zeilenwechsel im RowSet und ein Update auf das RowSet triggern. Denk mal über Hinweis von Beatrix zum Observer-Pattern nach. Das ist der richtige Weg.

    Du musst doch allerdings schon irgendwas an Logik implementiert haben; nur das RowSet einem Property zuzuweisen bewirkt doch erstmal gar nichts.

    das hatte ich oben schon beschrieben, dass das RowSet entsprechend bei Klientenwechsel angepasst wird.

  16. Beatrix W

    Dec 3 Pre-Release Testers, Third Party Store Europe (Germany)

    Ob es eine Möglichkeit in Xojo gibt, ein Objekt zu überwachen, etwa eine Eigenschaft o.ä., um bei Änderung darauf zu reagieren weiß ich nicht.

    Nein, das gibt es nicht. Daher mußt Du das selbst machen. Es ist eh besser, wenn Deine Controls nicht so eng mit dem Datenbank-Code verbandelt sind.

  17. Sascha C

    Dec 3 Pre-Release Testers, Xojo Pro

    Gut, dann werde ich vom Textfeld aus einen allgemeinen Aufruf an eine DB- Methode starten. Damit sollte das funktionieren und soweit als möglich voneinander entkoppelt sein.

    LG
    Sascha

  18. Norman P

    Dec 3 Pre-Release Testers, Xojo Pro under a bus

    @Sascha Cmer ist es irgend wie möglich, ein Property ByRef als Parameter zu verwenden?

    > Ist es möglich, eine Eigenschaft ByRef als Parameter zu verwenden?
    Nein.
    Hierfür gibt es eine langwierige Erklärung - aber akzeptieren Sie einfach, dass Sie Properties byref nicht übergeben können, da der Compiler Ihnen einfach nicht versichern kann, dass es so funktioniert, wie Sie es erwarten.

  19. Markus R

    Dec 3 Pre-Release Testers, Xojo Pro Europe / Germany

    By default, all arrays and objects are reference types that are passed ByVal.
    Because they are reference types, changes made to that array or object will be reflected in the calling method.

    To pass a parameter by reference, you use the ByRef keyword in the parameter declaration for the method.

    Mit anderen Worten ByVal oder ByRef ist das gleiche bei Objekte, war in VB6 auch schon so merkwürdig.
    Normal hat man ja eigentlich im Sinn das ByVal Daten kopiert das die dann eigenständig sind.
    Objekte kann man aber nicht so einfach reproduzieren.

    Ich vermute eher das dein rowset Objekt flöten geht weil die Datenbankverbindung nicht mehr existiert oder nur in einer Methode gültig war.

  20. Sascha C

    Dec 3 Pre-Release Testers, Xojo Pro

    @Markus R Mit anderen Worten ByVal oder ByRef ist das gleiche bei Objekte, war in VB6 auch schon so merkwürdig.
    Normal hat man ja eigentlich im Sinn das ByVal Daten kopiert das die dann eigenständig sind.
    Objekte kann man aber nicht so einfach reproduzieren.

    Ich vermute eher das dein rowset Objekt flöten geht weil die Datenbankverbindung nicht mehr existiert oder nur in einer Methode gültig war.

    Nein, die DB- Verbindung steht. Zum Einen werden nach der Zuweisung alle weiteren Daten aus dem entsprechenden RowSet (AKlient) gezogen und zum Anderen habe ich das selbstverständlich nochmals getestet.
    Norman hat auch schon bestätigt, dass es einfach nicht funktioniert. Warum es nicht "zuverlässig" (so übersetzte ich jetzt einfach "einfach nicht versichern kann") funktioniert ist mir bei einem professionellen Compiler allerdings unklar.

    Als jemand, der schon viele viele Jahre mit den verschiedensten Sprachen und Compilern arbeitet, sehe ich bei Xojo so einige "Eigenartigkeiten", gerade was Referenzen, Zuweisungen und allgemein Objekte angeht...

    LG
    Sascha

  21. Newer ›

or Sign Up to reply!