Hi,
nach einigen Überlegungen und ein bisschen rumprobieren hab ich nun folgenden Code auf die Beine gestellt - für alle Interessierten:
Delphi-Quellcode:
procedure TMainForm.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var temp:string;
c,depth:integer;
const IndentKey: Word = VK_SPACE;
IndentDepth: integer = 2;
function CountOccasions(input,need:string):integer;
var x,occured:integer;
begin
occured:=0;
for x:=1 to length(input) do
if (copy(input,x,length(need)) = need) then
Inc(occured);
result:=occured;
end;
begin
// Auto-Indent
if (Key = VK_RETURN) then begin
temp:=TMemo(Sender).Lines[TMemo(Sender).CaretPos.Y];
// get old indent depth
depth:=0;
while ((depth < length(temp)) and (Ord(copy(temp,depth+1,1)[1]) = IndentKey)) do
Inc(depth);
if (depth > 0) then
depth:=depth div IndentDepth;
// check if we need to go deeper
if (Pos('{',temp) > 0) then
depth:=depth + CountOccasions(temp,'{');
// apply indent
if (depth > 0) then
for c:=(IndentDepth * depth) downto 0 do begin
keybd_event(IndentKey,0,0,0);
keybd_event(IndentKey,0,KEYEVENTF_KEYUP,0);
end;
end;
Anpassen sollte man u.A. den Typecast von Sender, falls man eine andere Komponente als TMemo benutzt und die '{', falls man eine andere Sprache im Sinn hat
Viel Spaß damit