Eigene Funktion
-
Hallo C++ Gemeinde,
in einer Ereignisfunktion (Button1Click(TObject *Sender)) möchte ich eine selbst geschriebene Funktion aufrufen. Zur Zeit weiß ich nicht, wie ich an diese Funktion 3 AnsiString Variable übergeben soll.
Code etwa so :
void __fastcall Button1Click(TObject *Sender)
{
AnsiString a,b,c;
LadeSql(a,b,c);}
void __fastcall LadeSql(TObject *Sender,????????)
{
a = "23.05.2005 6:00:00";
b = "24.05.2005 6:00:00";
c = "Select * from ... where StartDatum = '"+a+"'and EndDatum = '"+b+"'";
}Bitte um Vergebung, wenn das mglw. eine triviale Frage ist.
Gruß
Christian
-
void LadeSql(AnsiString a,AnsiString b,AnsiString c) { }
-
Besser,
void LadeSql(const AnsiString& a, const AnsiString& b, const AnsiString& c) { }Konstante Referenzen vermeiden unnötige Kopien.
http://tutorial.schornboeck.net/funktionen2.htm
http://tutorial.schornboeck.net/referenzen.htm
-
Hallo gnumn,
danke für Deine Hilfe. Ich hab das jetzt so gemacht und erhalte nun :
[ILINK32 Fehler] Error: Nicht auflösbares externes 'TForm1::LadeSql(System::AnsiString, System::AnsiString, System::AnsiString)' referenziert von E:\PROJEKTE\START\DEBUG\UNIT1.OBJ
Was kann ich tun ?
Gruß
Christian
-
Ich würde mal sagen, hier passen Deklaration (im Header) und Definition (in der cpp) nicht zusammen. Evtl. stimmen die Parameterlisten nicht überein.
-
Hallo Braunstein,
Danke für Deine Antwort. Ja, das ist sicher richtig. Ich hatte die Funktionsdeklaration von LadeSql() im Abschnitt public der Klassendefinition von TForm1 untergebracht.
Nun steht void LadeSql(....) vor der Klassendefinition und der Linker Fehler ist weg. Leider wird die 1. Variable (a) zwar innerhalb der Funktion LadeSql mit dem Sql-String gefüllt, nach dem Rücksprung ist in a aber nichts enthalten.
Ich probiere nun mal Deinen Vorschlag mit der const - Variante.
Gruß
Christian
-
das liegt daran, das du nur kopien übergibst. Diese übergebenen AnsiStrings werden wie lokale Parameter behandelt. du hast zwei Möglichkeiten:
- du deklarierst diese Ansistrings global (in deiner *.h) (nicht ganz sauber)
dann musst du sie nicht übergeben, kannst sie in deiner funktion aber benutzen
- oder du übergibst die Adressen der Variablen (Call by Referenz)mfg stephan
-
Hallo Braunstein und menel
nochmal Dank für Eure Hilfe. Jetzt läuft es. Habe void LadeSql(...) zu AnsiString LadeSql(...) umdefiniert und in LadeSql eine lokale AnsiString Variable angelegt. Jetzt klappt es auch mit der Rückgabe des Strings mit "eingemergtem" Start und Ende Datum.
Gruß
Christian
-
menel schrieb:
- du deklarierst diese Ansistrings global (in deiner *.h) (nicht ganz sauber)
Ganz und gar nicht sauber! Vergiß das besser schnell wieder.
Ich würde die Rückgabe eher im typischen Stil machen. Über den Rückgabeparameter...
[EDIT] zu langsam, ich sollte während des postens nicht telefonieren...
-
Braunstein schrieb:
void LadeSql(const AnsiString& a, const AnsiString& b, const AnsiString& c) { }Konstante Referenzen vermeiden unnötige Kopien.
Mhh, ich habe bisher immer Zeiger dafür verwendet und mit Refrenzen eigentlich noch garnichts gemacht.
http://tutorial.schornboeck.net/zeiger.htmDanke für den Hinweis, werde jetzt wohl das mal öfter einsetzen.
-
Wollts gleichmal ausprobieren
statt
MyFunc(AnsiString Filename, TListView *ListView)
nun
MyFunc(AnsiString &Filename, TListView &ListView)Nun will er das man überall
ListView->Items->Count
in
ListView.Items->Count
abändert.Begründung?

-
Listview ist ein Zeiger. Also musst du den auch weiterhin so übergeben. Konstante Referenzen machen nur bei Nichtzeigerobjekten Sinn. Also
MyFunc(const AnsiString& Filename, TListView *ListView)Die Compilermeldung ist auch logisch. Auf Member von Zeiger auf Structs/Klassen greift man über -> beim Rest mit . zu.
-
Stimmt. Alles klar
