开发者社区> 技术小美> 正文

Delphi天气预报查询

简介:
+关注继续查看

   现在的很多软件中都内置了天气查看这个功能!其实呢,这个功能的实现并不麻烦!会上网的人,都会查天气情况!其实那些内置天气预报功能的软件的天气预报功能也都是来源于网上!因为也没有哪个软件公司会自己去架一个气象站了哈哈,现在我就来说说如何通过互联网上的信息来获取天气情况!

  目前能查询天气的网站有不少,比较有名的有中国天气网与Google天气,大部分站点与大部分软件的天气预报数据也都是来源于中国天气网!因为中国天气网是中国气象局相关的,所以他的数据会更准确一些!查阅本文信息时,假设读者熟悉http协议与如何模拟网页提交等知识!

  中国天气网有一个连接http://m.weather.com.cn/data/+‘城市编码.html',这个连接可以获取对应的城市的天气情况!返回Json数据,解析Json就能获得该城市的天气!这个问题就在那个城市编码的获取方式上,这个获取方式,网上有代码的!我就不写了,我是直接将城市编码都包到资源文件中去了使用的时候,直接从资源加载就行了!获得天气的Json数据,用的事Http协议,这里只要用可以提交http的数据的控件或者类都可以(比如,indy的idhttp,ics的http控件都行,也可以使用MSxml的IXMLHttpRequest,也可以使用HttpRequest5.1或者使用WinHttp控件),这里我用的事最简单的方式,就用了Delphi直接带的indy的idhttp来获得,详细代码:

复制代码

unit Unit4;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,msxml,uLkJSON, ExtCtrls, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdHTTP;

type
TComboBox
= class(StdCtrls.TComboBox)
private
Values: TStringList;
public
constructor Create(AOwner: TComponent);override;
destructor Destroy;override;
procedure LoadFromFile(Filename: string);
procedure LoadFromRes(ResName: string);
end;

TForm4
= class(TForm)
Memo1: TMemo;
Panel1: TPanel;
ComboBox1: TComboBox;
Button1: TButton;
IdHTTP1: TIdHTTP;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function pro_result(str:string):string ;
public
{ Public declarations }
List: TStringList;
HttpReq: IXMLHttpRequest;
end;

var
Form4: TForm4;

implementation
uses DateUtils;

{$R *.dfm}
{$R mm.RES}

procedure TForm4.Button1Click(Sender: TObject);
var
url:
string;
Json: TlkJSONobject;
ChildJson,tmpJson: TlkJSONbase;
begin
url :
= 'http://m.weather.com.cn/data/'+Combobox1.Values.ValueFromIndex[ComboBox1.ItemIndex]+'.html';
HttpReq.open(
'Get', Url, False, EmptyParam, EmptyParam);
HttpReq.send(EmptyParam);
//开始搜索
Url :
= HttpReq.responseText;
Json :
= Tlkjson.ParseText(url) as TlkJSONobject;
ChildJson :
= Json.Field['weatherinfo'];
Memo1.Lines.Clear;
if ChildJson.SelfType = jsObject then
begin
//Showmessage(ChildJson.Field['city'].Value);
Memo1.Lines.Add(
'今日天气('+Vartostr(ChildJson.Field['date_y'].Value)+' '+Vartostr(ChildJson.Field['week'].Value)+'):');
Memo1.Lines.Add(
' 温度:'+Vartostr(ChildJson.Field['temp1'].Value));
Memo1.Lines.Add(
' 天气:'+Vartostr(ChildJson.Field['weather1'].Value));
//Memo1.Lines.Add(' 风向:'+Vartostr(ChildJson.Field['fx1'].Value)+ ' '+Vartostr(ChildJson.Field['wind1'].Value));
Memo1.Lines.Add(
' 风力:'+Vartostr(ChildJson.Field['wind1'].Value));

Memo1.Lines.Add(
'明日天气('+FormatDateTime('YYYY年MM月DD日 ',DateUtils.IncDay(now))+'):');
Memo1.Lines.Add(
' 温度:'+Vartostr(ChildJson.Field['temp2'].Value));
Memo1.Lines.Add(
' 天气:'+Vartostr(ChildJson.Field['weather2'].Value));
//Memo1.Lines.Add(' 风向:'+Vartostr(ChildJson.Field['fx2'].Value)+ ' '+Vartostr(ChildJson.Field['wind2'].Value));
Memo1.Lines.Add(
' 风力:'+Vartostr(ChildJson.Field['wind2'].Value));

Memo1.Lines.Add(FormatDateTime(
'YYYY年MM月DD日 ',DateUtils.IncDay(now,2))+'');
Memo1.Lines.Add(
' 温度:'+Vartostr(ChildJson.Field['temp3'].Value));
Memo1.Lines.Add(
' 天气:'+Vartostr(ChildJson.Field['weather3'].Value));
//if True then

//Memo1.Lines.Add(' 风向:'+Vartostr(ChildJson.Field['fx3'].Value)+ ' '+Vartostr(ChildJson.Field['wind3'].Value));
Memo1.Lines.Add(
' 风力:'+Vartostr(ChildJson.Field['wind3'].Value));

