Προς το περιεχόμενο

Listview στη C++


georginos1989

Προτεινόμενες αναρτήσεις

  • Απαντ. 62
  • Δημ.
  • Τελ. απάντηση

Η μορφή του TDateTime ως αλφαριθμητικού μπορεί να καθοριστεί με την βοήθεια της ρουτίνας .FormatString. Έτσι για παράδειγμα αν θέλουμε οι όροι μέρα & μήνας της ημερομηνίας να παρουσιάζονται σε διψήφια μορφή (nn) ενώ του έτους σε τετραψήφια (nnnn), αρκεί να εισάγουμε ως παράμετρο της .FormatString το αλφαριθμητικό "dd/mm/yyyy":

 

>
[..]
const UnicodeString MyDateFrm = "dd/mm/yyyy";

wcout << "Today   = " << Now().FormatString(MyDateFrm).w_str()<<endl;
wcout << "-7 days = " << IncDay(Now(), -7).FormatString(MyDateFrm).w_str()<<endl;
wcout << "-1 month= " << IncMonth(Now(), -1).FormatString(MyDateFrm).w_str()<<endl<<endl;
[..]

ΕΞΟΔΟΣ:

 

>
Today   = 14/01/2011
-7 days = 07/01/2011
-1 month= 14/12/2010

 

Για περισσότερες λεπτομέρειες σχετικά με τις παραμέτρους που δέχεται η TDateTime.FormatString θα πρέπει να συμβουλευτείς την τεκμηρίωση του C++ Builder.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 3 μήνες μετά...

#include <vcl.h>

#include <DateUtils.hpp>

#include <iostream.h>

#pragma hdrstop

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <tchar.h>

//---------------------------------------------------------------------------

 

using namespace std;

 

#pragma argsused

int main()

{

cout << "Today = " << Now().DateString().w_str()<<endl;

cout << "-7 days = " << IncDay(Now(), -7).DateString().w_str()<<endl;

cout << "-1 month= " << IncMonth(Now(), -1).DateString().w_str()<<endl<<endl;

 

cout << "Press Enter to exit";

 

getch();

}

 

Εγραψα το παραπανω αλλα πεταει linker error

 

[iLINK32 Error] Error: Unresolved external '__fastcall Strhlpr::UnicodeFree(System::UnicodeString&)' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\7.0\LIB\DEBUG\VCLE.LIB|ustring

[iLINK32 Error] Error: Unresolved external '__fastcall Dateutils::IncDay(const System::TDateTime, const const int)' referenced from C:\DOCUMENTS AND SETTINGS\GIORGOS\ΤΑ ΈΓΓΡΑΦΆ ΜΟΥ\RAD STUDIO\PROJECTS\DEBUG\FILE4.OBJ

[iLINK32 Error] Error: Unresolved external '__fastcall Sysutils::Now()' referenced from C:\DOCUMENTS AND SETTINGS\GIORGOS\ΤΑ ΈΓΓΡΑΦΆ ΜΟΥ\RAD STUDIO\PROJECTS\DEBUG\FILE4.OBJ

[iLINK32 Error] Error: Unresolved external '__fastcall Sysutils::IncMonth(const System::TDateTime, int)' referenced from C:\DOCUMENTS AND SETTINGS\GIORGOS\ΤΑ ΈΓΓΡΑΦΆ ΜΟΥ\RAD STUDIO\PROJECTS\DEBUG\FILE4.OBJ

[iLINK32 Error] Error: Unresolved external '__fastcall Sysutils::DateToStr(const System::TDateTime)' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\7.0\LIB\DEBUG\VCLE.LIB|datetime

[iLINK32 Error] Error: Unresolved external '__fastcall Strhlpr::UnicodeAssign(System::UnicodeString&, System::UnicodeString&)' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\7.0\LIB\DEBUG\VCLE.LIB|ustring

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όπως έχω γράψει στο παρελθόν, αν θέλεις να χρησιμοποιείς την VCL σε προγράμματα κονσόλας θα πρέπει να μαρκάρεις το "Use VCL" στο New Console Application wizard διαφορετικά θα έχεις πρόβλημα κατά το linking.

 

vclconsolesettings.png

 

Επίσης αφού στο cout περνάς w_str() θα πρέπει να χρησιμοποιήσεις την Unicode εκδοχή του δηλαδή την wcout ή να αλλάξεις το w_str() σε c_str() (ANSI).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Χωρίς to use vcl δεν γίνετε με καποιον αλλο τρόπο?

 

Επειδή χρησιμοποιώ στο πρόγραμμα το το std::string με την vcl μηπως υπάρξει προβλημα?

 

Το c_str() δεν δουλευει με το cout

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Χωρίς to use vcl δεν γίνετε με καποιον αλλο τρόπο?

