FireFly PowerBASIC RAD编程,调用PowerBASIC COM对象

一、序言

初步看了看PowerBASIC编程,很类似用VC注册窗体后调用回调函数,先是一个Dialog new,然后添加组件 Control add ......, 然后在处理 Windows MSG和发给组件的消息,这种编程方式和早期DOS 25x80屏幕上编程一样,要自己处理显示内容的位置和区域大小。

PowerBASIC还自带了一个Dlgedit.exe , 它是微软的 Dialog Editor,用于设计窗口和摆放组件。

同时,PowerBASIC带了RC.exe和PBRES.exe用于资源编译,但设计器是16位的,在Win10和Win11上要处理一下才能运行。处理的方法是到github下载 OTVDM,解压到C盘根目录,执行Install向注册表填加16位程序转向即可。安装有OTVDM的计算机,可以安装VB3, VB6, Delphi2, Delphi3, 而且窗口样式和现在的一样,界面倍加美观。

后来,有了PBFORMS,类似Linux上Glade的界面设计器,属性方法框架基本上在上面完成了。

在菜单上,VIEW, DDT 代码, 全部考贝粘到程序代码页,编译就能运行这个框架。

#PBFORMS CREATED V2.01
'------------------------------------------------------------------------------
' The first line in this file is a PB/Forms metastatement.
' It should ALWAYS be the first line of the file. Other
' PB/Forms metastatements are placed at the beginning and
' end of "Named Blocks" of code that should be edited
' with PBForms only. Do not manually edit or delete these
' metastatements or PB/Forms will not be able to reread
' the file correctly.  See the PB/Forms documentation for
' more information.
' Named blocks begin like this:    #PBFORMS BEGIN ...
' Named blocks end like this:      #PBFORMS END ...
' Other PB/Forms metastatements such as:
'     #PBFORMS DECLARATIONS
' are used by PB/Forms to insert additional code.
' Feel free to make changes anywhere else in the file.
'------------------------------------------------------------------------------#COMPILE EXE
#DIM ALL'------------------------------------------------------------------------------
'   ** Includes **
'------------------------------------------------------------------------------
#PBFORMS BEGIN INCLUDES 
#RESOURCE "noname1.pbr"
%USEMACROS = 1
#INCLUDE ONCE "WIN32API.INC"
#INCLUDE ONCE "COMMCTRL.INC"
#INCLUDE ONCE "PBForms.INC"
#PBFORMS END INCLUDES
'------------------------------------------------------------------------------'------------------------------------------------------------------------------
'   ** Constants **
'------------------------------------------------------------------------------
#PBFORMS BEGIN CONSTANTS 
%IDD_DIALOG1  =  101
%IDC_TEXTBOX1 = 1001
%IDC_TEXTBOX2 = 1002
%IDC_TEXTBOX3 = 1003
%IDC_TEXTBOX4 = 1004
%IDC_TEXTBOX5 = 1005
%IDC_BUTTON1  = 1006
%IDR_IMGFILE1 =  102    '*
#PBFORMS END CONSTANTS
'------------------------------------------------------------------------------'------------------------------------------------------------------------------
'   ** Declarations **
'------------------------------------------------------------------------------
DECLARE CALLBACK FUNCTION ShowDIALOG1Proc()
DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG
#PBFORMS DECLARATIONS
'------------------------------------------------------------------------------'------------------------------------------------------------------------------
'   ** Main Application Entry Point **
'------------------------------------------------------------------------------
FUNCTION PBMAIN()PBFormsInitComCtls (%ICC_WIN95_CLASSES OR %ICC_DATE_CLASSES OR _%ICC_INTERNET_CLASSES)ShowDIALOG1 %HWND_DESKTOP
END FUNCTION
'------------------------------------------------------------------------------'------------------------------------------------------------------------------
'   ** CallBacks **
'------------------------------------------------------------------------------
CALLBACK FUNCTION ShowDIALOG1Proc()SELECT CASE AS LONG CB.MSGCASE %WM_INITDIALOG' Initialization handlerCASE %WM_NCACTIVATESTATIC hWndSaveFocus AS DWORDIF ISFALSE CB.WPARAM THEN' Save control focushWndSaveFocus = GetFocus()ELSEIF hWndSaveFocus THEN' Restore control focusSetFocus(hWndSaveFocus)hWndSaveFocus = 0END IFCASE %WM_COMMAND' Process control notificationsSELECT CASE AS LONG CB.CTLCASE %IDC_TEXTBOX1CASE %IDC_TEXTBOX2CASE %IDC_TEXTBOX3CASE %IDC_TEXTBOX4CASE %IDC_TEXTBOX5CASE %IDC_BUTTON1IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THENMSGBOX "%IDC_BUTTON1=" + FORMAT$(%IDC_BUTTON1), _%MB_TASKMODALEND IFEND SELECTEND SELECT
END FUNCTION
'------------------------------------------------------------------------------'------------------------------------------------------------------------------
'   ** Dialogs **
'------------------------------------------------------------------------------
FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONGLOCAL lRslt AS LONG#PBFORMS BEGIN DIALOG %IDD_DIALOG1->->LOCAL hDlg  AS DWORDDIALOG NEW hParent, "Dialog1", 191, 173, 184, 181, %WS_POPUP OR _%WS_BORDER OR %WS_THICKFRAME OR %WS_CAPTION OR %WS_SYSMENU OR _%WS_MINIMIZEBOX OR %WS_MAXIMIZEBOX OR %WS_VISIBLE OR %DS_SYSMODAL OR _%DS_CENTER OR %DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT, _%WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _%WS_EX_RIGHTSCROLLBAR, TO hDlgCONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX1, "TextBox1", 40, 25, 70, 15CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX2, "TextBox2", 40, 55, 105, 15CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX3, "TextBox3", 40, 75, 105, 15CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX4, "TextBox4", 40, 95, 105, 15CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX5, "TextBox5", 40, 115, 105, 15CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON1, "Button1", 40, 145, 60, 15
#PBFORMS END DIALOGDIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt#PBFORMS BEGIN CLEANUP %IDD_DIALOG1
#PBFORMS END CLEANUPFUNCTION = lRslt
END FUNCTION
'------------------------------------------------------------------------------

