Property ByRef mögich?

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

ok, ich versuche es genauer zu erklren :slight_smile:

Ich habe ein Modul namens “Datenbank” in dem die Funktionalitt 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 ausgewhlten 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

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

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

komisch, Objekte werden eigentlich immer als ByRef übergeben

Nein. Default ist byVal.

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?

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

[quote=465837:@Carsten Belling]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?[/quote]

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.

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.

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

Können Deine Controls nicht Observer sein vom RowSet?

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

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.

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

[quote=465847:@Carsten Belling]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.[/quote]

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

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.

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

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.

[quote]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.[/quote]

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.

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

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

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