一步一步学习使用LiveBindings()TListView进阶使用(),打造天气预报程序
一步一步学习使用LiveBindings与TListView进阶使用打造天气预报程序在Delphi开发中LiveBindings实时绑定是一种强大的数据绑定技术它能将UI组件与数据源动态关联实现界面与数据的自动同步。而TListView作为常用的列表控件结合LiveBindings可以高效展示复杂数据。本文将通过一个天气预报程序的实际案例演示LiveBindings与TListView的进阶用法。## 项目设计与数据模型我们将构建一个天气预报应用能够显示未来5天的天气信息包括日期、天气状况、温度和风力。首先定义数据模型。pascal// 定义天气预报数据类type TWeatherData class private FDate: string; FWeather: string; FTemperature: string; FWind: string; FCity: string; published property Date: string read FDate write FDate; property Weather: string read FWeather write FWeather; property Temperature: string read FTemperature write FTemperature; property Wind: string read FWind write FWind; property City: string read FCity write FCity; end;// 定义数据容器支持LiveBindingstype TWeatherList class private FList: TObjectListTWeatherData; public constructor Create; destructor Destroy; override; property Items: TObjectListTWeatherData read FList; end;## 创建LiveBindings绑定环境要实现LiveBindings需要引入System.Bindings.Helper和Data.Bind.Components单元。我们通过一个TBindSourceDB或TPrototypeBindSource作为数据源。pascal// 初始化绑定源和ListViewprocedure TForm1.FormCreate(Sender: TObject);begin // 创建天气预报数据 WeatherList : TWeatherList.Create; PopulateWeatherData; // 填充模拟数据 // 设置LiveBindings数据源 BindSourceList1 : TBindSourceDB.Create(Self); // 使用ObjectBindSource适配对象列表 ObjectBindSource1 : TObjectBindSource.Create(Self); ObjectBindSource1.DataObject : WeatherList; ObjectBindSource1.Active : True; // 绑定ListView LinkListControlToField1 : TLinkListControlToField.Create(Self); LinkListControlToField1.DataSource : ObjectBindSource1; LinkListControlToField1.Control : ListView1; LinkListControlToField1.Active : True; // 配置字段映射 with LinkListControlToField1 do begin // 添加字段绑定ListView的每个Item显示Date和Temperature with AddField(Date, Date) do begin DisplayWidth : 50; Text : 日期; end; with AddField(Temperature, Temperature) do begin DisplayWidth : 50; Text : 温度; end; with AddField(Weather, Weather) do begin DisplayWidth : 80; Text : 天气; end; with AddField(Wind, Wind) do begin DisplayWidth : 60; Text : 风力; end; end;end;## 填充模拟天气数据为了演示我们创建一个函数生成模拟的5天天气预报。pascal// 填充天气预报数据procedure TForm1.PopulateWeatherData;var i: Integer; WeatherData: TWeatherData; WeatherTypes: array[0..4] of string (晴, 多云, 小雨, 阴天, 雪);begin WeatherList.Items.Clear; for i : 1 to 5 do begin WeatherData : TWeatherData.Create; WeatherData.Date : FormatDateTime(yyyy-mm-dd, Now i); WeatherData.Weather : WeatherTypes[Random(5)]; WeatherData.Temperature : IntToStr(Random(25) 5) °C; WeatherData.Wind : IntToStr(Random(4) 1) 级; WeatherData.City : 北京; WeatherList.Items.Add(WeatherData); end;end;## 高级功能动态更新与样式定制LiveBindings支持实时数据更新。当数据源变化时ListView自动刷新。我们还可以定制ListView的显示样式例如添加天气图标。pascal// 动态更新天气数据模拟API调用procedure TForm1.ButtonRefreshClick(Sender: TObject);begin // 清空并重新生成数据 PopulateWeatherData; // 通知绑定系统数据已变化 ObjectBindSource1.Reset;end;// 定制ListView Item显示样式procedure TForm1.ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem);var WeatherText: string;begin // 获取当前Item绑定的数据 WeatherText : AItem.Data[Weather].AsString; // 根据天气设置图标 if WeatherText 晴 then AItem.ImageIndex : 0 else if WeatherText 多云 then AItem.ImageIndex : 1 else if WeatherText 小雨 then AItem.ImageIndex : 2 else if WeatherText 阴天 then AItem.ImageIndex : 3 else if WeatherText 雪 then AItem.ImageIndex : 4;end;## 完整代码示例以下是一个完整的程序单元整合了以上所有功能。pascalunit WeatherApp;interfaceuses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListView, FMX.ListView.Types, FMX.ListView.Appearance, FMX.StdCtrls, System.Bindings.Outputs, Data.Bind.EngExt, FMX.Bind.DBEngExt, Data.Bind.Components, Data.Bind.DBScope, System.Rtti, System.Bindings.Helper, FMX.Objects, Data.Bind.ObjectScope;type TForm1 class(TForm) ListView1: TListView; ButtonRefresh: TButton; ObjectBindSource1: TObjectBindSource; LinkListControlToField1: TLinkListControlToField; procedure FormCreate(Sender: TObject); procedure ButtonRefreshClick(Sender: TObject); procedure ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem); private FWeatherList: TObjectListTWeatherData; procedure PopulateWeatherData; public property WeatherList: TObjectListTWeatherData read FWeatherList; end;var Form1: TForm1;implementation{$R *.fmx}{ TWeatherData }type TWeatherData class private FDate: string; FWeather: string; FTemperature: string; FWind: string; FCity: string; published property Date: string read FDate write FDate; property Weather: string read FWeather write FWeather; property Temperature: string read FTemperature write FTemperature; property Wind: string read FWind write FWind; property City: string read FCity write FCity; end;procedure TForm1.FormCreate(Sender: TObject);begin FWeatherList : TObjectListTWeatherData.Create(True); PopulateWeatherData; // 配置ObjectBindSource ObjectBindSource1.DataObject : FWeatherList; ObjectBindSource1.Active : True; // 配置ListView绑定 LinkListControlToField1.DataSource : ObjectBindSource1; LinkListControlToField1.Control : ListView1; LinkListControlToField1.Active : True; // 添加字段 with LinkListControlToField1 do begin with AddField(Date, Date) do begin DisplayWidth : 50; Text : 日期; end; with AddField(Temperature, Temperature) do begin DisplayWidth : 50; Text : 温度; end; with AddField(Weather, Weather) do begin DisplayWidth : 80; Text : 天气; end; with AddField(Wind, Wind) do begin DisplayWidth : 60; Text : 风力; end; end;end;procedure TForm1.PopulateWeatherData;var i: Integer; Weather: TWeatherData; WeatherTypes: array[0..4] of string (晴, 多云, 小雨, 阴天, 雪);begin FWeatherList.Clear; for i : 1 to 5 do begin Weather : TWeatherData.Create; Weather.Date : FormatDateTime(yyyy-mm-dd, Now i); Weather.Weather : WeatherTypes[Random(5)]; Weather.Temperature : IntToStr(Random(25) 5) °C; Weather.Wind : IntToStr(Random(4) 1) 级; Weather.City : 北京; FWeatherList.Add(Weather); end;end;procedure TForm1.ButtonRefreshClick(Sender: TObject);begin PopulateWeatherData; ObjectBindSource1.Reset; // 通知绑定系统数据变化end;procedure TForm1.ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem);var WeatherText: string;begin WeatherText : AItem.Data[Weather].AsString; if WeatherText 晴 then AItem.ImageIndex : 0 else if WeatherText 多云 then AItem.ImageIndex : 1 else if WeatherText 小雨 then AItem.ImageIndex : 2 else if WeatherText 阴天 then AItem.ImageIndex : 3 else if WeatherText 雪 then AItem.ImageIndex : 4;end;end.## 运行效果与调试技巧运行程序后ListView将显示5行天气预报数据。点击刷新按钮数据会随机更新ListView自动同步。通过ListView1UpdateObjects事件我们可以根据天气状态动态切换图标增强用户体验。调试时可使用ObjectBindSource1.Reset强制刷新绑定确保数据同步。若字段绑定失败检查published属性是否正确声明。## 总结通过本文的天气预报程序示例我们深入学习了LiveBindings与TListView的进阶用法。LiveBindings的核心优势在于1.自动同步数据源变化后UI自动更新无需手动操作。2.灵活映射支持多字段绑定可定制显示宽度和标签。3.动态样式通过事件处理可以定制Item的图标、颜色等。在实际开发中LiveBindings适用于需要频繁更新数据的场景如实时监控、数据仪表盘等。掌握这些技术后你可以轻松构建数据驱动的动态界面提升开发效率和应用交互体验。

