سلام و درود و تشکر بابت وقتی که گذاشتید و میگذارید.
موفق و موید باشید
نمایش نسخه قابل چاپ
سلام و درود و تشکر بابت وقتی که گذاشتید و میگذارید.
موفق و موید باشید
سلام
امروز قصد دارم کد نویسی فرم ها را شروع کنم . امیدوارم تا اینجای پروژه استفاده کرده باشید.
برای شروع لطفا تمام فرم هایی که ساخته اید را باز کرده و در زیر قسمت implementation کد زیر را وارد کنید :
همچنین یونیت WordGame_Namespace را به قسمت Uses اصلی واقع در زیر interface تمام یونیت ها اضافه کنید و تمام فرم ها را ذخیره کرده و ببندید.کد:uses
ServerController,
UserSessionUnit;
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
یک متغیر عمومی برای نگهداری کد کاربر وارد شده نیاز داریم و باید آن را در UserSessionUnit تعریف کنیم . به قسمت public در یونیت TIWUserSession رفته و متغیر CurrentUserID را مانند کد زیر تعریف کنید :------------------------------------------------------------------------------------------------------------------------------------------------------------------
کد:TIWUserSession = class(TIWUserSessionBase)
private
{ Private declarations }
public
CurrentUserID: Integer;
{ Public declarations }
end;
فرم ورود (LoginForm) را باز کنید. فرم شما باید شبیه به تصویر زیر باشد.
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
کد زیر را در انتهای فایل LoginUnit.pas قبل از .end وارد کنید.
کد:initialization
TLoginForm.SetAsMainForm;
end.
دقت کنید که .end (بخوانید end نقطه - این عبارت با ;end (بخوانید end سمیکالن) فرق دارد) که در قسمت کد در سطر آخر آمده است برای راهنمایی شماست . نباید آن را کپی کنید . هر فایل pas فقط یک عبارت .end باید داشته باشد و آن هم در انتهای فایل و سطر آخر آن است.
یونیت های SelectDifficultyLevelUnit و ForgetPasswordUnit و RegisterUnit را به قسمت uses واقع در implementation اضافه کنید.
و Event های OnAsyncClick و OnClick مربوط به IWGradButtonLogin را مانند نمونه زیر کد نویسی نمایید :
همچنین Event های OnClick مربوط به IWLinkForgetPassword و IWLinkRegister را به صورت زیر کد نویسی کنید :
کد:
procedure TLoginForm.IWGradButtonLoginAsyncClick(Sender: TObject; EventParams: TStringList);
begin
inherited;
if (Trim(IWEditUsername.Text) = '') or (Trim(IWEditPassword.Text) = '') then
WebApplication.ShowMessage('درج نام کاربری و رمز عبور الزامی است')
else
IWGradButtonLoginClick(Sender);
end;
procedure TLoginForm.IWGradButtonLoginClick(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := TUser.Create;
aUser.Username := IWEditUsername.Text;
aUser.Password := IWEditPassword.Text;
aUser := aUser.Login;
if aUser <> nil then
begin
UserSession.CurrentUserID := aUser.UserID;
TSelectDifficultyLevelForm.Create(WebApplication).Show;
end
else
WebApplication.ShowMessage('نام کاربری یا رمز عبور نادرست است');
aUser.Free;
end;
کد:procedure TLoginForm.IWLinkForgetPasswordClick(Sender: TObject);
begin
inherited;
TForgetPasswordForm.Create(WebApplication).Show;
end;
procedure TLoginForm.IWLinkRegisterClick(Sender: TObject);
begin
inherited;
TRegisterForm.Create(WebApplication).Show;
end;
نکته مهم :
در Event های موجود آنهایی که دارای عبارت Async هستند ، Event های ClientSide هستند و مابقی ServerSide هستند . Event های ClientSide در کامپیوتر کاربر پردازش و اجرا میشوند و Event های SeverSide سمت سرور اجرا میشوند . Event های ClientSide اغلب برای بررسی شرایط یا داده های تولید شده یا ویرایش شده توسط کاربر بکار میروند تا از اعمال بار اضافی روی سرور بکاهند . مثال : در همین فرم Login در کامپوننت IWGradButtonLogin در قسمت OnAsyncClick بررسی میشود که نام کاربری و رمز عبور وارد شده باشند و پس از اطمینان از وجود داده های فوق Event مربوط به OnClick فراخوانی میگردد.
در انتها فایل کد LoginUnit.pas باید به شکل زیر باشد :
کد:unit LoginUnit;
interface
uses
WordGame_Namespace,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
BaseUnit,
IWVCLComponent,
IWBaseLayoutComponent,
IWBaseContainerLayout,
IWContainerLayout,
IWTemplateProcessorHTML,
IWVCLBaseControl,
IWBaseControl,
IWBaseHTMLControl,
IWControl,
IWCompEdit,
IWCompGradButton,
IWHTMLControls;
type
TLoginForm = class(TBaseForm)
IWEditUsername: TIWEdit;
IWEditPassword: TIWEdit;
IWLinkForgetPassword: TIWLink;
IWLinkRegister: TIWLink;
IWGradButtonLogin: TIWGradButton;
procedure IWGradButtonLoginClick(Sender: TObject);
procedure IWGradButtonLoginAsyncClick(Sender: TObject; EventParams: TStringList);
procedure IWLinkForgetPasswordClick(Sender: TObject);
procedure IWLinkRegisterClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
LoginForm: TLoginForm;
implementation
uses
ServerController,
UserSessionUnit,
SelectDifficultyLevelUnit,
ForgetPasswordUnit,
RegisterUnit;
{$R *.dfm}
procedure TLoginForm.IWGradButtonLoginAsyncClick(Sender: TObject; EventParams: TStringList);
begin
inherited;
if (Trim(IWEditUsername.Text) = '') or (Trim(IWEditPassword.Text) = '') then
WebApplication.ShowMessage('درج نام کاربری و رمز عبور الزامی است')
else
IWGradButtonLoginClick(Sender);
end;
procedure TLoginForm.IWGradButtonLoginClick(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := TUser.Create;
aUser.Username := IWEditUsername.Text;
aUser.Password := IWEditPassword.Text;
aUser := aUser.Login;
if aUser <> nil then
begin
UserSession.CurrentUserID := aUser.UserID;
TSelectDifficultyLevelForm.Create(WebApplication).Show;
end
else
WebApplication.ShowMessage('نام کاربری یا رمز عبور نادرست است');
aUser.Free;
end;
procedure TLoginForm.IWLinkForgetPasswordClick(Sender: TObject);
begin
inherited;
TForgetPasswordForm.Create(WebApplication).Show;
end;
procedure TLoginForm.IWLinkRegisterClick(Sender: TObject);
begin
inherited;
TRegisterForm.Create(WebApplication).Show;
end;
initialization
TLoginForm.SetAsMainForm;
end.
فرم تغییر رمز عبور (ChangePasswordForm) را باز کنید. فرم شما باید شبیه به تصویر زیر باشد.
Event های OnAsyncClick و OnClick مربوط به IWGradButtonChangePassword را مانند نمونه زیر کد نویسی نمایید :
در انتها فایل کد ChangePasswordUnit.pas باید به شکل زیر باشد :کد:procedure TChangePasswordForm.IWGradButtonChangePasswordAsyncClick(Sender: TObject; EventParams: TStringList);
begin
inherited;
if (Trim(IWEditCurrentPassword.Text) = '') or (Trim(IWEditNewPassword.Text) = '') or
(Trim(IWEditConfirmNewPassword.Text) = '') then
WebApplication.ShowMessage('درج رمز عبور فعلی و رمز عبور جدید و تکرار رمز عبور جدید الزامی است')
else if Trim(IWEditNewPassword.Text) <> Trim(IWEditConfirmNewPassword.Text) then
WebApplication.ShowMessage('رمز عبور جدید و تکرار آن با هم یکسان نیستند')
else
IWGradButtonChangePasswordClick(Sender);
end;
procedure TChangePasswordForm.IWGradButtonChangePasswordClick(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := aUser.GetUserInfo('', UserSession.CurrentUserID);
if aUser <> nil then
begin
if aUser.Password = IWEditCurrentPassword.Text then
begin
aUser.ChangePassword(IWEditNewPassword.Text);
WebApplication.ShowMessage('رمز عبور جدید با موفقیت ثبت شد');
end
else
WebApplication.ShowMessage('رمز عبور فعلی نادرست است');
aUser.Free;
end;
end;
کد:unit ChangePasswordUnit;
interface
uses
WordGame_Namespace,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
BaseUnit,
IWCompGradButton,
IWVCLBaseControl,
IWBaseControl,
IWBaseHTMLControl,
IWControl,
IWCompEdit,
IWVCLComponent,
IWBaseLayoutComponent,
IWBaseContainerLayout,
IWContainerLayout,
IWTemplateProcessorHTML;
type
TChangePasswordForm = class(TBaseForm)
IWEditCurrentPassword: TIWEdit;
IWEditNewPassword: TIWEdit;
IWEditConfirmNewPassword: TIWEdit;
IWGradButtonChangePassword: TIWGradButton;
procedure IWGradButtonChangePasswordClick(Sender: TObject);
procedure IWGradButtonChangePasswordAsyncClick(Sender: TObject; EventParams: TStringList);
private
{ Private declarations }
public
{ Public declarations }
end;
var
ChangePasswordForm: TChangePasswordForm;
implementation
uses
ServerController,
UserSessionUnit;
{$R *.dfm}
procedure TChangePasswordForm.IWGradButtonChangePasswordAsyncClick(Sender: TObject; EventParams: TStringList);
begin
inherited;
if (Trim(IWEditCurrentPassword.Text) = '') or (Trim(IWEditNewPassword.Text) = '') or
(Trim(IWEditConfirmNewPassword.Text) = '') then
WebApplication.ShowMessage('درج رمز عبور فعلی و رمز عبور جدید و تکرار رمز عبور جدید الزامی است')
else if Trim(IWEditNewPassword.Text) <> Trim(IWEditConfirmNewPassword.Text) then
WebApplication.ShowMessage('رمز عبور جدید و تکرار آن با هم یکسان نیستند')
else
IWGradButtonChangePasswordClick(Sender);
end;
procedure TChangePasswordForm.IWGradButtonChangePasswordClick(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := aUser.GetUserInfo('', UserSession.CurrentUserID);
if aUser <> nil then
begin
if aUser.Password = IWEditCurrentPassword.Text then
begin
aUser.ChangePassword(IWEditNewPassword.Text);
WebApplication.ShowMessage('رمز عبور جدید با موفقیت ثبت شد');
end
else
WebApplication.ShowMessage('رمز عبور فعلی نادرست است');
aUser.Free;
end;
end;
end.
فرم ثبت عضویت (RegisterForm) را باز کنید. فرم شما باید شبیه به تصویر زیر باشد.
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]یونیت SelectDifficultyLevelUnit را به قسمت uses واقع در implementation اضافه کنید.
Event های OnAsyncClick و OnClick مربوط به IWGradButtonRegister را مانند نمونه زیر کد نویسی نمایید :
در انتها فایل کد RegisterUnit.pas باید به شکل زیر باشد :
کد:procedure TRegisterForm.IWGradButtonRegisterAsyncClick(Sender: TObject; EventParams: TStringList);
begin
inherited;
if (Trim(IWEditUsername.Text) = '') or (Trim(IWEmailEdit.Text) = '') or (Trim(IWEditPassword.Text) = '') or
(Trim(IWEditConfirmPassword.Text) = '') or (Trim(IWEditFullName.Text) = '') then
WebApplication.ShowMessage('لطفا تمام قسمت های فرم را کامل کنید')
else
if IWEditPassword.Text <> IWEditConfirmPassword.Text then
WebApplication.ShowMessage('رمز عبور و تکرار آن با هم یکسان نیستند')
else
IWGradButtonRegisterClick(Sender);
end;
procedure TRegisterForm.IWGradButtonRegisterClick(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := TUser.Create;
aUser.Username := IWEditUsername.Text;
aUser.EMail := IWEmailEdit.Text;
aUser.Password := IWEditPassword.Text;
aUser.FullName := IWEditFullName.Text;
aUser := aUser.RegisterUser;
if aUser = nil then
WebApplication.ShowMessage('کاربری قبلا با این نام عضو شده است . لطفا نام کاربری دیگری انتخاب کنید')
else
begin
WebApplication.ShowMessage('ثبت نام با موفقیت انجام شد');
TSelectDifficultyLevelForm.Create(WebApplication).Show;
end;
aUser.Free;
end;
کد:unit RegisterUnit;
interface
uses
WordGame_Namespace,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
BaseUnit,
IWVCLComponent,
IWBaseLayoutComponent,
IWBaseContainerLayout,
IWContainerLayout,
IWTemplateProcessorHTML,
IWCompGradButton,
IWTMSCtrls,
IWVCLBaseControl,
IWBaseControl,
IWBaseHTMLControl,
IWControl,
IWCompEdit;
type
TRegisterForm = class(TBaseForm)
IWEditUsername: TIWEdit;
IWEditPassword: TIWEdit;
IWGradButtonRegister: TIWGradButton;
IWEditConfirmPassword: TIWEdit;
IWEmailEdit: TTIWEmailEdit;
IWEditFullName: TIWEdit;
procedure IWGradButtonRegisterClick(Sender: TObject);
procedure IWGradButtonRegisterAsyncClick(Sender: TObject; EventParams: TStringList);
private
{ Private declarations }
public
{ Public declarations }
end;
var
RegisterForm: TRegisterForm;
implementation
uses
ServerController,
UserSessionUnit,
SelectDifficultyLevelUnit;
{$R *.dfm}
procedure TRegisterForm.IWGradButtonRegisterAsyncClick(Sender: TObject; EventParams: TStringList);
begin
inherited;
if (Trim(IWEditUsername.Text) = '') or (Trim(IWEmailEdit.Text) = '') or (Trim(IWEditPassword.Text) = '') or
(Trim(IWEditConfirmPassword.Text) = '') or (Trim(IWEditFullName.Text) = '') then
WebApplication.ShowMessage('لطفا تمام قسمت های فرم را کامل کنید')
else
if IWEditPassword.Text <> IWEditConfirmPassword.Text then
WebApplication.ShowMessage('رمز عبور و تکرار آن با هم یکسان نیستند')
else
IWGradButtonRegisterClick(Sender);
end;
procedure TRegisterForm.IWGradButtonRegisterClick(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := TUser.Create;
aUser.Username := IWEditUsername.Text;
aUser.EMail := IWEmailEdit.Text;
aUser.Password := IWEditPassword.Text;
aUser.FullName := IWEditFullName.Text;
aUser := aUser.RegisterUser;
if aUser = nil then
WebApplication.ShowMessage('کاربری قبلا با این نام عضو شده است . لطفا نام کاربری دیگری انتخاب کنید')
else
begin
WebApplication.ShowMessage('ثبت نام با موفقیت انجام شد');
TSelectDifficultyLevelForm.Create(WebApplication).Show;
end;
aUser.Free;
end;
end.
فرم فراموشی رمز عبور (ForgetPasswordForm) را باز کنید. فرم شما باید شبیه به تصویر زیر باشد.
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
کد OnClick مربوط به IWGradButtonSendPassword را مانند نمونه زیر وارد کنید :
در انتها فایل کد ForgetPasswordUnit.pas باید به شکل زیر باشد :کد:procedure TForgetPasswordForm.IWGradButtonSendPasswordClick(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := aUser.GetUserInfo('', 0, IWEmailEdit.Text);
if aUser <> nil then
begin
aUser.SendNewPasswordEmail(UserSession.SMTP, UserSession.MailMessage);
WebApplication.ShowMessage('رمز عبور جدید به ایمیل شما ارسال گردید');
end
else
WebApplication.ShowMessage('ایمیل وارد شده نامعتبر است');
aUser.Free;
end;
------------------------------------------------------------------------------------------------------------------------------------------کد:unit ForgetPasswordUnit;
interface
uses
WordGame_Namespace,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
BaseUnit,
IWVCLComponent,
IWBaseLayoutComponent,
IWBaseContainerLayout,
IWContainerLayout,
IWTemplateProcessorHTML,
IWCompGradButton,
IWVCLBaseControl,
IWBaseControl,
IWBaseHTMLControl,
IWControl,
IWCompEdit,
IWTMSCtrls;
type
TForgetPasswordForm = class(TBaseForm)
IWEmailEdit: TTIWEmailEdit;
IWGradButtonSendPassword: TIWGradButton;
procedure IWGradButtonSendPasswordClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
ForgetPasswordForm: TForgetPasswordForm;
implementation
uses
ServerController,
UserSessionUnit;
{$R *.dfm}
procedure TForgetPasswordForm.IWGradButtonSendPasswordClick(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := aUser.GetUserInfo('', 0, IWEmailEdit.Text);
if aUser <> nil then
begin
aUser.SendNewPasswordEmail(UserSession.SMTP, UserSession.MailMessage);
WebApplication.ShowMessage('رمز عبور جدید به ایمیل شما ارسال گردید');
end
else
WebApplication.ShowMessage('ایمیل وارد شده نامعتبر است');
aUser.Free;
end;
end.
یونیت UserSessionUnit را باز کنید و به حالت طراحی بروید. یک کامپوننت TIdSSLIOHandlerSocketOpenSSL و یک کامپوننت TIdMessage و یک کامپوننت TIdSMTP روی فرم قرار دهید و خصوصیات آنها را مانند کد زیر تغییر دهید :
در انتها فایل کد UserSessionUnit.pas باید به شکل زیر باشد :
کد:object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL
Destination = 'smtp.gmail.com:467'
Host = 'smtp.gmail.com'
MaxLineAction = maException
Port = 467
DefaultPort = 0
SSLOptions.Mode = sslmUnassigned
SSLOptions.VerifyMode = []
SSLOptions.VerifyDepth = 0
Left = 152
Top = 32
end
object MailMessage: TIdMessage
AttachmentEncoding = 'MIME'
BccList = <>
CCList = <>
Encoding = meMIME
FromList = <
item
end>
Recipients = <>
ReplyTo = <>
ConvertPreamble = True
Left = 32
Top = 32
end
object SMTP: TIdSMTP
IOHandler = IdSSLIOHandlerSocketOpenSSL1
Host = 'smtp.gmail.com'
Password = 'MyPassword'
Port = 467
SASLMechanisms = <>
UseTLS = utUseRequireTLS
Username = 'Email@gmail.com'
Left = 32
Top = 84
end
دقت کنید که برای ارسال ایمیل باید مقادیر [برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید] و MyPassword را با اطلاعات درست جایگزین نمایید
کد:unit UserSessionUnit;
{
This is a DataModule where you can add components or declare fields that are specific to
ONE user. Instead of creating global variables, it is better to use this datamodule. You can then
access the it using UserSession.
}
interface
uses
IWUserSessionBase,
SysUtils,
Classes,
IdTCPConnection,
IdTCPClient,
IdExplicitTLSClientServerBase,
IdMessageClient,
IdSMTPBase,
IdSMTP,
IdMessage,
IdBaseComponent,
IdComponent,
IdIOHandler,
IdIOHandlerSocket,
IdIOHandlerStack,
IdSSL,
IdSSLOpenSSL;
type
TIWUserSession = class(TIWUserSessionBase)
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
MailMessage: TIdMessage;
SMTP: TIdSMTP;
private
{ Private declarations }
public
CurrentUserID: Integer;
{ Public declarations }
end;
implementation
{$R *.dfm}
end.
فرم پروفایل کاربر (UserProfileForm) را باز کنید. فرم شما باید شبیه به تصویر زیر باشد.[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]کد OnCreate مربوط به UserProfileForm را مانند نمونه زیر وارد کنید :
در انتها فایل کد UserProfileUnit.pas باید به شکل زیر باشد :
کد:procedure TUserProfileForm.IWAppFormCreate(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := aUser.GetUserInfo('', UserSession.CurrentUserID);
IWLabelUsername.Caption := aUser.Username;
IWLabelTotalPoint.Caption := IntToStr(aUser.TotalPoint);
IWLabelEMail.Caption := aUser.EMail;
IWLabelPoint3.Caption := IntToStr(aUser.UserProfile.Point3);
IWLabelPoint4.Caption := IntToStr(aUser.UserProfile.Point4);
IWLabelPoint5.Caption := IntToStr(aUser.UserProfile.Point5);
IWLabelCount3.Caption := IntToStr(aUser.UserProfile.Count3);
IWLabelCount4.Caption := IntToStr(aUser.UserProfile.Count4);
IWLabelCount5.Caption := IntToStr(aUser.UserProfile.Count5);
aUser.Free;
end;
کد:unit UserProfileUnit;
interface
uses
WordGame_Namespace,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
BaseUnit,
IWVCLComponent,
IWBaseLayoutComponent,
IWBaseContainerLayout,
IWContainerLayout,
IWTemplateProcessorHTML,
IWVCLBaseControl,
IWBaseControl,
IWBaseHTMLControl,
IWControl,
IWCompLabel;
type
TUserProfileForm = class(TBaseForm)
IWLabelUsername: TIWLabel;
IWLabelTotalPoint: TIWLabel;
IWLabelEMail: TIWLabel;
IWLabelPoint3: TIWLabel;
IWLabelPoint4: TIWLabel;
IWLabelPoint5: TIWLabel;
IWLabelCount3: TIWLabel;
IWLabelCount4: TIWLabel;
IWLabelCount5: TIWLabel;
procedure IWAppFormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
UserProfileForm: TUserProfileForm;
implementation
uses
ServerController,
UserSessionUnit;
{$R *.dfm}
procedure TUserProfileForm.IWAppFormCreate(Sender: TObject);
var
aUser: TUser;
begin
inherited;
aUser := aUser.GetUserInfo('', UserSession.CurrentUserID);
IWLabelUsername.Caption := aUser.Username;
IWLabelTotalPoint.Caption := IntToStr(aUser.TotalPoint);
IWLabelEMail.Caption := aUser.EMail;
IWLabelPoint3.Caption := IntToStr(aUser.UserProfile.Point3);
IWLabelPoint4.Caption := IntToStr(aUser.UserProfile.Point4);
IWLabelPoint5.Caption := IntToStr(aUser.UserProfile.Point5);
IWLabelCount3.Caption := IntToStr(aUser.UserProfile.Count3);
IWLabelCount4.Caption := IntToStr(aUser.UserProfile.Count4);
IWLabelCount5.Caption := IntToStr(aUser.UserProfile.Count5);
aUser.Free;
end;
end.
یونیت UserSessionUnit را باز کرده و متغیر عمومی DifficultyLevel را از نوع عددی اضافه کنید:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------کد:type
TIWUserSession = class(TIWUserSessionBase)
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
MailMessage: TIdMessage;
SMTP: TIdSMTP;
private
{ Private declarations }
public
CurrentUserID, DifficultyLevel: Integer;
{ Public declarations }
end;
فرم انتخاب سطح دشواری (SelectDifficultyLevelForm) را باز کنید. فرم شما باید شبیه به تصویر زیر باشد.
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]Prpcedure زیر را به یونیت SelectDifficultyLevelUnit اضافه کنید :
کد:procedure TSelectDifficultyLevelForm.ShowGame(aDifficultyLevel: Integer);
begin
UserSession.DifficultyLevel := aDifficultyLevel;
TWordGameForm.Create(WebApplication).Show;
end;
کد OnClick مربوط به IWGradButtonEasy و IWGradButtonMiddle و IWGradButtonHard را مانند نمونه زیر وارد کنید :
در انتها فایل کد SelectDifficultyLevelUnit.pas باید به شکل زیر باشد :
کد:procedure TSelectDifficultyLevelForm.IWGradButtonEasyClick(Sender: TObject);
begin
inherited;
ShowGame(3);
end;
procedure TSelectDifficultyLevelForm.IWGradButtonMiddleClick(Sender: TObject);
begin
inherited;
ShowGame(4);
end;
procedure TSelectDifficultyLevelForm.IWGradButtonHardClick(Sender: TObject);
begin
inherited;
ShowGame(5);
end;
کد:unit SelectDifficultyLevelUnit;
interface
uses
WordGame_Namespace,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
BaseUnit,
IWVCLComponent,
IWBaseLayoutComponent,
IWBaseContainerLayout,
IWContainerLayout,
IWTemplateProcessorHTML,
IWVCLBaseControl,
IWBaseControl,
IWBaseHTMLControl,
IWControl,
IWCompGradButton;
type
TSelectDifficultyLevelForm = class(TBaseForm)
IWGradButtonEasy: TIWGradButton;
IWGradButtonMiddle: TIWGradButton;
IWGradButtonHard: TIWGradButton;
procedure ShowGame(aDifficultyLevel: Integer);
procedure IWGradButtonEasyClick(Sender: TObject);
procedure IWGradButtonMiddleClick(Sender: TObject);
procedure IWGradButtonHardClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
SelectDifficultyLevelForm: TSelectDifficultyLevelForm;
implementation
uses
ServerController,
UserSessionUnit,
WordGameUnit;
{$R *.dfm}
procedure TSelectDifficultyLevelForm.ShowGame(aDifficultyLevel: Integer);
begin
UserSession.DifficultyLevel := aDifficultyLevel;
TWordGameForm.Create(WebApplication).Show;
end;
procedure TSelectDifficultyLevelForm.IWGradButtonEasyClick(Sender: TObject);
begin
inherited;
ShowGame(3);
end;
procedure TSelectDifficultyLevelForm.IWGradButtonMiddleClick(Sender: TObject);
begin
inherited;
ShowGame(4);
end;
procedure TSelectDifficultyLevelForm.IWGradButtonHardClick(Sender: TObject);
begin
inherited;
ShowGame(5);
end;
end.
فرم بازی (WordGameForm) را باز کنید. فرم شما باید شبیه به تصویر زیر باشد.[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
کد های OnCreate فرم
و OnClick و OnAsyncClick برای IWGradButtonSubmit
و OnAsyncKeyDown برای IWEditSuggestionWord
و OnGetCellData برای TIWDBAdvWebGridGame
و OnNotify برای IWAJAXNotifier1
و OnAsyncTimer برای IWTimer1 را مانند زیر کد نویسی کنید :
در انتها فایل کد WordGameUnit.pas باید به شکل زیر باشد :
کد:procedure TWordGameForm.IWAppFormCreate(Sender: TObject);
begin
inherited;
try
try
if WordGame.GetSecretWord(UserSession.DifficultyLevel) = '' then
agsID := WordGame.AddNewSecretWord(UserSession.DifficultyLevel)
else
agsID := WordGame.GetSecretWordID(UserSession.DifficultyLevel);
case UserSession.DifficultyLevel of
3:
IWLabelDifficultyLevel.Caption := 'ساده - سه حرفی';
4:
IWLabelDifficultyLevel.Caption := 'متوسط - چهار حرفی';
5:
IWLabelDifficultyLevel.Caption := 'سخت - پنج حرفی';
end;
DataSource1.DataSet := WordGame.GetWordGameData(UserSession.DifficultyLevel);
IWEditSuggestionWord.MaxLength := UserSession.DifficultyLevel;
IWLabelLastWinner.Caption := WordGame.GetLastWinner(UserSession.DifficultyLevel);
IWLabelFoundSecretWord.Caption :=
'<a style=" text-decoration: none" href="http://www.farsilookup.com/p2p/seek.jsp?lang=fa&word=' +
WordGame.GetLastFoundSecretWord(UserSession.DifficultyLevel) + '" target="_blank">' +
WordGame.GetLastFoundSecretWord(UserSession.DifficultyLevel) + '</a>';
except
on E: Exception do
begin
// Error Handling
end;
end;
finally
end;
end;
procedure TWordGameForm.IWEditSuggestionWordAsyncKeyDown(Sender: TObject; EventParams: TStringList);
begin
inherited;
if EventParams[7] = 'which=13' then
IWGradButtonSubmitAsyncClick(Sender, EventParams);
end;
procedure TWordGameForm.IWGradButtonSubmitAsyncClick(Sender: TObject; EventParams: TStringList);
var
I, J: Integer;
S : Char;
begin
inherited;
for I := 1 to Length(IWEditSuggestionWord.Text) do
begin
S := IWEditSuggestionWord.Text[I];
if (Pos(S, '`~!@#$%^&*()_+-=[]{}\|":;/?.>,<' + QuotedStr('''')) > 0) or (S = ' ') then
begin
WebApplication.ShowMessage('وجود کاراکتر غیر مجاز');
Exit;
end;
for J := I + 1 to Length(IWEditSuggestionWord.Text) do
begin
if S = IWEditSuggestionWord.Text[J] then
begin
WebApplication.ShowMessage('وجود کاراکتر تکراری');
Exit;
end;
end;
end;
if Length(Trim(IWEditSuggestionWord.Text)) = UserSession.DifficultyLevel then
IWGradButtonSubmitClick(Sender)
else
WebApplication.ShowMessage('طول کلمه پیشنهادی با طول رمز یکسان نیست');
end;
procedure TWordGameForm.IWGradButtonSubmitClick(Sender: TObject);
var
I, J, CommonCharsCnt, CompatibleCharsCnt: Integer;
SecretWord : String;
begin
inherited;
try
try
SecretWord := WordGame.GetSecretWord(UserSession.DifficultyLevel);
SecretWord := ReplaceStr(SecretWord, 'ي', 'ی');
SecretWord := ReplaceStr(SecretWord, 'ك', 'ک');
CommonCharsCnt := 0;
CompatibleCharsCnt := 0;
for I := 1 to Length(IWEditSuggestionWord.Text) do
begin
for J := 1 to Length(SecretWord) do
begin
if IWEditSuggestionWord.Text[I] = SecretWord[J] then
Inc(CommonCharsCnt);
end;
end;
for I := 1 to Length(SecretWord) do
begin
if SecretWord[I] = IWEditSuggestionWord.Text[I] then
Inc(CompatibleCharsCnt);
end;
if WordGame.AddNewSuggestionWord(UserSession.CurrentUserID, agsID, IWEditSuggestionWord.Text, CommonCharsCnt,
CompatibleCharsCnt,
UserSession.DifficultyLevel) then
begin
if (CommonCharsCnt = CompatibleCharsCnt) and (CommonCharsCnt = UserSession.DifficultyLevel) then
agsID := WordGame.AddNewSecretWord(UserSession.DifficultyLevel);
TWordGameForm.Create(WebApplication).Show;
Release;
end
else
begin
WebApplication.ShowMessage('کلمه پیشنهادی تکراری است');
IWEditSuggestionWord.Text := '';
end;
except
on E: Exception do
begin
// Error Handling
end;
end;
finally
end;
end;
procedure TWordGameForm.IWAJAXNotifier1Notify(Sender: TObject);
begin
inherited;
DataSource1.DataSet := WordGame.GetWordGameData(UserSession.DifficultyLevel);
IWEditSuggestionWord.MaxLength := UserSession.DifficultyLevel;
IWLabelLastWinner.Caption := WordGame.GetLastWinner(UserSession.DifficultyLevel);
IWLabelFoundSecretWord.Caption :=
'<a style=" text-decoration: none" href="http://www.farsilookup.com/p2p/seek.jsp?lang=fa&word=' +
WordGame.GetLastFoundSecretWord(UserSession.DifficultyLevel) + '" target="_blank">' +
WordGame.GetLastFoundSecretWord(UserSession.DifficultyLevel) + '</a>';
TIWDBAdvWebGridGame.AsyncUpdateAllCells;
end;
procedure TWordGameForm.IWTimer1AsyncTimer(Sender: TObject; EventParams: TStringList);
begin
inherited;
IWAJAXNotifier1.Notify;
end;
procedure TWordGameForm.TIWDBAdvWebGridGameGetCellData(Sender: TObject; RowIndex, ColumnIndex: Integer;
var AValue: string);
var
S: String;
begin
inherited;
if ColumnIndex = 1 then
AValue := '<a style=" text-decoration: none" href="http://www.farsilookup.com/p2p/seek.jsp?lang=fa&word=' + AValue +
'"'' target="_blank">' +
AValue + '</a>';
end;
کد:unit WordGameUnit;
interface
uses
WordGame_Namespace,
StrUtils,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
BaseUnit,
IWCompExtCtrls,
IWBaseComponent,
IWBaseHTMLComponent,
IWBaseHTML40Component,
Data.DB,
IWCompGradButton,
IWControl,
IWWebGrid,
IWDBAdvWebGrid,
IWCompEdit,
Vcl.Controls,
IWVCLBaseControl,
IWBaseControl,
IWBaseHTMLControl,
IWCompLabel,
System.Classes,
IWVCLComponent,
IWBaseLayoutComponent,
IWBaseContainerLayout,
IWContainerLayout,
IWTemplateProcessorHTML;
type
TWordGameForm = class(TBaseForm)
IWLabelDifficultyLevel: TIWLabel;
IWEditSuggestionWord: TIWEdit;
TIWDBAdvWebGridGame: TTIWDBAdvWebGrid;
IWGradButtonSubmit: TIWGradButton;
DataSource1: TDataSource;
IWLabelLastWinner: TIWLabel;
IWLabelFoundSecretWord: TIWLabel;
IWAJAXNotifier1: TIWAJAXNotifier;
IWTimer1: TIWTimer;
procedure IWAppFormCreate(Sender: TObject);
procedure IWGradButtonSubmitAsyncClick(Sender: TObject; EventParams: TStringList);
procedure IWGradButtonSubmitClick(Sender: TObject);
procedure IWEditSuggestionWordAsyncKeyDown(Sender: TObject; EventParams: TStringList);
procedure TIWDBAdvWebGridGameGetCellData(Sender: TObject; RowIndex, ColumnIndex: Integer; var AValue: string);
procedure IWTimer1AsyncTimer(Sender: TObject; EventParams: TStringList);
procedure IWAJAXNotifier1Notify(Sender: TObject);
private
{ Private declarations }
public
WordGame: TWordGame;
agsID : Integer;
{ Public declarations }
end;
var
WordGameForm: TWordGameForm;
implementation
uses
ServerController,
UserSessionUnit;
{$R *.dfm}
procedure TWordGameForm.IWAppFormCreate(Sender: TObject);
begin
inherited;
try
try
if WordGame.GetSecretWord(UserSession.DifficultyLevel) = '' then
agsID := WordGame.AddNewSecretWord(UserSession.DifficultyLevel)
else
agsID := WordGame.GetSecretWordID(UserSession.DifficultyLevel);
case UserSession.DifficultyLevel of
3:
IWLabelDifficultyLevel.Caption := 'ساده - سه حرفی';
4:
IWLabelDifficultyLevel.Caption := 'متوسط - چهار حرفی';
5:
IWLabelDifficultyLevel.Caption := 'سخت - پنج حرفی';
end;
DataSource1.DataSet := WordGame.GetWordGameData(UserSession.DifficultyLevel);
IWEditSuggestionWord.MaxLength := UserSession.DifficultyLevel;
IWLabelLastWinner.Caption := WordGame.GetLastWinner(UserSession.DifficultyLevel);
IWLabelFoundSecretWord.Caption :=
'<a style=" text-decoration: none" href="http://www.farsilookup.com/p2p/seek.jsp?lang=fa&word=' +
WordGame.GetLastFoundSecretWord(UserSession.DifficultyLevel) + '" target="_blank">' +
WordGame.GetLastFoundSecretWord(UserSession.DifficultyLevel) + '</a>';
except
on E: Exception do
begin
// Error Handling
end;
end;
finally
end;
end;
procedure TWordGameForm.IWEditSuggestionWordAsyncKeyDown(Sender: TObject; EventParams: TStringList);
begin
inherited;
if EventParams[7] = 'which=13' then
IWGradButtonSubmitAsyncClick(Sender, EventParams);
end;
procedure TWordGameForm.IWGradButtonSubmitAsyncClick(Sender: TObject; EventParams: TStringList);
var
I, J: Integer;
S : Char;
begin
inherited;
for I := 1 to Length(IWEditSuggestionWord.Text) do
begin
S := IWEditSuggestionWord.Text[I];
if (Pos(S, '`~!@#$%^&*()_+-=[]{}\|":;/?.>,<' + QuotedStr('''')) > 0) or (S = ' ') then
begin
WebApplication.ShowMessage('وجود کاراکتر غیر مجاز');
Exit;
end;
for J := I + 1 to Length(IWEditSuggestionWord.Text) do
begin
if S = IWEditSuggestionWord.Text[J] then
begin
WebApplication.ShowMessage('وجود کاراکتر تکراری');
Exit;
end;
end;
end;
if Length(Trim(IWEditSuggestionWord.Text)) = UserSession.DifficultyLevel then
IWGradButtonSubmitClick(Sender)
else
WebApplication.ShowMessage('طول کلمه پیشنهادی با طول رمز یکسان نیست');
end;
procedure TWordGameForm.IWGradButtonSubmitClick(Sender: TObject);
var
I, J, CommonCharsCnt, CompatibleCharsCnt: Integer;
SecretWord : String;
begin
inherited;
try
try
SecretWord := WordGame.GetSecretWord(UserSession.DifficultyLevel);
SecretWord := ReplaceStr(SecretWord, 'ي', 'ی');
SecretWord := ReplaceStr(SecretWord, 'ك', 'ک');
CommonCharsCnt := 0;
CompatibleCharsCnt := 0;
for I := 1 to Length(IWEditSuggestionWord.Text) do
begin
for J := 1 to Length(SecretWord) do
begin
if IWEditSuggestionWord.Text[I] = SecretWord[J] then
Inc(CommonCharsCnt);
end;
end;
for I := 1 to Length(SecretWord) do
begin
if SecretWord[I] = IWEditSuggestionWord.Text[I] then
Inc(CompatibleCharsCnt);
end;
if WordGame.AddNewSuggestionWord(UserSession.CurrentUserID, agsID, IWEditSuggestionWord.Text, CommonCharsCnt,
CompatibleCharsCnt,
UserSession.DifficultyLevel) then
begin
if (CommonCharsCnt = CompatibleCharsCnt) and (CommonCharsCnt = UserSession.DifficultyLevel) then
agsID := WordGame.AddNewSecretWord(UserSession.DifficultyLevel);
TWordGameForm.Create(WebApplication).Show;
Release;
end
else
begin
WebApplication.ShowMessage('کلمه پیشنهادی تکراری است');
IWEditSuggestionWord.Text := '';
end;
except
on E: Exception do
begin
// Error Handling
end;
end;
finally
end;
end;
procedure TWordGameForm.IWAJAXNotifier1Notify(Sender: TObject);
begin
inherited;
DataSource1.DataSet := WordGame.GetWordGameData(UserSession.DifficultyLevel);
IWEditSuggestionWord.MaxLength := UserSession.DifficultyLevel;
IWLabelLastWinner.Caption := WordGame.GetLastWinner(UserSession.DifficultyLevel);
IWLabelFoundSecretWord.Caption :=
'<a style=" text-decoration: none" href="http://www.farsilookup.com/p2p/seek.jsp?lang=fa&word=' +
WordGame.GetLastFoundSecretWord(UserSession.DifficultyLevel) + '" target="_blank">' +
WordGame.GetLastFoundSecretWord(UserSession.DifficultyLevel) + '</a>';
TIWDBAdvWebGridGame.AsyncUpdateAllCells;
end;
procedure TWordGameForm.IWTimer1AsyncTimer(Sender: TObject; EventParams: TStringList);
begin
inherited;
IWAJAXNotifier1.Notify;
end;
procedure TWordGameForm.TIWDBAdvWebGridGameGetCellData(Sender: TObject; RowIndex, ColumnIndex: Integer;
var AValue: string);
var
S: String;
begin
inherited;
if ColumnIndex = 1 then
AValue := '<a style=" text-decoration: none" href="http://www.farsilookup.com/p2p/seek.jsp?lang=fa&word=' + AValue +
'"'' target="_blank">' +
AValue + '</a>';
end;
end.
در این پست می خواهیم روش های مختلف ایجاد منو برای پروژه را بررسی کنیم .
روش اول : ساخت منو بوسیله کامپوننت TIWMenu : این کامپوننت در IntraWeb Standard وجود دارد و کامپوننت پایه برای ایجاد منو در اینتراوب است .
برای ایجاد منو در پروژه به یک Frame نیاز داریم . از منوی File گزینه New و سپس ...Other را انتخاب کنید و مانند تصویر یک Frame جدید به پروژه اضافه کنید. (دقت کنید منظور Frame است نه Form)
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
نام IWFrame1 را به MenuFrame_Intraweb و نام Unit1.pas را به MenuFrame_Intraweb_Unit.pas تغییر دهید .
یک کامپوننت TMainMenu و یک TIWMenu روی فریم قرار دهید و یونیت های ServerController و UserSessionUnit و LoginUnit و UserProfileUnit و SelectDifficultyLevelUnit و ChangePasswordUnit را به قسمت implementation / uses اضافه کنید .
کد:implementation
uses
ServerController,
UserSessionUnit,
LoginUnit,
UserProfileUnit,
SelectDifficultyLevelUnit,
ChangePasswordUnit;
مانند تصویر آیتم های منو را برای TMainMenu تعریف کنید.
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]و نام آیتم ها را مانند زیر قرار دهید :
و کد های زیر را برای Event های OnClick آیتم های منو بنویسید و مقدار OnClick را برای mnuLogin برابر با mnuExitClick قرار دهید :کد:mnuChangePassword: TMenuItem;
mnuSelectDifficultyLevel: TMenuItem;
mnuUserProfile: TMenuItem;
mnuExit: TMenuItem;
mnuLogin: TMenuItem;
مقدار AttachedMenu از کامپوننت IWMenu1 را به MainMenu1 تغییر دهید تا ارتباط بین دو کامپوننت برقرار شود.کد:procedure TMenuFrame_Intraweb.mnuChangePasswordClick(Sender: TObject);
begin
TChangePasswordForm.Create(TIWAPPForm(Parent)).Show;
end;
procedure TMenuFrame_Intraweb.mnuExitClick(Sender: TObject);
begin
UserSession.CurrentUserID := 0;
TLoginForm.Create(TIWAPPForm(Parent)).Show;
end;
procedure TMenuFrame_Intraweb.mnuSelectDifficultyLevelClick(Sender: TObject);
begin
TSelectDifficultyLevelForm.Create(TIWAPPForm(Parent)).Show;
end;
procedure TMenuFrame_Intraweb.mnuUserProfileClick(Sender: TObject);
begin
TUserProfileForm.Create(TIWAPPForm(Parent)).Show;
end;
تا اینجا ساخت منو به روش اول تمام شد . برای اینکه بتوانید منو را در تمام فرم ها ببینید مراحل زیر را دنبال کنید:
فرم BaseForm را باز کنید .
مانند تصویر در قسمت Tool Palette عبارت Frame را جستجو کنید و سپس روی Frames کلیک کنید . سپس در محل دلخواه خود روی فرم کلیک کنید تا پنجره ی انتخاب فریم باز شود.
MenuFrame_Intraweb را از لیست فریم های موجود انتخاب کرده و OK را کلیک کنید.
از این پس منو ایجاد شده در تمام فرم ها نمایش داده خواهد شد . بعضی از فرم ها مانند فرم ورود کاربران نیازی به منو ندارند . از این رو فرم نام برده را باز کنید و خصوصیت Visible فریم منو را False کنید.
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
روش دوم : ساخت منو بوسیله کامپوننت TTIWMainMenu : این کامپوننت در TMS IW وجود دارد .
برای ایجاد منوی جدید در پروژه به یک Frame دیگر نیاز داریم . از منوی File گزینه New و سپس ...Other را انتخاب کنید و مانند تصویر یک Frame جدید به پروژه اضافه کنید. (دقت کنید منظور Frame است نه Form)
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
نام IWFrame1 را به MenuFrame_TMS و نام Unit1.pas را به MenuFrame_TMS_Unit.pas تغییر دهید .
یک کامپوننت TMainMenu و یک TTIWMainMenu روی فریم قرار دهید و یونیت های ServerController و UserSessionUnit و LoginUnit و UserProfileUnit و SelectDifficultyLevelUnit و ChangePasswordUnit را به قسمت implementation / uses اضافه کنید .
کد:implementation
uses
ServerController,
UserSessionUnit,
LoginUnit,
UserProfileUnit,
SelectDifficultyLevelUnit,
ChangePasswordUnit;
مانند تصویر آیتم های منو را برای TMainMenu تعریف کنید.
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]و نام آیتم ها را مانند زیر قرار دهید :
کد زیر را برای OnCreate کامپوننت IWFrameRegion بنویسید :کد:mnuChangePassword: TMenuItem;
mnuSelectDifficultyLevel: TMenuItem;
mnuUserProfile: TMenuItem;
mnuExit: TMenuItem;
mnuLogin: TMenuItem;
و کد های زیر را برای Event های OnClick آیتم های منو بنویسید و مقدار OnClick را برای mnuLogin برابر با mnuExitClick قرار دهید :کد:procedure TMenuFrame_TMS.IWFrameRegionCreate(Sender: TObject);
begin
if (TIWAPPForm(Parent).Name = 'RegisterForm') or (TIWAPPForm(Parent).Name = 'ForgetPasswordForm') then
begin
mnuChangePassword.Visible := False;
mnuSelectDifficultyLevel.Visible := False;
mnuUserProfile.Visible := False;
mnuExit.Visible := False;
end
else
mnuLogin.Visible := False;
end;
مقدار Menu از کامپوننت TIWMainMenu1 را به MainMenu1 تغییر دهید تا ارتباط بین دو کامپوننت برقرار شود.کد:procedure TMenuFrame_Intraweb.mnuChangePasswordClick(Sender: TObject);
begin
TChangePasswordForm.Create(TIWAPPForm(Parent)).Show;
end;
procedure TMenuFrame_Intraweb.mnuExitClick(Sender: TObject);
begin
UserSession.CurrentUserID := 0;
TLoginForm.Create(TIWAPPForm(Parent)).Show;
end;
procedure TMenuFrame_Intraweb.mnuSelectDifficultyLevelClick(Sender: TObject);
begin
TSelectDifficultyLevelForm.Create(TIWAPPForm(Parent)).Show;
end;
procedure TMenuFrame_Intraweb.mnuUserProfileClick(Sender: TObject);
begin
TUserProfileForm.Create(TIWAPPForm(Parent)).Show;
end;
تا اینجا ساخت منو به روش دوم تمام شد . برای اینکه بتوانید منو را در تمام فرم ها ببینید مراحل زیر را دنبال کنید:
فرم BaseForm را باز کنید .
مانند تصویر در قسمت Tool Palette عبارت Frame را جستجو کنید و سپس روی Frames کلیک کنید . سپس در محل دلخواه خود روی فرم کلیک کنید تا پنجره ی انتخاب فریم باز شود.
MenuFrame_TMS را از لیست فریم های موجود انتخاب کرده و OK را کلیک کنید.
از این پس منو ایجاد شده در تمام فرم ها نمایش داده خواهد شد . بعضی از فرم ها مانند فرم ورود کاربران نیازی به منو ندارند . از این رو فرم نام برده را باز کنید و خصوصیت Visible فریم منو را False کنید.
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
روش سوم : استفاده از نرم افزار طراحی منو Sothink DHTML Menu 9 + استفاده از IWLink
این روش را بعدا به طور کامل توضیح خواهم داد . پیش نیاز روش سوم ساخت Template برای فرم هاست که در پست های بعدی به آن خواهیم پرداخت
آخرين تغييرات و اصلاحات در ظاهر و کد نويسي فرم ها و کلاس ها و ديتابيس انجام شد و پست هاي قبلي نيز متناسب با تغييرات بروز رساني گرديد. فايل هاي ضميمه شده به اين پست نيز حاوي آخرين تغييرات هستند . فکر ميکنم از اين به بعد ديگه تغييري در ظاهر فرم ها و کدنويسي آنها و همچنين در ساختار ديتابيس لازم نباشد . مگر اينکه کاربران عزيز باگي پيدا کنند و اطلاع دهند . از اين پست به بعد طراحي فرم ها با HTML و CSS و هر جا که لازم باشد از JavaScript نيز استفاده خواهيم کرد تا ظاهر بازي زيبا تر شود . البته نتيجه هر چه شود حاصل سليقه و دانش بنده خواهد بود و ممکن است خيلي مطلوب تمام کاربران نباشد . از اين رو شما ميتوانيد پس از مطالعه پست هاي بعدي تغييرات مورد نظر خود را به دلخواه اعمال کنيد و پوسته بازي را براي خود طراحي نماييد .
سلام
شاید تا حالا این سوال براتون پیش اومده باشه که چرا ظاهر بعضی از فرمها ناقص به نظر میان . مثلا در فرم ثبت نام فقط IWEdit برای ورود اطلاعات وجود داشت و هیچ IWLabel ی برای اینکه کاربر بفهمه کجا باید چی وارد کنه وجو نداشت . دلیل این مساله اینه که ما قصد داریم برای بازی پوسته طراحی کنیم و از اونجایی که تعدادی از این عبارت ها استاتیک هستند نیازی نیست که اونا رو در فرم طراحی کنیم . فقط کافیه هر جا لازم شد متن مورد نظرمونو توی پوسته فرم قرار بدیم . یکی از محسنات این کار سریعتر لود شدن فرم هاست .
برای ایجاد پوسته نیاز به یک فایل HTML هست و برای کار با فایل های HTML راه های زیادی هست که اگه تجربه کار با این فایل ها را داشته باشید میتونید ابزار مناسب و دلخواه خودتونو انتخاب کنید . برای ویرایش یا ایجاد یک فایل HTML میتونید از notepad ویندوز هم استفاده کنید . نرم افزار های دیگری هم هستند که امکانات بیشتری را در اختیارتون قرار میدهند. مثل Dreamveiwer . بنده توصیه میکنم از نرم افزار Aptana Studio نسخه 3 اش استفاده کنید . این نرم افزار هم رایگان هست و هم امکانات بسیار خوبی داره که در مقایسه با نرم افزار های دیگه یک سر و گردن بالاتره. تصاویری که در پست های بعد خواهید دید از محیط همین نرم افزار خواهد بود . ضمنا اگه خیلی با HTML آشنایی ندارید میتونید معلومات خودتونو با مطالعه این سایت ( [برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید] ) بالا ببرید.
اینم آدرس سایت [برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید] برای دانلود نرم افزار Aptana Studio
اگه بتونید وقت بیشتری صرف کنید و یه چیزایی هم در مورد CSS یاد بگیرید که دیگه خیلی عالی میشه . اینطوری دیگه نیازی نیست دنبال متخصص HTML و CSS بگردیم
آدرس سایت آموزش CSS :
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
قبل از شروع ، یک فولدر جدید در مسیر ساخت EXE پروژه ایجاد کنید و نام آن را Templates (به حرف s آخر آن توجه کنید) بگذارید . تمام فایل های HTML در این فولدر قرار خواهند گرفت . اینتراوب به صورت پیش فرض برای استفاده از فایل های قالب در مسیر Templates به دنبال آنها خواهد گشت . شما میتوانید این مسیر را در فرم ServerController تغییر داده و مسیر دیگری را برای این کار انتخاب کنید . ما فعلا با پیش فرض اینتراوب کارمان را پیش خواهیم برد.
MasterTemplate چیست؟
MasterTemplate قالب اصلی صفحات را مشخص میکند . اینتراوب سایر فایل های HTML را با MasterTemplate.Html ترکیب کرده و در نهایت به عنوان قالب نهایی فرم ها در Browser ترسیم میکند.
ایجاد فایل MasterTemplate.Html :
نرم افزار Aptana Studio را اجرا کنید و مانند تصاویر مراحل را دنبال کنید تا یک فایل MasterTemplate.html ایجاد شود
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
همانطور که در تصویر آخر مشاهده میکنید محتویات پیشفرض فایل MasterTemplate.html مانند زیر خواهد بود که لازم است تغییراتی در آن داده شود:داخل فایل MasterTemplate.html را به صورت زیر تغییر دهید :
کد HTML:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>MasterTemplate</title>
<meta name="author" content="Admin" />
<!-- Date: 2015-06-29 -->
</head>
<body>
</body>
</html>
در این فایل 4 تگ "<div>" استفاده شده است . داخل یکی از تگ ها عبارت body$ قرار دادیم تا محتویات ایجاد شده توسط اینتراوب در این قسمت نمایش داده شود . این محتویان همان کامپوننت هایی هستند که در فرم های پروژه گذاشته ایم.کد HTML:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>IntraWeb_WordGame</title>
</head>
<body dir="rtl" lang="fa">
<div id="Banner" style="border: dotted; border-width: 1px; position: fixed; top: 0px; left: 0px; right: 0px; height: 100px;"> </div>
<div id="UserMenu" style="border: dotted; border-width: 1px; position: fixed; top: 101px; left: 0px; right: 0px; height: 30px;"> </div>
<div id="SiteBody" style="border: dotted; border-width: 1px; position: fixed; top: 131px; left: 0px; right: 0px; bottom: 31px;">
$body
</div>
<div id="Footer" style="border: dotted; border-width: 1px; position: fixed; left: 0px; right: 0px; bottom: 0px; height: 30px;"> </div>
</body>
</html>
در پایان باید فایل MasterTemplate.html را به فرم ServerController معرفی کنیم تا این مرحله به اتمام برسد. لطفا مانند تصویر عمل کنید :
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
سلام
بالاخره پروژه به پایان رسید . امشب سورس و فایل های اجرایی + منو ها و Template ها را برای علاقمندان آپلود میکنم تا وظیفه خودمو به انجام رسونده باشم . شرمنده هستم که کمی طول کشید . متاسفانه از این پروژه استقبال خوبی نشد و بنده هم فقط برای اینکه کار را ناتمام رها نکرده باشم پست آخر را بدون هیچ توضیح اضافه ای میگذارم تا هر کس علاقمند بود خودش زحمت بکشد و سورس را دانلود کند و ببیند که بنده چه کرده ام. امیدوارم برای علاقمندان مفید بوده باشد . ضمنا روش سوم ساخت منو ها هم در این سورس آخر لحاظ شده است . خودتون زحمتشو بکشید و ببیید چطوری ساخته شده.
در ادامه هم تصاویری از محیط بازی را مشاهده خواهید کرد:
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
عجب پروژه ای شد!
هنوز هیچکس توش باگی پیدا نکرده !؟
اصلا فکر نمیکردم اینقدر کارم درست باشه !!!
بیش از 3500 بازدید و غیر از admin عزیز همه فقط عابر رهگذر بودند و ویترین را تماشا کردند . هیچکس از کالای ما چیزی نپرسید!!!
سلام به همه
برای دوستانی که نتونستند بک آپ دیتابیس را بازیابی کنند : اول عذر خواهی میکنم که اطلاع رسانی نکردم و در ادامه هم اسکریپت های دیتابیس و جداول را قرار میدم تا با هر نسخه ای از sql بتونید آن را ایجاد کنید
اسکریپت ساخت دیتابیس بازی :
نکته : مسیر ایجاد دیتابیس را به دلخواه خودتون تغییر بدید
کد:USE [master]
GO
/****** Object: Database [IntraWordGameDB] Script Date: 07/16/2015 05:40:08 ب.ظ ******/
CREATE DATABASE [IntraWordGameDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'IntraWordGameDB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\IntraWordGameDB.mdf' , SIZE = 4416KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'IntraWordGameDB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\IntraWordGameDB_log.ldf' , SIZE = 2048KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [IntraWordGameDB] SET COMPATIBILITY_LEVEL = 120
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [IntraWordGameDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [IntraWordGameDB] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [IntraWordGameDB] SET ANSI_NULLS OFF
GO
ALTER DATABASE [IntraWordGameDB] SET ANSI_PADDING OFF
GO
ALTER DATABASE [IntraWordGameDB] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [IntraWordGameDB] SET ARITHABORT OFF
GO
ALTER DATABASE [IntraWordGameDB] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [IntraWordGameDB] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [IntraWordGameDB] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [IntraWordGameDB] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [IntraWordGameDB] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [IntraWordGameDB] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [IntraWordGameDB] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [IntraWordGameDB] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [IntraWordGameDB] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [IntraWordGameDB] SET DISABLE_BROKER
GO
ALTER DATABASE [IntraWordGameDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [IntraWordGameDB] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [IntraWordGameDB] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [IntraWordGameDB] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [IntraWordGameDB] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [IntraWordGameDB] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [IntraWordGameDB] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [IntraWordGameDB] SET RECOVERY FULL
GO
ALTER DATABASE [IntraWordGameDB] SET MULTI_USER
GO
ALTER DATABASE [IntraWordGameDB] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [IntraWordGameDB] SET DB_CHAINING OFF
GO
ALTER DATABASE [IntraWordGameDB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO
ALTER DATABASE [IntraWordGameDB] SET TARGET_RECOVERY_TIME = 0 SECONDS
GO
ALTER DATABASE [IntraWordGameDB] SET DELAYED_DURABILITY = DISABLED
GO
ALTER DATABASE [IntraWordGameDB] SET READ_WRITE
GO
اسکریپت های جداول به تفکیک نسخه SQL Server ضمیمه شده است
سلام
نسخه جدید پروژه بازی به پیوست تقدیم می گردد. admin عزیز در مورد چگونگی اتصال به دیتابیس اشکالی در پروژه پیدا کرده و گزارش دادند و بنده هم در اولین فرصت آن را اصلاح کرده و در این پست تقدیم می کنم.
اشکال مربوط به ConnectionString پروژه بود . وقتی شما فایل اجرایی را دانلود و اجرا می کردید ، نرم افزار سعی می کرد با ConnectionString استاتیک که مربوط به تنظیمات کامپیوتر بنده بود به دیتابیس وصل شود و در نتیجه کاربر با Error مواجه می شد.
در نسخه اصلاح شده ، نرم افزار ابتدا در مسیر فایل اجرایی بدنبال فایلی با نام Config.txt می گردد . اگر آن را پیدا کند محتویات آن را خوانده و پس از Decrypt کردن ، به عنوان ConnectionString در پروژه مورد استفاده قرار میدهد. ولی چنانچه این فایل پیدا نشود در فرم ورود کاربران بجای دکمه "ورود" دکمه "Config" نمایش داده خواهد شد که کاربر میتواند بوسیله آن Config.txt مربوط به سیستم خود را تولید کند.
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
[برای مشاهده لینک ها شما باید عضو سایت باشید برای عضویت در سایت بر روی اینجا کلیک بکنید]
سلام
جهت اجرای صحیح پروژه باید فولدر های wwwroot و Templates در کنار فایل اجرایی وجود داشته باشند
قالب فرم Login تغییر کرده بود که اصلاح شد و در همین پست به همراه Exe مجددا آپلود و در دسترس کاربران عزیز قرار میگیرد
سلام
لینک بازگشت در فرم ثبت نام و فراموشی رمز عبور و لینک راهنمای بازی به فرم بازی اضافه شد
آخرین سورس و exe به پیوست تقدیم می گردد
سلام به دوستان فعال و خوش فکر
ایده بسیار جالب و پشتکار شما هم قابل تحسین هست
فقط یک نکته وجود داره ! چرا Intra Web ؟ چرا یک HTTP Server مثل indy رو انتخاب نکردید ؟
سلام
مرسی از لطفتون
شما بفرمایید چرا Intraweb نه؟ و چرا indy ?
البته دلیل بنده اینه که خیلی بلد نیستم با indy کار کنم !!! :(
شما اگه می تونید این دو را با هم مقایسه کنید تا اگر indy راه بهتری پیشنهاد میکنه بنده هم برم سراغش
ممنون میشم اگه وقت بذارید و راهنمایی کنید
سلام
خوب نمیشه به صورت کلی گفت کدوم نسبت به دیگری برتری دارند و خیلی بستگی به نحوه پیاده سازی و اهداف پروژه داره ، indy در واقع یک Embedded HTTP Server هست و شما مجبورید همه چیز رو خودتون پیاده سازی کنید
اما 2 حسن عمده داره ، اول اینکه برنامه شما به وب سرور خارجی وابسته نمیشه و دوم اینکه در سطح پایین قدرت کنترل همه چیز رو خواهید داشت.
شاید یک جورایی بشه گفت مثل مقایسه php و ASP.net هست.
سلام به همه
به زودی عضو جدید گروه یعنی سر کار خانم شیر محمدی پوسته جدید بازی را آماده و آپلود خواهد کرد
با سلام و دورود ورود سر کار خانم شیر محمدی را خیر مقدم میگوییم .
به دلیل عدم استقبال اعضاء این گفتگو بسته می شود