Как сделать пароль и логин в делфи

Обновлено: 06.07.2024

Текстовый редактор Word представляет собой сервер автоматизаций (COM-сервер), который может получать и обрабатывать запросы от внешних программ, в том числе и написанных в Delphi.

Доступ к приложению Word осуществляется, как правило, посредством основных двух объектов: Word.Application и Word.Document. Они же обеспечивают доступ и к остальным объектам Word: тексту, таблицам, кнопкам, меню.

Самый лёгкий, но одновременно и самый медленный по производительности способ работы с COM-сервером Word базируется на использовании переменных Variant.

Для использования метода Variant, нужно указать в разделе uses ссылку на модуль ComObj.

Работа с документом Word в Delphi. Видео

Обработка документов Word в Delphi. Примеры

Как уже упоминалось, для взаимодействия с COM-сервером Word нам в первую очередь нужно подключить модуль ComObj. Поэтому не забудьте в uses дописать ComObj.

Также, нужно объявить глобальную переменную типа OleVariant.

Этот урок содержит ответ на вопрос в одном из комментариев. Вот как он был сформулирован:

Иван, добавлено 21.04.10, 16:02:29
Привет. Я хочу сделать так, чтобы при вводе так сказать пароля в окно edit, выводились звездочки, но звездочками не значились. Т.е. ввел 50, при нажатии "Ок" к примеру, у меня все было нормально. Как бы пароль принят. Я пробовал пример и мне интересно, за что отвечает " Pass:=Pass+Key; ". Что это действие выполняет. И где и каким типом объявлена переменная Pass.
Ответ: Для того чтобы при вводе пароля вместо вводимых символов появлялись звёздочки, нужно переопределять переменную Key в обработчике OnKeyPress. Она имеет тип Char (т.е. символ):
Key:='*';
Предварительно нужно сохранить вводимый символ в предварительно обнулённой глобальной переменной Pass типа String:
Pass:=Pass+Key;
Таким образом, обработчик будет выглядеть так:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
Pass:=Pass+Key;
Key:='*';
end;

В дальнейшем на совпадение с паролем нужно анализировать переменную Pass.

Иван, добавлено 21.04.10, 22:45:56
Понятно. Спасибо. Но из этого вытекает другой вопрос. При наборе текста выводятся звездочки, это отлично, т.к. и хотели именно этого, но если после ввода чего-то в edit мне захотелось стереть то, что написал, клавишей "Backspace", то вместо стирания происходит ввод. И это видно по тому, что ничего не стирается, а звездочки увеличиваются.
Ответ: Для решения этой задачи нам нужно отлавливать нажатие клавиши "Backspace". Но обработчик OnKeyPress обрабатывает только нажатие клавиш с символами. Значит, нужно воспользоваться обработчиком OnKeyDown или OnKeyUp. В них переменная Key имеет тип Word, то есть число. Клавиша "Backspace" кодируется числом 8. Код любой клавиши можно узнать и без справочников, выполнив в одном из этих обработчиков:

Caption:=IntToStr(Key); //Код клавиши выводится в заголовок Формы

Итак, при нажатии "Backspace" нужно стирать по последнему символу и в Edit, и в Pass:

if(Key=8) then
begin
Edit1.Text:=copy(Edit1.Text, 1, Length(Edit1.Text)-1);
Pass:=copy(Pass, 1, Length(Pass)-1); //На самом деле, здесь отнимать нужно 2, далее увидите сами!
end;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if(Key=8) then
begin
Edit1.Text:=copy(Edit1.Text, 1, Length(Edit1.Text)-1);
Pass:=copy(Pass, 1, Length(Pass)-2); //Да, здесь именно минус 2, попробуйте сами, отнимите 1!
end
else Edit1.Text:=Edit1.Text+'*';
Edit1.SelStart:=Length(Edit1.Text); //Перемещение курсора в конец
Caption:=Pass; //Просто проверка, в реальной программе удалить
end;

Однако, при нажатии некоторых служебных клавиш наш Edit меняется. Чтобы этого не происходило, нужно коды этих клавиш собрать во множество, и менять Edit только если Key не принадлежит этому множеству. Вот как объявить множество:

var SlaveKey: set of 9..123;

Вот какие коды в него включить (если какие забыл, добавьте!):

SlaveKey:=[9, 13, 16..20, 27, 33..40, 45..46, 112..123];

Вот где проверять:

else if (not(Key in SlaveKey)) then Edit1.Text:=Edit1.Text+'*';

Однако замечаем, что при нажатии Escape (Esc, код 27) переменная Pass меняется, Edit нет. Исправляем здесь:

if((Key=8)or(Key=27)) then

Теперь последний символ можно стереть не только нажатием Backspace, но и Escape. Это нам не мешает.

Эти принципы использованы в демонстрационной программе, предоставляющей по паролю доступ к редактированию текста. Её можно скачать, и использовать модуль проверки пароля в своих проектах.

Необходимо сказать о том, что пароль в открытом виде хранить небезопасно, хоть в файле на диске, хоть в самой программе. Стоит открыть любой файл или даже запароленную программу простым Windows-блокнотом, и сохранённый пароль можно легко отыскать. Поэтому перед сохранением пароль шифруют функцией необратимого шифрования - то есть, зная зашифрованный пароль, исходную форму восстановить невозможно. Для шифрования часто применяют хеш-функцию md5, которая реализована и в Delphi:

function md5(s: string): string;
begin
Result := '';
with TIdHashMessageDigest5.Create do
try
Result := AnsiLowerCase(AsHex(HashValue(s)));
finally
Free;
end;
end;

Для работы этой функции необходимо добавить в список используемых модулей модуль IdHashMessageDigest из пакета Indy. Теперь введённый пользователем текст необходимо зашифровать и только потом сравнивать с сохранённым в файле также зашифрованным паролем. А злоумышленник, даже найдя зашифрованный пароль, не сможет по нему восстановить оригинальную фразу пароля!

Большие программы, как правило, состоят более чем из одной формы. Рассмотрим некоторые особенности работы с несколькими формами.

Главная форма по умолчанию. Выбор главной формы.

Главная форма-это основная форма, с которой начинается построение программы. Если программа запущена на выполнение, то закрытие главной формы, например методом Close, приведет к закрытию всей программы. В Delphi, по умолчанию главной формой является форма Form1. Если программа содержит более одной формы, то любую из этих форм можно сделать главной по своему усмотрению. Для этого надо выполнить:

-Project | Options… | В выпадающем списке Main Form выбрать нужную форму | Нажать OK

Пример1: Создать программу, состоящую из двух форм и сделать форму Form2 главной формой.

Решение:
1) Создать новый проект
2) Создать новую форму-Form2
3) Выполнить: Project | Options… | В выпадающем списке Main Form выбрать нужную форму | Нажать OK
4) Сохранить программу в рабочей папке под произвольным именем
5) Откомпилировать проект
6) Проверить работу программы

Переход между формами в процессе разработки программы.

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

-Выполнить View | Forms… | Выбрать нужную форму

-Нажать + F12 и выбрать нужную форму

Организация перехода между формами в процессе работы программы.

В процессе работы программы можно из одной формы вызвать другую в двух основных режимах: обычный режим и режим модальной формы. Если активной является форма Form1, то вызвать из нее форму Form2 можно, как обычную форму (в обычном режиме) или как модальную форму (в режиме модальной формы). Модальная форма-это форма, которая появляется перед пользователем и не исчезает пока не получит ответа. Пока не закрыта модальная форма, программа не может продолжать работу. При обычной вызове обычной формы используется метод show. При вызове формы как модальной используется метод showmodal.

Пример2: Написать программу, состоящую из двух форм и позволяющую переходить между формами.

Решение:
1) Создать новый проект
2) Создать новую форму-Form2
3) Перейти на Form1 (одним из трех способов)
4) Создать на Form1 кнопку (Button1) и назвать ее “На Form2”
5) Связать первую форму со второй. Для этого надо выполнить: File | Use Unit…| Выбрать имя модуля второй формы.
6) В обработчике события OnClick кнопки Button1 написать код:
form2.show;
7) Перейти на Form2
8) Создать на Form2 кнопку (Button2) и назвать ее “На Form1”
9) Связать вторую форму с первой. Для этого надо выполнить: File | Use Unit…| Выбрать имя модуля первой формы.
10) В обработчике события OnClick кнопки Button2 написать код:
form1.show;
11) Откомпилировать и запустить программу
12) Проверить работу программы
13) Завершить работу с программой
14) Сохранить программу в рабочей папке под произвольным именем

Пример3: Написать программу, состоящую из двух форм Form1 и Form2 и вызывающую из первой формы вторую, как модальную.

Решение:
1) Создать новый проект
2) Создать новую форму-Form2
3) Перейти на Form1 (одним из трех способов)
4) Создать на Form1 кнопку (Button1) и назвать ее “Вызов модальной формы”
5) Связать первую форму со второй. Для этого надо выполнить: File | Use Unit…| Выбрать имя модуля второй формы.
6) В обработчике события OnClick кнопки Button1 написать код:
form2.showmodal;
7) Перейти на Form2
8) Создать на Form2 кнопку (Button2) и назвать ее “Выход”
9) Для кнопки “Выход” написать код закрытия второй формы.
10) Откомпилировать и запустить программу
11) Проверить работу программы
12) Завершить работу с программой
13) Сохранить программу в рабочей папке под произвольным именем

Пояснение: При ссылке в коде программы одного модуля на объект, который описывается в другом модуле, необходимо связать эти модули между собой. В нашем случае надо связать между собой две формы Form1 и Form2, так как они описываются в различных модулях.

Создание диалогового окна ввода пароля.

Пример4. Создать диалоговое окно ввода пароля, которое позволяет заменить старый пароль на новый если старый пароль введен верно и подтверждение нового пароля прошло успешно.

Решение:
1) Форме Form1 задать заголовок “Change Password”
2) Создать три метки, три строки ввода и две кнопки, разместить и назвав их так, как показано на рисунке.

wpe1.jpg (28884 bytes)

Метки и строки ввода должны быть расположены по порядку одна над другой (т.е. самой верхней меткой должна быть метка Label1, самой нижней-Label3 тоже самое должно быть справедливо и для строк ввода). Кнопки должны быть расположены по порядку слева направо.
3) Выбрать кнопку OK, а также две нижние метки и две нижние строки ввода и установить для их свойства Enabled значение False.
4) Выбрать все три строки ввода, удалить значения их свойств Text и установить их свойства PasswordChar в значение @.
5) Для кнопок OK и Cancel ввести код закрытия формы.
6) Для обработчика OnChange строки ввода Edit1 ввести код:
edit2.enabled:=edit1.text=’Delphi’;
edit3.enabled:=edit2.enabled;
label2.enabled:=edit2.enabled;
label3.enabled:=edit2.enabled;
7) Выбрать две нижние строки ввода и для их обработчиков события OnChange ввести код:
button1.enabled:=(edit2.text<>’ ‘) and (edit2.text=edit3.text);
8) Сохранить программу в рабочей папке под произвольным именем
9) Откомпилировать программу
10) Проверить работу программы

Самостоятельная работа

1) Изменить пример 2 так, чтобы при переходе на следующую форму предыдущая форма закрывалась, объясните почему при закрытии формы Form1 с использованием метода Close происходит выход из программы, выясните можно ли не закрыть форму Form1, а скрыть ее.
2) Изменить оба фрагмента кода в примере 4 так, чтобы новый код использовал условный оператор.
3) Задача1: Написать программу, которая на одной форме запрашивает имя человека, а на другой форме выводит его в строке ввода.

Способ 1:
Открываешь программу Database Desktop, выбираешь там свою базу и убираешь пароль.

Что то совсем не понял. Как это? Объясните подробнее, что за пароль? Откуда он берется? Может это пароль в программе, а не в базе?

Создал в DD файл.dbf, в BDE администратор указал новую базу, скажем с именем DB, с драйвером Microsoft dBase Driver (*.dbf), указал DataBaseName (каталог с файлом), LangDriver (866), сохранил объект. В DBE Admin пытаюсь его открыть - запрашивает логин и пароль. Как убрать?

