Консультация № 176944
27.02.2010, 12:22
45.00 руб.
0 8 1
Здравствуйте! Как мне сделать, чтоб при вводе неверного пароля более X раз, приложение закрывалось?
вводим пароль в Edit1. Если неправильно сообщение о том что ошибка. Тут же вводим снова и когда достигнет X приложение закрывалось.
В коде этого не выходит.. inc(n) увеличивается на 1 шаг а дальше не хочет. Заранее спасибо!


Приложение:
procedure TForm1.sButton1Click(Sender: TObject);
var
n:integer;
s:string;
begin
n:=0;
sEdit1.Text:=s;
s:='';
if s <> 'zxcv' then begin
inc(n);
If n > 3 then begin
ShowMessage ('Exit');
Halt;

end else ShowMessage ('Error, retry');
end else ShowMessage ('Accept');

end;

Обсуждение

Неизвестный
27.02.2010, 12:30
общий
Angel1731:
переменная n, у вас, появляется только при нажатии на кнопку, и поэтому каждый раз инициализируется заново.
Она должна быть глобальной!
И уберите строчку n:=0
она должна быть вдругом месте, например, при событии formShow.
давно
Профессионал
153662
1070
27.02.2010, 12:33
общий
Angel1731:
Вот код из моего ответа на вопрос 176871
Код:
unit Unit3;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
i: word;

implementation

{$R *.dfm}

function Pass(ss: String): string; // Функция шифровки пароля
var
i: integer;
s: String[255];
c: array[0..255] of Byte absolute s;
begin
s:= ss;
for i:= 1 to Ord(s[0]) do
c[i]:= 23 xor c[i];
// Строки для получения закодированного пароля
// Закомментировываем предыдущий цикл
// Раскомментируем этот
// и вводим в поле ввода нужный пароль на выходе
// в строке result:= s; получаем закодированный
{for i := 1 to Length(s) do
s[i] := Char(23 xor Ord(c[i]));}
//
result:= s;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit1.Text <> Pass('&%$') then
begin // Неправильный пароль
if i <> 2 then
Messagedlg('Введённый пароль не правильный ' + Inttostr(i + 1) + ' раз, попробуйте ввести пароль ещё раз.', mtError, [mbOk], 0)
else
Messagedlg('Введённый пароль не правильный ' + Inttostr(i + 1) + ' раз, программа будет закрыта.', mtError, [mbOk], 0);
inc(i);
if i >= 3 then
{Sleep(10000); меняем на }Application.Terminate {и всё после троекратного ввода неправильного пароля программа закроется}
end
else
MessageDlg('Вы ввели правильный пароль', mtInformation, [mbok], 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
i:= 0;
end;

end.
пароль 123. А так эксперт Patriotix-N правильно описал Вашу ошибку в коде.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
27.02.2010, 12:47
общий
Спасибо все работает))..я голову ломал и видимо пока еще не особо грамотен в плане объявления переменных)))...
Неизвестный
27.02.2010, 13:00
общий
Добавлю еще про одну возможность: объявить n константой (старая Паскалевская штучка). Она в это случае сохраняет свое значение при выходе.
То есть, в
procedure TForm1.sButton1Click(Sender: TObject);
CONST n:integer = 0;
var

s:string;
begin
Неизвестный
27.02.2010, 13:13
общий
Сейчас, на всякий случай, проверил в Turbo Delphi (под рукой, кроме Lazarus'a ничего нет). Так там в свойствах проекта:
Project Options -> Compiler поставить галочку в Assignable typed constants
ЗЫ: в Lazarus и так работает
Неизвестный
27.02.2010, 13:32
общий
это ответ
Здравствуйте, Angel1731.
Переменная N в процедуре каждый раз инициализируется заново. Поэтому она не хранит старые значения. Почитайте про область видимости переменных.
Чтобы решить проблемму, Вы должны вынести переменную N за пределы функции. Например в свойства класса или просто объявите var n:integer; после implementation

Неизвестный
27.02.2010, 13:33
общий
Ух.. пока писал ответ в мини-форуме уже все ответили :(
Неизвестный
27.02.2010, 15:18
общий
Всем спасибо за отвыты!))
Форма ответа