Memo1.Lines.Add(FormatDateTime(
'YYYY年MM月DD日 ',DateUtils.IncDay(now,3))+'');
Memo1.Lines.Add(
' 温度:'+Vartostr(ChildJson.Field['temp4'].Value));
Memo1.Lines.Add(
' 天气:'+Vartostr(ChildJson.Field['weather4'].Value));
//Memo1.Lines.Add(' 风向:'+Vartostr(ChildJson.Field['fx4'].Value)+ ' '+Vartostr(ChildJson.Field['wind4'].Value));
Memo1.Lines.Add(
' 风力:'+Vartostr(ChildJson.Field['wind4'].Value));

Memo1.Lines.Add(FormatDateTime(
'YYYY年MM月DD日 ',DateUtils.IncDay(now,4))+'');
Memo1.Lines.Add(
' 温度:'+Vartostr(ChildJson.Field['temp5'].Value));
Memo1.Lines.Add(
' 天气:'+Vartostr(ChildJson.Field['weather5'].Value));
//Memo1.Lines.Add(' 风向:'+Vartostr(ChildJson.Field['fx5'].Value)+ ' '+Vartostr(ChildJson.Field['wind5'].Value));
Memo1.Lines.Add(
' 风力:'+Vartostr(ChildJson.Field['wind5'].Value));
end;
end;

procedure TForm4.FormCreate(Sender: TObject);
var
temp,str_
1,str_2:string;
http1:tidhttp;
i:Integer;
begin
http1:
=tidhttp.create(self);
temp:
=HTTP1.Get('http://www.ipseeker.cn');
http1.free;
//temp:=Mmo1.Text;
i:
=Pos('查询结果',temp);
str_
1:=Copy(temp,i,254);
str_
2:=pro_result(str_1);
//Mmo2.Text:=str_2;
Caption :
= Trim(str_2);
ComboBox1.LoadFromRes(
'CityCode.Data');
i :
= Pos(' ',Caption);
if i <> 0 then
temp :
= copy(Caption,i+1,MaxInt)
else temp := Caption;
i :
= Pos('',temp);
if i <> 0 then
temp :
= copy(temp,0,i-1);
ComboBox1.ItemIndex :
= ComboBox1.Items.IndexOf(temp);

HttpReq :
= CoXMLHTTPRequest.Create;
Button1.Click;
end;

function TForm4.pro_result(str: string): string;
var
i_
0,i_1:Integer;
temp_result:
string;
begin
temp_result:
='';
while Pos('查询结果',str)<>0 do
begin
i_
1:=Pos('</span>',str);
i_
0:=Pos('查询结果',str);
temp_result:
=temp_result+Copy(str,i_0,i_1-i_0)+#13#10;
Delete(str,
1,Pos('</span>',str));
end;
result:
=StringReplace(temp_result,'&nbsp;','',[rfReplaceAll]);
i_
1 := Pos('-',Result);
Result :
= copy(Result,i_1+1,MaxInt);
end;

{ TComboBox }

constructor TComboBox.Create(AOwner: TComponent);
begin
inherited;
Values :
= TStringList.Create;
end;

destructor TComboBox.Destroy;
begin
Values.Free;
inherited;
end;

procedure TComboBox.LoadFromFile(Filename: string);
var
i: Integer;
begin
Items.Clear;
Values.LoadFromFile(Filename);
for i := 0 to Values.Count - 1 do
begin
Items.Add(Values.Names[i]);
end;
ItemIndex :
= 0;
end;

procedure TComboBox.LoadFromRes(ResName: string);
var
stream: TResourceStream;
i: Integer;
begin
stream :
= TResourceStream.Create(HInstance,'CityCode','TxtData');
Items.Clear;
Values.LoadFromStream(stream);
for i := 0 to Values.Count - 1 do
begin
Items.Add(Values.Names[i]);
end;
ItemIndex :
= 0;
stream.Free;
end;

end.
复制代码


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
用免费的webservice查询天气
用免费的webservice查询天气
10 0
Qt编写自定义控件44-天气仪表盘
一、前言 天气仪表盘控件是所有控件中唯一一个使用了svg矢量图的控件,各种天气图标采用的矢量图,颜色变换采用动态载入svg的内容更改生成的,其实也可以采用图形字体来做,本次控件为了熟悉下svg在Qt中的使用,才采用的svg来绘制。
1302 0
仿12306查询火车票功能
首先感谢http://www.zuidaima.com/share/1861712958622720.html对我的帮助,我在此基础上修改了页面的显示, 先上效果吧 public class SearchTrainController implements X509TrustManager { private static String QUERY_RUL = "https://ky
1223 0
机房收费系统之VB报表
<p> <span style="font-size:32px"><span style="font-family:KaiTi_GB2312">   <span style="font-size:24px; color:#333333"> 简单地说:报表就是用图表、表格等格式来动态显示数据,用一个公式来表示的话,就是“报表 = 多样的格式 + 动态的数据”,报表可以说是企业管理的基本措施
1292 0
010_《Delphi6最佳专辑》
《Delphi6最佳专辑》 Delphi 教程 系列书籍 (010) 《Delphi6最佳专辑》 网友(邦)整理 EMail: shuaihj@163.
1419 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载