Eigene Funktion



  • 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.htm

    Danke 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 🙂


Anmelden zum Antworten