Kod jest sprawdzony pochodzi z jednego z moich programów.
Ten komunikat:
[C++ Error] Unit1.cpp(34): E2316 'Items' is not a member of 'TStrings' |
dotyczy tego fragmentu kodu:
jest:
- Kod: Zaznacz cały
optionList->Items->Add("coś tam sobie zapisujesz");
powinno być:
- Kod: Zaznacz cały
optionList->Add("coś tam sobie zapisujesz");
Co do tych komunikatów:
[C++ Error] Unit1.cpp(57): E2451 Undefined symbol 'Strings' [C++ Error] Unit1.cpp(57): E2379 Statement missing ; [C++ Error] Unit1.cpp(59): E2451 Undefined symbol 'optionTxt' [C++ Error] Unit1.cpp(71): E2451 Undefined symbol 'optionFile' [C++ Error] Unit1.cpp(83): E2451 Undefined symbol 'Strings' [C++ Error] Unit1.cpp(83): E2379 Statement missing ; [C++ Error] Unit1.cpp(90): E2451 Undefined symbol 'optionTxt' |
to błędy wynikające z błędnej deklaracji zmiennych, gdyż deklarując zmienne typu String pisałem Strings.
Pojawiają się tam drobne literówki, które nieopatrznie wprowadziłem podczas przepisywania kodu. Tam gdzie jest
Strings powinno być oczywiście String, gdyż chodzi o zmienne
String. Błąd pojawia się dwa razy:
w funkcji SaveOptions:
jest:
- Kod: Zaznacz cały
Strings optionTxt = "option.txt"; // nazwa pliku w archiwum, nazwa dowolna
powinno być:
- Kod: Zaznacz cały
String optionTxt = "option.txt"; // nazwa pliku w archiwum, nazwa dowolna
oraz w funkcji LoadOptions:
jest:
- Kod: Zaznacz cały
Strings optionTxt = "option.txt"; /* nazwa pliku w archiwum, ten sam plik, który był wykorzystany do zapisu */
powinno być:
- Kod: Zaznacz cały
Strings optionTxt = "option.txt"; /* nazwa pliku w archiwum, ten sam plik, który był wykorzystany do zapisu */
Co do tego komunikatu:
[C++ Error] Unit1.cpp(76): E2238 Multiple declaration for 'optionFile' |
Oznacza, on że zmienna o nazwie
optionFile została dwukrotnie zadeklarowana, ale ten błąd nie występuje w moim kodzie, wiec to pewnie efekt twoich modyfikacji.
Funkcje zdefiniowane w pliku źródłowym wymagają deklaracji w pliku nagłówkowy, o czym nie pisałem, gdyż sądziłęm, że to oczywiste.
plik nagłówkowy np. Unit1.h:
- Kod: Zaznacz cały
private:
void LoadOptions(void);
void SaveOptions(void);
Kolejny błąd jaki popełniłem modyfikując funkcję do Twoich potrzeb występuje w funkcji SaveOptions:
jest:
- Kod: Zaznacz cały
/* tutaj tworzona jest lista typu TStringList i w niej zapisywane są opcje */
std::auto_ptr<TStrings> optionListt(new TStringList());
optionLista->Items->Add("coś tam sobie zapisujesz");
powinno być:
- Kod: Zaznacz cały
/* tutaj tworzona jest lista typu TStringList i w niej zapisywane są opcje */
std::auto_ptr<TStrings> optionList(new TStringList());
optionList->Add("coś tam sobie zapisujesz");
Co do tego komunikatu:
[C++ Error] Unit1.cpp(90): E2285 Could not find a match for 'TZFBaseArchiver::FindFirst(undefined,TZFArchiveItem,int)' |
to błąd wywołuje ten fragment kodu:
- Kod: Zaznacz cały
if(LoadArchiver->FindFirst(optionTxt, ArchiveItem, faAnyFile - faDirectory))
bierze się stąd, że zmodyfikowałem go do Twoich potrzeb, ale w pomocy jest napisane, że pierwszy argument to wartość typu WideString (mój błąd po podałem wartość typu String). Nie mam też pewności, czy można tutaj podać pełną nazwę pliku, więc możesz to zrobić na dwa sposoby:
pierwszy (niepewny)
- Kod: Zaznacz cały
if(LoadArchiver->FindFirst(optionTxt.c_bstr(), ArchiveItem, faAnyFile - faDirectory))
.c_bstr() - konwersja zmiennej typy String do WideString
drugi (musi zadziałać:
- Kod: Zaznacz cały
if(LoadArchiver->FindFirst("*.txt", ArchiveItem, faAnyFile - faDirectory))
Poprawiłem kod w moim poprzednim poście, ale kopiując go musisz dostosować go do swojego programu.