Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.838 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler

  Alt 7. Feb 2011, 13:55
Hallo,
ich habe mir dass noch mal genauer angesehen.

Folgender Test in D2007 (win32):

Mit folgender Procedure erzeuge ich etwas Quellcode:
Delphi-Quellcode:
...
var
  z: shortstring = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890ßäöüÄÖÜ!"§$%&/()=?+*#-_.:,;@€~<>|^°[]\';

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: Integer;
  s: string;
begin
  Memo1.Lines.BeginUpdate;
  Memo1.Lines.Add(' Result := TStringList.Create;');
  for i := 1 to 2000 do
  begin
    s := '';
    for j := 1 to 50 do
    begin
      s := s + z[Random(100)+1];
    end;
    Memo1.Lines.Add(' Result.Add('''+s+''');');
// Memo1.Lines.Add(' Result.Add(''12345678901234567890123456789012345678901234567890'');');
  end;
  Memo1.Lines.EndUpdate;
end;
...
Unter Delphi 2007 gibt es diese Fehlermeldung auch !!!

Es lassen sich 1093 Zeilen kompilieren. Bei 1094 Zeilen gibt es diese Fehlermeldung.
Delphi-Quellcode:
...
procedure TForm1.Button2Click(Sender: TObject);
begin
  with GetMyText do
  try
    Memo1.Lines.Text := Text;
  finally
    Free;
  end;
end;

function TForm1.GetMyText: TStrings;
begin
  Result := TStringList.Create;
  Result.Add('gsWS!\ß!3J&OX;§r]PDSAlnkItyuÖ*5Zl7,9Z!4,kkß=tU!-/€');
  Result.Add('S)ad"t°SBW@g:(°bn-CYFyqAP"fn3aPdH"h=ü5@CZ;ÜDPPppOA');
  Result.Add('1(6X:GwHkÄU+1pD\QEFK+^LV(]xD8+<zÄ\(§@\%=BkfH=a.~E@');
  Result.Add('<wÜlq&!ißy°K\C0jzö*ä^xw\XTrÜ/D0+uQäH°=,rAW6;Fv>:.$');
  Result.Add(']VPÄ#SB*5urO?,J8?Vvoy"=fD9dFuVIü.iev~$pI+ZDi;:rZqk');
  Result.Add('üqä/*t20eYo$üR°Dg@uz,Öp7O[vPf0*wNuOhÄ#.PR&biYD€ÜIÄ');
  Result.Add('B07)T@*öw=&Tl€1,$d8Kijq6~Ö%\jJob<XmI1z2WTp°y6ll=~Ü');
  Result.Add('61<WC[x[U#JrG\m":#nüb:SkpI°ASKGäb+L!ow1K>g^b?.qyc$');
  Result.Add('hqr[k7"wRgpwjuGS\4t@#8pd_6cö;ZßEv#:W[Ä"a€Xvj+9CpWx');
  Result.Add('zZ49h6("Q<s§43z%@39_qC|D%€Zö>=FJj;U|7]?mCC9=uy%>bQ');
  ...
end;
Was ich Interesannt finde ist das aber 2000 Zeilen möglich sind, wenn man folgende Funktion kompiliert:
Delphi-Quellcode:
...
function TForm1.GetMyText: TStrings;
begin
  Result := TStringList.Create;
  Result.Add('12345678901234567890123456789012345678901234567890');
  Result.Add('12345678901234567890123456789012345678901234567890');
  Result.Add('12345678901234567890123456789012345678901234567890');
  Result.Add('12345678901234567890123456789012345678901234567890');
  Result.Add('12345678901234567890123456789012345678901234567890');
  ...
end;
Es sind auch 2000 Zeilen mit folgender Funktion möglich:
Delphi-Quellcode:
...
function TForm1.GetMyText: TStrings;
begin
  Result := TStringList.Create;
  Result.Add('AD:UbÖfQlqIvH_Fd~k)g');
  Result.Add('kkß=tU!-/€S)ad"t°SBW');
  Result.Add('@g:(°bn-CYFyqAP"fn3a');
  Result.Add('PdH"h=ü5@CZ;ÜDPPppOA');
  Result.Add('1(6X:GwHkÄU+1pD\QEFK');
  Result.Add('+^LV(]xD8+<zÄ\(§@\%=');
  Result.Add('BkfH=a.~E@<wÜlq&!ißy');
  Result.Add('°K\C0jzö*ä^xw\XTrÜ/D');
  Result.Add('0+uQäH°=,rAW6;Fv>:.$');
  Result.Add(']VPÄ#SB*5urO?,J8?Vvo');
  ...
end;

Evtl wird der String im Speicher komprimiert abgelegt. Und der komprimierte String darf eine gewisse Größe nicht überschreiten.

Was noch selsam ist:

Eine Umwandlung von den Add()'s ind ein 'bla' + #13#10 + 'bla'... hat bei mir funktioniert.
Der String wurde aber eigentlich nicht kürzer.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat