gksqjs94 님이 쓰신 글 :
: for(int i = 10; i> -11; i--)
: {
: TDateTime day = Now();
: day = IncYear(day,-i);
: Year->Items->Add(day.FormatString("yyyy"));
: }
: Year->ItemIndex=10;
:
:
: ... 이렇게 하니까 됐네요
:
:
:
: gksqjs94 님이 쓰신 글 :
: : 안녕하세요
: : 제가 하고싶은건 지금 년도 에서 1~10 년 전이랑 1~10년후 까지 하나의 콤보박스에 넣고 현재 년도를 기본인덱스로 설정하고싶어요.
: :
: : int j = 0;
: : for(int i = 1; i< 22; i++)
: : {
: : TDateTime day = Now();
: : TDateTime day2 =Now();
: : if(i<11)
: : {
: : day = IncYear(day,-i);
: : Year->Items->Add(day.FormatString("yyyy"));
: : }
: : else
: : {
: : day2 = IncYear(day2,j);
: : Year->Items->Add(day2.FormatString("yyyy"));
: : j++;
: : }
: : }
: : 이렇게 짜니까 들어가긴하는데 코드도 더러워보이고 딱봐도 뭔가 어거지로 맞춘듯한 느낌이들어요 ..ㅠ
: : 어떻게 하면 깔끔히 짤수 있을까요 ?
: :
: : ps .그리고 저렇게 넣으면 2009년부터 2019년까지 아래에서 위로 올라가고 2020년부터 다시 2009년부터 아래로 써지더라구요
: : 위에 한줄은 제가 읽어도 이해가 잘되지않네요..
: :
답변:
아래와 같이 헤더 포함하고... C++17 테크닉 이용해서 간단하게 구현할 수 있지요.
std::stringstream, std::generate_n, std::string은 STL template으로 정의되어 있음.
#include <algorithm>
#include <sstream>
#include <string>
using namespace std;
using OI = std::ostream_iterator< WORD >;
SYSTEMTIME dt; GetLocalTime(&dt);
stringstream ss;
generate_n((dt.wYear -= 10, OI(ss, "\n")), 21, [&dt]() { return dt.wYear++;});
ComboBox1->Items->Text = ss.str().c_str();
ComboBox1->ItemIndex = 10;
소스코드가 상당히 간단한데, 굳이 설명을 하자면...
현재 연도 기준으로 +- 10년을 사용하므로... 도합 21개의 Item이 사용되는 거고...
TComboBox의 ItemIndex는 zero 베이스 이므로... 현재 연도 인덱스는 10이 되고.
std::stringstream은 Container가 아닌 plain 스트림 클래스이므로...
back_inserter 대신, std::ostream_iterator<> Iterator를 사용해야 하고.
VCL 프레임웍이 파스칼이 아닌 C++로 구현되어 있으면 5번 라인은 전혀 필요없으나
VCL 프레임웍이 파스칼로 구현되어 있기 때문에 어쩔수 없이 사용돼야 하고.
C++17 테크닉 이용해서 VCL 프레임웍을 구현하면, 파스칼로 구현되어 있는 것 보다
3분의1로 크기를 확 줄여서 더 작고 효율적인 프레임웍 구현이 가능할 텐데...
지금까지 엠바 돌아가는 꼬라지를 보아서는 의미 없는 기대.
델파이 프레임웍에 의존성을 갖고있는 이와 같은 기형적인 구조에서는...
C++20, C++24가 나온다고 하더라도...
module, concept, range 등의 C++ 랭귀지 파워를 프레임웍 레벨에서 써 먹을 수 없는 구조