# Native Code > برنامه نویسی در Delphi > توسعه نرم افزار تحت وب >  دلفی و  ASP.NET !

## Inprise

بنام خدا

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

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

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

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




&lt;configuration>
   &lt;configSections>
      &lt;section name="appSettings"   
               type="System.Configuration.NameValueFileSectionHan  dler, 
               System, Version=1.0.3300.0, 
               Culture=neutral, PublicKeyToken=b77a5c561934e089" />         
      &lt;section name="sessionState" 
               type="System.Web.SessionState.SessionStateSectionH  andler, 
               System.Web, Version=1.0.3300.0, Culture=neutral, 
               PublicKeyToken=b03f5f7f11d50a3a" 
               allowDefinition="MachineToApplication" />
   &lt;/configSections>

   &lt;appSettings>
      &lt;add key="dsn" value="localhost;uid=MyUserName;pwd=;" />
      &lt;add key="msmqserver" value="server\myqueue" />
   &lt;/appSettings>
   
   &lt;sessionState cookieless="true" timeout="10" />
&lt;/configuration>



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

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




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

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

&lt;html>
    &lt;script language="Delphi" runat="server">
    procedure Click&#40;Sender&#58; System.Object; E&#58; EventArgs&#41;;
    begin
        Message.Text &#58;= Edit1.Text;
    end;
    &lt;/script>
    &lt;body>
    &lt;form runat="server">
        &lt;asp&#58;textbox id="Edit1" runat="server"/>
        &lt;asp&#58;button text="Click Me!" OnClick="Click" runat="server"/>
    &lt;/form>
    &lt;p>&lt;b>&lt;asp&#58;label id="Message" runat="server"/>&lt;/b>&lt;/p>
    &lt;/body>
&lt;/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&#58; Integer;
  editdemo_aspx___intialized&#58; Boolean = False;
  editdemo_aspx___fileDependencies&#58; System.Collections.ArrayList;
type
  editdemo_aspx = class&#40;System.Web.UI.Page, System.Web.SessionState.IRequiresSessionState&#41;
  protected
    Edit1&#58; System.Web.UI.WebControls.TextBox;
    __control3&#58; System.Web.UI.WebControls.Button;
    __control2&#58; System.Web.UI.HtmlControls.HtmlForm;
    Message&#58; System.Web.UI.WebControls.Label;
    procedure ButtonClick&#40;Sender&#58; System.Object; E&#58; EventArgs&#41;;
  public
    constructor Create;
    function get_AutoHandlers&#58; Integer; override;
    function get_ApplicationInstance&#58; System.Web.HttpApplication; virtual;
    function get_TemplateSourceDirectory&#58; System.String; override;
    procedure set_AutoHandlers&#40;Value&#58; Integer&#41;; override;
  protected
    property AutoHandlers&#58; Integer read get_AutoHandlers write set_AutoHandlers;
    property ApplicationInstance&#58; System.Web.HttpApplication read get_ApplicationInstance;
  public
    property TemplateSourceDirectory&#58; System.String read get_TemplateSourceDirectory;
  private
    function __BuildControlEdit1&#58; System.Web.UI.Control;
    function __BuildControl__control3&#58; System.Web.UI.Control;
    function __BuildControl__control2&#58; System.Web.UI.Control;
    function __BuildControlMessage&#58; System.Web.UI.Control;
    procedure __BuildControlTree&#40;__ctrl&#58; System.Web.UI.Control&#41;;
  protected
    procedure FrameworkInitialize; override;
  public
    function GetTypeHashCode&#58; Integer; override;
  end;
  
implementation


    procedure editdemo_aspx.ButtonClick&#40;Sender&#58; System.Object; E&#58; EventArgs&#41;;
    begin
        Message.Text &#58;= Edit1.Text;
    end;
    constructor editdemo_aspx.Create;
var
  dependencies&#58; System.Collections.ArrayList;