相关新闻

工程人必看!单曲异形双曲铝单板工装选材不踩坑

工程人必看!单曲异形双曲铝单板工装选材不踩坑

高端工装建筑的高级感,从来不是堆砌材料,而是造型与质感的完美落地。在高端公建、地标项目等高端工装场景中,单曲、异形、双曲铝单板各有千秋。单曲铝单板,拥有简约流畅的单弧度美学,是工装百搭款。它适配大多数中端公…

2026/10/3 10:55:52 阅读更多 →
一文了解性能测试常见的指标

一文了解性能测试常见的指标

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、什么是性能测试性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。我们可以认为性能测试是:…

2026/9/27 22:32:18 阅读更多 →
终极指南:免费解锁百度网盘macOS版SVIP加速功能完整教程

终极指南:免费解锁百度网盘macOS版SVIP加速功能完整教程

终极指南:免费解锁百度网盘macOS版SVIP加速功能完整教程 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版下载速度慢如…

2026/9/28 6:58:25 阅读更多 →

最新新闻

Qwen团队变动后开发者指南:部署微调与API接入全攻略

Qwen团队变动后开发者指南:部署微调与API接入全攻略

你的技术群里有没有被同一条消息刷屏?说的是Qwen技术负责人和多名核心团队成员离职。这件事我听到的时候第一反应是去翻官方公告,结果没看到正式说明,倒是各种猜测已传得满天飞。今天不聊八卦,从一个天天拿Qwen做项目的开发者的角…

