function ZsList(mStr: string): string; { 全排列 }  procedure pZsList(mLeft, mRight: string);
  var
    I, L: Integer;
    Temp: string;
  begin
    L := Length(mLeft);
    if L = 0 then
      Result := Result + mRight + #13#10
    else for I := 1 to L do begin
      Temp := mLeft;
      Delete(Temp, I, 1);
      pZsList(Temp, Concat(mRight, mLeft[I]));
    end;
  end; { [ZsList<pZsList>] }begin
  Result := '';
  pZsList(mStr, '');
end; { ZsList }procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Text := ZsList('abcd')
end;