Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 033

Раздел: Delphi » Прочее
/ вопрос решён /

Здравствуйте! Хочу разнообразить программу, добавив в нее, так называемое, "пасхальноея яйцо". Вот что хочу спросить - а можно сделать так, что бы фора 2 появлялась при наборе определенной комбинации из баттонов - т. е. если сначала нажать, там, например, баттон1, затем баттон3, затем2 и затем снова баттон1 - то появится форма 2? Не судите строго) Спасибо...

Вечперик Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Вечперик (статус: Посетитель)
Вопрос отправлен: 2 ноября 2008, 02:05
Состояние вопроса: решён, ответов: 3.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Вечперик!
А почему нельзя? можно, если осторожно:) Ведь люди делают.
Вся идея заключается в том, что мы где то храним текущее состояние нажатия кнопок.
Итак, наиболее простой способ. Заводим глобальную переменную step:integer;
В FormCreate инициализируем её нулем.
Эта переменная будет хранить число-состояние. Каждая кнопка при нажатии анализирует текущее число, и выполняет нужное действие. вот схематический код для Вашего варианта
//первая кнопка.
if step = 0 then step := 1
else if step = 3 then "показать форму"
else step := 0;

//вторая кнопка
if step = 2 then step := 3 else step := 0;

//третья кнопка
if step = 1 then step := 2 else step := 0;

Понятно, что кроме этого может быть и другой код. Если сделать где то вывод переменной step на форму, то будет видно, как при правильном наборе "условной секретной комбинации", она будет увеличиваться на единицу при каждом нажатии и обращаться в ноль при ошибке - то есть начальное состояние.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 2 ноября 2008, 02:19
Оценка за ответ: 5

Комментарий к оценке: Если уже я понял - то ответ хорош))

Ответ #2. Отвечает эксперт: Dron

Здравствуйте, Вечперик!
Раз уж вопрос зашёл о пасхалках типа "нажать что-то в нужной последовательности", расскажу вкратце о том, как сделать пасхалку следующую: если нажать на клавиатуре клавиши в определённом порядке (например, какое-то слово), то что-то происходит. Подобные секреты есть во многих программах. А делается достаточно легко. Определяем текст, который нужно набрать и переменную для хранения того, что набрано:

const
  EasterEggTargetText ='Hello';
 
var
  Form1: TForm1;
  EasterEggTypedText: String = '';
Чтобы реагировать на нажатия клавиш независимо от того, какой элемент активен на форме, ставим у формы KeyPreview = True.
Теперь самое главное - обработчик события формы OnKeyPress:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if LowerCase(EasterEggTargetText[Length(EasterEggTypedText)+1]) = LowerCase(Key) then
    EasterEggTypedText:=EasterEggTypedText+Key
  else
    EasterEggTypedText:='';
  if Length(EasterEggTypedText) = Length(EasterEggTargetText) then
  begin
    MessageDlg('Easter egg!',mtInformation,[mbOk],0);
    EasterEggTypedText:=''
  end;
end;
Что происходит: сравниваем набранный символ с очередным символом строки-ключа. На всякий случай приводим их к одному регистру. Если символ совпал, добавляем его в строку набранных символов, а если не совпал, значит последовательность неверна и всю строку очищаем. Далее смотрим, совпадает ли длина набранного текста с длиной ключа. Если совпала - делаем "что-то" (в примере - текстовое сообщение) и не забываем очистить строку. Вот и всё! Осталось только заменить "что-то" - тут уж на что фантазии хватит.

Ответ отправил: Dron (статус: Студент)
Время отправки: 2 ноября 2008, 13:54
Оценка за ответ: 5

Комментарий к оценке: Спасибо - прикольно очень)

Ответ #3. Отвечает эксперт: Аксион

Здравствуйте, Вечперик!
Описанное вами можно сделать ещё так:
s:string;
//обработчик первой кнопки
s:=s+'1';
if s='1321' then form2.visible:=true; //if именно тут потому, что комбинация должна закончится при нажатии этой кнопки
//обработчик второй кнопки
s:=s+'2';
//обработчик третьей кнопки
s:=s+'3';

Ответ отправил: Аксион (статус: 4-ый класс)
Время отправки: 4 ноября 2008, 17:25
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 2 ноября 2008, 16:31; участников в обсуждении: 2.
Вечперик

Вечперик (статус: Посетитель), 2 ноября 2008, 11:59 [#1]:

Большое спасибо - понял принцип - но 2 недочета нашел - может подскажите, как их устранить можно... 1-й: код все тот же 1321 - если нажать 11321 - то не срабатывает - хотя должна же по идее... можно это как-то исправить? и 2-й: если после ввода комбинации и появлении формы 2 просто нажать опять на баттон1 - то она появится... можно как-то онулироватьзначение step после того, как появится форма? Спасибо
Вечперик

Вечперик (статус: Посетитель), 2 ноября 2008, 16:23 [#2]:

Dron, большое спасибо - тоже очень забавно выходит... ну вот по первой пасхалке через step у меня все еще осталась под вопросом проблема с тем, что после появления скрытой формы 2 при нажатии сразу только на баттон 1 она свова будет появляться... вопрос с работой комбинации после n-го нажатия на начальную кнопку решил вроде - а с этим не знаю... может кто подскажет, как после form2.show или form2.visible = true присвоить значение step := 0? Ато я уж все перепробовал, на что способен - спасибо)
Вадим К

Вадим К (статус: Академик), 2 ноября 2008, 16:24 [#3]:

Да, походу надо поправить обработчик первой кнопки, где то так
//первая кнопка.
if step = 0 then step := 1
else if step = 3 then
begin
"показать форму";
step := 0;
end
else step := 1;
Галочка "подтверждения прочтения" - вселенское зло.
Вечперик

Вечперик (статус: Посетитель), 2 ноября 2008, 16:31 [#4]:

О.. теперь все работает прекрасно - еще раз большое спасибо)

31 января 2011, 19:23: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:32
Выполнено за 0.02 сек.