Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
[navy][i]// for automatic syntax highlighting see faq102-6487
[/i][/navy][b]unit[/b] UserWrap;
[b]interface[/b]
[b]uses[/b]
Variants, Classes, DB, ADODB, SysUtils, Controls, Graphics, Forms, Windows;
[b]type[/b]
TCustomUsers = [b]class[/b];
TCustomUser = [b]class[/b];
TUserTableOptions = [b]class[/b];
[navy][i]//Represents User Table Options
[/i][/navy] TUserTableOptions = [b]class[/b](TPersistent)
[b]private[/b]
fUserTable: String; [navy][i]//Database Table where User Data is Stored
[/i][/navy] fIDField: String; [navy][i]//ID Field
[/i][/navy] fUserNameField: String; [navy][i]//User Name Field
[/i][/navy] fPasswordField: String; [navy][i]//Password Field
[/i][/navy] fFirstNameField: String; [navy][i]//First Name Field
[/i][/navy] fMiddleNameField: String; [navy][i]//Middle Name Field
[/i][/navy] fLastNameField: String; [navy][i]//Last Name Field
[/i][/navy] fNickNameField: String; [navy][i]//Nick Name Field
[/i][/navy] [b]published[/b]
[b]property[/b] UserTable: String [b]read[/b] fUserTable [b]write[/b] fUserTable;
[b]property[/b] IDField: String [b]read[/b] fIDField [b]write[/b] fIDField;
[b]property[/b] UserNameField: String [b]read[/b] fUserNameField [b]write[/b] fUserNameField;
[b]property[/b] PasswordField: String [b]read[/b] fPasswordField [b]write[/b] fPasswordField;
[b]property[/b] FirstNameField: String [b]read[/b] fFirstNameField [b]write[/b] fFirstNameField;
[b]property[/b] MiddleNameField: String [b]read[/b] fMiddleNameField [b]write[/b] fMiddleNameField;
[b]property[/b] LastNameField: String [b]read[/b] fLastNameField [b]write[/b] fLastNameField;
[b]property[/b] NickNameField: String [b]read[/b] fNickNameField [b]write[/b] fNickNameField;
[b]end[/b];
[navy][i]//Represents an individual user
[/i][/navy] TCustomUser = [b]class[/b](TObject)
[b]private[/b]
fConnectionString: String;
fID: Integer;
fUserName: String;
fPassword: String;
fFirstName: String;
fMiddleName: String;
fLastName: String;
fNickName: String;
fOwner: TCustomUsers;
[b]function[/b] GetOptions: TUserTableOptions;
[b]function[/b] GetID: Integer;
[b]function[/b] GetUserName: String;
[b]function[/b] GetFirstName: String;
[b]function[/b] GetLastName: String;
[b]procedure[/b] SetUserName(Value: String);
[b]procedure[/b] SetFirstName(Value: String);
[b]procedure[/b] SetLastName(Value: String);
[b]function[/b] GetMiddleName: String;
[b]function[/b] GetNickName: String;
[b]function[/b] GetPassword: String;
[b]procedure[/b] SetMiddleName(Value: String);
[b]procedure[/b] SetNickName(Value: String);
[b]procedure[/b] SetPassword(Value: String);
[b]function[/b] ReadString(Field: String): String;
[b]function[/b] ReadInteger(Field: String): Integer;
[b]function[/b] SaveString(Field: String; Value: String): Bool;
[b]function[/b] SaveInteger(Field: String; Value: Integer): Bool;
[b]public[/b]
[b]constructor[/b] Create(AOwner: TCustomUsers);
[b]destructor[/b] Destroy; [b]override[/b];
[b]published[/b]
[b]property[/b] ConnectionString: String [b]read[/b] fConnectionString [b]write[/b] fConnectionString;
[b]property[/b] ID: Integer [b]read[/b] GetID; [navy][i]//No setting function because ID shall remain the same
[/i][/navy] [b]property[/b] UserName: String [b]read[/b] GetUserName [b]write[/b] SetUserName;
[b]property[/b] Password: String [b]read[/b] GetPassword [b]write[/b] SetPassword;
[b]property[/b] FirstName: String [b]read[/b] GetFirstName [b]write[/b] SetFirstName;
[b]property[/b] MiddleName: String [b]read[/b] GetMiddleName [b]write[/b] SetMiddleName;
[b]property[/b] LastName: String [b]read[/b] GetLastName [b]write[/b] SetLastName;
[b]property[/b] NickName: String [b]read[/b] GetNickName [b]write[/b] SetNickName;
[b]property[/b] Options: TUserTableOptions [b]read[/b] GetOptions;
[b]end[/b];
[navy][i]//Represents a set of users (TCustomUser)
[/i][/navy] TCustomUsers = [b]class[/b](TComponent)
[b]private[/b]
fUserList: TStringList;
fConnectionString: String;
fOptions: TUserTableOptions;
[b]function[/b] GetUser(Index: Integer): TCustomUser;
[b]procedure[/b] SetConnectionString(Value: String);
[b]function[/b] GetCount: Integer;
[b]public[/b]
[b]constructor[/b] Create(AOwner: TComponent); [b]override[/b];
[b]destructor[/b] Destroy; [b]override[/b];
[b]procedure[/b] Refresh;
[b]property[/b] Count: Integer [b]read[/b] GetCount;
[b]property[/b] Users[Index: Integer]: TCustomUser [b]read[/b] GetUser;
[b]published[/b]
[b]property[/b] ConnectionString: String [b]read[/b] fConnectionString [b]write[/b] SetConnectionString;
[b]property[/b] Options: TUserTableOptions [b]read[/b] fOptions [b]write[/b] fOptions;
[b]end[/b];
[b]procedure[/b] Register;
[b]implementation[/b]
[b]procedure[/b] Register;
[b]begin[/b]
RegisterComponents([teal]'JD Custom'[/teal], [TCustomUsers]);
[b]end[/b];
[b]function[/b] TCustomUser.GetID: Integer;
[b]begin[/b]
Self.fID:= Self.ReadInteger(Options.IDField);
Result:= Self.fID;
[b]end[/b];
[b]function[/b] TCustomUser.GetUserName: String;
[b]begin[/b]
Self.fUserName:= Self.ReadString(Options.UserNameField);
Result:= Self.fUserName;
[b]end[/b];
[b]function[/b] TCustomUser.GetFirstName: String;
[b]begin[/b]
Self.fFirstName:= Self.ReadString(Options.FirstNameField);
Result:= Self.fFirstName;
[b]end[/b];
[b]function[/b] TCustomUser.GetLastName: String;
[b]begin[/b]
Self.fLastName:= Self.ReadString(Options.LastNameField);
Result:= Self.fLastName;
[b]end[/b];
[b]function[/b] TCustomUser.GetMiddleName: String;
[b]begin[/b]
Self.fMiddleName:= Self.ReadString(Options.MiddleNameField);
Result:= Self.fMiddleName;
[b]end[/b];
[b]function[/b] TCustomUser.GetNickName: String;
[b]begin[/b]
Self.fNickName:= Self.ReadString(Options.NickNameField);
Result:= Self.fNickName;
[b]end[/b];
[b]function[/b] TCustomUser.GetPassword: String;
[b]begin[/b]
Self.fPassword:= Self.ReadString(Options.PasswordField);
Result:= Self.fPassword;
[b]end[/b];
[b]procedure[/b] TCustomUser.SetMiddleName(Value: String);
[b]begin[/b]
[b]if[/b] Self.SaveString(Options.MiddleNameField, Value) [b]then[/b]
Self.fMiddleName:= Value;
[b]end[/b];
[b]procedure[/b] TCustomUser.SetNickName(Value: String);
[b]begin[/b]
[b]if[/b] Self.SaveString(Options.NickNameField, Value) [b]then[/b]
Self.fNickName:= Value;
[b]end[/b];
[b]procedure[/b] TCustomUser.SetPassword(Value: String);
[b]begin[/b]
[b]if[/b] Self.SaveString(Options.PasswordField, Value) [b]then[/b]
Self.fPassword:= Value;
[b]end[/b];
[b]procedure[/b] TCustomUser.SetUserName(Value: String);
[b]begin[/b]
[b]if[/b] Self.SaveString(Options.UserNameField, Value) [b]then[/b]
Self.fUserName:= Value;
[b]end[/b];
[b]procedure[/b] TCustomUser.SetFirstName(Value: String);
[b]begin[/b]
[b]if[/b] Self.SaveString(Options.FirstNameField, Value) [b]then[/b]
Self.fFirstName:= Value;
[b]end[/b];
[b]procedure[/b] TCustomUser.SetLastName(Value: String);
[b]begin[/b]
[b]if[/b] Self.SaveString(Options.LastNameField, Value) [b]then[/b]
Self.fLastName:= Value;
[b]end[/b];
[b]constructor[/b] TCustomUser.Create(AOwner: TCustomUsers);
[b]begin[/b]
Self.fOwner:= AOwner;
[b]end[/b];
[b]destructor[/b] TCustomUser.Destroy;
[b]begin[/b]
[b]inherited[/b] Destroy;
[b]end[/b];
[b]function[/b] TCustomUser.ReadString(Field: String): String;
[b]var[/b]
Q: TADOQuery;
[b]begin[/b]
Result:= [teal]''[/teal];
Q:= TADOQuery.Create([b]nil[/b]);
[b]try[/b]
Q.ConnectionString:= Self.fConnectionString;
Q.SQL.Text:= [teal]'select '[/teal]+Field+[teal]' from ['[/teal]+Options.UserTable+[teal]'] where ['[/teal]+
Options.IDField+[teal]'] = '[/teal]+IntToStr(Self.fID);
Q.Open;
[b]if[/b] [b]not[/b] Q.IsEmpty [b]then[/b] [b]begin[/b]
Q.First;
Result:= Q.FieldByName(Field).AsString;
[b]end[/b];
Q.Close;
[b]finally[/b]
[b]if[/b] assigned(Q) [b]then[/b] [b]begin[/b]
[b]if[/b] Q.Active [b]then[/b] Q.Close;
Q.Free;
[b]end[/b];
[b]end[/b];
[b]end[/b];
[b]function[/b] TCustomUser.ReadInteger(Field: String): Integer;
[b]var[/b]
Q: TADOQuery;
[b]begin[/b]
Result:= [purple]0[/purple];
Q:= TADOQuery.Create([b]nil[/b]);
[b]try[/b]
Q.ConnectionString:= Self.fConnectionString;
Q.SQL.Text:= [teal]'select '[/teal]+Field+[teal]' from ['[/teal]+Options.UserTable+[teal]'] where ['[/teal]+
Options.IDField+[teal]'] = '[/teal]+IntToStr(Self.fID);
Q.Open;
[b]if[/b] [b]not[/b] Q.IsEmpty [b]then[/b] [b]begin[/b]
Q.First;
Result:= Q.FieldByName(Field).AsInteger;
[b]end[/b];
Q.Close;
[b]finally[/b]
[b]if[/b] assigned(Q) [b]then[/b] [b]begin[/b]
[b]if[/b] Q.Active [b]then[/b] Q.Close;
Q.Free;
[b]end[/b];
[b]end[/b];
[b]end[/b];
[b]function[/b] TCustomUser.SaveString(Field: String; Value: String): Bool;
[b]var[/b]
Q: TADOQuery;
[b]begin[/b]
Result:= False;
Q:= TADOQuery.Create([b]nil[/b]);
[b]try[/b]
Q.ConnectionString:= Self.fConnectionString;
Q.SQL.Text:= [teal]'select '[/teal]+Field+[teal]' from ['[/teal]+Options.UserTable+[teal]'] where ['[/teal]+
Options.IDField+[teal]'] = '[/teal]+IntToStr(Self.fID);
Q.Open;
[b]if[/b] [b]not[/b] Q.IsEmpty [b]then[/b] [b]begin[/b]
Q.First;
[b]try[/b]
Q.Edit;
Q[Field]:= Value;
Q.Post;
Result:= True;
[b]except[/b]
[b]on[/b] e: exception [b]do[/b] [b]begin[/b]
Result:= False;
[b]end[/b];
[b]end[/b];
[b]end[/b];
Q.Close;
[b]finally[/b]
[b]if[/b] assigned(Q) [b]then[/b] [b]begin[/b]
[b]if[/b] Q.Active [b]then[/b] Q.Close;
Q.Free;
[b]end[/b];
[b]end[/b];
[b]end[/b];
[b]function[/b] TCustomUser.SaveInteger(Field: String; Value: Integer): Bool;
[b]var[/b]
Q: TADOQuery;
[b]begin[/b]
Result:= False;
Q:= TADOQuery.Create([b]nil[/b]);
[b]try[/b]
Q.ConnectionString:= Self.fConnectionString;
Q.SQL.Text:= [teal]'select '[/teal]+Field+[teal]' from ['[/teal]+Options.UserTable+[teal]'] where ['[/teal]+
Options.IDField+[teal]'] = '[/teal]+IntToStr(Self.fID);
Q.Open;
[b]if[/b] [b]not[/b] Q.IsEmpty [b]then[/b] [b]begin[/b]
Q.First;
[b]try[/b]
Q.Edit;
Q[Field]:= Value;
Q.Post;
Result:= True;
[b]except[/b]
[b]on[/b] e: exception [b]do[/b] [b]begin[/b]
Result:= False;
[b]end[/b];
[b]end[/b];
[b]end[/b];
Q.Close;
[b]finally[/b]
[b]if[/b] assigned(Q) [b]then[/b] [b]begin[/b]
[b]if[/b] Q.Active [b]then[/b] Q.Close;
Q.Free;
[b]end[/b];
[b]end[/b];
[b]end[/b];
[b]function[/b] TCustomUser.GetOptions: TUserTableOptions;
[b]begin[/b]
Result:= Self.fOwner.Options;
[b]end[/b];
[b]function[/b] TCustomUsers.GetUser(Index: Integer): TCustomUser;
[b]begin[/b]
[b]if[/b] (Index >= [purple]0[/purple]) [b]and[/b] (Index < fUserList.Count) [b]then[/b]
Result:= TCustomUser(Self.fUserList.Objects[Index])
[b]else[/b] [b]begin[/b]
Result:= [b]nil[/b];
Raise Exception.Create([teal]'UserList Index Out Of Bounds ('[/teal]+IntToStr(Index)+[teal]')'[/teal]);
[b]end[/b];
[b]end[/b];
[b]constructor[/b] TCustomUsers.Create(AOwner: TComponent);
[b]begin[/b]
[b]inherited[/b] Create(AOwner);
Self.fUserList:= TStringList.Create;
Self.fOptions:= TUserTableOptions.Create;
[navy][i]//Set Defaults
[/i][/navy] fOptions.UserTable:= [teal]'Users'[/teal];
fOptions.IDField:= [teal]'ID'[/teal];
fOptions.UserNameField:= [teal]'Login'[/teal];
fOptions.FirstNameField:= [teal]'FName'[/teal];
fOptions.LastNameField:= [teal]'LName'[/teal];
[b]end[/b];
[b]destructor[/b] TCustomUsers.Destroy;
[b]var[/b]
X: Integer;
[b]begin[/b]
[b]for[/b] X:= [purple]0[/purple] [b]to[/b] fUserList.Count - [purple]1[/purple] [b]do[/b]
fUserList.Objects[X].Free;
fUserList.Free;
[b]if[/b] assigned(Self.fOptions) [b]then[/b] Self.fOptions.Free;
[b]inherited[/b] Destroy;
[b]end[/b];
[b]procedure[/b] TCustomUsers.Refresh;
[b]var[/b]
X: Integer;
U: TCustomUser;
Q: TADOQuery;
[b]begin[/b]
[b]for[/b] X:= [purple]0[/purple] [b]to[/b] Self.fUserList.Count - [purple]1[/purple] [b]do[/b]
Self.fUserList.Objects[X].Free;
Self.fUserList.Clear;
Q:= TADOQuery.Create([b]nil[/b]);
[b]try[/b]
Q.ConnectionString:= Self.fConnectionString;
Q.SQL.Text:= [teal]'Select ['[/teal]+ Options.IDField +[teal]'] from ['[/teal]+ Options.UserTable +[teal]']'[/teal];
Q.Open;
[b]if[/b] [b]not[/b] Q.IsEmpty [b]then[/b] [b]begin[/b]
Q.First;
While Not Q.Eof [b]do[/b] [b]begin[/b]
U:= TCustomUser.Create(Self);
U.fID:= Q.FieldByName(Options.IDField).AsInteger;
U.fConnectionString:= Self.fConnectionString;
Self.fUserList.AddObject(IntToStr(U.ID), U);
Q.Next;
[b]end[/b];
[b]end[/b];
Q.Close;
[b]finally[/b]
[b]if[/b] assigned(Q) [b]then[/b] [b]begin[/b]
[b]if[/b] Q.Active [b]then[/b] Q.Close;
Q.Free;
[b]end[/b];
[b]end[/b];
[b]end[/b];
[b]procedure[/b] TCustomUsers.SetConnectionString(Value: String);
[b]var[/b]
X: Integer;
U: TCustomUser;
[b]begin[/b]
Self.fConnectionString:= Value;
[b]for[/b] X:= [purple]0[/purple] [b]to[/b] Self.fUserList.Count - [purple]1[/purple] [b]do[/b] [b]begin[/b]
U:= TCustomUser(fUserList.Objects[X]);
U.ConnectionString:= Value;
[b]end[/b];
[b]end[/b];
[b]function[/b] TCustomUsers.GetCount: Integer;
[b]begin[/b]
Result:= Self.fUserList.Count;
[b]end[/b];
[b]end[/b].
[navy][i]// for automatic syntax highlighting see faq102-6487
[/i][/navy]
[b]unit[/b] uMain;
[b]interface[/b]
[b]uses[/b]
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, UserWrap, StdCtrls;
[b]type[/b]
TForm1 = [b]class[/b](TForm)
CustomUsers1: TCustomUsers;
ListBox1: TListBox;
[b]procedure[/b] FormCreate(Sender: TObject);
[b]private[/b]
[navy][i]{ Private declarations }[/i][/navy]
[b]public[/b]
[navy][i]{ Public declarations }[/i][/navy]
[b]end[/b];
[b]var[/b]
Form1: TForm1;
[b]implementation[/b]
[navy][i]{$R *.dfm}[/i][/navy]
[b]procedure[/b] TForm1.FormCreate(Sender: TObject);
[b]var[/b]
X: Integer;
U: TCustomUser;
Str: String;
[b]begin[/b]
CustomUsers1.Refresh;
ListBox1.Clear;
[b]for[/b] X:= [purple]0[/purple] [b]to[/b] CustomUsers1.Count - [purple]1[/purple] [b]do[/b] [b]begin[/b]
U:= CustomUsers1.Users[X];
Str:= U.UserName + [teal]' - '[/teal] + U.FirstName + [teal]' '[/teal] + U.MiddleName + [teal]' '[/teal] + U.LastName;
Str:= Str + [teal]' | '[/teal]+ U.NickName;
ListBox1.Items.Append(Str);
[b]end[/b];
[b]end[/b];
[b]end[/b].