Όχι, δεν μπορείς να χρησιμοποιήσεις classes της VCL δίχως να δηλώσεις "Use VCL" στο New Console Application wizard.

Επειδή χρησιμοποιώ στο πρόγραμμα το το std::string με την vcl μηπως υπάρξει προβλημα?

Όχι, δεν υπάρχει πρόβλημα καθώς άλλο το VCL String και άλλο το C++ STL std::string.

Το c_str() δεν δουλευει με το cout

Σε εμένα δουλεύει σωστά, ως:

> cout << "Today = " << Now().DateString().c_str()<<endl;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπορείς να το κάνεις ως (ASCII):

>string stl_string = Now().DateString().c_str();

ή (Unicode)

>wstring stl_string = Now().DateString().w_str();

οπότε από εκεί και πέρα την διαχειρίζεσαι ως ένα απλό STL string.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπορείς να το κάνεις ως (ASCII):

>string stl_string = Now().DateString().c_str();

ή (Unicode)

>wstring stl_string = Now().DateString().w_str();

οπότε από εκεί και πέρα την διαχειρίζεσαι ως ένα απλό STL string.

 

Εμένα δε νιώθει

 

[bCC32 Error] File4.cpp(14): E2285 Could not find a match for 'string::basic_string(const string&)'

Full parser context

File4.cpp(14): parsing: int main(int,char * *)

 

Μονο το wstring δουλευει

Αυτό είναι ίδιο με το απλό string ή θα υπάρχει κάποιο πρόβλημα? Γιατι στο προγραμμα χρησιμοποιώ τα std::string

 

wstring stl_string = Now().DateString().w_str();

std::string s;

s=stl_string;

 

Μαλλον οχι ε?

Για αν γραψω το παραπανω παεταει αυτο

 

[bCC32 Error] File4.cpp(16): E2285 Could not find a match for 'operator string::=(wstring)'

Full parser context

File4.cpp(14): parsing: int main(int,char * *)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Φτιάξε ένα νέο Console Project, μαρκάρισε την χρήση της VCL όπως σου υπέδειξα και πάνω στο νέο, καθαρό, σκελετό (template) που θα δημιουργήσει ο C++ Builder χτίσε τον κώδικα σου και όλα θα δουλέψουν κανονικά.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το κανα απο την αρχή όπως είπε χωρις να πειραξω τπτ μονο προσθετα πραγματα

 

//---------------------------------------------------------------------------

 

#include <vcl.h>

#include <DateUtils.hpp>

#include <iostream>

 

#pragma hdrstop

 

#include <tchar.h>

//---------------------------------------------------------------------------

 

#pragma argsused

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

 

string stl_string = Now().DateString().c_str();

cout << "Today = " << Now().DateString().c_str()<<endl;

wcout << "-7 days = " << IncDay(Now(), -7).DateString().w_str()<<endl;

wcout << "-1 month= " << IncMonth(Now(), -1).DateString().w_str()<<endl<<endl;

 

wcout << "Press Enter to exit";

cin.get();

return 0;

 

}

//---------------------------------------------------------------------------

 

χτυπαει στην πρωτη γραμμη

 

[bCC32 Error] File4.cpp(18): E2285 Could not find a match for 'string::basic_string(const string&)'

Full parser context

File4.cpp(16): parsing: int main(int,char * *)

 

και στην πρωτη cout εμφανιζει οτι ναναι

 

Εγω χρησιμοποιώ embarcadero 2010 εσύ τι χρησιμοποιείς και τρέχει

 

Μονο αυτό δουλευει

wstring st2_string = Now().DateString().w_str();

 

Βρήκα εγώ τρόπο για να μετατρέπω το wstring se string.. Ειναι ο παρακατω

 

#include <vcl.h>

#pragma hdrstop

#include <DateUtils.hpp>

#include <iostream>

#include <tchar.h>

#include <string>

#include <algorithm>

//---------------------------------------------------------------------------

using namespace std;

#pragma argsused

 

 

std::string WStringToString(const std::wstring& s)

{

std::string temp(s.length(), ' ');

std::copy(s.begin(), s.end(), temp.begin());

return temp;

}

 

int _tmain(int argc, _TCHAR* argv[])

{

 

wstring s = Now().FormatString("yyyy-mm-dd").w_str() ;

string s1;

s1=WStringToString(s);

cout<<s1<<endl;

 

 

wcout << "Press Enter to exit";

cin.get();

return 0;

}

//---------------------------------------------------------------------------

 

Δουλευει μια χαρα αυτος στη main αλλά όταν περνας τις συναρτησεις σε unit μεσα σε καποια κλάση χτυπαει ένα λαθος κατι για _Αserte καπως έτσι

 

Μηπως υπάρχει καποιος άλλος τρόπος να παιρνω την ημερομηνια σε string σε μορφή yyyy/mm/dd ?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