感觉这些东西挺不错的,代表着一种不同VB6的实现思想。PowerBASIC是32位编译器、没有64位编译器、现在已经停更了,但仍然在一些地方得到应用。PowerBASIC支持多线程,用它编写DLL体积小速度快。后来,又有好事者 FireFly 为它开发了 RAD 。

二、FireFly RAD powerBASIC

控件几十项,代码可以用PowerBASIC原装语句,也可以用它自己的语句,但编译器完全是PowerBASIC的,只是又做了一些封装。

这个习练程序是按如下步骤调用PowerBASIC COM对象的。

用FireFly带的 Type_lib browser 找到已经注册的COM对象

双击找到的COM对象,然后点击菜单上的Code

会自动生成Type library,将它们全部考贝到FireFly RAD中的一个模块中即可。

' ########################################################################################
' Library name: Prime
' Version: 1.0, Locale ID = 0
' Description: Prime
' Documentation string: Prime number detector
' Path: D:\PBASICWIN104\SAMPLES\OBJECTS\VB\PRIME.DLL
' Library GUID: {66098C79-60F3-44F5-B30C-845E1171E87B}
' Code generated by the TypeLib Browser 5.0.0 (c) 2011 by Jos?Roca
' Date: 20 9月 2023   Time: 18:35:24
' Options used to generate the code:
' - Use METHOD and PROPERTY GET/SET statements
' - Use parameter names in interface declarations
' - Use interface names with external objects
' - Include dispatch only interfaces
' - Retrieve license key
' - Use automation view
' ########################################################################################' ========================================================================================
' CoClass name: MATHCLASS
' ========================================================================================
' CLSID (Class identifier): {590B350A-D462-485E-A35C-40FACA1ABC16}
' Attributes: 2 [&H00000002] [Cancreate]
' ProgID (Program identifier): MATHCLASS
' Default interface: IPRIME
' Default interface IID: {19C9E340-205F-4AA6-A58F-A62179D0E26B}
' Default events interface: IPROGRESS
' Default events interface IID: {AB813267-178F-47A0-8EFC-CE0CCB06D359}
' Implemented interfaces:
'  IPRIME (default interface)
'  IPROGRESS (default events interface)
' ========================================================================================' ========================================================================================
' ProgIDs (Program identifiers)
' ========================================================================================' CLSID = {590B350A-D462-485E-A35C-40FACA1ABC16}
$PROGID_MATHCLASS = "MATHCLASS"' ========================================================================================
' ClsIDs (Class identifiers)
' ========================================================================================$CLSID_MATHCLASS = GUID$("{590B350A-D462-485E-A35C-40FACA1ABC16}")' ========================================================================================
' IIDs (Interface identifiers)
' ========================================================================================$IID_IPRIME = GUID$("{19C9E340-205F-4AA6-A58F-A62179D0E26B}")
$IID_IPROGRESS = GUID$("{AB813267-178F-47A0-8EFC-CE0CCB06D359}")' ########################################################################################
' Interface name = IPRIME
' IID = {19C9E340-205F-4AA6-A58F-A62179D0E26B}
' IPRIME is a custom interface for Direct VTable access.
' Attributes = 128 [&H00000080] [Nonextensible]
' Inherited interface = IUnknown
' #########################################################################################IF NOT %DEF(%IPRIME_INTERFACE_DEFINED)%IPRIME_INTERFACE_DEFINED = 1INTERFACE IPRIME $IID_IPRIMEINHERIT IAutomation' =====================================================================================METHOD ADDNUMBERS1 ( _                               ' VTable offset = 12BYVAL NUM1 AS INTEGER _                            ' [in] NUM1 VT_I2 <Integer>, BYVAL NUM2 AS INTEGER _                            ' [in] NUM2 VT_I2 <Integer>, BYREF LRETURN AS LONG _                            ' [in][out] *LRETURN VT_I4 <Long>)                                                    ' void' =====================================================================================PROPERTY GET ADDNUMBERS ( _                          ' VTable offset = 16BYVAL NUM1 AS INTEGER _                            ' [in] NUM1 VT_I2 <Integer>, BYVAL NUM2 AS INTEGER _                            ' [in] NUM2 VT_I2 <Integer>, BYREF IN LRETURN AS LONG _                         ' [in][out] *LRETURN VT_I4 <Long>) AS LONG                                            ' VT_I4 <Long>' =====================================================================================PROPERTY GET ISPRIME ( _                             ' VTable offset = 20) AS LONG                                            ' [in] N VT_I4 <Long>' =====================================================================================END INTERFACE#ENDIF   ' /* __IPRIME_INTERFACE_DEFINED__ */

全部考贝,一个字都不需要更改!

双击frmMAIN上Command1钮,试手操作它左边的Text1文本。在自动生成的框架上加一句:FF_Control_SetText(HWND_FrmMain_TEXT1,"中文" + "and English" ),运行程序后点击Command1,就会在Text1上显示  "中文 and English" 字样。这是在PowerBASIC原有的 Control Set Text hWnd, IDC, text 基础上封装的,调用方法基本上不变,但它们与 Text1.Text = "中文 and English" 是很大不同的。

'--------------------------------------------------------------------------------
Function FRMMAIN_COMMAND1_BN_CLICKED ( _ControlIndex     As Long,  _  ' index in Control ArrayhWndForm         As Dword, _  ' handle of FormhWndControl      As Dword, _  ' handle of ControlidButtonControl  As Long   _  ' identifier of button) As LongFF_Control_SetText(HWND_FrmMain_TEXT1,"中文" + "and English" )
End Function

再来看看一段代码,当程序运行后,将窗体置于屏幕中央。
先得到Desktop的尺寸,然后得到主窗体尺寸,相减后除以2作为窗体的top和left,窗体就在中央位置了。LanID可以是FF,也可以是PB,接着的判断根据FF或FB,决定用PowerBASIC和是FF的封装函数实现。两者样式差不多,实现的功能完全相同。

Function FRMMAIN_WM_CREATE ( _hWndForm As Dword, _      ' handle of FormByVal UserData As Long _  ' optional user defined Long value) As LongLocal nScreenX As Long, nScreenY As LongLocal nfrmMainWidth As Long, nfrmMainHeight As Long  Local LanID As String      Local hWndDeskTop As Dword hWndDesktop = GetDesktopWindow()                                                            '%HWND_DESKTOPLanID = "FF"    'PB for powerbasic statements, and FF for FireFly statementsIf LanID = "PB" ThenDesktop Get Size To nScreenX, nScreenY                                                  'Get screen sizeDialog Get Size hWndForm To nfrmMainWidth, nfrmMainHeight                               'Get frmMain sizeDialog Set LoC hWndForm, (nScreenX - nfrmMainWidth)/2, (nScreenY - nfrmMainHeight)/2    'Center frmMainElse    FF_Control_GetSize hWndDesktop, nScreenX, nScreenY                                      '%HWND_DESKTOP = hWndDesktop = 0FF_Control_GetSize hWndForm, nfrmMainWidth, nfrmMainHeightFF_Control_SetLoc hWndForm, (nScreenX - nfrmMainWidth)/2, (nScreenY - nfrmMainHeight)/2End If     
End Function

最后是调用COM对象代码

IPRIME是Class的实现接口,在Class内部完成。在程序中 Local Glossary As IPRIME,Let Glossary = NewCom $PROGID_MATHCLASS 完成接口对象创建。原COM中用了Property GET和Method两种方式实现了AddNumbers,用Method方法要用 call 调用。参数回传要用 byref, 不能用byval,否则收不到COM的数据。

Function FRMMAIN_COMMAND2_BN_CLICKED ( _ControlIndex     As Long,  _  ' index in Control ArrayhWndForm         As Dword, _  ' handle of FormhWndControl      As Dword, _  ' handle of ControlidButtonControl  As Long   _  ' identifier of button) As LongLocal Glossary As IPRIMELet Glossary = NewCom $PROGID_MATHCLASS'If IsFalse(IsObject(Glossary)) Then Exit FunctionIf IsObject(Glossary) ThenLocal iParam1 As IntegerLocal iParam2 As IntegerLocal lReturn As LongiParam1 = 3: iParam2 = 5'Method using Property GETGlossary.AddNumbers(ByVal iParam1, ByVal iParam2, ByRef lReturn)'Methond using Method routine'Call Glossary.AddNumbers1(ByVal iParam1, ByVal iParam2, ByRef lReturn)FF_Control_SetText(HWND_FrmMain_TEXT2, Format$(lReturn))Glossary = Nothing        End IfEnd Function

三、Prime COM对象代码

主要函数一个是method方式,一个是property get方式

'------------------------------------------------------------------------------
'
'  PowerBASIC COM Server and Visual Basic 6 client example
'  Copyright (c) 2009-2011 PowerBASIC, Inc.
'  All Rights Reserved.
'
'  Be sure to register the COM Server (prime.dll) before
'  using it in a Visual Basic application!
'
'  See the ReadMe.txt file!
'
'------------------------------------------------------------------------------#COMPILE DLL
#DIM ALL' Include the Type Library file as a resource file in the DLL
#RESOURCE TYPELIB, 1, "prime.tlb"' The #COM DOC statement sets the description of this server Visual
' Basic does not display the servers name in it's project references
' dialog box, it only displays the description.
#COM DOC  "Prime number detector" ' Description of the server
#COM NAME "Prime", 1.0            ' Server name and version number
#COM TLIB ON                      ' Generate a type library file' Event Interface definition. This is required so that the event interface
' is saved in the type library file and so that VB knows how to receive the events.
INTERFACE IProgress GUID$("{AB813267-178F-47A0-8EFC-CE0CCB06D359}") AS EVENTINHERIT IAUTOMATIONMETHOD sOutString(BYVAL p AS WSTRING)METHOD Value(BYVAL p AS LONG)
END INTERFACE' MathClass that conatins the IPrime interface
CLASS MathClass GUID$("{590B350A-D462-485E-A35C-40FACA1ABC16}") AS COMINTERFACE IPrime GUID$("{19C9E340-205F-4AA6-A58F-A62179D0E26B}")INHERIT IUNKNOWNMETHOD AddNumbers1(BYVAL Num1 AS INTEGER, BYVAL Num2 AS INTEGER, BYREF lReturn AS LONG)lReturn = Num1 + Num2END METHODPROPERTY GET AddNumbers(BYVAL Num1 AS INTEGER, BYVAL Num2 AS INTEGER, BYREF lReturn AS LONG) AS LONGlReturn = Num1 + Num2END PROPERTY' While not the fastest way to determine if a number is prime,' it is good for an sample server with an event.PROPERTY GET IsPrime(BYVAL n AS LONG) AS LONGLOCAL w AS LONGLOCAL h AS LONGLOCAL i AS LONGLOCAL k AS WSTRINGIF n < 2 THEN' Any value less than two is not a prime numberPROPERTY = 0EXIT PROPERTYELSEIF n = 2 THEN' Two is a prime numberPROPERTY = 1EXIT PROPERTYEND IF' Test the value and see if the value can be divided' by any number between two and the value minus 1FOR i = 2 TO n-1IF (n MOD i) = 0 THEN' Not a prime numberPROPERTY = 0EXIT PROPERTYEND IFIF (i MOD 300) = 0 THEN' Call the event handler and inform it of our progress' This is the Sub prime_Value(ByVal p As Long) routine in VBk = "A message from ActiveX component!"RAISEEVENT IProgress.sOutString(k)RAISEEVENT IProgress.Value(i/n * 100)END IFNEXT i' The value is a prime numberPROPERTY = 1END PROPERTYEND INTERFACE' Specify that this class is an event source and sends' events to the IProgress interfaceEVENT SOURCE IProgressEND CLASS

代码是在原Prime基础上修改的,另外做了Event接口提供两个 Event, 在VB6上使用的话可以自加 vbPrime_Value和vbPrime_sOutString函数,COM对象会按条件要求自动触发VB6相应的功能。

运行结果

习练至此,其它功能没练,调用webservice和socket至少可以通过DLL封装实现,因此,感觉这套基于PowerBASIC的RAD开发环境做简单应用开发是可行的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/137117.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1千听歌猜歌名疯狂猜歌ACCESS\EXCEL数据库

就是从今年开始&#xff0c;各类的“猜”游戏开始火爆&#xff0c;先是猜图&#xff0c;比如看图猜明星、看图猜成语、看图猜电影、看图猜电视剧、看图猜背景、看图猜游戏、看图猜影视人物、看图猜景点等。然后又开始猜音频&#xff0c;猜音频最多的是歌。甚至现在的《一站到底…

Python 数据分析学习路线

Python 数据分析学习路线 第一阶段&#xff1a;Python语言基础第二阶段&#xff1a;数据采集和持久化第三阶段&#xff1a;数据分析第四阶段&#xff1a;数据挖掘与机器学习书籍介绍参与方式 第一阶段&#xff1a;Python语言基础 在学习数据分析之前&#xff0c;首先需要掌握P…

探究Nginx应用场景

1 静态资源 Nginx是一个流行的Web服务器和反向代理服务器&#xff0c;它可以用于托管静态资源。下面是一个简单的案例&#xff0c;展示了如何使用Nginx来提供静态资源。 假设你有一个名为example.com的域名&#xff0c;并且你希望使用Nginx来托管位于/var/www/html目录下的静…

知名IT网站博客园陷入绝境

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 博客园陷入生死存亡的绝境。 5月份知名IT开发者网站发布文章称“博客园网站遇到困难了&#xff1a;寻求捐助”&#xff0c;并开通了捐助渠道。4个月过去了&#xff0c;好像效果并不明显&#xff…

毕业设计|基于stm32单片机的app视频遥控抽水灭火小车设计

基于stm32单片机的app视频遥控抽水灭火水泵小车设计 1、项目简介1.1 系统构成1.2 系统功能 2、部分电路设计2.1 L298N电机驱动电路设计2.2 继电器控制电路设计 3、部分代码展示3.1 小车控制代码3.1 水泵控制代码 4 演示视频及代码资料获取 1、项目简介 视频简介中包含资料http…

iOS 17中的Safari配置文件改变了游戏规则,那么如何设置呢

Safari在iOS 17中最大的升级是浏览配置文件——能够在一个应用程序中创建单独的选项卡和书签组。这些也可以跟随你的iPad和Mac&#xff0c;但在本指南中&#xff0c;我们将向你展示如何使用运行iOS 17的iPhone。 你可能有点困惑&#xff0c;为什么Safari中没有明显的位置可以添…

TouchGFX之自定义控件

在创建应用时&#xff0c;您可能需要TouchGFX中没有包含的控件。在创建应用时&#xff0c;您可能需要TouchGFX中没有包含的控件。但有时此法并不够用&#xff0c;当您需要全面控制帧缓冲时&#xff0c;您需要使用自定义控件法。 TouchGFX Designer目前不支持自定义控件的创建。…

晚上弱光拍照不够清晰,学会这几招画面清晰效果好

很多小伙伴喜欢夜晚拍摄&#xff0c;然而拍摄出来的照片经常画面偏暗甚至模糊不清&#xff0c;这是怎么回事&#xff1f; 弱光环境是很多人都比较头疼的拍摄场合&#xff0c;由于光线弱曝光不好把控&#xff0c;并且还很容易出现细节性问题&#xff0c;想要将照片拍好就非常不…

Cannot read properties of null bug解决方法

项目场景&#xff1a; vue3element plusts。 问题描述 本地运行没有任何错误&#xff0c;在生产环境中&#xff0c;当点击按钮&#xff0c;展示el-dialog时第一次正常&#xff0c;关闭时报错 原因分析&#xff1a; 定位到el-dialog组件&#xff0c;最初认为是dialog中table依…

IPO解读丨Arm破解市场质疑的答案,仍在AI中?

时隔7年&#xff0c;移动设备芯片领域霸主Arm重回二级市场。IPO进程的推进&#xff0c;让这家全球芯片行业的基石公司&#xff0c;不得不面对来自市场的全方位的密集审视。 而从股价来看&#xff0c;投资者对于Arm的态度始终处于摇摆中&#xff0c;从上市首日股价大涨25%&…

黑马JVM总结(七)

&#xff08;1&#xff09;StringTable_编译器优化 “a”“b”对应#4&#xff1a;是去常量池中找ab的这个符号 astore 5&#xff1a;是把这个存入编号为5的局部变量 “ab”对应的指令 #4&#xff0c;跟“a”“b”对应#4下面弄是一样的 在执行s3“ab”这行个代码时&#xf…

全网最详细的自动化测试(Jenkins 篇)

学习 Jenkins 自动化测试的系列文章 Robot Framework 概念Robot Framework 安装Pycharm Robot Framework 环境搭建Robot Framework 介绍Jenkins 自动化测试 1. Robot Framework 概念 Robot Framework是一个基于Python的&#xff0c;可扩展的关键字驱动的自动化测试框架。 …

Shiro 框架基本使用

文章目录 Shiro框架介绍Shiro 基本使用SimpleAccountRealmIniRealmJdbcRealmCustomRealm&#xff08;自定义Realm&#xff09; Shiro框架介绍 Apache Shiro是一个强大且易用的Java安全框架&#xff0c;它执行身份验证、授权、密码和会话管理。Shiro框架通过其三个核心组件&…

微服务是个坏主意吗?

曾几何时&#xff0c;我记得我的手指疯狂地敲打键盘&#xff0c;与庞大而杂乱的代码库搏斗。那是巨石的时代&#xff0c;代码就像古老的城堡一样&#xff0c;由一块块石头砌成一个令人印象深刻的庞然大物。 几年过去了&#xff0c;时代变了。开发人员口中的流行语变成了“微服…

Eclipse如何打开debug变量窗口

今天笔者在使用Eclipse调试的时候&#xff0c;发现没有变量&#xff08;Variables&#xff09;监视窗口&#xff0c;真是头痛得很&#xff0c;最后摸索出一套显示变量窗口的操作如下&#xff1a; 点击other&#xff0c;找到Variables并点击 最后调试代码&#xff0c;调试后如图…

【小知识送书2】从不了解用户画像,到用画像数据赋能业务看这一本书就够了丨《用户画像:平台构建与业务实践》

⭐简单说两句⭐ 作者&#xff1a;后端小知识 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 简单说两句 &#x1f381;本次送书1~3本取决于阅读量&#xff0c;阅…

springboot整合aop,实现日志操作

前言&#xff1a; 整合之前&#xff0c;我们要明白aop是什么&#xff0c;为什么要用aop&#xff0c;aop能帮我们做什么。 答&#xff1a;AOP是面向切面编程&#xff08;Aspect-Oriented Programming&#xff09;的简称&#xff0c;它是一种编程思想&#xff0c;旨在在面向对象…

虹科方案 | LIN/CAN总线汽车零部件测试方案

文章目录 摘要一、汽车零部件测试的重要性&#xff1f;二、虹科的测试仿真工具如何在汽车零部件测试展露头角&#xff1f;三、应用场景**应用场景1&#xff1a;方向盘开关的功能测试****应用场景2&#xff1a;各类型电机的控制测试****应用场景3&#xff1a;RGB氛围灯的功能测试…

win系统环境搭建(六)——Windows安装nginx

windows环境搭建专栏&#x1f517;点击跳转 win系统环境搭建&#xff08;六&#xff09;——Windows安装nginx 本系列windows环境搭建开始讲解如何给win系统搭建环境&#xff0c;本人所用系统是腾讯云服务器的Windows Server 2022&#xff0c;你可以理解成就是你用的windows10…

建立表使用约束

1.建立表 二、使用约束 1.NOT NULL 非空约束&#xff0c;规定某个字段不能为空&#xff0c;NOT NULL 约束强制列不接受 NULL 值。 NOT NULL 约束强制字段始终包含值。这意味着&#xff0c;如果不向字段添加值&#xff0c;就无法插入新记录或者更新记录。下面的 SQL 强制表&qu…