begin
  inherited Create;
  
  if &#40;ASP.editdemo_aspx___intialized = False&#41; then
  begin
    dependencies &#58;= System.Collections.ArrayList.Create;
    dependencies.Add&#40;'d&#58;\vslive\editdemo.aspx'  &#41;;
    ASP.editdemo_aspx___fileDependencies &#58;= dependencies;
    ASP.editdemo_aspx___intialized &#58;= True;
  end;
  Self.Server.ScriptTimeout &#58;= 30000000;
end;

function editdemo_aspx.get_AutoHandlers&#58; Integer;
begin
  Result &#58;= ASP.editdemo_aspx___autoHandlers;
end;

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

function editdemo_aspx.get_TemplateSourceDirectory&#58; System.String;
begin
  Result &#58;= '/vslive';
end;

procedure editdemo_aspx.set_AutoHandlers&#40;Value&#58; Integer&#41;;
begin
  ASP.editdemo_aspx___autoHandlers &#58;= Value;
end;

function editdemo_aspx.__BuildControlEdit1&#58; System.Web.UI.Control;
var
  __ctrl&#58; System.Web.UI.WebControls.TextBox;
begin
  
  __ctrl &#58;= System.Web.UI.WebControls.TextBox.Create;
  Self.Edit1 &#58;= __ctrl;
  __ctrl.ID &#58;= 'Edit1';
  __ctrl.Width &#58;= System.Web.UI.WebControls.Unit.Parse&#40;'300px', System.Globalization.CultureInfo.InvariantCulture&  #41;;
  Result &#58;= __ctrl;
end;

function editdemo_aspx.__BuildControl__control3&#58; System.Web.UI.Control;
var
  __ctrl&#58; System.Web.UI.WebControls.Button;
begin
  
  __ctrl &#58;= System.Web.UI.WebControls.Button.Create;
  Self.__control3 &#58;= __ctrl;
  __ctrl.Text &#58;= 'Click Me!';
  __ctrl.add_Click&#40;Self.ButtonClick&#41;;
  Result &#58;= __ctrl;
end;

function editdemo_aspx.__BuildControl__control2&#58; System.Web.UI.Control;
var
  __parser&#58; System.Web.UI.IParserAccessor;
  __ctrl&#58; System.Web.UI.HtmlControls.HtmlForm;
begin
  
  __ctrl &#58;= System.Web.UI.HtmlControls.HtmlForm.Create;
  Self.__control2 &#58;= __ctrl;
  __parser &#58;= __ctrl as System.Web.UI.IParserAccessor;
  __parser.AddParsedSubObject&#40;System.Web.UI.Lite  ralControl.Create&#40;''#13#10'        '&#41;&#41;;
  Self.__BuildControlEdit1;
  __parser.AddParsedSubObject&#40;Self.Edit1&#41;;
  __parser.AddParsedSubObject&#40;System.Web.UI.Lite  ralControl.Create&#40;''#13#10'        '&#41;&#41;;
  Self.__BuildControl__control3;
  __parser.AddParsedSubObject&#40;Self.__control3&#4  1;;
  __parser.AddParsedSubObject&#40;System.Web.UI.Lite  ralControl.Create&#40;''#13#10'    '&#41;&#41;;
  Result &#58;= __ctrl;
end;

function editdemo_aspx.__BuildControlMessage&#58; System.Web.UI.Control;
var
  __ctrl&#58; System.Web.UI.WebControls.Label;
begin
  
  __ctrl &#58;= System.Web.UI.WebControls.Label.Create;
  Self.Message &#58;= __ctrl;
  __ctrl.ID &#58;= 'Message';
  Result &#58;= __ctrl;
end;

procedure editdemo_aspx.__BuildControlTree&#40;__ctrl&#58; System.Web.UI.Control&#41;;
var
  __parser&#58; System.Web.UI.IParserAccessor;