скорее всего пароль нельзя убрать поскольку есть встроенный админ
"sysdba" pass "masterkey" (на всякий случай! , и есче чем конектимся на базу?

Getting Started. Это - курсовая работа по Delphi. В ней рассматривается использование базы данных, созданной в Access, в программах Delphi. Создадим новый проект: Рисунок 1: Стартовая площадка Базу.

Getting Started.

Это - курсовая работа по Delphi. В ней рассматривается использование базы данных, созданной в Access, в программах Delphi.

Создадим новый проект:


Рисунок 1: Стартовая площадка
Рисунок 2: Вкладка ADO

Базовый компонент, осуществляющий соединение с базой данных - TADOConnection. Это невизуальный компонент, который мы видим только в режиме конструктора. Да и видеть нам его незачем - он выполняет только функцию соединения с базой данных. Имеет следующие важные свойства (не в алфавитном порядке, а в последовательности настройки):

  • ConnectionString - строка с параметрами соединения. Двойной щелчек откроет диалоговое окно настройки соединения. Но об этом позже.
  • Login Promt - спрашивать ли логин и пароль при каждом соединении.
  • Connection Timeout - сколько времени ждать ответа от базы данных. Пригодится, если ваше приложение взаимодействует с базой данных на удалённом сервере.
  • Connected - если True, то компонент подключен к базе данных. Изменение параметров присвоит ему значение False, поэтому если нужно донастроить компонент - не забудьте выставить True в этом свойстве

Итак, вернемся к ConnectionString. После двойного клика на поле значений откроется нам вот такое окно:


Рисунок 3: ConnectionString - ручное введение

Если вы помните параметры наизусть, то можно вводить значение в ConnectionString вручную. Вот только печатать много и велика вероятность ошибки, да и зачем, если есть удобный мастер построения этой строки. Нажимаем кнопку Build:


Рисунок 4: ConnectionString - мастер построения, шаг 1

Базы данных Microsoft Access 2003 работают под управлением поставщика Microsoft Jet 4.0 OLE DB Provider.


Рисунок 5: ConnectionString - мастер построения, шаг 2

Выбираем местонахождение базы данных. В поля "Пользователь" и "Пароль" вводим логин и пароль от вашей базы данных.Жмём дважды OK. Всё, соединение с базой данных настроено.

Важное замечание! Если вы собираетесь переносить ваш проект, то из-за того, что мастер записывает в свойства объектов абсолютный путь к базе данных, проект придется перекомпилировать на каждом новом компьютере с указанием нового пути. Чтобы избавиться от этого, нужно изменить абсолютный путь на относительный в Connection String. Будьте внимательны! Не затроньте других параметров!

Ну и теперь мы можем включить соединение. Для этого в свойство Connected запишем True.

К базе данных мы присоединились. Пора сделать то, ради чего мы к ней соединялись - использовать данные. Для этого существует компонент TADODataSet.


- Пиктограмма компонента TADODataSet. Находится на вкладке ADO рядом с TADOConnection.

Важные свойства компонента TADODataSet:

  • CommandText - SQL запрос на выборку, результат которого мы будем отображать
  • Connection - указатель на соединение с базой данных, TADOConnection
  • Active - если True, то активен. После изменения свойств не забывайте ставить это свойство в True

Двойной щелчок в поле значения свойства CommandText откроет нам такое окно:


Рисунок 6: Составляем запрос

Двойной щелчок на имени таблицы добавит таблицу в запрос. Ну а двойной щелчок по имени поля добавит поле в запрос. Кстати, в списке таблиц так же отображаются запросы. Вот только модифицировать ничего нельзя. Запрос в этой строке полностью поддерживает синтаксис SQL. После модификации строки запроса не забудьте выставить Active = true, иначе не увидите результатов запроса.


Настало время посмотреть, что у нас получилось. Переходим на вкладку Data Access, выбираем компонент TDataSource. Единственное свойство этого компонента, которым мы будем пользоваться - DataSet. Выбираем наш предварительно настроенный DataSet из списка.

Важное замечание! У компонента DataSet так же существует свойство DataSource. Не поддаёмся на искушение и оставляем это поле пустым.


Переходим на вкладку Data Controls. На этой вкладке расположены объекты, с помощью которых мы сможем получить доступ к данным. Сейчас нас интересует компонент TDBGrid - обычная двухмерная таблица .

Рисунок 7: TDBGrid на форме

Важные свойства компонента TADODataSet:

  • DataSource - указатель на TDataSource
  • Columns - столбцы таблицы

Выбираем в свойстве DataSource предварительно настроенный компонент. И в таблице DBGrid мы видим результат нашего запроса.


Рисунок 8: TDBGrid в действии

Приложение готово к работе.

Lookup поля

Итак, мы вполне уверенно вытаскиваем данные из таблиц. Но при многочисленных связях - а в базе данных в третьей нормальной форме их будет достаточно много - таблица будет пестрить многочисленными числовыми индексами, малопонятными обычному пользователю. Обратим внимание на рисунок 8 и рисунок 9. На рисунке 8 в поле Тип_памяти мы видим числовые индексы, когда как в Access у нас удобно подставляются данные.


Рисунок 9: Подстановка в Ms Access

Существует два варианта это сделать в Delphi. Первый вариант - использовать SQL запрос:

select Интерфейс, Память, Название as Тип_памяти from Видеокарты, Тип_ОЗУ_Видеокарты WHERE Тип_памяти = Тип_ОЗУ_Видеокарты.id

Не забыли куда писать этот запрос? Конечно в свойство CommandString компонента ADODataSet. Не забываем включить свойство Active после изменения запроса. Итак, нашим взглядам предстает такая картина:


Рисунок 10: Результат выполнения запроса

Итак, теперь по порядку. Мы выбираем данные из двух таблиц. Но если просто указать select Интерфейс, Память, Название as Тип_памяти from Видеокарты, Тип_ОЗУ_Видеокарты, то для наших трёх записей мы получим девять записей - выберутся все возможные варианты пересечения между таблицами. А так выберутся только те записи, где тип_памяти видеокарты равен id в списке типов памяти видеокарт.

Важное замечание! Для таких операций лучше использовать JOIN

Запускаем проект. Всё отображается, работает. Но давайте попробуем изменить данные или же добавить.


Рисунок 11: Вот что бывает, когда пытаешься изменить данные

Скорее всего это как-то лечится. Но как - я еще не разобрался. Поэтому мы применим магию Lookup полей для возможности корректного редактирования. Это и есть второй вариант отображения значений вместо индексов. Делается lookup поле в несколько шагов:


  • Шаг 1: Добавляем еще один DataSet, настраиваем его на наше соединение, а в commandText прописываем выборку всех записей таблицы со значениями. Запрос будет примерно таким:
    select * from Тип_ОЗУ_Видеокарты. Не забываем выставить свойство Active в True.
  • Шаг 2:

Рисунок 12: Нажмём на крестик рядом с DataSet

Нажмём на крестик рядом с DataSet - раскроется подобный список. Нас интересует Fields - нажмём правой кнопкой мыши и выберем "Add All Fields". Проделаем это с двумя нашими DataSet'ами.

Рисунок 13: Добавление нового поля

Правой кнопкой мыши на Fields -> New Field. Появится диалог создания нового отображаемого поля.

Важное замечание! Все операции с Fields внутри DataSet'ов не влияют на структуру самой базы данных.

Вписываем название. Поле Component заполнится самостоятельно. Так же выбираем тип поля, в моём случае это String. Среди трёх RadioButton выбираем Lookup - это значит, что значение поля мы будем выбирать из другого места. Key Fields - поле, которое содержит значения. Dataset - выбираем результирующий DataSet. Lookup Keys - поле, с которым сравниваем, обычно поле со счетчиком. Result Field - поле, значение которого мы будем показывать.


Результаты:

Рисунок 14: Результат в режиме конструктора


Рисунок 15: Результат в скомпилированном приложении

А самое главное, что всё без проблем редактируется.

Итак, в этой небольшой статье я рассмотрел основные принципы взаимодействия базы данных, спроектированной в MS Access, с Delphi. Удачи в написании собственных приложений!

Читайте также: