2008-10-28 15 views
5

Delphi 2009 se queja con un error E2283: [Error DCC] outputcode.pas (466): E2283 Demasiadas constantes locales. Use procedimientos más cortos¿Por qué aparece el error "Demasiadas constantes locales"?

Delphi 2007 compila muy bien. No puedo encontrar una gran cantidad de constantes locales, es una unidad corta (500 líneas). ¿Ves alguna abundancia de constantes o literales que pueda abordar?

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

Encontré el problema. La referencia a gstrCPPParser. Esa cadena global es un monstruo de una cadena. –

+0

y en cuanto a la memoria, las cadenas simplemente se duplicaron con Delphi 2009 (: ¿qué tan grande fue? –

Respuesta

3

Si se define Win32, podrían ser las constantes de todas las unidades incluidas.

me gustaría hacer una búsqueda binaria: mantener desgarro mitad de la unidad hasta que se compila, a continuación, añadir cosas de vuelta en

Sí que es una mierda, pero esa es una de las características de intentar depurar errores de compilación internos de BorlandCodeGaembarcadero..

0

He encontrado el método (FormCreate) que es el problema y he estado refactorizando, pero no importa cuán pequeño haga los fragmentos el compilador todavía tiene un problema a menos que elimine parte del código.

François gracias, pero he refactorizado el código y aún recibo el error. Si se construyó con D2007, y no con D2009, eso me parece sospechoso.

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

sigue cortando hasta que el problema desaparece. –

+0

incluso he visto mis problemas (nunca el error) originarios de la inclusión de ciertos Declaraciones de USUARIO: si no le queda ningún código, empiece a recortar las normas de USOS. –

+0

¿Qué código debe eliminar para que desaparezca el error? Esto puede ser una pista sobre el problema. –

3

Antes afirmando que es un error del compilador o pedir ayuda, me gustaría seriamente tratar de organizar y limpiar mi código.

Crearía rutinas dedicadas para llamar a cada parte de FormCreate en lugar de esta enorme bolsa tuya. - SQLParseInit
- cppParseInit
- pasParseInit
- CodeOutPutInit < - +++++ una gran cantidad de constantes allí

y ver si 1 en particular está causando problemas.

Y no estaría mal crear un caso mínimo, con la menor cantidad posible de dependencias de terceros, para permitir que otros lo reproduzcan y ver si se trata de un error o simplemente un código incorrecto.
Y también eliminar esos $ IFDEF ... Simplemente proporcione el código real que causa este comportamiento sin todo el desorden.

Agregado: Como funciona en D2007, pero no en D2009, también verificaría que todas las librerías/componentes de terceros que incluye en su código migren correctamente a D2009. (Desglosar ese cppParser)

0

Dado que el problema solo ocurre en uno de sus compiladores/configuraciones Delphi, me pregunto si está relacionado con un problema de instalación de componentes. ¿Intentó simplemente crear un formulario básico que use versiones estáticas de todos los componentes que está creando dinámicamente? (TSyntaxMemoParser, etc.)

(¿Está ejecutando las versiones de Delphi en máquinas separadas/VM por cierto se puede guardar un montón de problemas si utiliza muchos componentes de terceros y más de una versión de Delphi?)

0

De la ayuda:

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.

Así que tal vez intente poner algunas de esas cadenas en constras u otras variables (no locales).

0

Me gustaría ver la línea de "poCodeOutput.Options: = [xx ....]" Parece que hay demasiadas opciones en el conjunto en una línea de código.

Quite esa línea y vea si obtiene el error.

Cuestiones relacionadas