Variablenwert als Variablenname benutzen - Wie?
-
Hallo Akari,
nein das meine ich nicht. Sorry habe mich bischen falsch ausgedrückt.
Also ich habe eine Variable "Artikelnummer" mit dem Wert "1001".
Ich möchte jetzt statt
Artikelmenge = Form1->1001menge->Text;
es über eine Variable machen. Das in einer Variablen die Artikelnummer steht. Und ich diesen Werte dann mit menge "verknüpfe" um an den Wert von 1001menge zu kommen.
Artikelmenge = Form1->"'+Artikelnummer+'"+menge->Text;
War das jetzt einigermaßen verständlich??
Gruß
EPMS
-
Hallo
achso.
zuersteinmal : Komponenten per Name kannst du mit TForm->FindComponent() finden.
Allerdings müßen dazu diese Komponenten schon vorhanden sein.
Dir würde vielleicht dieses Thema aus der FAQ weiterhelfen
http://www.c-plusplus.net/forum/viewtopic.php?t=39211
Da geht es um das dynamische Erstellen und Zurordnen von Controlsbis bald
akari
-
Hallo akari,
mir gehts eigentlich darum, ob ich den Wert einer Variablen als Variablenname benutzen kann.Was muß ich schreiben, damit an dieser Stelle
Artikelmenge = Form1->"'+Artikelnummer+'"+menge->Text;
auch der Wert von "Artikelnummer genommen wurd und mit "menge" verknüpft wird.
Gruß
EPMS
-
Soweit ich mich errinere gabs sowas in c++ nicht...
-
Gibt's nicht?? Das wäre schade.
Also nochmoal genauer. Ich habe eine Datenbank mit Artikeln. Unter anderem auch die Artikelnummer mit dem Aufbau 1001, 1002, 2001, ... .
In meinem Formular habe ich jetzt für jeden Artikeln ein Edit-Feld wo man die Menge eingeben muß. Die Edit-Felder haben folgende Namen 1001menge, 1002menge, 2001menge, ... .Jetzt wollte ich die Daten aus der DB abfragen und mit einer Schleife alle Mengen-Felder abfragen. Dafür muß ich aber aber den Wert der Artikelnummer aus der DB als Variablenname haben. Sonst müsste ich alles in If-Abfragen packen. Was ziemlich blöd wäre.
Konnte man das jetzt nachvollziehen??
Gruß
EPMS
-
der Name eine Komponmente, Klasse, Variable darf nicht mit einer Ziffer
anfangen. Zudem versteh ich nicht was du überhaupt erreichen willst. Warum
kann das Eingabefeld, indem sich die Artikelnummer befindet, nicht einfach
"Artikelnummer", "txtArtikel" oder so ähnlich heißen?
-
ich kann die Eingabe-Felder da ja auch "menge1001" nennen.
Erreichen will ich:
Auf meinem Formular habe ich momentan 15 Artikel wo man anklicken kann ob das bestellt werden soll und die dazu gehörige Menge.
Also 15 mal das Mengenfeld. Wenn ich das so habe muß ich 15 If-Schleifen machen und abfragen ob der Artikel bestellt werden soll und wenn ja wieviele davon.Das wollte ich umgehen und in eine Schleife packen wo ich die Artikel mit der Artikelnummer aus einer Datenbank lese. Mit den Artikelnummern kann ich dann die einzelnen Felder aus dem Formular abfragen.
Dafür wollte ich das machen.
Gruß
EPMS
-
ich verstehe zwar noch nicht ganz was du damit erreichen willst (tipp: wieso einfach wenns komplizert geht
)
undEPMS schrieb:
15 If-Schleifen
eher ne if-verzweigung..
ich gehe mal davon aus das du 15 TEdit brauchst, um die menge anzugeben..
du kannst ja die durch DynamicArray in ein Array packen und somit ganz einfach ansteuern...DynamicArray<TEdit*>edMenge; ... .. .. for (int iCounter = 0; iCounter < edMenge.Length(); iCounter++) { if((edMenge[iCounter]->Text !="")&&(edMenge[iCounter]->Text !="0") { iMenge = StrToInt(edMenge[iCounter]->Text); } }
oder so ähnlich..
-
und wie spreche ich die Edit Felder an?? Was ich noch vergessen habe. Ich habe vor jeder Menge eine Checkbox. Nur wenn die Checkbox für einen Artikeln angehakt ist brauche ich die Menge.
Habe eben raus gefunden das das was ich suche in PHP geht. Dort heißt das "Varable Variablen".
Gruß
EPMS
-
schau dazu mal in die FAQ -> Dynamische Arrays
oder letzte woche wurde das thema auch erst gerade in min 2 Threads behandelt..
-
Ausserdem wählst du einen viel zu "menschlichen" Ansatz mit deiner Namensgebung. Ich würde mich an deiner Stelle mal etwas genauer mit Zeigern auseinander setzen. Zeiger sind genau was du suchst.
Der PC nämlich, der braucht gar keine Namen. Dem reichen auch adressen. Namen sind nur für (aus maschinen Sicht dümmliche) Menschen wie wir.-junix
-
akari schrieb:
Hallo
achso.
zuersteinmal : Komponenten per Name kannst du mit TForm->FindComponent() finden.
Allerdings müßen dazu diese Komponenten schon vorhanden sein.
Dir würde vielleicht dieses Thema aus der FAQ weiterhelfen
http://www.c-plusplus.net/forum/viewtopic.php?t=39211
Da geht es um das dynamische Erstellen und Zurordnen von Controlsbis bald
akariDas ist doch genau das was du willst.
Du suchst eine Komponente, die "Menge1001" heißt. Also:TEdit* menge=dynamic_cast<TEdit*>(Form1->FindComponent("Menge"+IntToStr(Artikelnummer))); if(menge!=NULL) { Artikelmenge=StrToInt(menge->Text); }
-
@-=]xXx[=-
Hallo, ich weiß das Thema ist schon etwas her. Danke für deinen Tipp. Denke das es funktionieren müsste.
Kann ich das auch so ändern, dass ich nicht überprüfe ob ein Edit Feld leer ist oder nicht, sondern ob bei einer Checkbox der Haken an ist oder nicht?Danke im voraus.
Gruß
EPMS
-
Hallo
du hast da was falsch verstanden. mit
if(menge!=NULL)
wird nicht überprüft, ob das Edit-Control inhaltlich leer ist, sondern ob überhaupt eine gültige Instanz durch den dynamic_cast gekommne ist. Diese Überprüfung must du immer machen. Wenn diese Überprüfung erfolgreich war, kannst du dann mit der gültigen Instanz machen was du willst, seis es nun bei TEdits die Text-Eigenschaft oder bei TCheckBox die Checked-Eigenschaft.
bis bald
akari
-
Hallo,
Das finde ich aber reichlich umständlich und wenig performant (FindComponent). Man könnte ja auch im Konstruktor (oder ähnliches) sich eine map mit allen vorhandenen Editfeldern erzeugen und dann darüber zugreifen.
std::map<AnsiString,TEdit*> editmap; //map erzeugen // map füllen (nur einmal) for( int i=0; i<Form1->ComponentCount; ++i) { TEdtit* edit = dynamic_cast<TEdit*>(Form1->Components[i]); if( edit != 0 ) editmap[edit->Name] = edit; } // Zugriff später dann so (wenn edit sicher vorhanden) Artikelmenge=StrToInt(editmap["Menge"+IntToStr(Artikelnummer)]->Text);
Der Zugriff funktioniert aber nur wenn das angegebene edit vorhanden ist. Ansonsten müsste man über find suchen und bei Nichtvorhandensein einen Fehler ausgeben.
Ähnlich ginge das dann auch für die Checkboxen.
Ich finde aber auch das ganze Konzept etwas ungünstig und vor allem schlecht erweiterbar. Wenn du die Artikel in einer Datenbank sind, nutze die Datenbankkomponenten (TDBGrid u.a.).
-
Wie könnte ich mein Problem denn besser lösen, wenn meine Idee oder die Vorschläge hier nicht so gut sind?
DBGrid nützt mir bei der Problematik überhaupt nicht. Über das Programm werden Bestellungen eingegeben. Und in den Edit Felder steht halt die Stückzahl die von einem Produkt bestellt wurden sind.
Der Vorschlag von -=]XXX[=- kommt dem was ich Suche schon sehr nahe.
Werde das mal ausprobieren.Gruß
BeTZe