자몽에이슬 님이 쓰신 글 :
: 컴포넌트 예제가 델파이 뿐이라... 이걸 빌더로 바꿔야 하는데
:
: 문법을 몰라 한번 여쭤봅니다..
: 예제는 TMS 라는 상용 컴포넌트에 있는거구요
: Grid에 combo 버튼을 넣고 combo 버튼에 이미지를 넣는겁니다.
:
: =============델파이 원문 =======
: procedure TForm1.AdvStringGrid1GetEditorProp(Sender: TObject; ACol,
: ARow: Integer; AEditLink: TEditLink);
: {
: with (AEditLink as TColumnComboEditLink).Combo do
: ComboItems.Items[0].ImageIndex := 1;
: ComboItems.Items[1].ImageIndex := 0;
:
: }
: 대략 이런 함수가 있는데 ..
:
:
: ColumnComboEditLink 라는 컴포넌트가 따로 있으며 이 컴포넌트 프로퍼티에 Item을 넣을수가 있습니다.
:
:
: 첫줄에서 턱... 하고 막히는데요..
: 이제와서 문법 더 공부하자니.. 꽤 힘들군요..
: 첫줄 with (AEditLink as TColumnComboEditLink).Combo do 요것만 변환이 가능하면 나머지는 어떻게든 알아서 하겠는데
: 잘 모르겠네요..
: 나름 타입케스팅 해서 하는것 같은데 ..
:
: 연초에 새해복 많이 받으시구요 ..
:
: 잘 모르는 중생 하나 구재 부탁 드립니다..
:
:
:
답변:
델파이 파스칼 랭귀지에서 with 는 소스작성 노가다?를 줄이기 위한 소스레벨에서의 alias 기능에 불과 합니다.
만약 C++빌더가 C++17을 지원했더라면...
if ( auto s = dynamic_cast<TColumnComboEditLink *>(AEditLink); s)
{
s->Combo->ComboItems->Items[0]->ImageIndex = 1;
s->Combo->ComboItems->Items[1]->ImageIndex = 0;
}
위와 같은 신텍스를 유용하게 써먹었을 수 있었을 텐데...
C++빌더는 아직 C++17 지원하지 않음
C++17 기능을 이용하려면 Visual C++ 2017에서 /std:c++17 옵션을 사용하거나
clang 5.0 이상을 사용해야 함.
현재 최신 버전인 Rad Studio 10.2.2도... C++ 컴파일러는 아직까지 clang/llvm 3.3.1에서 벗어나지 못하고 있음.
C++17 랭귀지 파워를 이용해서 코드를 더 간략하게 작성하는 예를 들면...
아래와 같은 코드도 더 간략하게 작성할 수 있지요.
void fun(std::string id, std::unique_ptr<Foo> foo)
{
auto it = items.find(id);
if (it == items.end())
{
auto p = items.emplace(std::move(id), std::move(foo));
p.first->second->launch();
}
else
{
standby.push_back(std::move(foo));
standby.back()->wait_for_notification();
}
}
// C++17 랭귀지 파워를 이용하면 위에서 작성된 기존의 코드를 더 간략하게 작성할 수 있음.
void fun(std::string_view id, std::unique_ptr<Foo> foo)
{
if (auto [pos, inserted] = items.try_emplace(id, std::move(foo)); inserted)
pos->second->launch();
else
standby.emplace_back(std::move(foo))->wait_for_notification();
}
|