Indirekter Zugriff auf Variablen [GELÖST]

Alle Fragen zur Programmierung, die nicht in die speziellen Themen passen
Antworten
hansheiser
Foriker
Beiträge: 21
Registriert: Do 30. Mai 2024, 18:02
Kontaktdaten:

Indirekter Zugriff auf Variablen [GELÖST]

Beitrag von hansheiser » So 2. Jun 2024, 16:49

Hi,

bin gerade dabei mein erstes Projekt in Gambas zu erstellen.

Vieles geht super, aber manches (was eigentlich einfach sein sollte) krieg' ich einfach nicht hin.

So auch die indirekte Variablenzuweisung:

bezeichner = _003_name.Value
print bezeichner
zeigt mir den korrekten Inhalt von '_003_name.Value' an.

tnumber = 3
bezeichner = "_00" & tnumber & "_name.Value"
print bezeichner
Zeigt mir immer '_003_name.Value', aber nicht den Inhalt dieses Feldes an.

Bin für jeden Tip dankbar, habe jetzt den ganzen Nachmittag verschiedene Varianten durchprobiert
und recherchiert, aber nichts gefunden.
Zuletzt geändert von hansheiser am Mi 5. Jun 2024, 11:57, insgesamt 1-mal geändert.

Benutzeravatar
Honsek
Foriker
Beiträge: 515
Registriert: Do 4. Okt 2007, 18:01
Kontaktdaten:

Re: Indirekter Zugriff auf Variablen

Beitrag von Honsek » So 2. Jun 2024, 18:22

Hallo hansheiser,

die Arbeit mit Variablen beginnt immer damit, zuerst den Datentyp festzulegen und dann die Wertzuweisungen vorzunehmen. Im gezeigten Beispiel ist nicht ersichtlich, welche Datentypen benutzt werden. Was bedeutet 'indirekter Zugriff auf Variablen'?

Mit dem Satz 'Zeigt mir immer '_003_name.Value', aber nicht den Inhalt dieses Feldes an.' kann ich nicht viel anfangen. Es ist nicht erkennbar, welches Feld gemeint ist? Von welchem Datentyp ist '_003_name' ?

Code: Alles auswählen

Dim sBezeichner As String
Dim iNumber As Integer

iNumber = 3
sBezeichner = "_00" & CInteger(iNumber) & "_name.Value"
Print  sBezeichner
Ausgegeben wird der korrekt zusammengesetzte String: _003_name.Value, der aber nicht als Variablenname verwendet werden kann!

Mit freundlichem Gruß

Honsek
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

hansheiser
Foriker
Beiträge: 21
Registriert: Do 30. Mai 2024, 18:02
Kontaktdaten:

Re: Indirekter Zugriff auf Variablen

Beitrag von hansheiser » So 2. Jun 2024, 19:31

Ok, war vielleicht nicht verständlich genug erläutert, sorry.

Beispielsweise habe ich mehrere Variablen, deren Name folgendermassen aufgebaut ist:

Name1
Name2
Name3
usw.

Die Variablennamen wurden als String deklariert, also

dim Name1 as String
dim Name2 as String
usw.

In diesen Variablen werden zugehörige Namen gespeichert.
Beispielsweise

Name1=Hans
Name2=Peter
usw.

Wenn ich jetzt alle Variablen ausgeben möchte, könnte ich z.B. folgendes schreiben:

Print Name1 -> gibt aus: Hans
Print Name2 -> gibt aus: Peter
Print Name3
usw.

Wenn das allerdings z.B. 100 oder mehr Namen sind wird das
sehr umfangreich.
Das soll also durch eine Routine erledigt werden, die eine
Zahl übergeben bekommt, also in etwas so:

Public Sub PrintName (number as Integer)
dim NameToPrint as String
NameToPrint = "Name"&number
Print NameToPrint
End

Diese Routine würde in diesem Beispiel von einer Schleife angesprungen werden,
z.B. so (oder so ähnlich):

dim i as Integer
for i = 1 to 20
Sub PrintName(i)
next i

Ausgeben werden soll dann

Hans
Peter
usw.

Meine Versuche mit Gambas ergaben jedoch nur folgende Ausgabe:

Name1
Name2
usw.

Das mit der Routine ist jetzt nur schnell für diesen Beitrag dahergeschrieben,
letztendlich aber soll die Routine anhand einer mitgelieferen Nummer den unter
dieser Variable gespeicherten Namen anzeigen/ausgeben.

Dieses Beispiel ist wohlgemerkt nur für diese Anfrage erstellt worden,
letztendlich sollen hiermit andere Variablen verarbeitet werden.


-------------------------------------------------------------------------------------------------------
Zum Verständniss, falls ich mich immer noch nicht klar genug ausgedrückt habe:
Indirekte Variablenadressierung für die Bash (mal auf die Schnelle gegoogelt):

https://stackoverflow.com/questions/392 ... eferencing

gambasso
Foriker
Beiträge: 1336
Registriert: Sa 17. Mär 2012, 09:55
Kontaktdaten:

Re: Indirekter Zugriff auf Variablen

Beitrag von gambasso » So 2. Jun 2024, 19:35

hallo,

die Namen müssen ja irgendwie in die Variablen reinkommen. Wo holst Du diese her?
Gruss

hansheiser
Foriker
Beiträge: 21
Registriert: Do 30. Mai 2024, 18:02
Kontaktdaten:

Re: Indirekter Zugriff auf Variablen

Beitrag von hansheiser » So 2. Jun 2024, 19:51

Wie meinst Du das?

In dem o.g. Beispiel z.B. werden die direkt zugewiesen:

Name1=Hans
Name2=Peter
usw.

Das ist aber für dieses Beispiel auch belanglos.

Bonus
Foriker
Beiträge: 132
Registriert: Mo 18. Mär 2024, 14:38
Kontaktdaten:

Re: Indirekter Zugriff auf Variablen

Beitrag von Bonus » So 2. Jun 2024, 22:54

Gambas Dolmetscher sieht die Namen nicht wirklich so wie wir. Aus Sicht des Interpreters sind die Variablennamen keine Strings, die Stringnamen sind für den Compiler und den Programmierer, aber im laufenden Code ist es etwas mehr, ähm, Digitales.

Hier sind einige Möglichkeiten, Objekte abzurufen und Eigenschaften anhand ihrer Zeichenfolgennamen festzulegen.

Eval?
https://gambaswiki.org/wiki/lang/eval gambas code
tnumber = 3
identifier = "Form1._00" & tnumber & "_name.Value"

Print Eval(identifier)
Window._get() ?
https://gambaswiki.org/wiki/comp/gb.qt4/window/_get gambas code
Dim o As Object = Form1["_003_name"]

Print o.Value
Object.GetProperty() ?
https://gambaswiki.org/wiki/comp/gb/object/getproperty gambas code
tnumber = 3
identifier = "_00" & tnumber & "_name"
prop = "Value"

Print Object.GetProperty(Form1[identifier], prop)
Zuletzt geändert von Bonus am Mo 3. Jun 2024, 13:04, insgesamt 2-mal geändert.
Ich bin Engländer und verwende Google Übersetzer. (Das tut mir leid)

Benutzeravatar
Honsek
Foriker
Beiträge: 515
Registriert: Do 4. Okt 2007, 18:01
Kontaktdaten:

Re: Indirekter Zugriff auf Variablen

Beitrag von Honsek » Mo 3. Jun 2024, 11:15

Hallo.

Gut zu wissen: Ein Array ist eine Menge von Elementen, die über einen Schlüssel vom Typ Integer indiziert werden und in einem Speicher-Block gespeichert sind. Alle Elemente in einem Array haben den gleichen Datentyp und es gibt eine Array-Klasse für jeden nativen Datentyp.

Beispiel-Quelltext:

Code: Alles auswählen

Public Sub ButtonDoPrint_Click()

    Dim sElement As String
    Dim aPlaneten As String[]
    Dim i As Integer

    aPlaneten = New String[]
    
'-- Inline-Zuweisung mit 4 Elementen (Index 0 bis Index 3)
    aPlaneten = ["Merkur", "Venus", "Erde", "Mars"] 
    
