Edit1->Text Übergabe per "call by reference" ???
-
-
... ok, Zusatzerläuterung:
wenn ich das was ich vorhabe auf diese weise schreibe:
void Funktion(AnsiString &Wert) { .... Wert = "test"; }und es anschliessend so aufrufe:
AnsiString temp; Funktion(temp); Edit1->Text = temp;dann ist alles in Ordnung !!
ich wollte nur fragen warum ich es nicht so schreiben kann :
Funktion(Edit1->Text);( wenn ich es so schreibe wird der Wert in Edit1 nicht verändert ... )
bzw. was muss ich ändern damit dies funktioniert ???
( bei Einem Parameter ist es nicht so tragisch eine Temporäre Variable einzufügen, aber was ist, wenn ich 5 oder mehrere Parameter habe und die Funktion öffters aufrufen will ?? )

-
und was ist so schwer es so zu versuchen??
void Funktion(AnsiString &Wert) { .... Wert = "test"; Edit1->Text = Wert; //UpdateData nicht vergessen ;) } Funktion( meinevariable );
-
Skatepirat schrieb:
...
( bei Einem Parameter ist es nicht so tragisch eine Temporäre Variable einzufügen, aber was ist, wenn ich 5 oder mehrere Parameter habe und die Funktion öffters aufrufen will ?? )

naja kommt drauf an was du machen willst
entweder du machst eine fkt
Funktion_verändere_alle_felder();
und in dieser dann veränderst halt alle variablenoder du tust funktionen überladen
Fkt( CString a, CString b);
Fkt( CString a);
Fkt( CString a, CString b, CString c);
oder machst eine mit allen parametern
Fkt( int a, int b, int c, int d, int e ); // für 5 felder und rufst dann so auf wenn du nur erstes und letzen feld verändern willstFkt( 1,0,0,0,1); // bei 1 wird verändert bei 0 nicht
oder was weiss ich, es gibt zig möglichkeiten. die editfled variable ist ja in der ganzen BspDlg.h vorhanden. deswegen kannst die variable auch direkt verändern in einer fkt die in BspDlg.h drin ist.
musst also nicht extra den wert des editfeldes der fkt übergeben nur um es dann da zu verändern.
-
... Funktionen entwirft man , zum einem dafür dass man einen Algorythmus der sich wiederholt nicht jedesmal neu schreiben muss ...
nichts gegen deinen Vorschlag , aber wenn ich es so mache , kann ich auf die Funktion gleich verzichten , und es direkt eingeben ...
Es geht mir nicht darum wie man die Edit-Box beschreibt !!
Das weiss ich ja , siehe Beispiel in meiner ersten anfrage ...es geht darum dass ich eine Funktion habe, die liefert mir ein paar Werte zurück und zwar als AnsiString , die Funktion selbst hat mit der Ausgabe nichts am Hut, denn sie ist universell geschrieben ...
das Edit - Beispiel habe ich auch nur deshalb genommen weil es einfach ist , aber wenn es möglich ist , kann man es sicher auch für andere Komponenten einsetzen ...
hier noch ein Beispiel:
void Funktion(&A,&B,&C) { // Hier steht natürlich einiges mehr drin !!! A="test1"; B="test2"; C="test3"; } AnsiString A,B,C,D,E,F,G,H,I; A="A"; B="B"; C="C"; // und jetzt der Aufruf Funktion(A,B,C); Funktion(D,E,F); Funktion(G,H,I); // jetzt wollte ich lediglich wissen ob ich die gleiche Funktion // unter anderem dafür verwenden kann : Funktion(A,B,Edit1->Text) // nochmal : auf diese Weise scheint es ja // nicht zu klappen , ich wollte wissen ob das // überhaupt möglich ist es auf diese Weise zu // verwenden , und falls ja wie !Warum das ganze überhaupt:
in meiner Funktion steht wie gesagt etwas mehr drin , und zwar lese ich RegistryEinträge ( es werden insgesammt später ca.30-50 Stück oder mehr ...)
und nun wollte ich die Funktion nicht wegen ein paar Edits nochmal schreiben
und da es im Prinzip ebenfalls ein AnsiString ist, hat es mich schon aus reiner Neugier interessiert ob dies Möglich ist.
Ich hoffe das ich mein Problem nun zufriedenstellend schildern konnte...ich finde es traurig dass jeder , der Edit1 liest gleich meint er hat einen Trottel vor sich der zum erstem mal den Compiler vor sich hat...
Wenn jemand etwas nicht versteht, habe ich nichts dagegen ihm eine Frage zu erklären. Dann sollte man allerdings erstmal ne Frage stellen , und nicht gleich versuchen das Gegenüber als untauglich oder lächerlich darzustellen ... Denn: das bringt keinen von uns weiter ...
Gruß Skatepirat
-
Hallo,
natürlich würde das klappen, wenn Edit1->Text vom Typ AnsiString ist, und da du nichts von einem Compiler-Fehler geschrieben hast, ist das C++ - technisch gesehen alles korrekt. Aber, und jetzt kommen wir vielleicht zu den entscheidenden Punkten, jede Klassenbibliothek zur Windows-Programmierung erledigt die tatsächliche optische Aktualisierung des Inhalts des Edit-Controls (was du wahrscheinlich meintest, was nicht klappt) auf andere Weise, und, was noch wesentlicher ist, für die Beantwortung dieser Frage (wie aktualisiert man den Inhalt auch optisch) befindest du dich im falschen Forum, weil es hier um, ich zitiere den Foren-Titel, "MFC mit dem Visual C++"-Compiler geht (und für MFC, eine andere Klassenbibliothek, hat dir newkid mit UpdateData(FALSE) die Lösung angedeutet, was dir natürlich nichts nützt)!!

weswegen zumindest ich die Antwort darauf nicht weiß, aber wahrscheinlich ziemlich viele im Borland-Forum, wenn ich AnsiString und die Bezeichnung deines Edit-Controls richtig interpretiere

Skatepirat schrieb:
ich finde es traurig dass jeder , der Edit1 liest gleich meint er hat einen Trottel vor sich der zum erstem mal den Compiler vor sich hat...
das war und ist nicht der Punkt, nur kann nicht jeder aus deinen Angaben herauslesen, was dein Problem war (es ist ja alles korrekt, werden Referenzen in einer Funktion geändert, dann wird auch die referenzierte Variable geändert, nur gibt es eben die eigentliche Änderung und zusätzlich die "Sichtbarmachung" dieser Änderung in der Anwendung/Oberfläche, das sollte dir bewußt sein, und ich glaube zumindest, daß ich aus deinen Angaben herauslesen konnte, daß dieses das Problem ist), und auch noch erkennen, daß du im falschen Forum bist.
MfG
-
ok, wusste nicht das du dich gleich damit angegriffen fühlst oder wie auch immer. war nicht meine absicht. ehrlich
ich hab dir auch nicht zeigen wollen wie man die editbox beschreibt. klar hätte die fkt. einen super algor. in meinem falle ausführen können und dann beschreiben.
nur was mich ein bissle dazu verleiten hat, nicht super freundlich zu schreiben ( und jetzt kommt der punkt wie ich dir doch helfen könnte) ist die tatsache
das es sich für mich so angehört hat, das du eine editbox hast wo der user was eingibt ( z.b. benutzernamen ect. ) und dann unten auf abspeichern oder wie auch immer klickt, und dann die box beschrieben wird ( z.b. der algorith. den namen in eine datenbank abzulegen ( trivial ) und dann auszugeben ( Ihr name wurde abgespeichert )
das hat mich ein wenig stutzig gemacht. denn idr sollte man eingabeboxen ( für eingaben ) und ausgabenboxen ( für ausgaben ) benutzen und man kann zwar sollte man nicht ein/aus boxen benutzen, vom design her.
aber kann auch sein das du nur eine ausgabebox hast, dann diese mit der fkt immer wieder veränderst ( z.b. aussentemp, cpu last ... ) dann musst aber trozdem nicht die fkt ( hole text aus der box, verändere diese, schreibe diese wieder rein ) benutzen sondern die variable direkt verändern.
-> da denk ich, ist das von der logik her bei borland nicht viel anders, als mfc ( ausser halt die klassen bib. und namen ) oder musst die variable wirklich von der box holen ( ablesen ) und dann verändern ?!?! wenn ja würde das nur sinn machen wenn die ( "reinschreibung" ) nicht in deiner hand ist ->d.h. ein user "dynamisch" was reintippt, aber dann bitte auch eine andere box benutzen
aber wahrscheinlich willst du eventl. keine editboxen verwenden. denn es geht dir ja ums prinzip. aber dann wähle auch eine andere überschrift beim next post, der zutreffender ist und nicht die sache mit editfeldern einschränkt.und nochwas als tipp den du schreibst ja:
---------
es geht darum dass ich eine Funktion habe, die liefert mir ein paar Werte zurück und zwar als AnsiString , die Funktion selbst hat mit der Ausgabe nichts am Hut, denn sie ist universell geschrieben ...
---------dann kannste eine fkt machen
fkt_algorithmus();
fkt_ausgabe();dann hast beide universell und musst sie halt hintereinander aufrufen oder
fkt_kombifkt(); die beide enthält
also hoff ich dir mit diesem post ein bischen geholfen zu haben was die denkweise betrifft, und die implementierungsfrage ( klassen ect. ) dann halt wo anders hinterfragen musst wie probe nutzer es schon sagte
-
.. jetzt kommen wir derSache langsam näher... :c)
Probe-Nutzer: Danke ! Die Idee mit dem aktualisiern des Bildschirmes werde
ich gleich ausprobieren, daran habe ich noch gar
nicht gedacht ...
Ansonsten muss ich es warsch. im Borland-Forum Probieren.newkid: schön das wir (endlich) auf gleiche Wellenlenge
kommen konnten :c)
wenn ich eine Ausgabe Funktion schreibe, brauche ich wieder eine
Variable mehr um die Werte zu übergeben ... Ausserdem ging es
mir wie Du schon richtig erkannt hast um das Prinzip..
Ich habe den Eintrag absichtlich auf Edit1 "beschränkt" weil ich
mir dachte das es ein einfaches Element ist :c).
Ich möchte das der User im Programm eine Eingabe macht,(Es geht um ein Backupprogramm, also sollen z.B.
Verzeichnissnamen eingegeben werden,wenn ich das gleich am
Anfang verraten hätte , hätte man mich warsch. auf das
API-Forum verwiesen, da bin aber warsch. auch falsch...)bei erneutem Programmstart sollen die Eingabeboxen nicht vom
User immerwieder neu beschrieben werden (was ziemlich nervig
wäre) :c) sondern die Eingaben vom letzem mal gleich übernommen
werden. Da habe ich mir gedacht ich schreibe sie an die Stelle
an der ich es abgefragt habe.. Jetzt alles klar ?Danke nochmal für alle Tips !
-
ok gerne geschehen
aber eine frage hab ich da noch an dich
wie machst du das??? der user gibt den pfad an
beim nächsten programm start wird dies übernommen.
also wenn das prog beendet wurde gehen ja alle varialben flöten.
also entweder su speicherst das. oder reg. oder ( bei mfc gibts auch ne merke fkt ) aber wie machst du das von hand, wenn du nichts abspeicherst?
weil wenn du eh abspeichserst, dann musst ja beim programmstart ja nur rauslesen und pfad wieder reinschreiben ( in die box )also endweder ich hab was verpasst, oder es gibt einfachere wege die ich nicht kenne

-
newkid:
der user gibt den pfad an, dann ab damit in die registry, beim neustart wird
mit einer Funktion Schlüssel für Schlüssel ausgelesen und zurückgeschrieben ... Deshalb wollte ich es ja so:FunktionLeseRegSchlüssel(Schlüsselname,Edit1->Text)anwenden, und das geht eben nicht ...
ich muss es also so machen:AnsiString A; FunktionLeseRegSchlüssel(Schlüsselname,A); Edit1->Text=A;Es ist eigentlich kein Problem es so zu schreiben , ( bis auf die Tatsache dass ich pro Aufruf eine Zeile mehr habe ) aber mir ging es ums Prinzip...
Probe-Nutzer:
Es geht auch nicht mit anschliessendemEdit1->Repaint();
-
Skatepirat schrieb:
Es geht auch nicht mit anschliessendem
Edit1->Repaint();
das mag sein, aber das ist dann ein Problem, das im anderen Forum sicher besser beantwortet werden kann, und nichts mit der von dir technisch korrekten Übergabe einer Referenz und der Änderung des referenzierten Wertes in einer Funktion zu tun hat. Ich kann dir hierzu leider nichts weiteres sagen, gut möglich, daß man bei Borland noch etwas anderes tun muß, als nur Repaint.
MfG
-
Ich verschieb dich jedenfalls mal ins richtige Forum ....
-
Dieser Thread wurde von Moderator/in dEUs aus dem Forum MFC mit dem Visual C++ in das Forum Borland C++ Builder (VCL/CLX) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
@Skatepirat
Mach doch Deine Funktion so:
FunctionBlaBla(TEdit * Edit)
{
Edit->Text="Hallo, so klappt's ja
";
}
-
Genau das will er aber nicht, da seine Funktion allgemein ist!
Ich glaube das mit dem Edit geht desshalb nicht, da Edit1->Text in wirklichkeit keine Variable ist, sondern eine Funktion (GetText;SetText).
In diesem Fall funktioniert das mit der Referenz nicht.Oder irre ich mich da?
-
Nein, du irrst dich nicht. Genau das ist der Punkt.
-
Beide falsch!!!
Text ist eine PROPERTY, die mit Funktion verknuepft ist!
Dascgeht nur mit REFERENZ auf TEDIT!!!

-
-=]xXx[=- :
Du hast mich genau richtig verstanden ! Ich wollte eben nur wissen ob das geht oder nicht ...Das heisst also dass Funktion auf diese Weise :
Funktion(setzeTextvonEdit());
keinen Parameter an setzeTextvonEdit() übergeben kann.
mfG
-
DerAltenburger schrieb:
Beide falsch!!!
Text ist eine PROPERTY, die mit Funktion verknuepft ist!
Ach ne... Edit1->Text als R-Wert ist aber nichts weiter als ein Rückgabewert einer Funktion. Dieser Wert steht aber wo ganz anders im Speicher als der Text vom Edit.
-
Skatepirat schrieb:
Funktion(setzeTextvonEdit());
Du meinst wohl Funktion( HoleTextVonEdit() )