// Huge Strings haben neben einem Längenzähler auch einen Referenzzähler.
// Wenn ein String einer Prozedur übergeben wird, ohne
const, var oder out
// zu verwenden, wird ein Duplikat des Strings erzeugt, welches gesondert
// bearbeitet werden kann. Dabei wird der Referenzzähler inkrementiert.
// Das gleiche passiert beispielsweise auch, wenn ein Zeichen des Strings
// verändert wird. Wird ein Duplikat eines Strings einem anderen String
// zugewiesen, wird der Referenzzähler wieder um 1 vermindert. Solange kein
// Duplikat des Strings besteht, hat der Zähler den Wert -1.
// Die folgende kleine Funktion kann den Referenzzähler eines Strings auslesen.


// Getestet mit D4 unter XP

function Referenz(const s: string): Longint; // bis Delphi 7 
var 
  p: ^Longint; 
begin 
  if s = '' then result := 0 
  else begin 
    p := @Pchar(s)^; 
    dec(p, 2); 
    result := p^; 
  end; 
end; 
 
 
// --- Demo --- 
 
procedure stringtest_const(const s: string); 
begin 
  showmessage('const - ' + s + #13 + inttostr(Referenz(s))); 
end; 
 
procedure stringtest_einfach(s: string); 
begin 
  showmessage('ohne - ' + s + #13 + inttostr(Referenz(s))); 
end; 
 
 
procedure TForm1.Button5Click(Sender: TObject); 
var 
  s, zweiterString: string; 
begin 
  zweiterString := 'Versuch'; 
 
  s := 'Test'; 
  showmessage(s + #13 + inttostr(Referenz(s))); // -1 
 
  s := 'Fest'; 
  showmessage(s + #13 + inttostr(Referenz(s))); // -1 
 
  s[2] := 'a'; 
  showmessage(s + #13 + inttostr(Referenz(s))); // wird 1 
 
  stringtest_const(s); // bleibt 1 
 
  stringtest_einfach(s); // wird 2 
 
  zweiterString[1] := s[1]; 
  showmessage(s + #13 + inttostr(Referenz(s))); // wird wieder 1 
 
  s := ''; 
  showmessage(s + #13 + inttostr(Referenz(s))); // 0 
end;



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke