C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[75590] Re:Re: C++17 테크닉 이용해서 간단하게 구현하는 방법
빌더(TWx) [builder] 2293 읽음    2019-09-19 00:11
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++ 랭귀지 파워를 프레임웍 레벨에서 써 먹을 수 없는 구조


+ -

관련 글 리스트
75586 날짜 더하는 코드간단(?)화 질문이요 gksqjs94 2177 2019/09/18
75587     Re:날짜 더하는 코드간단(?)화 질문이요 gksqjs94 2184 2019/09/18
75590         Re:Re: C++17 테크닉 이용해서 간단하게 구현하는 방법 빌더(TWx) 2293 2019/09/19
75610             Re:Re:Re: C++17 테크닉 이용해서 간단하게 구현하는 방법 질문 2186 2019/09/23
75588         Re:Re:날짜 더하는 코드간단(?)화 질문이요 정성훈.해미 2204 2019/09/18
75589             Re:Re:Re:날짜 더하는 코드간단(?)화 질문이요 gksqjs94 2179 2019/09/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.