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

news2025/9/19 0:35:58

一、序言

初步看了看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.MSG
        CASE %WM_INITDIALOG
            ' Initialization handler

        CASE %WM_NCACTIVATE
            STATIC hWndSaveFocus AS DWORD
            IF ISFALSE CB.WPARAM THEN
                ' Save control focus
                hWndSaveFocus = GetFocus()
            ELSEIF hWndSaveFocus THEN
                ' Restore control focus
                SetFocus(hWndSaveFocus)
                hWndSaveFocus = 0
            END IF

        CASE %WM_COMMAND
            ' Process control notifications
            SELECT CASE AS LONG CB.CTL
                CASE %IDC_TEXTBOX1

                CASE %IDC_TEXTBOX2

                CASE %IDC_TEXTBOX3

                CASE %IDC_TEXTBOX4

                CASE %IDC_TEXTBOX5

                CASE %IDC_BUTTON1
                    IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
                        MSGBOX "%IDC_BUTTON1=" + FORMAT$(%IDC_BUTTON1), _
                            %MB_TASKMODAL
                    END IF

            END SELECT
    END SELECT
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Dialogs **
'------------------------------------------------------------------------------
FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG
    LOCAL lRslt AS LONG

#PBFORMS BEGIN DIALOG %IDD_DIALOG1->->
    LOCAL hDlg  AS DWORD

    DIALOG 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 hDlg
    CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX1, "TextBox1", 40, 25, 70, 15
    CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX2, "TextBox2", 40, 55, 105, 15
    CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX3, "TextBox3", 40, 75, 105, 15
    CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX4, "TextBox4", 40, 95, 105, 15
    CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX5, "TextBox5", 40, 115, 105, 15
    CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON1, "Button1", 40, 145, 60, 15
#PBFORMS END DIALOG

    DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt

#PBFORMS BEGIN CLEANUP %IDD_DIALOG1
#PBFORMS END CLEANUP

    FUNCTION = 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 = 1

INTERFACE IPRIME $IID_IPRIME

   INHERIT IAutomation

   ' =====================================================================================
   METHOD ADDNUMBERS1 ( _                               ' VTable offset = 12
     BYVAL 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 = 16
     BYVAL 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 Array
                                   hWndForm         As Dword, _  ' handle of Form
                                   hWndControl      As Dword, _  ' handle of Control
                                   idButtonControl  As Long   _  ' identifier of button
                                   ) As Long
                                   
                                   FF_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 Form
                         ByVal UserData As Long _  ' optional user defined Long value
                         ) As Long

    Local nScreenX As Long, nScreenY As Long
    Local nfrmMainWidth As Long, nfrmMainHeight As Long  
    Local LanID As String      

    Local hWndDeskTop As Dword 
    hWndDesktop = GetDesktopWindow()                                                            '%HWND_DESKTOP
    
    LanID = "FF"    'PB for powerbasic statements, and FF for FireFly statements
    
    If LanID = "PB" Then
        Desktop Get Size To nScreenX, nScreenY                                                  'Get screen size
        Dialog Get Size hWndForm To nfrmMainWidth, nfrmMainHeight                               'Get frmMain size
        Dialog Set LoC hWndForm, (nScreenX - nfrmMainWidth)/2, (nScreenY - nfrmMainHeight)/2    'Center frmMain
    Else    
        FF_Control_GetSize hWndDesktop, nScreenX, nScreenY                                      '%HWND_DESKTOP = hWndDesktop = 0
        FF_Control_GetSize hWndForm, nfrmMainWidth, nfrmMainHeight
        FF_Control_SetLoc hWndForm, (nScreenX - nfrmMainWidth)/2, (nScreenY - nfrmMainHeight)/2
    End 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 Array
                                     hWndForm         As Dword, _  ' handle of Form
                                     hWndControl      As Dword, _  ' handle of Control
                                     idButtonControl  As Long   _  ' identifier of button
                                     ) As Long


    Local Glossary As IPRIME
    Let Glossary = NewCom $PROGID_MATHCLASS

    'If IsFalse(IsObject(Glossary)) Then Exit Function
    
    If IsObject(Glossary) Then
        Local iParam1 As Integer
        Local iParam2 As Integer
        Local lReturn As Long
        iParam1 = 3: iParam2 = 5
        
        'Method using Property GET
        Glossary.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 If
        
