PDA

View Full Version : دلفی و ASP.NET !



Inprise
شنبه 02 فروردین 1382, 21:06 عصر
بنام خدا

پس از مطالعه این مقاله خواهید آموخت چگونه از دلفی برای تولید صفحات دینامیک وب مبتنی بر تکنولوژی ASP.NET مایکروسافت استفاده کنید .

مرحله اول : قبل از هرکار باید سیستم ASP.NET را از وجود دلفی به عنوان یکی از زبانهای اسکریپت نگاری تحت NET. مطلع سازید .

ASP.NET برای اجرای برنامه ها به دنبال فایلی با نام web.config خواهد گشت که جزئیات زبانهای مورد استفاده سیستم در آن ثبت شده است . این فایل XML-Based باید برای معرفی دلفی به سیستم تغییر کند .

کد زیر نمونه خامی از این نوع فایل را نمایش میدهد :





<configuration>
<configSections>
<section name="appSettings"
type="System.Configuration.NameValueFileSectionHandler,
System, Version=1.0.3300.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<section name="sessionState"
type="System.Web.SessionState.SessionStateSectionHandler ,
System.Web, Version=1.0.3300.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
allowDefinition="MachineToApplication" />
</configSections>

<appSettings>
<add key="dsn" value="localhost;uid=MyUserName;pwd=;" />
<add key="msmqserver" value="server\myqueue" />
</appSettings>

<sessionState cookieless="true" timeout="10" />
</configuration>



فایل مورد نظر برای سازگاری با دلفی باید به این شکل باشد :


<configuration>
<system.web>
<compilation debug="true">
<assemblies>
<add assembly="DelphiProvider" />
</assemblies>
<compilers>
<compiler language="Delphi" extension=".pas"
type="Borland.Delphi.DelphiCodeProvider,DelphiProvider" />
</compilers>
</compilation>
</system.web>
</configuration>




فایل مورد نظر باید در دایرکتوری مجازی معرفی شده برای وب سرور که محل قرار گرفتن برنامه های ASP.NET ساخته شده با دلفی است قرار بگیرد . برای این مقصود به وب سرور خود دایرکتوری مجازی دیگری معرفی کرده و فایل فوق الذکر را آنجا قرار دهید .

مرحله دوم : در محیط ویژوال استودیو ( .. والبته اگر تمایل دارید Notepad !!!!! ) پروژه وب جدیدی باز کنید و یک تکست باکس - یک کلید - یک لیبل روی فرم خود قرار داده و تابع click را به رویداد OnClick کلید فشاری نسبت دهید . نام تکست باکس را ادیت وان و نام لیبل را مسج بگذارید . فایل حاصل را بصورت زیر ویرایش کنید :


<html>
<script language="Delphi" runat="server">
procedure Click(Sender: System.Object; E: EventArgs);
begin
Message.Text := Edit1.Text;
end;
</script>
<body>
<form runat="server">
<asp:textbox id="Edit1" runat="server"/>
<asp:button text="Click Me!" OnClick="Click" runat="server"/>
</form>
<p><b><asp:label id="Message" runat="server"/></b></p>
</body>
</html>







