• 0
HyperZen

Неадекватное поведение приложения под Android...

Вопрос

Добрый день!

Вот пример простенького приложения - генератор паролей с простейшим алгоритмом неповторяющихся символов.

Под Windows работает все корректно, вообще без каких-либо нареканий. Но вот под Андроид: генерируется любое количество символов (иногда и нужное количество, заданное трэкбаром), появляются артефакты, иногда выдает вообще пустое окно. Посмотрите, пожалуйста, в чем дело, ничего не пойму :)

Некорректная работа наблюдается как на реальном устройстве, так и на эмуляторе.

(Windows 10 64 bit, Berlin Update 2).

PassGen.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

7 ответов на этот вопрос

  • 0

Наверное здесь что-то не так: TempLetter := Random(LenghtSymb) + 1;

HyperZen понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

думаю, вы упускаете этот момент

http://docwiki.embarcadero.com/RADStudio/Seattle/en/Zero-based_strings_(Delphi)

в андроид индексы в строках идут с 0, на десктопе - с 1

и, насколько я помню, все движется в сторону immutable strings, когда нельзя будет заменить конкретный символ в строке кроме как составлением новой строки

так что приводите свой алгоритм в соответствие с этими вводными

HyperZen понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

вот исправленная версия, надеюсь поймете где была ошибка

PassGen.zip

HyperZen понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
  if (LengthPassword > Length(Symb)) then TempLengthPassw := Length(Symb)
    else TempLengthPassw := LengthPassword;

//  ShowMessage('LenghtPassword: ' + LenghtPassword.ToString + ', Length(Symb): ' + Length(Symb).ToString + ' ' + Symb[0]);

  SetLength(Result, TempLengthPassw); // устанавливаем длину конечной строки
  LengthSymb := Length(Symb); // Длина Таблицы для внутреннего цикла

  N := 0;

  while N < TempLengthPassw do
    begin
      TempLetter := Random(LengthSymb);
      // проверяем присутствие этого символа в конечной строке
      if (Pos(Symb[TempLetter], Result) = 0) then
        begin
          Result[N] := Symb[TempLetter]; // теперь его сохраняем
          Inc(N); // символ не найден
        end;
    end;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Огромное всем спасибо, решил проблему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Одновременно с ZuBy получилось :D 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

ZuBy, в Вашем решении:

SetLength(Result, TempLenghtPassw + 1);

+ 1 же не нужен?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу