2008-10-28 14 views
5

Delphi 2009 narzeka z błędem E2283: [Błąd DCC] outputcode.pas (466): E2283 Zbyt wiele lokalnych stałych. Użyj krótszych procedurDlaczego pojawia się błąd "Zbyt wiele lokalnych stałych"?

Delphi 2007 kompiluje się dobrze. Nie mogę znaleźć obfitości lokalnych stałych, to krótka (500 linii) jednostka. Czy widzisz obfitość stałych lub literałów, którymi mogę się zająć?

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

Znalazłem problem. Odwołanie do gstrCPPParser. Ten globalny ciąg to potwór łańcucha. –

+0

i pamiętajmy, że struny są dwa razy większe od Delphi 2009 (: jak duże to było? –

Odpowiedz

3

Czy zdefiniowano system Win32, czy stałe mogły pochodzić ze wszystkich uwzględnionych jednostek.

chciałbym zrobić wyszukiwania binarnego: zachować łzawienie pół jednostki, aż się kompiluje, a następnie dodać rzeczy z powrotem w

Tak to jest do bani, ale to jedna z cech próby debugowania wewnętrzne błędy BorlandCodeGaembarcadero za kompilatora..

0

Znalazłem metodę (FormCreate), która jest problemem i zostały refactoring, ale nie ważne jak małe robię kawałki kompilator nadal ma problem, chyba że usunę część kodu.

François dziękuje, ale zrobiłem refaktor kodu i nadal otrzymuję błąd. Jeśli jest zbudowany z D2007, a nie z D2009, wydaje mi się to podejrzane.

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; 
+0

kontynuuj cięcie, aż problem zniknie.) –

+0

Widziałem nawet moje problemy (nigdy błąd, który masz), pochodzące z włączenia pewnych WYKORZYSTAJ UWAGI Jeśli nie masz kodu, zacznij wycinać stany USES –

+0

Jaki kod musisz usunąć, aby błąd zniknął? Może to być wskazówką do problemu. –

3

Zanim zgłosisz błąd do kompilatora lub poprosisz o pomoc, na poważnie spróbuję uporządkować i wyczyścić mój kod.

Utworzę dedykowane procedury, które będą wywoływane dla każdej części w FormCreate zamiast w tej masywnej torebce. - SQLParseInit
- cppParseInit
- pasParseInit
- CodeOutPutInit < - +++++ dużo stałych tam

i sprawdzić, czy 1 w szczególności powoduje problemy.

I nie byłoby źle zbudować minimalnego przypadku, z jak najmniejszą liczbą zależności od stron trzecich, jak to możliwe, aby inni mogli je odtworzyć i sprawdzić, czy to rzeczywiście błąd, czy tylko zły kod.
A także usuń te $ IFDEF ... Wystarczy podać rzeczywisty kod, który powoduje to zachowanie bez całego bałaganu.

Dodano: Jak to działa w D2007, ale nie w D2009, dodatkowo sprawdziłbym, czy wszystkie biblioteki/komponenty stron trzecich, które zawierasz w swoim kodzie są poprawnie migrowane do D2009. (drążenie w dół, że cppParser)

0

Biorąc pod uwagę problem występuje tylko w jednym z kompilatorów/instalacji Delphi, zastanawiam się, czy jest to związane z problemem instalacji składnika. Czy próbowałeś po prostu utworzyć podstawowy formularz, który używa statycznych wersji wszystkich składników, które tworzysz dynamicznie? (TSyntaxMemoParser, itp.).

(Czy używasz te wersje Delphi na oddzielnych maszynach/VM btw może zaoszczędzić wiele kłopotów, jeśli używasz wielu komponentów innych firm i więcej niż jedną wersję Delphi?)

0

Z pomocą:

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.

Może więc spróbuj umieścić niektóre z tych ciągów w stałych lub innych zmiennych (nie lokalnych).

0

Spojrzałbym na wiersz "poCodeOutput.Options: = [xx ....]" Wygląda zbyt wiele opcji w zestawie w jednym wierszu kodu.

Wyjmij tę linię i sprawdź, czy wystąpił błąd.

Powiązane problemy