2013-09-29 4 views
3

많은 계산을 처리하기 위해 하나의 Delphi XE2 프로젝트가 있습니다.
내 프로젝트에서 총 1290 번호는 Edit, 숫자는 Label, 숫자는 Panel, 숫자는 TabSheet입니다. Edit 각각에 대해 OnChange, OnDblClick, OnEnterOnExit 이벤트가 있습니다.Delphi 메모리 부족 오류를 어떻게 해결합니까?

나는 총 1034 개의 숫자를 Variable으로 처리해야합니다. 방금 Form을 설계했지만 계산 논리를 추가하지 않았습니다. 이제 .pas file62.5MB이되어 1815057 라인 인.dfm file1.98 MB이되어 65540 라인 인이됩니다.

Windows XP Professional SP3 32Bit 아래 Delphi XE2을 사용하여 프로젝트를 컴파일하려고하는데 오류가 **[DCC Fatal Error] Unit1.pas(1815058): F2046 Out of memory**으로 표시됩니다.

또한 Delphi XE5을 사용하여 컴파일하려고 시도했습니다. Windows 8 Enterprise 64Bit 아래에서 같은 문제가 발생합니다.

1034 개의 변수를 사용하여 전체 계산 논리를 추가하지 않았습니다. 추가 할 경우 적어도 4200 4200 라인.pas file에 추가됩니다.

+8

음, 무엇을 기대 했습니까? 180 만 줄의 코드가있는 단일 소스 파일이 있습니다. 추상적 인 방법을 배워야합니다. .dfm 파일에 1200 개의 편집 컨트롤을 만들지 마십시오. 런타임에 생성하십시오. 탭 시트가 표시된 경우에만 탭을 만듭니다. 모든 편집에는 단일 OnChange 이벤트 핸들러를 사용하십시오. 'Sender' 매개 변수의 동작을 전환하십시오. 매 옵션 하나 하나를 손으로 코딩하는 대신 행동을 추상화하는 방법을 배워야합니다. 뭔가를 바꾸고 싶을 때 일어나는 일을 상상해보십시오. –

+2

코드가 악취를냅니다. :-) 1.8M LOC가있는 단일 장치는 잘못되어 1290 편집 컨트롤이 있습니다. 사용자가 볼 수있는 방법이 없으므로 항상 존재할 필요가 없습니다. 디자인을 심각하게 재고해야합니다. 실제로 코드를 관리하기 전까지는 오류를 수정하지 않습니다. 당신에게 행운이 있기를 간절히 바란다. 왜냐하면 너는 그것을 필요로하기 때문이다. :-) –

+0

어떻게 프로그램을 만들었습니까? 손으로 직접 작성할 수는 없습니다. 그 코드를 생성하는 프로그램을 작성하셨습니까?해당 프로그램의 아이디어를 가지고 미리 컴파일 단계가 아닌 런타임에 구현하십시오. –

답변

14

전체 접근 방식에 결함이 있습니다. 컴파일러는 단순히 파일의 크기를 처리 할 수 ​​없습니다. 180 만 라인 파스칼 소스 파일은 어리 석다. 2MB의 .dfm 파일은 비실용적입니다.

모든 가능한 옵션을 별도의 컨트롤과 변수로 코딩 한 것처럼 보입니다. 코드를 직접 작성하지는 않았지만 Excel에서 사전 처리 단계를 사용하여 코드를 작성했습니다.

이 솔루션은 컴파일 할 때 모든 옵션을 확장하지 않습니다. 해결 방법은 런타임에 여러 옵션을 표시 할 수 있도록 응용 프로그램을 작성하는 것입니다. 그래서 30 개의 다른 변수가 있다면 30 개의 다른 레이블 컨트롤과 30 개의 다른 편집 컨트롤을 만들었을 것입니다. 올바른 접근법은 하나의 레이블과 하나의 편집 컨트롤을 만드는 것입니다. 그런 다음 런타임에 사용자의 옵션에 따라 레이블 캡션 및 편집 컨트롤의 내용을 변경하십시오.

저장할 필요가있는 모든 값에 대해 하나의 변수를 만들지 마십시오. 배열 및 또는 사전을 사용하십시오.

Excel 사전 처리 단계에 포함 된 논리를 취하여 런타임 Delphi 코드로 변환해야합니다.

관련 문제