begin
  __parser &#58;= __ctrl as System.Web.UI.IParserAccessor;
  __parser.AddParsedSubObject&#40;System.Web.UI.Lite  ralControl.Create&#40;'&lt;html>'#13#10'    '&#41;&#41;;
  __parser.AddParsedSubObject&#40;System.Web.UI.Lite  ralControl.Create&#40;''#13#10'    &lt;body>'#13#10'    '&#41;&#41;;
  Self.__BuildControl__control2;
  __parser.AddParsedSubObject&#40;Self.__control2&#4  1;;
  __parser.AddParsedSubObject&#40;System.Web.UI.Lite  ralControl.Create&#40;''#13#10'    &lt;p>&lt;b>'&#41;&#41;;
  Self.__BuildControlMessage;
  __parser.AddParsedSubObject&#40;Self.Message&#41;;
  __parser.AddParsedSubObject&#40;System.Web.UI.Lite  ralControl.Create&#40;'&lt;/b>&lt;/p>'#13#10'    &lt;/body>'#13#10'&lt;/html>'#13#10&#41;&#41;;
end;

procedure editdemo_aspx.FrameworkInitialize;
begin
  Self.__BuildControlTree&#40;Self&#41;;
  Self.FileDependencies &#58;= ASP.editdemo_aspx___fileDependencies;
  Self.EnableViewStateMac &#58;= True;
end;

function editdemo_aspx.GetTypeHashCode&#58; Integer;
begin
  Result &#58;= -764444463;
end;

end.





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

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

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

الف)

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

&lt;script language="Delphi" runat="server">
procedure Calendar1Selected&#40;Sender&#58; System.Object; E&#58; EventArgs&#41;;
begin
  Label1.Text &#58;= 'Delphi for .NET says you picked ' + Calendar1.SelectedDate.ToString&#40;'D'&#41;;
end;

procedure Button1Click&#40;Sender&#58; System.Object; E&#58;EventArgs&#41;;
begin
  Calendar1.VisibleDate &#58;= System.Convert.ToDateTime&#40;Edit1.Text&#41;;
  Label1.Text &#58;= 'Delphi for .NET says you set ' + Calendar1.VisibleDate.ToString&#40;'D'&#41;;
end;
&lt;/script>

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





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


ب)


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

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

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


&lt;%@Import Namespace="System.Data"%>
&lt;%@Import Namespace="System.Data.SqlClient"%>

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

procedure DateSelected&#40;Sender&#58; System.Object; E&#58; EventArgs&#41;;
begin
  Label1.Text &#58;= ProdName + ' says you picked ' + Calendar1.SelectedDate.ToString&#40;'D'&#41;;
  DataGrid1.DataSource &#58;= GetOrders&#40;Calendar1.SelectedDate&#41;;
  DataGrid1.DataBind;
end;

procedure Button1Click&#40;Sender&#58; System.Object; E&#58;EventArgs&#41;;
begin
  Calendar1.VisibleDate &#58;= System.Convert.ToDateTime&#40;Edit1.Text&#41;;
  Label1.Text &#58;= ProdName + ' says you set ' + Calendar1.VisibleDate.ToString&#40;'D'&#41;;
end;

procedure Button2Click&#40;Sender&#58; System.Object; E&#58;EventArgs&#41;;
begin
  DisplayFields.Text &#58;= DispFields;
end;

function GetOrders&#40;Date &#58; DateTime&#41; &#58; DataSet;
var
  Adapter &#58; SqlDataAdapter;
begin
  Adapter &#58;= SqlDataAdapter.Create&#40;
    'select ' + DisplayFields.Text + ' from Orders '+
    'where OrderDate = ''' + date.ToString&#40;'d'&#41;+'''',
    'Server=&#40;local&#41;;Database=Northwind;Trusted  _Connection=yes'&#41;;
  Result &#58;= DataSet.Create;
  Adapter.Fill&#40;Result&#41;;
end;

&lt;/script>

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





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


&lt;%@Import Namespace="System.Data"%>
&lt;%@Import Namespace="System.Data.SqlClient"%>



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

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

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

----------


## Vahid_Nasiri

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

----------


## Inprise

وحید جان !

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

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

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

 :mrgreen:  :mrgreen:

----------


## Vahid_Nasiri

بعد از سی شارپ اگر عمری باقی موند! می رم سی بیلدر یاد می گیرم  :wink:  :twisted:

----------


## SyntaxCheck

جالب و آموزنده بود و مثل همیشه بدرد بخور.دستت درد نکنه.
تا شاید آنانکه زیبایی را میشناسند به معرفت هستی دلفی برسند.

----------