2026/10/3 10:54:53 阅读更多 →
Oracle数据卸载模板:Shell脚本编排与SQL执行实践

Oracle数据卸载模板:Shell脚本编排与SQL执行实践

简介:这是一份面向数据仓库与ETL开发人员的Oracle数据卸载Shell脚本模板,适合需要将库内数据按批次导出为文本并完成后续传输的运维与开发场景。使用者只需在SQL模板文件中填写待卸载的查询语句,并在文件名配置中指定对应输出名称&#xff0c…

2026/10/3 10:54:53 阅读更多 →
Oracle数据模板卸载脚本实战:shell驱动sqlplus的避坑指南

Oracle数据模板卸载脚本实战:shell驱动sqlplus的避坑指南

简介:这份资源是一套面向数据仓库与ETL开发人员的Oracle数据卸载Shell脚本模板,适合需要将库内数据按批次导出为文本文件并完成后续传输的工程师使用。包内共4个文件,包含1个sh主脚本、1个config环境配置、2个txt模板文件,压缩包仅…

2026/10/3 10:54:53 阅读更多 →
Unity资产库工具:从素材混乱到URP转换与植被自动化的流水线

Unity资产库工具:从素材混乱到URP转换与植被自动化的流水线

1. 从素材混乱到资产流水线:我为什么要做这个工具做Unity项目超过三年的人,大概率都经历过同一个噩梦:项目文件夹里躺着十几个来源不同的素材包,有的是Asset Store买的,有的是外包给的,有的是从旧项目里扒出…

2026/10/3 10:54:53 阅读更多 →
Unity内存泄漏实战:事件订阅为何导致GC失效及根治方案

Unity内存泄漏实战:事件订阅为何导致GC失效及根治方案

1. 从一个真实的内存泄漏案例说起 前阵子帮朋友排查一个 Unity 项目,场景是这样的:一个卡牌游戏,战斗界面反复打开关闭,每次关闭再打开,内存就往上蹿一截,打开个二三十次,低端机上直接闪退。朋友…

2026/10/3 10:54:53 阅读更多 →
DRV8818+STM32F469工业级步进电机高精度控制实战

DRV8818+STM32F469工业级步进电机高精度控制实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 10:53:53 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 9:47:50 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →