Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];

Вниз

Объектно-ориентированное программирование   Найти похожие ветки 

 
reg24r ©   (2005-08-02 20:23) [0]

Я не очень силен в ООП и поэтому хотел бы получить ответ на следующий вопрос:
В программе необходимо предусмотреть несколько пользователей
с сохранением имени и пароля скажем в текстовом файле.
Как грамотно решить эту задачу с использованием принципов объектно-ориентированного программирования?


 
TUser ©   (2005-08-02 20:26) [1]

Не-силёность в ООП не помешает тебе хранить пароли пользователей, причем весьма надежно. Только не надо хранить их в текстовом файле.


 
Гаврила ©   (2005-08-02 20:29) [2]


> Как грамотно решить эту задачу с использованием принципов
> объектно-ориентированного программирования?


Полагаю, первое, что надо сделать - это создать класс, и назвать его TUser
:-)))


 
reg24r ©   (2005-08-02 20:29) [3]

Где хранить пароли сейчас не суть важно.
Хотелось бы ответ на вопрос получить.


 
reg24r ©   (2005-08-02 20:32) [4]

Уважаемый Гаврила
вы не могли бы немного тему дальше раскрыть.


 
Fay ©   (2005-08-02 20:33) [5]

2 reg24r ©   (02.08.05 20:29) [3]
Вы, конечно, извините, но вопрос довольно глупый.
Спросили бы ещё "Как грамотно решить эту задачу в свете решений XIX съезда компартии Уругвая?"...


 
TUser ©   (2005-08-02 20:33) [6]

Я могу
type
TMe = class;

TMe := TMe.Create;


 
reg24r ©   (2005-08-02 20:34) [7]

Для вас глупый для других нет


 
TUser ©   (2005-08-02 20:35) [8]

Имеется в виду, что ООП как таковое не имеет к задаче никакого отношения.


 
reg24r ©   (2005-08-02 20:43) [9]

ООП как таковое может иметь отношение к задачке любого уровня
даже такой простой. Или?


 
Fay ©   (2005-08-02 20:46) [10]

2 reg24r ©   (02.08.05 20:43) [9]
Мы вчера с отцом ходили в горы.
Да?


 
reg24r ©   (2005-08-02 20:48) [11]

Действительно здесь можно получить ответ на ЛЮБОЙ вопрос.


 
Fay ©   (2005-08-02 20:51) [12]

2 reg24r ©   (02.08.05 20:48) [11]

Откройте свои лекции по технологии программирования. Там всё (должно быть) написано.


 
reg24r ©   (2005-08-02 20:52) [13]

У меня нет лекций, не учился я этому делу в институте.


 
Гаврила ©   (2005-08-02 20:53) [14]


> reg24r ©


Эта тема слишком обширна для ответа в форуме. Для этого нужна минимум хорошая статья, максимум книга


 
reg24r ©   (2005-08-02 20:55) [15]

А если написать эту статью?
Могу вопросы начинающего подкинуть.
Получится очень интересно.


 
Fay ©   (2005-08-02 20:56) [16]

2 reg24r ©   (02.08.05 20:55) [15]
Читать готовые тоже бывает интересно.


 
reg24r ©   (2005-08-02 21:04) [17]

Когда достигнешь определенного уровня, то уже не помнишь
какие проблемы интересовали тебя когда начинал и соответственно ничего путевого написать не получается.
Читал много статей, везде
описание создания класса,методы,поля и т.д. и т.п.
Это есть в любой книге.
Как это все применить вот в чем вопрос.
И вот здесь начинаются проблемы у писателей.
Вначале они пишут:"это все для начинающих"
Однако описывается все о так, что понимают только те кто это уже знает.
Зачем такое писать,не понятно.


 
TUser ©   (2005-08-02 21:10) [18]

Да, было бы ООП, остальное - фигня, так?


 
Fay ©   (2005-08-02 21:25) [19]

2 reg24r ©   (02.08.05 21:04) [17]
Предполагается, что у читающего есть голова, а в ней - мозги.
Проектирование классов - это такая штука, там думать надо...
А в статьях пишут какие БУКВЫ писать.


 
Джо ©   (2005-08-02 21:33) [20]

А вот мне делать нечего %-)
В свете последних ООП-технологий, скелет такого приложения может выглядеть так :)

{
 Модуль с менеджером пользователей
 Добавляет глобальную переменную 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.

В общем, учись, студент ;-)
Вопросы по сути дела - приветствуются. Вопросы, показывающие полное непомимание предмета - игнорируются и огорчают :-))


 
Гаврила ©   (2005-08-02 22:37) [21]


>  [20] Джо ©  



> А вот мне делать нечего %-)


Воистину так :-)))


 
k2 ©   (2005-08-03 04:23) [22]

Джо ©   (02.08.05 21:33)
может ещё методы encode/decode добавить?
уважаемый пацан да ещё в свете ООП кроме кракозябров в таких файлах ничегож хранить правов не имеет :о)


 
Гаврила ©   (2005-08-03 10:21) [23]


> уважаемый пацан да ещё в свете ООП кроме кракозябров в таких
> файлах ничегож хранить правов не имеет :о)


А совсем уважаемый пацан вообще не имеет правов хранить такое в файлах
:-) Ибо файл подменить можно


 
Джо ©   (2005-08-03 14:37) [24]


>  [23] Гаврила ©   (03.08.05 10:21)


> [22] k2 ©   (03.08.05 04:23)

За загрузку сведений о пользователях отвечает один-единственный метод. Который, при необходимости, и правится соответствующим образом. Хоть с СУБД по SSL-соединению запрашивай, хоть откуда хош. Кроме того, пацан написал:
> [3] reg24r ©   (02.08.05 20:29)
> Где хранить пароли сейчас не суть важно.


 
reg24r ©   (2005-08-03 14:43) [25]

Уважаемый Джо
Сообщите мне ваш домашний адрес на Емайл reg24r@web.de,
я перечислю вам 30$.
Не могу оставить без внимания ваше желание помочь.
Остальным маленький совет, если вам лень больше 3 строчек написать, нефиг сюда заходить.


 
Digitman ©   (2005-08-03 14:59) [26]

за эти $30. смею заметить, ты мог бы приобрести (хоть в тундре !) вполне приличный "букварь" по "основам" (и не только)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.054 c
14-1122620383
syte_ser78
2005-07-29 10:59
2005.08.21
посоветуйте украинский интернет магазин


1-1122892737
Proz2
2005-08-01 14:38
2005.08.21
Результат исполнения Action из TActionList


1-1122537926
Choovak
2005-07-28 12:05
2005.08.21
Зашифровать файл


1-1122616813
Viktop
2005-07-29 10:00
2005.08.21
Вопрос по DevExpress


1-1122992600
Aleksandr.
2005-08-02 18:23
2005.08.21
Как убрать мерцание при раскраске текста в TRichEdit?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский