2016-09-27 3 views
-1

대부분의 경우 델파이를 C++로 변환 할 수 있지만이 것은 다소 골치 거리가 있습니다. 어쩌면 당신 중 일부가 도울 수 있습니다.이 델파이 코드를 C++ 빌더로 변환 할 수있는 방법이 있습니까?

이 링크에서 볼 수있는 것처럼, Embarcadero (FMX)의 TListView에서 새로운 기능을 참조하는 here. Delphi보다 C++에 훨씬 익숙하기 때문에 저는 C++ Builder를 사용합니다. 대부분의 경우 번역 및 이해하고 대안을 찾아야합니다.

procedure TForm1.FormCreate(Sender: TObject); 
I: Integer; 
begin 
// ListView1 uses a classic Appearance 
for I in [0..63] do 
with ListView1.Items.Add do 
begin 
    Text := Format('%d pages', [1000 + Random(1234567)]); 
    Detail := Format('%d kg of paper', [1000 + Random(1234)]); 
    ImageIndex := Random(ImageList1.Count); 
end; 

// ListView4 uses a dynamic appearance with items named 
// Text1, Detail1, Portrait 
for I in [0..63] do 
with ListView4.Items.Add do 
begin 
    Data['Text1'] := Format('%d pages', [1000 + Random(1234567)]); 
    Data['Detail1'] := Format('%d kg of paper', [1000 + Random(1234)]); 
    Data['Portrait'] := Random(ImageList1.Count); 
end; 
end; 

end. 

내가 고민하고 섹션이 번역되는 방법

with ListView4.Items.Add do 
begin 
    Data['Text1'] := Format('%d pages', [1000 + Random(1234567)]); 
    Data['Detail1'] := Format('%d kg of paper', [1000 + Random(1234)]); 
    Data['Portrait'] := Random(ImageList1.Count); 
end; 

, 또는 단순히 C에없는 존재 ++ 않는이 기능은 다음과 같습니다 그러나 나는 여기 붙어?

+1

정확히 붙어있는 것 –

+0

답변 : 예, 방법이 있습니다.

+1

왜 그렇습니까? C++ B는 Delphi 코드를 컴파일 할 수 있습니다. 따라서이 형식을 많이 다시 만들어야 만 때까지 그대로 두십시오. –

답변

1

뷰 TListView의 항목 속성의 자녀입니다() 함수를 추가 사용 . 그런 다음 item의 Data 속성에 TValue가 필요하므로 문자열에 넣거나 다른 항목에서 TValue를 가져와야합니다. 이 작업의 성능을 향상시키기 위해 ListView에 항목을 추가 할 위치를 지정하기 전에 BeginUpdate()를 사용하고 EndUpdate()를 사용해야합니다.

ListView4->BeginUpdate(); 

TListViewItem* item = ListView4->Items->Add(); 
UnicodeString string1 = "content of the String"; 

item->Data["Text1"] = TValue::From<UnicodeString>(string1); 
item->Data["Detail1"] = TValue::From<UnicodeString>(string1); 
item->Data["visitTime"] =TValue::From<int>(Random(ImageList1->Count)) 

ListView4->EndUpdate(); 
+0

적어도이 사람이 저에게 errormessages를주지 않았습니다 ... –

3

With 종류에는 이름이없는 변수와 범위가 있습니다. C++에서는 명시 적이어야합니다. 델파이 프래그먼트는

var 
    li: TListItem; 
begin 
    li := ListView4.Items.Add; 
    li.Data['Text1'] := Format('%d pages', [1000 + Random(1234567)]); 
    li.Data['Detail1'] := Format('%d kg of paper', [1000 + Random(1234)]); 
    li.Data['Portrait'] := Random(ImageList1.Count); 
end; 

과 같습니다 (나는 엉망이되지 않으면 :-)). 이 같은

+0

많은 사람들이 악마의 산란으로'with'를 고려해야한다는 것에 유의하십시오. 요즘에는 훨씬 다양한 범위, 특히 객체 범위로 인해 버그를 찾기가 매우 어려워 질 수 있습니다. 예전에는 스코프가 훨씬 쉽게 따라갈 때 워스 (Wirth)가 파스칼을 고안했을 때 단순화와 최적화로서 의미가있었습니다. –

