PowerBuilder制作Windows托盘程序教程

版权申诉
0 下载量 152 浏览量 更新于2024-10-28 收藏 11KB RAR 举报
资源摘要信息: "pbtray.rar_界面编程_PowerBuilder_" 知识点: 1. PowerBuilder编程语言介绍: PowerBuilder是一种面向对象的、可视化编程工具,它允许开发者通过使用快速应用开发(RAD)来创建数据库驱动的应用程序。PowerBuilder支持多种数据库系统,并且拥有强大的数据窗口对象,允许用户以可视方式操作数据库中的数据。 2. 界面编程概念: 界面编程指的是创建、设计和管理应用程序用户界面的过程。在PowerBuilder中,界面编程主要涉及到窗口(Window)、用户对象(UserObject)、控件(Control)等元素的设计和实现。用户对象是PowerBuilder中定义界面和逻辑的独立组件,可以被重用,并且可以在不同的窗口中使用。 3. Windows托盘程序开发: Windows托盘程序通常指的是位于Windows任务栏的通知区域(也称为系统托盘)的小型程序。这样的程序可以让用户方便地访问系统状态信息或执行常见操作,而不需要打开主应用程序窗口。在PowerBuilder中,可以通过创建一个透明窗口或使用系统API来实现托盘程序。 4. PowerBuilder下托盘程序的实现: 在PowerBuilder环境下,开发一个托盘程序通常需要使用到PowerScript语言,这是一种事件驱动的编程语言。开发者可以利用PowerBuilder提供的系统函数和对象,例如`SystrayIcon`对象,来创建托盘图标并为图标添加鼠标点击事件等交互功能。 5. 托盘图标的创建与管理: 托盘程序通常会有一个图标显示在系统托盘中。在PowerBuilder中,可以通过创建一个`.ico`文件来定义托盘图标的外观。例如,文件列表中的`taskbar.ico`很可能就是程序将要使用的托盘图标。 6. pb环境下编译程序: 编译是将源代码转换为可执行文件的过程。在PowerBuilder中,开发者需要使用PowerBuilder的IDE(集成开发环境)来编译`.pbl`(PowerBuilder库文件)和`.pbt`(PowerBuilder模板文件)。`.pbt`文件是PowerBuilder的可执行文件格式。通过使用`aaa.pbt`或`aa.pbw`这样的编译脚本文件,可以在IDE中设置编译参数和执行编译过程。 7. 示例程序说明: 描述中提到的“示例如何使用PB在Windows任务条上建立一个托盘程序”,表明在pbtray.rar压缩包中的文件包含了一个具体的示例程序,可能包括必要的源代码文件和资源文件。通过学习和运行这个示例,开发者可以掌握如何使用PowerBuilder来创建Windows托盘程序。 8. 压缩包子文件的文件名称列表解读: - `taskbar.ico`:托盘程序图标文件。 - `taskbar.pbl`:包含用户对象、窗口等PowerBuilder资源的库文件。 - `taskbar.pbr`:可能是一个包含预编译资源的库文件,或者是用于PowerBuilder的资源文件。 - `taskbar.pbt`:PowerBuilder模板文件,可能是示例程序的一个组成部分。 - `aaa.pbt`:编译脚本文件,用于指定编译过程中的具体操作。 - `aa.pbw`:编译脚本文件,也用于指定编译过程。 通过学习和实践本压缩包中提供的示例程序,开发者不仅可以掌握PowerBuilder在界面编程中的应用,特别是Windows托盘程序的开发,还可以学习如何管理和编译PowerBuilder项目,这将大大提升开发PowerBuilder应用程序的能力。

class AbstractGreedyAndPrune(): def __init__(self, aoi: AoI, uavs_tours: dict, max_rounds: int, debug: bool = True): self.aoi = aoi self.max_rounds = max_rounds self.debug = debug self.graph = aoi.graph self.nnodes = self.aoi.n_targets self.uavs = list(uavs_tours.keys()) self.nuavs = len(self.uavs) self.uavs_tours = {i: uavs_tours[self.uavs[i]] for i in range(self.nuavs)} self.__check_depots() self.reachable_points = self.__reachable_points() def __pruning(self, mr_solution: MultiRoundSolution) -> MultiRoundSolution: return utility.pruning_multiroundsolution(mr_solution) def solution(self) -> MultiRoundSolution: mrs_builder = MultiRoundSolutionBuilder(self.aoi) for uav in self.uavs: mrs_builder.add_drone(uav) residual_ntours_to_assign = {i : self.max_rounds for i in range(self.nuavs)} tour_to_assign = self.max_rounds * self.nuavs visited_points = set() while not self.greedy_stop_condition(visited_points, tour_to_assign): itd_uav, ind_tour = self.local_optimal_choice(visited_points, residual_ntours_to_assign) residual_ntours_to_assign[itd_uav] -= 1 tour_to_assign -= 1 opt_tour = self.uavs_tours[itd_uav][ind_tour] visited_points |= set(opt_tour.targets_indexes) # update visited points mrs_builder.append_tour(self.uavs[itd_uav], opt_tour) return self.__pruning(mrs_builder.build()) class CumulativeGreedyCoverage(AbstractGreedyAndPrune): choice_dict = {} for ind_uav in range(self.nuavs): uav_residual_rounds = residual_ntours_to_assign[ind_uav] if uav_residual_rounds > 0: uav_tours = self.uavs_tours[ind_uav] for ind_tour in range(len(uav_tours)): tour = uav_tours[ind_tour] quality_tour = self.evaluate_tour(tour, uav_residual_rounds, visited_points) choice_dict[quality_tour] = (ind_uav, ind_tour) best_value = max(choice_dict, key=int) return choice_dict[best_value] def evaluate_tour(self, tour : Tour, round_count : int, visited_points : set): new_points = (set(tour.targets_indexes) - visited_points) return round_count * len(new_points) 如何改写上述程序,使其能返回所有已经探索过的目标点visited_points的数量,请用代码表示

2023-06-10 上传