فایل را با نام Test.AspX ذخیره کرده و اجرا کنید . ( برای اجرا کرده برنامه های ASP.NET باید IIS و NET. Run Times را قبلا نصب و تنظیم کرده باشید !
... Http://localhost/ur-virtual-delphi-dir/test.aspX)

مجموعه کامپایلر دلفی و ASP.NET کد زیر را تولید و کامپایل (!) میکنند :




unit ASP;

interface

uses System.Collections, System.Collections.Specialized, System.Configuration,
System.Text, System.Text.RegularExpressions, System.Web, System.Web.Caching,
System.Web.SessionState, System.Web.Security, System.Web.UI, System.Web.UI.WebControls,
System.Web.UI.HtmlControls, System.Globalization;

var
editdemo_aspx___autoHandlers: Integer;
editdemo_aspx___intialized: Boolean = False;
editdemo_aspx___fileDependencies: System.Collections.ArrayList;
type
editdemo_aspx = class(System.Web.UI.Page, System.Web.SessionState.IRequiresSessionState)
protected
Edit1: System.Web.UI.WebControls.TextBox;
__control3: System.Web.UI.WebControls.Button;
__control2: System.Web.UI.HtmlControls.HtmlForm;
Message: System.Web.UI.WebControls.Label;
procedure ButtonClick(Sender: System.Object; E: EventArgs);
public
constructor Create;
function get_AutoHandlers: Integer; override;
function get_ApplicationInstance: System.Web.HttpApplication; virtual;
function get_TemplateSourceDirectory: System.String; override;
procedure set_AutoHandlers(Value: Integer); override;
protected
property AutoHandlers: Integer read get_AutoHandlers write set_AutoHandlers;
property ApplicationInstance: System.Web.HttpApplication read get_ApplicationInstance;
public
property TemplateSourceDirectory: System.String read get_TemplateSourceDirectory;
private
function __BuildControlEdit1: System.Web.UI.Control;
function __BuildControl__control3: System.Web.UI.Control;
function __BuildControl__control2: System.Web.UI.Control;
function __BuildControlMessage: System.Web.UI.Control;
procedure __BuildControlTree(__ctrl: System.Web.UI.Control);
protected
procedure FrameworkInitialize; override;
public
function GetTypeHashCode: Integer; override;
end;

implementation


procedure editdemo_aspx.ButtonClick(Sender: System.Object; E: EventArgs);
begin
Message.Text := Edit1.Text;
end;
constructor editdemo_aspx.Create;
var
dependencies: System.Collections.ArrayList;
begin
inherited Create;

if (ASP.editdemo_aspx___intialized = False) then
begin
dependencies := System.Collections.ArrayList.Create;
dependencies.Add('d:\vslive\editdemo.aspx');
ASP.editdemo_aspx___fileDependencies := dependencies;
ASP.editdemo_aspx___intialized := True;
end;
Self.Server.ScriptTimeout := 30000000;
end;

function editdemo_aspx.get_AutoHandlers: Integer;
begin
Result := ASP.editdemo_aspx___autoHandlers;
end;

function editdemo_aspx.get_ApplicationInstance: System.Web.HttpApplication;
begin
Result := Self.Context.ApplicationInstance as System.Web.HttpApplication;
end;

function editdemo_aspx.get_TemplateSourceDirectory: System.String;
begin
Result := '/vslive';
end;

procedure editdemo_aspx.set_AutoHandlers(Value: Integer);
begin
ASP.editdemo_aspx___autoHandlers := Value;
end;

function editdemo_aspx.__BuildControlEdit1: System.Web.UI.Control;
var
__ctrl: System.Web.UI.WebControls.TextBox;
begin

__ctrl := System.Web.UI.WebControls.TextBox.Create;
Self.Edit1 := __ctrl;
__ctrl.ID := 'Edit1';
__ctrl.Width := System.Web.UI.WebControls.Unit.Parse('300px', System.Globalization.CultureInfo.InvariantCulture) ;
Result := __ctrl;
end;

function editdemo_aspx.__BuildControl__control3: System.Web.UI.Control;
var
__ctrl: System.Web.UI.WebControls.Button;
begin

__ctrl := System.Web.UI.WebControls.Button.Create;
Self.__control3 := __ctrl;
__ctrl.Text := 'Click Me!';
__ctrl.add_Click(Self.ButtonClick);
Result := __ctrl;
end;

function editdemo_aspx.__BuildControl__control2: System.Web.UI.Control;
var
__parser: System.Web.UI.IParserAccessor;
__ctrl: System.Web.UI.HtmlControls.HtmlForm;
begin

__ctrl := System.Web.UI.HtmlControls.HtmlForm.Create;
Self.__control2 := __ctrl;
__parser := __ctrl as System.Web.UI.IParserAccessor;
__parser.AddParsedSubObject(System.Web.UI.LiteralC ontrol.Create(''#13#10' '));
Self.__BuildControlEdit1;
__parser.AddParsedSubObject(Self.Edit1);
__parser.AddParsedSubObject(System.Web.UI.LiteralC ontrol.Create(''#13#10' '));
Self.__BuildControl__control3;
__parser.AddParsedSubObject(Self.__control3);
__parser.AddParsedSubObject(System.Web.UI.LiteralC ontrol.Create(''#13#10' '));
Result := __ctrl;
end;

function editdemo_aspx.__BuildControlMessage: System.Web.UI.Control;
var
__ctrl: System.Web.UI.WebControls.Label;
begin

__ctrl := System.Web.UI.WebControls.Label.Create;
Self.Message := __ctrl;
__ctrl.ID := 'Message';
Result := __ctrl;
end;

procedure editdemo_aspx.__BuildControlTree(__ctrl: System.Web.UI.Control);
var
__parser: System.Web.UI.IParserAccessor;
begin
__parser := __ctrl as System.Web.UI.IParserAccessor;
__parser.AddParsedSubObject(System.Web.UI.LiteralC ontrol.Create('<html>'#13#10' '));
__parser.AddParsedSubObject(System.Web.UI.LiteralC ontrol.Create(''#13#10' <body>'#13#10' '));
Self.__BuildControl__control2;
__parser.AddParsedSubObject(Self.__control2);
__parser.AddParsedSubObject(System.Web.UI.LiteralC ontrol.Create(''#13#10' <p><b>'));
Self.__BuildControlMessage;
__parser.AddParsedSubObject(Self.Message);
__parser.AddParsedSubObject(System.Web.UI.LiteralC ontrol.Create('</b></p>'#13#10' </body>'#13#10'</html>'#13#10));
end;

procedure editdemo_aspx.FrameworkInitialize;
begin
Self.__BuildControlTree(Self);
Self.FileDependencies := ASP.editdemo_aspx___fileDependencies;
Self.EnableViewStateMac := True;
end;

function editdemo_aspx.GetTypeHashCode: Integer;
begin
Result := -764444463;
end;

end.





کد فوق صرفا زمانی قابل رویت است که خطای دستوری در برنامه دلفی خود داشته باشید و وب سرور ضمن ارائه Error مربوط سورس کد را نیر به شما نشان خواهد داد و در بقیه موارد راهی برای دیدن این کد وجود ندارد و برنامه شما بصورت اسکریپت AspX کامپایل شده که به زبان دلفی نوشته شده است قابل استفاده است .

هر چند هنوز محصول جامع و قابل اطمینان بورلند برای سازگاری محصولاتش با دات نت معرفی نشده است و احتمالا جزئیات موجود در .Net Preview نیز تغییر خواهند کرد اما امید است توضیحات فوق تصویر نسبتا روشنی از آنچه در آینده ای نزدیک از ترکیب تکنولوژی مایکروسافت و کامپایلر بورلند نصیبتان خواهد شد ایجاد کرده باشد .

به دو مثال زیر نیز توجه کنید :

الف)

یکی از اشیا مفید همراه ویژوال استودیو برای توسعه وب Calendar میباشد . یک نمونه از آن را روی فرم وب خود گذاشته و پس از نسبت دادن مقادیر مناسب به خواص پایه ای آن کد مناسب دلفی را برای تولید خروجی با عنوان تاریخ انتخاب شده توسط کاربر و حرکت به سمت تاریخ مورد نظر کاربر را به شکل زیر بنویسید :


<script language="Delphi" runat="server">
procedure Calendar1Selected(Sender: System.Object; E: EventArgs);
begin
Label1.Text := 'Delphi for .NET says you picked ' + Calendar1.SelectedDate.ToString('D');
end;

procedure Button1Click(Sender: System.Object; E:EventArgs);
begin
Calendar1.VisibleDate := System.Convert.ToDateTime(Edit1.Text);
Label1.Text := 'Delphi for .NET says you set ' + Calendar1.VisibleDate.ToString('D');
end;
</script>

<body style="font:18pt Verdana">
<form runat="server">
<center>
<h1>Delphi for .NET running in ASP.NET</h1>
<p>Please pick a date</p>
<asp:Calendar id="Calendar1" runat="server" ForeColor="#0000FF" BackColor="#FFFFCC"
OnSelectionChanged="Calendar1Selected">
<TodayDayStyle Font-Bold="True"/>
<NextPrevStyle ForeColor="#FFFFCC"/>
<DayHeaderStyle BackColor="#FFCC66"/>
<SelectedDayStyle ForeColor="Black" BackColor="#CCCCFF"/>
<TitleStyle Font-Size="14pt" Font-Bold="True" ForeColor="#FFFFCC" BackColor="#990000"/>
<OtherMonthDayStyle ForeColor="#CC9966"/>
</asp:Calendar>
<p><asp:TextBox id="Edit1" width=200 runat="server"/>
<asp:Button text="Set date" id="Button1" OnClick="Button1Click" runat="server" />
</p>
<p><asp:Label id="Label1" runat="server"/></p>
</center>
</form>
</body>





خروجی برنامه ASP.NET ای خواهد بود که در محیط ویژوال استودیو تولید شده و از کامپوننت تقویم طراحی شده با #C استفاده میکند و پیاده سازی آن توسط دلفی انجام شده است .


ب)


اگر آشنائی مقدماتی با محیط ویژوال استودیو داشته باشید میدانید که این محیط برای تولید سریع محتوای وب مبتنی بر بانکهای اطلاعاتی کامپوننتهای خاصی جهت نمایش و ویرایش داده ها دارد .

یک نمونه از کامپوننت DataGrid را و یک نمونه TextBox را به فرم مثال قبلی ( تقویم ) اضافه کنید . کد دلفی نوشته شده با بانک اطلاعاتی معروف Northwind موجود در سیستم ارتباط برقرار میکند . ( باید اسکوئل سرور 2000 نصب شده باشد ! ) .

حالا تقویم شما با بانک اطلاعاتی اتصال برقرار کرده و اطلاعات لازم استخراج میگردد .



<%@Import Namespace="System.Data"%>
<%@Import Namespace="System.Data.SqlClient"%>

<script language="Delphi" runat="server">
const
ProdName = 'Delphi for .NET';
DispFields = 'OrderID, CustomerID, ShipName, ShipCity, ShipCountry';

procedure DateSelected(Sender: System.Object; E: EventArgs);
begin
Label1.Text := ProdName + ' says you picked ' + Calendar1.SelectedDate.ToString('D');
DataGrid1.DataSource := GetOrders(Calendar1.SelectedDate);
DataGrid1.DataBind;
end;

procedure Button1Click(Sender: System.Object; E:EventArgs);
begin
Calendar1.VisibleDate := System.Convert.ToDateTime(Edit1.Text);
Label1.Text := ProdName + ' says you set ' + Calendar1.VisibleDate.ToString('D');
end;

procedure Button2Click(Sender: System.Object; E:EventArgs);
begin
DisplayFields.Text := DispFields;
end;

function GetOrders(Date : DateTime) : DataSet;
var
Adapter : SqlDataAdapter;
begin
Adapter := SqlDataAdapter.Create(
'select ' + DisplayFields.Text + ' from Orders '+
'where OrderDate = ''' + date.ToString('d')+'''',
'Server=(local);Database=Northwind;Trusted_Connect ion=yes');
Result := DataSet.Create;
Adapter.Fill(Result);
end;

</script>

<body style="font:18pt Verdana">
<form runat="server">
<h1><%=ProdName %> with a Calendar, DataGrid, & SqlClient in ASP.NET</h1>
<table>
<tr valign="top"><td>
<p><b>Pick a date</b></p>
<asp:Calendar id="Calendar1" runat="server" ForeColor="#0000FF" BackColor="#FFFFCC"
OnSelectionChanged="DateSelected">
<TodayDayStyle Font-Bold="True"/>
<NextPrevStyle ForeColor="#FFFFCC"/>
<DayHeaderStyle BackColor="#FFCC66"/>
<SelectedDayStyle ForeColor="Black" BackColor="#CCCCFF"/>
<TitleStyle Font-Size="14pt" Font-Bold="True" ForeColor="#FFFFCC" BackColor="#990000"/>
<OtherMonthDayStyle ForeColor="#CC9966"/>
</asp:Calendar>
<p><asp:TextBox id="Edit1" width=150 runat="server"/>
<asp:Button text="Set date" id="Button1" OnClick="Button1Click" runat="server" />
</p>
</td><td valign="top">
<p><b>Display fields:</b> <asp:TextBox id="DisplayFields"
text="OrderID, CustomerID, ShipName, ShipCity, ShipCountry" width=500 runat="server"/>
<asp:Button text="Reset fields" id="Button2" OnClick="Button2Click" runat="server" /></p>
<asp:DataGrid id="DataGrid1" runat="server" BorderColor="#FFCC66" ForeColor="#0000FF">
<HeaderStyle ForeColor="#FFFFCC" BackColor="#990000"/>
</asp:DataGrid>
</td></tr></table>
<p><asp:Label id="Label1" runat="server"/></p>
</form>
</body>





بخاطر داشته باشید که خطوط :



<%@Import Namespace="System.Data"%>
<%@Import Namespace="System.Data.SqlClient"%>



درست مانند SqlConnection و ClientDataset محیط دلفی عمل کرده و ارتباط با بانک داده ها و ظرفی برای استخراج داده ها فراهم می آورند .

امید است توضیحات هر چند سطحی فوق ذهنیت مناسبی برای برنامه نویسانی که قصد دارند پای به عرصه وب بگذارند ایجاد کرده باشد . موفق و موید و سلامت باشید .

سال خوبی را برایتان آرزومندم . InpriZ

Vahid_Nasiri
یک شنبه 03 فروردین 1382, 18:18 عصر
خسته نباشید استاد! در ضمن چقدر هم ملایم و لطیف شدی ؟!! :wink: :lol: 8)
بالاخره روح مایکروسافت در اینپرایز :wink: دمیده شد!
البته دات نت فریم ورک آنقدر دست و دلباز است که دلفی که هیچی :wink: زبانهایی مثل کوبول و غیره را هم می تواند در خودش جای دهد . :twisted:

Inprise
یک شنبه 03 فروردین 1382, 21:04 عصر
وحید جان !

من آخرش تو رو به راه راست هدایت میکنم !!! :twisted: چون دوستت دارم ... :roll:

... و البته راه راست چیزی نیست جز اینپرایز !!!! :twisted:

اینپرایز صراط المستقیم !

:mrgreen: :mrgreen:

Vahid_Nasiri
دوشنبه 04 فروردین 1382, 00:49 صبح
بعد از سی شارپ اگر عمری باقی موند! می رم سی بیلدر یاد می گیرم :wink: :twisted:

SyntaxCheck
دوشنبه 04 فروردین 1382, 04:16 صبح
جالب و آموزنده بود و مثل همیشه بدرد بخور.دستت درد نکنه.http://www.whiteiran.com/images/yahoo/35.gif
تا شاید آنانکه زیبایی را میشناسند به معرفت هستی دلفی برسند.http://www.whiteiran.com/images/yahoo/22.gifhttp://www.whiteiran.com/images/yahoo/16.gif