End 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 EVENT
  INHERIT IAUTOMATION

  METHOD 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 COM
  INTERFACE IPrime GUID$("{19C9E340-205F-4AA6-A58F-A62179D0E26B}")
    INHERIT IUNKNOWN

    METHOD AddNumbers1(BYVAL Num1 AS INTEGER, BYVAL Num2 AS INTEGER, BYREF lReturn AS LONG)
        lReturn = Num1 + Num2
    END METHOD

    PROPERTY GET AddNumbers(BYVAL Num1 AS INTEGER, BYVAL Num2 AS INTEGER, BYREF lReturn AS LONG) AS LONG
        lReturn = Num1 + Num2
    END 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 LONG
      LOCAL w AS LONG
      LOCAL h AS LONG
      LOCAL i AS LONG
      LOCAL k AS WSTRING

      IF n < 2 THEN
        ' Any value less than two is not a prime number
        PROPERTY = 0
        EXIT PROPERTY
      ELSEIF n = 2 THEN
        ' Two is a prime number
        PROPERTY = 1
        EXIT PROPERTY
      END IF

      ' Test the value and see if the value can be divided
      ' by any number between two and the value minus 1
      FOR i = 2 TO n-1
        IF (n MOD i) = 0 THEN
          ' Not a prime number
          PROPERTY = 0
          EXIT PROPERTY
        END IF

        IF (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 VB
          k = "A message from ActiveX component!"
          RAISEEVENT IProgress.sOutString(k)
          RAISEEVENT IProgress.Value(i/n * 100)
        END IF

      NEXT i

      ' The value is a prime number
      PROPERTY = 1

    END PROPERTY

  END INTERFACE

  ' Specify that this class is an event source and sends
  ' events to the IProgress interface
  EVENT SOURCE IProgress

END CLASS

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

运行结果

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UWB学习——day5

旁瓣的控制 在UWB&#xff08;Ultra-Wideband&#xff0c;超宽带&#xff09;通信系统中&#xff0c;对主瓣和旁瓣进行控制和优化是重要的&#xff0c;因为这直接影响了信号的传输质量、抗干扰性和系统性能。 旁瓣出现的原因 频谱泄露&#xff0c;根据傅里叶变换原理&#x…

uniapp实时获取当前位置

首先我们需要先下载一个插件&#xff08;高德地图官网插件&#xff09; &#xff08;插件主要作用是获取当前地理定位或者是自身的位置&#xff0c;并且可以返回名称name&#xff09; 相关下载-微信小程序插件 | 高德地图API (amap.com)https://developer.amap.com/api/wx/do…

旅游出行类APP如何找到策略优势,最大化流量红利

刚刚结束了暑期出游&#xff0c;中秋国庆小长假马上到啦&#xff0c;出行计划又要安排起来了&#xff01;多样化的出行方式为大家旅行带来极大的便利&#xff0c;同时&#xff0c;伴随互联网模式的深化发展&#xff0c;各式各样的旅游出行类APP已经成长为旅行用户所依赖的一类工…

【LeetCode热题100】--128. 最长连续序列

128.最长连续序列 先对数组进行排序&#xff0c;不断尝试x1,x2,…是否存在&#xff0c;不断枚举并更新答案 class Solution {public int longestConsecutive(int[] nums) {if (nums null || nums.length 0){return 0;}Arrays.sort(nums);int maxLength 1,current 1;for(in…

LVM分区空间扩充

老早之前自己整理的&#xff0c;今天有同事问起&#xff0c;再整理一下发出来。 LVM的全称为Logical Volume Manager&#xff0c;它是Linux环境下对磁盘分区进行管理的一种机制&#xff0c;LVM是建立在硬盘和分区之上的一个逻辑层&#xff0c;来提高磁盘分区管理的灵活…

MySQL: 锁

一、table CREATE TABLE dog (id int(11) NOT NULL AUTO_INCREMENT,age int(11) DEFAULT NULL,weight int(11) DEFAULT NULL,PRIMARY KEY (id),KEY idx_age (age) ) ENGINEInnoDB AUTO_INCREMENT51 DEFAULT CHARSETutf8二、插入数据&#xff1a; 三、主键上锁的测试&#xff…

C++中的四种类型转换运算符

隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有表明存在什么风险,风险程度如何。 再者,C风格的强制类型转换统一使用( ),…

linux上mysql数据备份(全量备份策略+增量备份策略)

执行备份策略前&#xff0c;先做好scp命令的准备 解决思路&#xff1a; 生成SSH公钥/私钥后&#xff0c;您需要将公钥添加到服务器上&#xff0c;从而使服务器可以使用该公钥来验证您的身份。 生成SSH公钥/私钥的命令为 ssh-keygen -t rsa -b 4096什么都不用输入&#xff0c…

用于无功补偿的固定电容晶闸管控制反应器研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

已解决 (org.springframework.beans.factory.BeanCreationException)

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

vue模板语法(下集)

事件处理器 Vue模板语法中的事件处理器是指在Vue组件中绑定DOM事件&#xff0c;当事件发生时执行相应的方法或表达式。常见的事件包括点击事件click、输入事件input、鼠标移入事件mouseover等等。 事件监听可以使用v-on 指令 2.1 事件修饰符 .Vue通过由点(.)表示的指令后缀来调…

近2万签名的句子网络签名ACCESS\EXCEL数据库

虽然已经有《24万QQ伤感签名论坛签名ACCESS数据库》和《2万多条QQ签名论坛签名大全ACCESS数据库》两个论坛签名数据&#xff0c;但是总觉得今天更正经一些&#xff0c;每个句子都可以当作一个好词好句。 分类包含&#xff1a;爱情诗&#xff08;2315&#xff09;、超级拽&#…

IMX6ULL ARM Linux开发板SD卡启动,SD卡的分区与分区格式化创建

一、确定TF卡挂载到ubuntu上的设备名称及分区情况 1. 在ubuntu不接入TF卡的情况下&#xff0c; 使用df -lh /dev/sd*命令查看当前"/dev/sd开头"的设备。 ##输入df -lh /dev/sd*命令&#xff0c;敲回车键 ~$ df -lh /dev/sd* 2.将TF卡接入到ubuntu&#xff0c;再次使…

Compose的一些小Tips - 可组合项的绘制

系列文章 Compose的一些小Tips - 可组合项的生命周期 Compose的一些小Tips - 可组合项的绘制&#xff08;本文&#xff09; Compose的一些小Tips - 列表的优化 前言 本系列介绍Compose的一些常识&#xff0c;了解这些tips并不会让人摇身一变成为大佬&#xff0c;但可以帮助到…

大数据Flink(八十四):SQL语法的DML:窗口聚合

文章目录 SQL语法的DML:窗口聚合 一、滚动窗口(TUMBLE)

R 语言画图中英文字体解决方案

在某些时候&#xff0c;需要在 R 画图中添加中文&#xff0c;但是默认情况下&#xff0c;R 对中文的支持不好。这里推荐一个 showtext 的 R 包。如果需要将含有中文字体的图形保存为 pdf 文件&#xff0c;可以使用下面讲到的方案&#xff0c;最新版的showtext已经支持了 ggplot…

6.1 使用scikit-learn构建模型

6.1 使用scikit-learn构建模型 6.1.1 使用sklearn转换器处理数据6.1.2 将数据集划分为训练集和测试集6.1.3 使用sklearn转换器进行数据预处理与降维1、数据预处理2、PCA降维算法 代码 scikit-learn&#xff08;简称sklearn&#xff09;库整合了多种机器学习算法&#xff0c;可以…

已解决 Bug: SyntaxError - expected expression, got ‘<‘

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

C# ref 学习1

ref 关键字用在四种不同的上下文中&#xff1b; 1.在方法签名和方法调用中&#xff0c;按引用将参数传递给方法。 2.在方法签名中&#xff0c;按引用将值返回给调用方。 3.在成员正文中&#xff0c;指示引用返回值是否作为调用方欲修改的引用被存储在本地&#xff0c;或在一般…

React 全栈体系(十)

第五章 React 路由 三、基本路由使用 7. 代码 - Switch 的使用 7.1 Test /* src/pages/Test/index.jsx */ import React, { Component } from reactexport default class Test extends Component {render() {return (<div><h2>Test....</h2></div>…