'-- Zuweisungen mit Add()-Methode
'-- aPlaneten.Add("Jupiter")
    aPlaneten.Add("Saturn")    
    aPlaneten.Add("Uranus")
    aPlaneten.Add("Neptun")
    aPlaneten.Add("Pluto")

'-- Zuweisung mit Add()-Methode und bestimmtem Index 
    aPlaneten.Add("Jupiter", 4)

'-- Ausgabe 1    
    For Each sElement In aPlaneten
        Print sElement
    Next

    Print "------------------"

'-- Ausgabe 2
    For i = 0 To aPlaneten.Max
        Print aPlaneten[i]
    Next

End
Das sind die korrekten Ausgaben:

Merkur
Venus
Erde
Mars
Jupiter
Saturn
Uranus
Neptun
Pluto
------------------
Merkur
Venus
Erde
Mars
Jupiter
Saturn
Uranus
Neptun
Pluto

Mit freundlichem Gruß

Honsek
Honsek (https://www.gambas-buch.de)
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

hansheiser
Foriker
Beiträge: 21
Registriert: Do 30. Mai 2024, 18:02
Kontaktdaten:

Re: Indirekter Zugriff auf Variablen

Beitrag von hansheiser » Mo 3. Jun 2024, 20:38

Hi,

erstmal vorab vielen Dank für die raschen und kompetenten Antworten.

Die Lösung für _dieses_ Problem kam mit einem Hinweis von Bonus

-> Object.GetProperty()

Da ist mein Feldinhalt von '_00X_name':

Code: Alles auswählen

Dim attr_field As String
Dim prop As String = "Value"

attr_field = "_00" & tnumber & "_name"
Print Object.GetProperty(FMain[attr_field], prop)
Diese ganze Aktion wird wahrscheinlich _letztendlich_ überflüssig sein,
aber ich will mich ja in Gambas einarbeiten.

Ich will/wollte hiermit alle Datenfelder mangels direkter Formatmöglichkeit
in Labels übertragen, so das ich die Felder dann meinen Wünschen entsprechend
formatieren kann (Hintergrundfarbe, Ausrichtung usw.).

Das sollte auch direkt funktionieren, aber ich habe unter den Datenfeldeigenschaften
keine Parameter gefunden (Kann also ein Datenfeld z.B. nicht rechtsbündig ausrichten).

Diese Problematik werde ich aber wohl besser in einem neuen Thread angehen damit's
hier nicht zu unübersichtlich wird.

Crabman
Foriker
Beiträge: 199
Registriert: So 6. Jan 2019, 13:31
Kontaktdaten:

Re: Indirekter Zugriff auf Variablen

Beitrag von Crabman » Mi 5. Jun 2024, 10:28

Moin
Variablen indirekt anzusprechen ist eine praxisfremde und aufwendige Art zu programmieren. Die von Honsek vorgeschlagene Verwendung von Arrays wäre für die vermutlich beabsichtigten Zwecke das Richtige.
"Datenfelder" und "Labels" und deren Formatierung in diesem Zusammenhang zu nennen, macht die Absicht leider völlig undurchsichtig. Der Begriff "Datenfeld" kommt aus der Datenbank-Programmierung und Labels sind GUI-Steuerelemente. Beide haben nichts mit Variablen zu tun. Die bisher verwendeten Namen der Variablen sind zudem ungewöhnlich. Außerdem wurde hier wahrscheinlich ein Thema aus einem anderen Thread eingeflochten, was die Sache noch unübersichtlicher macht. Zudem wurden in diesem anderen Thread offenbar Begrifflichkeiten verwendet, die auf die falsche Fährte führten.

Um unter Vermeidung vom Misverständnissen gezielt und effektiv helfen zu können und eine Empfehlung für die Einarbeitung in Gambas abgeben zu können, wäre die Kenntnis über Deine bestehenden Erfahrungen im Bereich Objekt-orientierter-Programmierung, der Sprache Basic oder anderer Sprachen, der Verwendung von Arrays und eine Beschreibung des aktuellen Projektes hilfreich.

Viele Grüße
Crabman

hansheiser
Foriker
Beiträge: 21
Registriert: Do 30. Mai 2024, 18:02
Kontaktdaten:

Re: Indirekter Zugriff auf Variablen [GELÖST]

Beitrag von hansheiser » Mi 5. Jun 2024, 12:36

Hi,
Variablen indirekt anzusprechen ist eine praxisfremde und aufwendige Art zu programmieren.
Die von Honsek vorgeschlagene Verwendung von Arrays wäre für die vermutlich beabsichtigten Zwecke das Richtige.
Arrays zu benutzen ist sicher nicht verkehrt.
In diesem Fall leiten sich die Feld-/Variablennamen
allerdings aus Feldnamen bereits bestehender Datenbanken
her. Da das eine ganze Menge Felder mit spezifischen Namen
sind, wäre das logistisch sehr aufwendig diese in Arrays zu
übertragen. So kann ich die mit ihren ursprünglichen Namen
verarbeiten - für mich wesentlich einfacher.

Variblen indirekt anzusprechen -wenn's denn für den
Anwendungsfall passt- hat mir bisher noch nie Probleme bereitet.

Bash-Scripting z.B. hat keinerlei Probleme damit.

Aber das sind meine Erfahrungen, es hat sicher auch Vorteile
Arrays zu verwenden. Kommt halt immer auf den Anwendungsfall an.

"Datenfelder" und "Labels" und deren Formatierung in diesem Zusammenhang zu nennen,
macht die Absicht leider völlig undurchsichtig. Der Begriff "Datenfeld" kommt aus der
Datenbank-Programmierung und Labels sind GUI-Steuerelemente. Beide haben nichts mit Variablen zu tun.
Tut mir leid wenn ich mich nicht verständlich ausgedrückt habe.
Felder, welche ich aus einer SQL-Datenbank in Gambas in einem
Datacontrol-Feld anzeige sind für mich 'Datenfelder'.
Wenn ich diese hier zur besseren Verständlichkeit anders nennen
soll, gerne. Wie wäre die korrekte Bezeichnung?

Die bisher verwendeten Namen der Variablen sind zudem ungewöhnlich.
Die Namen der Variablen leiten sich aus den Datenbank-Feldnamen
bereits vorhandener SQL-Datenbanken her, für welche dieses Programm
als Frontend dienen soll.

Außerdem wurde hier wahrscheinlich ein Thema aus einem anderen Thread eingeflochten,
was die Sache noch unübersichtlicher macht.
Nein. Wie kommst Du darauf?

Um unter Vermeidung vom Misverständnissen gezielt und effektiv helfen zu können und eine
Empfehlung für die Einarbeitung in Gambas abgeben zu können, wäre die Kenntnis über Deine
bestehenden Erfahrungen im Bereich Objekt-orientierter-Programmierung, der Sprache Basic
oder anderer Sprachen, der Verwendung von Arrays und eine Beschreibung des aktuellen Projektes hilfreich.
Damit das hier nicht ausufert, verweise ich bezüglich meines aktuellen Projekts auf den Thread
'Datacontrol-Felder formatieren'. Dort habe ich dieses erläutert.

Objektorientiert Programmierung, Basic, Arrays kenne ich.

Hatte unter Linux probiert dieses Frontend mit OOBase umzusetzen: gruselig.

Eine Weile hatte ich unter Xojo programmiert, leider haben die
den Editor für mich unbenutzbar gemacht.

Programm-/Datenbankmässig habe ich füher auch etwas umfangreichere Sachen
(Mehrbenutzersysteme) u.A. unter Superbase (falls das noch jemand kennt)
erstellt.

Crabman
Foriker
Beiträge: 199
Registriert: So 6. Jan 2019, 13:31
Kontaktdaten:

Re: Indirekter Zugriff auf Variablen [GELÖST]

Beitrag von Crabman » Mi 5. Jun 2024, 12:55

Danke! Das half. Schlage vor, dass wir hier einen Strich drunter ziehen und zum Datenbank-Thread wechseln.
Viele Grüße
Crabman

Antworten

Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 0 Gäste