2008-10-28 41 views
5

德爾福2009年抱怨與E2283錯誤:[DCC錯誤] outputcode.pas(466):E2283太多局部常量。使用較短的程序爲什麼我得到「太多局部常量」錯誤?

德爾福2007年編譯得很好。我找不到大量的本地常量,這是一個很短的(500行)單位。你有沒有看到我可以解決的豐富的常量或文字?

procedure TOutputCodeForm.FormCreate(Sender: TObject); 
var 
    poParser : TStringStream; 
begin 

    if (IsWindowsVista()) then 
    begin 
     SetVistaFonts(self); 
    end; 

    poParser := TStringStream.Create(gstrSQLParser); 

    SQLParser := TSyntaxMemoParser.Create(self); 
    SQLParser.RegistryKey := '\Software\Advantage Data Architect\SQLSyntaxMemo'; 
    SQLParser.UseRegistry := True; 
    SQLParser.CompileFromStream(poParser); 

    FreeAndNil(poParser); 
    poParser := TStringStream.Create(gstrCPPParser); 



    cppParser := TSyntaxMemoParser.Create(self); 
    cppParser.RegistryKey := '\Software\Advantage Data Architect\SQLSyntaxMemo'; 
    cppParser.UseRegistry := True; 
    cppParser.CompileFromStream(poParser); 

    FreeAndNil(poParser); 
    poParser := TStringStream.Create(gstrPasParser); 

    pasParser := TSyntaxMemoParser.Create(self); 
    pasParser.RegistryKey := '\Software\Advantage Data Architect\SQLSyntaxMemo'; 
    pasParser.Script := ExtractFilePath(Application.ExeName) + 'pasScript.txt'; 
    pasParser.CompileFromStream(poParser); 

    {* Free the stream since we are finished with it. *} 
    FreeAndNil(poParser); 

    poCodeOutput := TSyntaxMemo.Create(self); 
    poCodeOutput.Parent := Panel1; 
    poCodeOutput.Left := 8; 
    poCodeOutput.Top := 8; 
    poCodeOutput.Width := Panel1.Width - 16; 
    poCodeOutput.Height := Panel1.Height - 16; 
    poCodeOutput.ClipCopyFormats := [smTEXT, smRTF]; 
    poCodeOutput.Font.Charset := ANSI_CHARSET; 
    poCodeOutput.Font.Color := clWindowText; 
    poCodeOutput.Font.Height := -11; 
    poCodeOutput.Font.Name := 'Courier New'; 
    poCodeOutput.Font.Style := []; 
    poCodeOutput.GutterFont.Charset := DEFAULT_CHARSET; 
    poCodeOutput.GutterFont.Color := clWindowText; 
    poCodeOutput.GutterFont.Height := -11; 
    poCodeOutput.GutterFont.Name := 'MS Sans Serif'; 
    poCodeOutput.GutterFont.Style := []; 
    poCodeOutput.HyperCursor := crDefault; 
    poCodeOutput.IndentStep := 1; 
    poCodeOutput.Margin := 2; 
    poCodeOutput.Modified := False; 
    poCodeOutput.MonoPrint := True; 
    poCodeOutput.Options := [smoSyntaxHighlight, smoPrintWrap, smoPrintLineNos, smoPrintFilename, smoPrintDate, smoPrintPageNos, smoAutoIndent, smoTabToColumn, smoWordSelect, smoShowRMargin, smoShowGutter, smoShowWrapColumn, smoTitleAsFilename, smoProcessDroppedFiles, smoBlockOverwriteCursor, smoShowWrapGlyph, smoColumnTrack, smoUseTAB, smoSmartFill, smoOLEDragSource]; 
    poCodeOutput.ReadOnly := False; 
    poCodeOutput.RightMargin := 80; 
    poCodeOutput.SaveFormat := sfTEXT; 
    poCodeOutput.ScrollBars := ssBoth; 
    poCodeOutput.SelLineStyle := lsCRLF; 
    poCodeOutput.SelStart := 3; 
    poCodeOutput.SelLength := 0; 
    poCodeOutput.SelTextColor := clWhite; 
    poCodeOutput.SelTextBack := clBlack; 
    poCodeOutput.TabDefault := 4; 
    poCodeOutput.TabOrder := 0; 
    poCodeOutput.VisiblePropEdPages := [ppOPTIONS, ppHIGHLIGHTING, ppKEYS, ppAUTOCORRECT, ppTEMPLATES]; 
    poCodeOutput.WrapAtColumn := 0; 
    poCodeOutput.OnKeyDown := FormKeyDown; 
    poCodeOutput.ActiveParser := 3; 
    poCodeOutput.Anchors := [akLeft, akTop, akRight, akBottom]; 
    poCodeOutput.Parser1 := pasParser; 
    poCodeOutput.Parser2 := cppParser; 
    poCodeOutput.Parser3 := SQLParser; 

    SQLParser.AttachEditor(poCodeOutput); 
    cppParser.AttachEditor(poCodeOutput); 
    pasParser.AttachEditor(poCodeOutput); 

    poCodeOutput.Lines.AddStrings(poCode); 

    if (CodeType = ctCPP) then 
     poCodeOutput.ActiveParser := 2 
    else if (CodeType = ctPascal) then 
     poCodeOutput.ActiveParser := 1 
    else 
     poCodeOutput.ActiveParser := 3; 

    MainForm.AdjustFormSize(self, 0.95, 0.75); 
