大家讨论:用Delphi来开发WEB有必要吗?(讨论完,赠大家WebSnap的完整教材)(0分)

  • 主题发起人 主题发起人 nzfsoft
  • 开始时间 开始时间
我用了一下,觉得不错,尤其是用了Ado。我的网站上,就用了delphi制作的web。先用dreamwave制作模板,觉得功能挺强大。
 
UP!!!!真正的高手还没来说话呢!怎么能就此结贴。
就想看看WEBSNAP到底有多厉害?用过了,没做出东西来,
但好象潜力挺大,操作简单,集中性也挺强,
在界面的设计上似乎没有???怎么回事???
有人能回答我吗?
zergwangzg@163.com
 
以下是一段用Delphi写的asp.net脚本:
<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>
 
将Delphi视为脚本语言
支持ASP.NET的第一件事是让ASP.NET将Delphi视为脚本语言,让ASP.NET能够为各种ASP文件类型调用Delphi的.NET编译器。
ASP.NET要在IIS虚路径的根目录下寻找web.config文件。下面是ASP.NET中使用Delphi作脚本语言的web.config配制文件内容:
<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>
关于web配制文件的详情请参MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconformatofconfigurationfiles.asp
在我的机器(Win2K Pro)上测试Delphi对ASP.NET的支持。要增加一个虚路径来安放Delphi脚本,我把这个路径名定为"vslive"。
在我的机器配制文件上作了这个小改动后就可以来看ASP.NET是如何将Delphi视为脚本语言的。
在ASP.NET中使用Delphi代码
首先编写一个简单应用来确认我们的Delphi支持配制是正确的。下面是editdemo.aspx文件的代码,有一个文本输入框,一个按钮。按钮事件触发显示输入框内容。
<html>
<script language="Delphi" runat="server">
procedure ButtonClick(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="ButtonClick" runat="server"/>
</form>
<p><b><asp:label id="Message" runat="server"/></b></p>
</body>
</html>
可以看到,ASP按钮对象的OnClick事件触发Delphi的ButtonClick过程,而Delphi程序里却使用了ASP对象label Message和text box Edit1。虽然在Delphi过程中没有定义ASP的二个变量,Delphi代码却能找到它们。这是因为脚本中含有的Delphi服务模块能够产生相应的Delphi代码。
现在可以用本地浏览器来浏览这个网页了。因为我把脚本放在"vslive"虚路径,所以打开:
http://localhost/vslive/editdemo.aspx.
以下是编译之后形成的Delphi代码,代码产生WebForm:
//------------------------------------------------------------------------------
// <autogenerated>
// 本代码由一个工具生成
// 运行版本:1.0.3705.209
//
// 修改本文件将导致异常行为并丢失生成的代码。
// </autogenerated>
//------------------------------------------------------------------------------
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.LiteralControl.Create(''#13#10' '));
Self.__BuildControlEdit1;
__parser.AddParsedSubObject(Self.Edit1);
__parser.AddParsedSubObject(System.Web.UI.LiteralControl.Create(''#13#10' '));
Self.__BuildControl__control3;
__parser.AddParsedSubObject(Self.__control3);
__parser.AddParsedSubObject(System.Web.UI.LiteralControl.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.LiteralControl.Create('<html>'#13#10' '));
__parser.AddParsedSubObject(System.Web.UI.LiteralControl.Create(''#13#10' <body>'#13#10' '));
Self.__BuildControl__control2;
__parser.AddParsedSubObject(Self.__control2);
__parser.AddParsedSubObject(System.Web.UI.LiteralControl.Create(''#13#10' <p><b>'));
Self.__BuildControlMessage;
__parser.AddParsedSubObject(Self.Message);
__parser.AddParsedSubObject(System.Web.UI.LiteralControl.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.

注意:这里介绍的是Delphi的.NET编译器功能的预览。正式发布的Delphi 7生成的代码与上面将有显著不同。本文仅是示例说明如何在ASP.NET中使用Delphi及其功能。
更高技术的网页
ASP.NET的一些控件远比HTML控件要更加智能化。其中之一就是日历(Calendar)控件。
以下代码是calendar.aspx中的一部分。代码提供二种方法让控件设置日期:
 浏览日历然后选择日期;
 按照日期格式输入日期,确认选择。这种方法由.NET的Convert类支持。
<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>
在日历上选择日期触发OnSelectionChanged事件,调用Delphi的Calendar1Selected()过程。
输入日期,点击"Set data"按钮触发Button1Click事件,调用Delphi的Button1Click()过程。
数据处理
现在通过日历的日期选择来选择显示数据库数据。在这个ASP.NET Delphi网页上,增加一个DataGrid和一个TextBox,前者显示数据库数据,后者输入要显示的数据库域。
<%@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_Connection=yes');
Result := DataSet.Create;
Adapter.Fill(Result);
end;

</script>
<body style="font:18pt Verdana">
<form runat="server">
<h1><%=ProdName %> with a Calendar, DataGrid, &amp;
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>
每当用户点击日历选择日期时,就触发OnSelectionChanged事件,调用DateSelected()函数。
在GetOrders函数中,数据库的连接由命名空间定义的SqlClient实现,数据库是MS SQL 2000的示范库Northwind。SqlDataAdapter将查询结果安装到DataGrid中,显示出数据表格,如附图。
改变域输入框的域名,再点击日历,就得到不同的结果。
这就是日历驱动的数据库查询系统,由Delphi for .NET与ASP.NET共同完成。
结语
本文试图简略说明在ASP.NET中应用Delphi是如何方便。
请记住,本文示例是Delphi 7的预览示例,正式版本的结果也许不完全如此,当然也许就是如此。
附图:
http://www.chinaok.net/down/200208151609310.gif
 
websnap开发WEB非常好啊,个人觉得比ASP开发周期短,
执行效率高。只是界面方面要配合CSS的知识,比较麻烦。
 
有必要,为了更大的自由度,我是这样理解的
 
至少从代码维护方面来说delphi相对好很多!除非你的程序准备每次都是从头写起!
 
没有什么是必要的,只有是不是需要的。
就好象同样输出语句在ASP里只需要<%response.write "test"%>就可以了
但在DLEPHI里,却做不到这样简单。
但从另一方面来说,在同等硬件下,
DELPHI写出来的web appliction能比ASP/php/jsp写的应用能支持不止一倍的访问量。
所以用什么写程序要看开发要求。
 
我想Delphi开发WEB有个致命伤。
它需要用户的服务器有可运行EXE的权限。
》》》》那个用户敢给你的Delphi开发的WEB来运行呢?
 
来学习...
kinganson@mail.china.com
 
zhouhj@mail.716.com.cn
delphi开发不容易呀!
 
我也是有这个困惑,我爱Delphi ,所以想用Delphi 网站,但不知道功能如何?
如果楼主发资料的话,请给我发一份,谢谢
saissoft@sohu.com
 
我想Delphi开发WEB有个致命伤。
它需要用户的服务器有可运行EXE的权限。
》》》》那个用户敢给你的Delphi开发的WEB来运行呢?
 
我没有用过WEBSNAP 我就用的DELPHI的CGI
我自已写了一个小小的留言簿,,大家可以去看看
http://61.177.65.24/cgi-bin/lybcgi.cgi
 
to liaoliao,你的东东看了,还成~
小弟想请教一个问题:现在很多用DELPHI写的ISAPI或CGI,在多次狂涮的情况下,会“当”
了,刚才测试老兄的程序却没有,请问:老兄如何做的???
谢谢~~
 

Similar threads

D
回复
0
查看
911
DelphiTeacher的专栏
D
D
回复
0
查看
868
DelphiTeacher的专栏
D
后退
顶部