Nerven tun manchmal die sinnlosesten Fehlerchen, welche aber ungehnte Nebenwirkunen zeigen.
Einen dieser Fehler hab ich mal auf folgenden Code reduziert.
Delphi-Quellcode:
procedure MacheMist;
var
S: string;
L: Cardinal;
begin
L := MAX_PATH;
GetUserName(PChar(S), L);
end;
initialization
MacheMist;
finalization
end.
(einfach nur ein kleines
SetLength(S, i);
vergessen)
OK, S ist als Leerstring NIL, also sollte GetUserName mit einer Zugriffsverletzung enden,
tut es aber nicht
Denn PChar leitet dieses NIL auf einen existierenden "Leerstring" um, welcher auf #0 endet.
Tja, nun ist gerade dieser Speicherplatz leider nicht schreibgeschützt (PAGE_READONLY), so wie man es von einer Konstante eventuell erwarten könnte.
Daher überschreibt jetzt GetUserName diesen Speicher und schwups, hat man sich den programmglobalen Leerstring zerschossen.
Alles was also diesen PChar-Leerstring nutzt, wird sich nun verändern.
Tipp: Nehmt eine Form, darauf 2-3 Edits, den Text jeweils rauslöschen und kompilieren+starten.
Am Besten noch mit dieser Funktion:
Delphi-Quellcode:
procedure MacheMist;
const H = 'himi war hier'#0;
var S: string;
begin
Move(PChar(H)^, PChar(S)^, Length(H) * SizeOf(Char));
end;
Zumindestens ab Delphi 2010 (ab wann genau weiß ich nicht) und mit mindestens WinXP sieht man nun in allen Edits (ohne Fokus) seinen Nutzernamen/meinen Namen.
Genauso war das hier in DBGrids, wo dann alle leeren Zellen plötzlich gefüllt waren.
[edit]
Das Beispiel geht ab da, wo TEdit die Eigenschaft TextHint besitzt.