Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Fehler E2283 beim Übersetzen (https://www.delphipraxis.net/106236-fehler-e2283-beim-uebersetzen.html)

Commander Tom 7. Jan 2008 18:33


Fehler E2283 beim Übersetzen
 
Hallo, ich bekomme folgende Fehlermeldung beim Übersetzen:

Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren (E2283)

Die Hilfe sagt hier folgendes:

Eine oder mehrere Ihrer Prozeduren enthält so viele String-Konstanten, dass die interne Speichergrenze des Compilers überschritten wurde. Dieses Problem kann in automatisch generiertem Code auftreten. Kürzen Sie die betreffenden Prozeduren, oder deklarieren Sie Konstanten anstelle der vielen Literale.

Weiß jemand, wie die interne Speichergrenze des Compilers ist ?

Ich kann leider momentan meinen Code nicht ändern, da ich das Programm so auf die Schnelle nicht umstellen kann.

shmia 7. Jan 2008 19:04

Re: Fehler E2283 beim Übersetzen
 
Zitat:

Zitat von Commander Tom
Ich kann leider momentan meinen Code nicht ändern, da ich das Programm so auf die Schnelle nicht umstellen kann.

Das wäre dann aber das KO-Kriterium, denn du musst den Code ändern!
Wie sieht denn den Code aus ?
Wenn die Prozedure mehr als eine Seite hat, dann bis als ZIP anhängen, damit nicht alles vollgemüllt wird.
Hoffentlich sieht der Code nicht so aus wie die Strassen von Neapel...

Commander Tom 7. Jan 2008 21:30

Re: Fehler E2283 beim Übersetzen
 
Hallo shmia,

ich benutze Fastreport, aber ohne Datenbank, weil ich aus einem alten DOS-Programm per Export Daten in eine Textdatei schreibe und in FastReport wieder einlese und dann Reports daraus generiere. Dazu benutze ich die Methode GetValue des Reports:

Delphi-Quellcode:
PROCEDURE TReportForm.frxReport1GetValue(CONST VarName: STRING; VAR Value: Variant);
BEGIN
  IF CompareText(VarName, '1') = 0 THEN Value := MainForm.RegIniFile.ReadString(Datei, '1', '?');
END;
Inzwischen hat die Prozedur aber leider 10000 Zeilen, da die Reports inzwischen sehr umfangreich geworden sind. Zusätzlich gibt es pro Unit 57 solcher Prozeduren, so daß das Programm inzwischen auf ca. 1,4 Mio. Zeilen angewachsen ist und die EXE-Datei auf ca. 32 MB angewachsen ist.

Leider habe ich kenen Weg gefunden, mit Fast Report die Dateien mittels einer anderen Methode einzulesen.

Klaus01 8. Jan 2008 08:11

Re: Fehler E2283 beim Übersetzen
 
Guten Morgen,

hilft es nicht wenn Du das CONST aus der Parameterliste der Prozedur wegläßt.

Delphi-Quellcode:
PROCEDURE TReportForm.frxReport1GetValue(VarName: STRING; VAR Value: Variant);
BEGIN
  IF CompareText(VarName, '1') = 0 THEN Value := MainForm.RegIniFile.ReadString(Datei, '1', '?');
END;
Nur eine Vermutung.

Grüße
Klaus

Bernhard Geyer 8. Jan 2008 08:28

Re: Fehler E2283 beim Übersetzen
 
Zitat:

Zitat von Commander Tom
Inzwischen hat die Prozedur aber leider 10000 Zeilen, da die Reports inzwischen sehr umfangreich geworden sind. Zusätzlich gibt es pro Unit 57 solcher Prozeduren, so daß das Programm inzwischen auf ca. 1,4 Mio. Zeilen angewachsen ist und die EXE-Datei auf ca. 32 MB angewachsen ist.

32 MB :shock: Haben auch ca. 1,4 Mio Quellzeilen (mit Quellzeilen aus Kaufkomponenten, ...) aber unsere Exe ist "nur" 14 MB zusammen. Hast du evtl. Debug (TD32) Infos aktiv?

Muetze1 8. Jan 2008 09:53

Re: Fehler E2283 beim Übersetzen
 
Och, wir haben eine 134 MB EXE mit der gleichen Anzahl von Codezeilen zusammen. Die Größe ist so oder so egal und sagt nichts aus.

shmia 8. Jan 2008 10:32

Re: Fehler E2283 beim Übersetzen
 
Zitat:

Zitat von Commander Tom
Inzwischen hat die Prozedur aber leider 10000 Zeilen...

Du meinst, deine Prozedur sieht ungefähr so aus: :roll:
Delphi-Quellcode:
PROCEDURE TReportForm.frxReport1GetValue(CONST VarName: STRING; VAR Value: Variant);
BEGIN
  IF CompareText(VarName, '1') = 0 THEN Value := MainForm.RegIniFile.ReadString(Datei, '1', '?')
  else if CompareText(VarName, '2') = 0 THEN Value := MainForm.RegIniFile.ReadString(Datei, '2', '?')
  else if CompareText(VarName, 'B8') = 0 THEN Value := MainForm.RegIniFile.ReadString(Datei, 'B8', '?')
  // und hier noch 9997 weitere else Anweisungen
END;
Wäre gut gewesen, du hättest so ungefähr 3 Zeilen aus GetValue() angegeben, damit man das ganze Elend erkennen kann.
Also prinzipiell bräuchtest du eine Zuordnung zwischen dem Parameter VarName und dem Name in der Ini-Datei.
Diese Zuordnung kann man in einem Konstantenarray ablegen und später über eine For-Schleife auslesen:
Delphi-Quellcode:
type
   TListEintrag = record
      a:string;
      b:string;
   end;
const liste:array[1..10000] of TListEintrag = (
(a:'1'), (b:'1'),
(a:'2'), (b:'2'),
(a:'B8'), (b:'B8'),
...
)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz