![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Объектно-ориентированное программирование [D7, WinXP]
reg24r © (2005-08-02 20:23:00)Я не очень силен в ООП и поэтому хотел бы получить ответ на следующий вопрос:
В программе необходимо предусмотреть несколько пользователей
с сохранением имени и пароля скажем в текстовом файле.
Как грамотно решить эту задачу с использованием принципов объектно-ориентированного программирования?
Digitman (2005-08-03 14:59:00) [1]за эти $30. смею заметить, ты мог бы приобрести (хоть в тундре !) вполне приличный "букварь" по "основам" (и не только)
reg24r (2005-08-03 14:43:00) [2]Уважаемый Джо
Сообщите мне ваш домашний адрес на Емайл reg24r@web.de,
я перечислю вам 30$.
Не могу оставить без внимания ваше желание помочь.
Остальным маленький совет, если вам лень больше 3 строчек написать, нефиг сюда заходить.
Джо (2005-08-03 14:37:00) [3]
> [23] Гаврила © (03.08.05 10:21)
> [22] k2 © (03.08.05 04:23)
За загрузку сведений о пользователях отвечает один-единственный метод. Который, при необходимости, и правится соответствующим образом. Хоть с СУБД по SSL-соединению запрашивай, хоть откуда хош. Кроме того, пацан написал:
> [3] reg24r © (02.08.05 20:29)
> Где хранить пароли сейчас не суть важно.
Гаврила (2005-08-03 10:21:00) [4]
> уважаемый пацан да ещё в свете ООП кроме кракозябров в таких
> файлах ничегож хранить правов не имеет :о)
А совсем уважаемый пацан вообще не имеет правов хранить такое в файлах
:-) Ибо файл подменить можно
k2 (2005-08-03 04:23:00) [5]Джо © (02.08.05 21:33)
может ещё методы encode/decode добавить?
уважаемый пацан да ещё в свете ООП кроме кракозябров в таких файлах ничегож хранить правов не имеет :о)
Гаврила (2005-08-02 22:37:00) [6]
> [20] Джо ©
> А вот мне делать нечего %-)
Воистину так :-)))
Джо (2005-08-02 21:33:00) [7]А вот мне делать нечего %-)
В свете последних ООП-технологий, скелет такого приложения может выглядеть так :)
{
Модуль с менеджером пользователей
Добавляет глобальную переменную UserManager
}
unit LoginMgr;
interface
uses SysUtils, Classes, Contnrs;
type
TUser = class
private
FUserName,
FPassword: string;
procedure Logoff;
function CheckLoginInfo (const AUserName, APassword: string): Boolean;
public
constructor Create (const AUserName, APassword: string);
procedure CustomizeApplication;
property UserName: string read FUserName;
property Password: string read FPassword;
end;
TUserManager = class
private
FUserList: TObjectList;
FCurrentUser: TUser;
public
function Login (const AUserName, APassword: string): Boolean;
function TryLoginInteractively: Boolean;
procedure Logoff;
// ссылка на текущего пользователя
// т.е, последнего успешно залогинившегося
property CurrentUser: TUser read FCurrentUser;
procedure LoadUsersFromFile (const AFileName: string);
constructor Create;
destructor Destroy; override;
end;
var
UserManager: TUserManager;
implementation
uses Forms, Controls, ExtCtrls, StdCtrls, Dialogs;
// диалоговое окно с запросом
function ShowLoginDlg (var AUserName, APassword: string): Boolean;
var
Frm: TForm;
EditUserName,
EditPassword: TLabeledEdit;
BtnOK, BtnCancel: TButton;
begin
Result := False;
Frm := TForm.Create(nil);
try
with Frm do
begin
Frm.Caption := 'Login';
BorderStyle := bsDialog;
Position := poScreenCenter;
Width := 180;
Height := 160;
end;
EditUserName := TLabeledEdit.Create(Frm);
with EditUserName do
begin
EditLabel.Caption := 'Login:';
Parent := Frm;
Left := 2;
Top := 20;
end;
EditPassword := TLabeledEdit.Create(Frm);
with EditPassword do
begin
PasswordChar := '*';
EditLabel.Caption := 'Password:';
Parent := Frm;
Left := 2;
Top := 60;
end;
BtnOK := TButton.Create(Frm);
with BtnOK do
begin
Parent := Frm;
Caption := 'OK';
Left := 10;
Top := Frm.Height - BtnOK.Height - 40;
ModalResult := mrOK;
Default := True;
end;
BtnCancel := TButton.Create(Frm);
with BtnCancel do
begin
Parent := Frm;
Caption := 'Cancel';
Left := 20 + BtnOk.Width;
Top := Frm.Height - BtnCancel.Height - 40;
ModalResult := mrCancel;
Cancel := True;
end;
if Frm.ShowModal = mrOK then
begin
AUserName := EditUserName.Text;
APassword := EditPassword.Text;
Result := True;
end;
finally
Frm.Free;
end;
end;
{ TUserManager }
constructor TUserManager.Create;
begin
inherited;
FUserList := TObjectList.Create (True);
Logoff
end;
destructor TUserManager.Destroy;
begin
FUserList.Free;
inherited;
end;
//
// эту процедуру необходимо переписать с учетом шифрования данных
//
procedure TUserManager.LoadUsersFromFile(const AFileName: string);
var
Lst: TStrings;
I: Integer;
AUserName,
APassword: string;
procedure SplitString (const ASource: string; var AUserName,APassword: string);
const
Delimiter: Char = ',';
var
N: Integer;
begin
AUserName := '';
APassword := '';
N := Pos (Delimiter,ASource);
AUserName := Copy (ASource,1,N-1);
APassword := Copy (ASource,N+1,Length(ASource));
end;
begin
{
Формат файла:
UserName1,Password1
UserName2,Password2
...
Остальные данные для конкретного пользователя
Также можно хранить здесь
}
Lst := TStringList.Create;
try
Lst.LoadFromFile(AFileName);
for I := 0 to Lst.Count-1 do
begin
SplitString(Lst[I],AUserName,APassword);
FUserList.Add(TUser.Create(AUserName,APassword))
end;
finally
Lst.Free;
end;
end;
// пробуем залогиниться с указанными именем и паролем
// в случае успеха возвращаем True.
function TUserManager.Login(const AUserName, APassword: string): Boolean;
var
I: Integer;
begin
Result := False;
FCurrentUser := nil;
for I := 0 to FUserList.Count-1 do
if TUser(FUserList[I]).CheckLoginInfo(AUserName,APassword) then
begin
FCurrentUser := TUser(FUserList[I]);
Result := True;
Break
end
end;
procedure TUserManager.Logoff;
begin
if FCurrentUser <> nil then
FCurrentUser.Logoff;
end;
function TUserManager.TryLoginInteractively: Boolean;
var
AUserName,
APassword: string;
begin
Result := False;
while UserManager.CurrentUser = nil do
begin
if not ShowLoginDlg(AUserName,APassword) then
Break;
if not UserManager.Login(AUserName,APassword) then
MessageDlg ('Incorrect login/password',mtError,[MBOK],-1)
else
Result := True;
end;
end;
{ TUser }
function TUser.CheckLoginInfo(const AUserName, APassword: string): Boolean;
begin
Result :=
(AnsiUpperCase(AUserName) = AnsiUpperCase(FUserName)) and
(APassword = FPassword)
end;
constructor TUser.Create(const AUserName, APassword: string);
begin
FUserName := AUserName;
FPassword := APassword;
end;
{ TInvalidUser }
procedure TUser.CustomizeApplication;
begin
// сдесь устанавливаем свойства приложения
// в зависимости от данных пользователя
// например, изменим заголовок главной формы...
Application.MainForm.Caption :=
Format ('Пользователь %s, пароль %s',[FUserName,FPassword])
end;
procedure TUser.Logoff;
begin
Application.MainForm.Caption := 'Нет пользователя'
end;
initialization
UserManager := TUserManager.Create;
// читаем данные о пользователях из файла
UserManager.LoadUsersFromFile('d:\users.txt');
{
Образец файла данных с 2-мя пользователями
--------------------
sergey,psw1
admin,psw2
}
finalization
UserManager.Logoff;
UserManager.Free;
end.
Образец приложения.
Создаем пустое приложение с одной формой.
Файл проекта:
program Project2;
uses
Forms,
Dialogs,
Unit1 in 'Unit1.pas' {Form1},
LoginMgr in 'LoginMgr.pas';
{$R *.res}
begin
Application.Initialize;
// предлагаем залогиниться
if not UserManager.TryLoginInteractively then
Halt(1); // ну, и не надо :-)
Application.CreateForm(TForm1, Form1);
// Применяем настройки текущего пользователя
UserManager.CurrentUser.CustomizeApplication;
Application.Run;
end.
В общем, учись, студент ;-)
Вопросы по сути дела - приветствуются. Вопросы, показывающие полное непомимание предмета - игнорируются и огорчают :-))
Fay (2005-08-02 21:25:00) [8]2 reg24r © (02.08.05 21:04) [17]
Предполагается, что у читающего есть голова, а в ней - мозги.
Проектирование классов - это такая штука, там думать надо...
А в статьях пишут какие БУКВЫ писать.
TUser (2005-08-02 21:10:00) [9]Да, было бы ООП, остальное - фигня, так?
reg24r (2005-08-02 21:04:00) [10]Когда достигнешь определенного уровня, то уже не помнишь
какие проблемы интересовали тебя когда начинал и соответственно ничего путевого написать не получается.
Читал много статей, везде
описание создания класса,методы,поля и т.д. и т.п.
Это есть в любой книге.
Как это все применить вот в чем вопрос.
И вот здесь начинаются проблемы у писателей.
Вначале они пишут:"это все для начинающих"
Однако описывается все о так, что понимают только те кто это уже знает.
Зачем такое писать,не понятно.
Fay (2005-08-02 20:56:00) [11]2 reg24r © (02.08.05 20:55) [15]
Читать готовые тоже бывает интересно.
reg24r (2005-08-02 20:55:00) [12]А если написать эту статью?
Могу вопросы начинающего подкинуть.
Получится очень интересно.
Гаврила (2005-08-02 20:53:00) [13]
> reg24r ©
Эта тема слишком обширна для ответа в форуме. Для этого нужна минимум хорошая статья, максимум книга
reg24r (2005-08-02 20:52:00) [14]У меня нет лекций, не учился я этому делу в институте.
Fay (2005-08-02 20:51:00) [15]2 reg24r © (02.08.05 20:48) [11]
Откройте свои лекции по технологии программирования. Там всё (должно быть) написано.
reg24r (2005-08-02 20:48:00) [16]Действительно здесь можно получить ответ на ЛЮБОЙ вопрос.
Fay (2005-08-02 20:46:00) [17]2 reg24r © (02.08.05 20:43) [9]
Мы вчера с отцом ходили в горы.
Да?
reg24r (2005-08-02 20:43:00) [18]ООП как таковое может иметь отношение к задачке любого уровня
даже такой простой. Или?
TUser (2005-08-02 20:35:00) [19]Имеется в виду, что ООП как таковое не имеет к задаче никакого отношения.
reg24r (2005-08-02 20:34:00) [20]Для вас глупый для других нет