Property ByRef mögich?

  1. ‹ Older
  2. 7 months ago

    Norman P

    3 Dec 2019 Testers, Xojo Pro outside admiring the sunshine,...

    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

  3. Markus R

    3 Dec 2019 Testers, Xojo Pro Europe / Germany / Lower Saxon...

    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 ;)

  4. Sascha C

    3 Dec 2019 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

  5. Carsten B

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

  6. Carsten B

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

  7. Carsten B

    3 Dec 2019 Testers, Xojo Pro Germany, NRW, Europe
    Edited 7 months 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.

  8. Norman P

    3 Dec 2019 Testers, Xojo Pro outside admiring the sunshine,...

    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/

  9. Carsten B

    3 Dec 2019 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).

  10. Norman P

    3 Dec 2019 Testers, Xojo Pro outside admiring the sunshine,...

    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

  11. Markus R

    4 Dec 2019 Testers, Xojo Pro Europe / Germany / Lower Saxon...

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

  12. Carsten B

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

  13. Carsten B

    4 Dec 2019 Testers, Xojo Pro Germany, NRW, Europe

    Beispielprojekt mit Delegate als Binding

  14. Markus R

    4 Dec 2019 Testers, Xojo Pro Europe / Germany / Lower Saxon...
    Edited 7 months 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

  15. Markus R

    4 Dec 2019 Testers, Xojo Pro Europe / Germany / Lower Saxon...
    Edited 7 months 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!