end; 
+1

我發現了這個問題。對gstrCPPParser的引用。該全局字符串是一個字符串的怪物。 – 2009-04-02 17:13:11

+0

和內存方面,字符串在德爾福2009中獲得了兩倍的增長(:它有多大? – 2012-09-04 14:29:20

回答

3

是Win32定義的,常量是否可以來自所有包含的單元。

我會做一個二進制搜索:保持撕裂一半的單位,直到它編譯,然後添加的東西回來

是的,它很爛,但是這是試圖調試BorlandCodeGaembarcadero的內部編譯器錯誤的功能之一。

0

我發現了問題並重構了方法(FormCreate),但無論我如何製作塊,編譯器仍然有問題,除非我刪除了一些代碼。

弗朗索瓦感謝,但我沒有重構代碼,仍然得到錯誤。如果它使用D2007構建,而不是D2009,那對我來說似乎很腥。

procedure TOutputCodeForm.FormCreate(Sender: TObject); 
begin 

    if (IsWindowsVista()) then 
    begin 
     SetVistaFonts(self); 
    end; 

    SetupParser(SQLParser, gstrSQLParser, ''); 
    // unresolved jmu - have to comment this out for now or delphi will complain 
    // that there are too many literals in this file. Seems like a delphi bug 
    // since this builds in older versions, and I've already refactored it. 
    //SetupParser(cppParser, gstrCPPParser, ''); 
    SetupParser(pasParser, gstrPasParser, ExtractFilePath(Application.ExeName) + 'pasScript.txt'); 
    SetupCodeOutput(poCodeOutput); 

    SQLParser.AttachEditor(poCodeOutput); 
    cppParser.AttachEditor(poCodeOutput); 
    pasParser.AttachEditor(poCodeOutput); 

    poCodeOutput.Lines.AddStrings(poCode); 

    if (CodeType = ctCPP) then 
     poCodeOutput.ActiveParser := 2 
    else if (CodeType = ctPascal) then 
     poCodeOutput.ActiveParser := 1 
    else 
     poCodeOutput.ActiveParser := 3; 

    MainForm.AdjustFormSize(self, 0.95, 0.75); 
end; 
3

聲稱它是一個編譯器錯誤或尋求幫助之前,我會認真地嘗試組織和清理我的代碼。

我會創建專門的例程來調用FormCreate中的每個部分,而不是你這個龐大的包。 - SQLParseInit
- cppParseInit
- pasParseInit
- CodeOutPutInit < - +++++很多常量有

看看是否1特別是造成問題。

建立一個最小的案例,儘可能少的第三方依賴關係,讓其他人重現它,看看它確實是一個錯誤還是錯誤的代碼,這並不壞。
並刪除那些$ IFDEF ...只需提供導致此行爲的實際代碼,而不會造成任何混亂。

補充:因爲它在D2007中工作,但在D2009中不行,所以我還要仔細檢查包含在代碼中的所有庫/第三方組件是否已正確遷移到D2009。 (鑽取該cppParser)

0

鑑於問題只發生在您的一個Delphi編譯器/設置中,我發現自己想知道它是否與組件安裝問題有關。你是否嘗試過創建一個使用動態創建的所有組件的靜態版本的基本表單? (TSyntaxMemoParser等)。

(是否運行在不同的機器的德爾福版本/ VM的BTW可以節省麻煩很多,如果你使用許多第三方組件和Delphi的多個版本?)

0

從幫助:

One or more of your procedures contain so many string constant expressions that they exceed the compiler's internal storage limit. This can occur in code that is automatically generated. To fix this, you can shorten your procedures or declare contant identifiers instead of using so many literals in the code.

所以也許嘗試把一些這些字符串放在常量或其他變量(非本地)。

0

我會看看「poCodeOutput.Options:= [xx ....]」 這行看起來像一行代碼中的集合中的選項太多。

取出一行,看看你是否得到錯誤。

相關問題