[..]

Εγω χρησιμοποιώ embarcadero 2010 εσύ τι χρησιμοποιείς και τρέχει

[..]

Μονο αυτό δουλευει

wstring st2_string = Now().DateString().w_str();

[..]

Μηπως υπάρχει καποιος άλλος τρόπος να παιρνω την ημερομηνια σε string σε μορφή yyyy/mm/dd ?

Χρησιμοποιώ τον C++ Builder 2009 και C++ Builder 6.0 όπου εκεί ο παραπάνω κώδικας εκτελείται επιτυχώς όμως ...

 

Όσον αφορά το σφάλμα του compiler, συμπεριέλαβε την εντολή "#include <string>" στις δηλώσεις headers του προγράμματος διότι βλέπω ότι δεν την έχεις συμπεριλάβει αλλά δηλώνεις το string σκέτο και πες μου αν το πρόβλημα διορθωθεί!

 

---

 

Από εκεί και πέρα, η πιο απλή μέθοδος μετατροπής του Date σε yyyy/mm/dd υπό τις παρούσες συνθήκες είναι (διότι θα μπορούσες να το κάνεις πιο απλά ως αλλάζοντας το "mm/dd/yyyy" σε "yyyy/mm/dd"):

>
#include <vcl.h>
#include <DateUtils.hpp>
#include <iostream>

#pragma hdrstop

#include <tchar.h>
//---------------------------------------------------------------------------

#pragma argsused
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
char szDate[bUFSIZ];
sprintf(szDate, "%.4d/%.2d/%.2d", YearOf(Now()), MonthOf(Now()), DayOf(Now()));

cout << szDate;

cin.get();
return 0;
}

και αν δεν δουλέψει αυτό, τότε σε Unicode:

>
#include <vcl.h>
#include <DateUtils.hpp>
#include <iostream>

#pragma hdrstop

#include <tchar.h>
//---------------------------------------------------------------------------

#pragma argsused
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
wchar_t wszDate[bUFSIZ];
swprintf(wszDate, L"%.4d/%.2d/%.2d", YearOf(Now()), MonthOf(Now()), DayOf(Now()));

wcout << wszDate;

cin.get();
return 0;
}

 

Και εδώ μια ρουτίνα που επιστρέφει string ως yyyy/mm/dd:

>
//---------------------------------------------------------------------------

#include <vcl.h>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <DateUtils.hpp>
#pragma hdrstop

#include <tchar.h>
//---------------------------------------------------------------------------
using namespace std;

string _ReturnDate(void);

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
cout << "_ReturnDate: " << _ReturnDate() << endl;

cin.get();
return 0;
}
//---------------------------------------------------------------------------
string _ReturnDate(void)
{
stringstream ss;
TDate Today = (TDate)Now();

ss << setfill('0') << YearOf(Today) << "/"
   << setw(2) << MonthOf(Today) 	<< "/"
   << setw(2) << DayOf(Today);

return ss.str();
}

 

Τέλος, δοκίμασε και αυτόν τον κώδικα και πες μου αν στην έκδοση 2010 λειτουργεί:

>
//---------------------------------------------------------------------------

#include <vcl.h>
#include <DateUtils.hpp>
#include <iostream>
#include <string>

#pragma hdrstop

#include <tchar.h>
//---------------------------------------------------------------------------

#pragma argsused
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
wstring stl_string = Now().DateString().w_str();
wcout << "Today = " << stl_string<<endl;
wcout << "-7 days = " << IncDay(Now(), -7).DateString().w_str()<<endl;
wcout << "-1 month= " << IncMonth(Now(), -1).DateString().w_str()<<endl<<endl;
string asciistr = Now().DateString().c_str();
cout << "ASCII = " << asciistr<<endl<<endl;

wcout << "Press Enter to exit";
cin.get();
return 0;

}
//---------------------------------------------------------------------------

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δουλευουν όλα εκτός απο την τελευταία περίπτωση που χτυπαει

 

[bCC32 Error] File4.cpp(22): E2285 Could not find a match for 'string::basic_string(const string&)'

Full parser context

File4.cpp(17): parsing: int main(int,char * *)

 

Σε console Με χρήση της vcl δουλεύουν...

 

Απλά με προβληματίζει το γεγονός επειδή το project έχει στηθεί χωρίς χρήση της vcl. Βασικά τωρα νομιζω δεν θα υπαρχει πρόβλημα γιατί αν αλλάξουμε ΄μονο το unit της main και το κανουμε με vcl και προσθέσουμε στο προτζεκτ τα units των κλασσεων δε νομιζω να υπαρχει προβλημα

 

Σε λιγο καιρό που θα προστεθεί gui δεν ξέρω αν θα πεχτει κανένα πρόβλημα.. Τι λες?

 

