Property ByRef mögich?

  1. ‹ Older
  2. last week

    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.

  3. 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.

  4. 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

  5. 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.

  6. 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.

  7. 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

  8. Norman P

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

    Eigenschaften können nicht als ref übergeben werden, da der Compiler nicht sicher sein kann, dass das Ergebnis eines Ausdrucks tatsächlich als ref übergeben werden kann
    Der Punktoperator ist ein "Ausdruck"
    Eine berechnete Eigenschaft gibt möglicherweise einen Klon zurück, sodass sich eine Byref möglicherweise ohnehin nicht wie erwartet verhält
    Das Ergebnis des Ausdrucks kann zu einem Objekt führen, dessen Besitz sich möglicherweise NICHT in Xojo befindet, sondern in einem Plugin oder einem anderen Speicherbereich

  9. Markus R

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

    Kann ich Morgen mal testen
    also DB auf, Abfrage als RowSet und in eigener Textbox merken, wenn Textbox sich ändert wieder DB updaten, das war deine Idee oder?

    Danach kann ich sagen ob Xojo komisch ist ;)

  10. Sascha C

    Dec 3 Pre-Release Testers, Xojo Pro

    @Markus R Kann ich Morgen mal testen
    also DB auf, Abfrage als RowSet und in eigener Textbox merken, wenn Textbox sich ändert wieder DB updaten, das war deine Idee oder?

    Danach kann ich sagen ob Xojo komisch ist ;)

    Neue Subclasse eines Textfield erstellen, Property (bsp "Binding" des Types RowSet erstellen.
    In einem Modul (klar kann man auch eine Classe erstellen :) ) ein RowSet- Property erstellen und mit einer SQL- Abfrage befüllen.
    Dieses RowSet Textfeld.Bindig zuweisen.

    Du musst das so machen, dass du nicht mit jedem Row- Wechsel Binding neu zuweisst, damit wäre der Sinn nicht erfüllt. Ziel ist es, dass das Textfeld mit Anabe des RowSet´s sich bei Änderungen selbst updaten kann - bei nur einer Zuweisung des RowSet´s.

    Schwer zu erklären :) Aber ich denke, du weißt, worauf es hinaus läuft oder hinaus laufen sollte

    LG
    Sascha

  11. 7 days ago

    Carsten B

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

    @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. ...

    Das ist für Objekte weder das Gleiche noch ist es merkwürdig. Was beim Zuweisen eines Objektes übergeben wird, ist die Speicheradresse auf das Objekt. Diese Adresse wird in einer Variablen gespeichert. Per ByVal wird diese Adresse kopiert, per ByRef wird die Adresse auf die Variable übergeben. Das funktioniert beispielsweise als Methoden-Parameter. Angenommen Du hast innerhalb einer Klasse das Property "Binding", das ein RowSet speichert und übergibst das als Parameter "pBinding" an eine Methode (egal wo sich die befindet), dann macht es zunächst keinen Unterschied, ob ByVal oder ByRef; alle Änderungen an dem RowSet innerhalb dieser Methode wirken gleich. Der Unterschied ist folgender:

    • ByVal: Du kannst pBinding auf Nil setzen oder ein anderes RowSet zuweisen; das wirkt sich nicht auf das Property "Binding" in dem Objekt aus.
    • ByRef: Wird pBinding auf Nil gesetzt, wird damit auch das Property "Binding" auf Nil gesetzt. Wird pBinding ein anderes RowSet zugewiesen, hat danach auch das Property "Binding" dieses RowSet.

    ByRef lässt sich beispielsweise auch dazu verwenden, um mehrere Funktionsergebnisse in Parametern zurückzugeben.

  12. Carsten B

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

    @Sascha Cmer ... Du musst das so machen, dass du nicht mit jedem Row- Wechsel Binding neu zuweisst, damit wäre der Sinn nicht erfüllt. Ziel ist es, dass das Textfeld mit Anabe des RowSet´s sich bei Änderungen selbst updaten kann - bei nur einer Zuweisung des RowSet´s. ...

    Find ich schwer zu verstehen. Oder anders gesagt, verstehe ich nicht.

  13. Carsten B

    Dec 3 Pre-Release Testers, Xojo Pro Germany, NRW, Europe
    Edited 7 days ago

    @Sascha Cmer 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...

    Dementi, das funktioniert in Xojo alles prima und absolut zuverlässig! Ich glaube eher, dass Du (zumindest was Xojo betrifft) "etwas" nicht verstanden oder in diesem Fall einen Denkfehler in deinem Vorgehen hast. Referenzen sind Referenzen und die funktionieren beispielsweise in C nicht anders als in Xojo, egal welchen Compiler Du verwendest.

  14. Norman P

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

    In C wäre ein Verweis ein Zeiger (vielleicht eine Lücke *)

    Dies ist jedoch nicht dasselbe wie byval oder byref, wenn es um Methodenparameter geht

    siehe https://www.great-white-software.com/blog/2019/10/21/byval-and-byref/

  15. Carsten B

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

    Sorry Norman, your blogpost does not explain ByRef in method parameters. This is not the same as object references in general.
    And in C a reference is not a pointer (eine Referenz ist kein Zeiger).

  16. Norman P

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

    Sorry wrong post
    https://blog.xojo.com/2019/01/24/some-follow-up-regarding-byref/
    https://blog.xojo.com/2019/01/23/byref-vs-reference-types/

    In C about the closest you get to a "reference type" would be something accessed via a pointer (which is more or less what you have in a Xojo reference type)

    MOST times there is great confusion about byval & byref and reference types

  17. 6 days ago

    Markus R

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

    @Carsten B ByVal

    byval wurde aber so verstanden das es Dinge kopiert und wenn man den Wert in dieser Kopie ändert wird der nicht
    in der aufrufenden Funktion verändert. Darum finde ich ByVal als Object unpassend und der compiler müsste auf ByRef bestehen.
    Um Objekte im nachhinein zu tauschen/ändern ging es mit gar nicht. In dem Fall hier wollen wir doch mit genau dem offenen RowSet arbeiten. Inhaltlich wechselt es ja nur die DatabaseRow .

  18. Carsten B

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

    ByVal kopiert die Variable/das Property mit der Objekt-Referenz!

    Ich glaube, ich begreife jetzt so langsam, wo bei euch (Markus und Sascha) der Denkfehler liegt: Man kann nicht ein Objekt mehreren Variablen zuweisen und durch eine einzige Zuweisung eines neuen Objekts diese anderen Stellen autom. aktualisieren.

    Sascha, was Du vor hast, ließe sich aber beispielsweise mit einem Funktionszeiger als Delegate realisieren. Anstatt auf das RowSet direkt zuzugreifen, gibst Du als Binding die Funktion an (AddressOf Funktionsname), die als Ergebnis das RowSet liefert, das beispielsweise in einem Property zu einem Fenster gespeichert wird. So kannst Du das RowSet beliebig austauschen und alle Textfelder greifen immer automatisch auf das richtige RowSet zu. Aber um das Aktualisieren der Felder mußt Du dich trotzdem noch kümmern.

  19. Carsten B

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

    Beispielprojekt mit Delegate als Binding

  20. Markus R

    Dec 4 Pre-Release Testers, Xojo Pro Europe / Germany
    Edited 6 days ago

    @Sascha Cmer Neue Subclasse eines Textfield erstellen, Property (bsp "Binding" des Types RowSet erstellen.
    In einem Modul (klar kann man auch eine Classe erstellen :) ) ein RowSet- Property erstellen und mit einer SQL- Abfrage befüllen.
    Dieses RowSet Textfeld.Bindig zuweisen.

    Du musst das so machen, dass du nicht mit jedem Row- Wechsel Binding neu zuweisst, damit wäre der Sinn nicht erfüllt. Ziel ist es, dass das Textfeld mit Anabe des RowSet´s sich bei Änderungen selbst updaten kann - bei nur einer Zuweisung des RowSet´s.

    Schwer zu erklären :) Aber ich denke, du weißt, worauf es hinaus läuft oder hinaus laufen sollte

    LG
    Sascha

    habe ich mal versucht, also das modul macht eine abfrage und merkt sich das ergebniss,
    das ergebniss bekommt die eigene textbox als property.
    den reihenwechsel habe ich mit methoden in dieser textbox gemacht damit du siehst das dieses binding property dort geht.
    beim lostfocus wird das textfeld in die spalte zurück geschrieben mit edit row,save row in die datenbank.
    das rowset bleibt leider unberührt und enthält weiter das sql abfrageergebnis, das ist blöd weil wenn man zurück navigiert hat man wieder die alten daten drin.

    mein test project 2019r2.1
    die sqllite datenbank als link ins project, die wird dann automatisch beim start geöffnet und angesprochen mit database1
    drive.google

  21. Markus R

    Dec 4 Pre-Release Testers, Xojo Pro Europe / Germany
    Edited 6 days ago

    @Carsten B Man kann nicht ein Objekt mehreren Variablen zuweisen und durch eine einzige Zuweisung eines neuen Objekts diese anderen Stellen autom. aktualisieren.

    Keine Ahnung ob er das so vor hatte.
    Er sprach doch nur von einmal zuweisen.

or Sign Up to reply!