Property ByRef mögich?

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

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 :wink:

[quote=465873:@Markus Rauch]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 ;)[/quote]

Neue Subclasse eines Textfield erstellen, Property (bsp “Binding” des Types RowSet erstellen.
In einem Modul (klar kann man auch eine Classe erstellen :slight_smile: ) 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 :slight_smile: Aber ich denke, du weißt, worauf es hinaus läuft oder hinaus laufen sollte

LG
Sascha

[quote=465868:@Markus Rauch]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. …[/quote]

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.

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

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.

In C wre ein Verweis ein Zeiger (vielleicht eine Lcke *)

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/

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

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

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 .

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, liee 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 mut Du dich trotzdem noch kmmern.

Beispielprojekt mit Delegate als Binding

[quote=465875:@Sascha Crämer]Neue Subclasse eines Textfield erstellen, Property (bsp “Binding” des Types RowSet erstellen.
In einem Modul (klar kann man auch eine Classe erstellen :slight_smile: ) 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 :slight_smile: Aber ich denke, du weißt, worauf es hinaus läuft oder hinaus laufen sollte

LG
Sascha[/quote]

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

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