+0

@RudyVelthuis 나는 여전히 적당한 것으로 생각한다. DRY/Single Responsibility 원칙에 따라 좋은 최적화를 사용한다. C++에서는 begin/end 블록마다 새로운 변수를 선언 할 수 있습니다. 파스칼은 그것을 금지합니다. 많은 현대 언어들에서 나는 하나의 할당 var를 가질 수있다.'const const F = Self.Canvas.Font;와 비슷하다. F.Style : = ...; ...; 끝 - 델피는 아직 그것을 가지고 있지 않다. 어떤면에서 'With'는 Delphi에서 부족한이 두 기능을 대체합니다. 즉, "암시 적 변수"는 익명의 과용이 있기 때문에 With는 악몽으로 변하기 쉽습니다. –

+1

이상하게도 OP는 그가 ListView4.Items.Add 섹션에서 붙어 있다고 언급했습니다. 하지만 거의 같은 코드를 가진 첫 번째 섹션'ListView1.Items.Add do'에 대해서는 언급하지 않았습니다 ...이 답변에 +1을 주었지만이 사실과 @Davids 주석은'with '가 문제가 아니라고 생각하게했습니다 . – kobik

0

시도 뭔가 : 당신은 당신이 첫번째 항목 개체 (TListViewItem *)를 만들 필요가있는 ListView에 항목을 추가 할

// Never use the OnCreate event in C++, 
// use the class constructor instead... 
__fastcall TForm1::TForm1(TComponent *Owner) 
    : TForm(Owner) 
{ 
    // ListView1 uses a classic Appearance 
    for(int i = 0; i < 64; ++i) 
    { 
     TListViewItem *Item = ListView1->Items->Add(); 
     Item->Text = Format(L"%d pages", ARRAYOFCONST((1000 + Random(1234567)))); 
     Item->Detail = Format(L"%d kg of paper", ARRAYOFCONST((1000 + Random(1234)))); 
     Item->ImageIndex = Random(ImageList1->Count); 
    } 

    // ListView4 uses a dynamic appearance with items named 
    // Text1, Detail1, Portrait 
    for(int i = 0; i < 64; ++i) 
    { 
     TListViewItem *Item = ListView4->Items->Add(); 
     Item->Data[L"Text1"] = Format(L"%d pages", ARRAYOFCONST((1000 + Random(1234567)))); 
     Item->Data[L"Detail1"] = Format(L"%d kg of paper", ARRAYOFCONST((1000 + Random(1234)))); 
     Item->Data[L"Portrait"] = Random(ImageList1->Count); 
    } 
} 
+1

'C++에서 OnCreate 이벤트를 사용하지 마십시오'??? –

+2

@ Arioch'OnCreate' *는 파생 클래스가 생성되기 전에 기본 클래스 생성자에서 트리거 될 수 있습니다. 이는 Delphi에서는 괜찮지만 C++에서는 불법입니다. 'OnDestroy'는 파생 된 클래스가 파괴 된 후에 기본 클래스 소멸자에서 트리거 될 수 있으므로 * 비슷한 * 불법적 인 동작을합니다. 다시 Delphi에서는 괜찮지 만 C++에서는 불법입니다. 이제 부여 된 동작은'OldCreateOrder' 속성에 연결됩니다. * 보통 * false입니다 (항상 그런 것은 아니지만!). 그러나 문제를 피하는 것이 가장 좋으며 C++에서'OnCreate'와'OnDestroy'를 절대 사용하지 마십시오. 항상 사용하십시오 대신에 생성자와 소멸자. –

+0

흥미 롭습니다 .... C++ 에서처럼 항상 'OldCreateOrder' 방식으로 된 것처럼 들립니다 .... 한번 더'AfterConstruction'과'BeforeDestruction' 서브 루틴이 AH의 밝은 통찰력이었던 것을 봅니다. 추신 : 여기에 또 다른 주입 지점이 있습니다. - Loaded() 메소드. 나는 그것을 생성자보다 오버라이드하는 것을 선호하지만, 맛의 문제이다. –

관련 문제