επίσης στο προηγούμενο παραδειγμα στην απαντηση #56 το σφαλμα που βγαζει όταν τα περασω μέσα στο προτζεκτ που εχουμε κανει ειναι

 

[bCC32 Error] autoargs.h(45): E2268 Call to undefined function '_ASSERTE_'

Full parser context

main.cpp(29): #include c:\program files\embarcadero\rad studio\7.0\include\vcl\DateUtils.hpp

DateUtils.hpp(15): #include c:\program files\embarcadero\rad studio\7.0\include\vcl\System.hpp

System.hpp(840): #include c:\program files\embarcadero\rad studio\7.0\include\vcl\sysclass.h

sysclass.h(84): #include c:\program files\embarcadero\rad studio\7.0\include\vcl\sysvari.h

sysvari.h(1434): #include c:\program files\embarcadero\rad studio\7.0\include\autoargs.h

autoargs.h(34): class TAutoArgsBase

autoargs.h(79): decision to instantiate: Variant & operator TAutoArgsBase::[](int) const

--- Resetting parser context for instantiation...

autoargs.h(41): parsing: Variant & operator TAutoArgsBase::[](int) const

 

Βασικά και αυτά που μου δειξες εσυ μόλις τα δοκιμασα στο προτζεκτ και χτυπαει στο ιδιο λαθος

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δουλευουν όλα εκτός απο την τελευταία περίπτωση που χτυπαει

 

[bCC32 Error] File4.cpp(22): E2285 Could not find a match for 'string::basic_string(const string&)'

Full parser context

File4.cpp(17): parsing: int main(int,char * *)

 

Σε console Με χρήση της vcl δουλεύουν...

 

Απλά με προβληματίζει το γεγονός επειδή το project έχει στηθεί χωρίς χρήση της vcl. Βασικά τωρα νομιζω δεν θα υπαρχει πρόβλημα γιατί αν αλλάξουμε ΄μονο το unit της main και το κανουμε με vcl και προσθέσουμε στο προτζεκτ τα units των κλασσεων δε νομιζω να υπαρχει προβλημα

 

Σε λιγο καιρό που θα προστεθεί gui δεν ξέρω αν θα πεχτει κανένα πρόβλημα.. Τι λες?

 

επίσης στο προηγούμενο παραδειγμα στην απαντηση #56 το σφαλμα που βγαζει όταν τα περασω μέσα στο προτζεκτ που εχουμε κανει ειναι

 

[bCC32 Error] autoargs.h(45): E2268 Call to undefined function '_ASSERTE_'

Full parser context

main.cpp(29): #include c:\program files\embarcadero\rad studio\7.0\include\vcl\DateUtils.hpp

DateUtils.hpp(15): #include c:\program files\embarcadero\rad studio\7.0\include\vcl\System.hpp

System.hpp(840): #include c:\program files\embarcadero\rad studio\7.0\include\vcl\sysclass.h

sysclass.h(84): #include c:\program files\embarcadero\rad studio\7.0\include\vcl\sysvari.h

sysvari.h(1434): #include c:\program files\embarcadero\rad studio\7.0\include\autoargs.h

autoargs.h(34): class TAutoArgsBase

autoargs.h(79): decision to instantiate: Variant & operator TAutoArgsBase::[](int) const

--- Resetting parser context for instantiation...

autoargs.h(41): parsing: Variant & operator TAutoArgsBase::[](int) const

 

Βασικά και αυτά που μου δειξες εσυ μόλις τα δοκιμασα στο προτζεκτ και χτυπαει στο ιδιο λαθος

 

Όπως σου εξήγησα από την αρχή, όταν καλείς οτιδήποτε έχει να κάνει με VCL οφείλεις στην περίπτωση που πρόκειται για Project κονσόλας να ορίζεις την χρήση της στις ρυθμίσεις του (δεν φτάνει ένα απλό #include <vcl.h>) διαφορετικά δεν πρόκειται να λειτουργήσει τίποτε σωστά.

 

Από εκεί και πέρα, όταν πας σε GUI αναγκαστικά η VCL θα συμπεριληφθεί και εφόσων αυτά που έχεις ήδη φτιάξει δουλεύουν όταν συμπεριλάβεις ρητά στο Project σου την χρήση της, θα δουλέψουν και εκεί.

 

--

Σχετικά με την _ASSERTE_, φαίνεται ανεπίτρεπτο σφάλμα βαθιά στα header των βιβλιοθηκών του μεταφραστή, υποθέτω λοιπόν ότι πρέπει να προέρχεται από διάφορες αλχημείες κατά την συγγραφή του κώδικα / project (χρήση ή μη σωστή δήλωση της VCL κλπ). Αλλά καθώς δεν διαθέτω τον C++ Builder 2010 δεν μπορώ να πω τίποτε περισσότερο από αυτό.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.


  • Δημιουργία νέου...