From 06778fde57d3760f2ef380260308ac8af1db7436 Mon Sep 17 00:00:00 2001 From: Kuba Sunderland-Ober Date: Wed, 3 Jun 2026 21:39:18 +0200 Subject: [PATCH 1/9] Ignore the upcoming indexer package repository. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8ea362a8..270d0bee 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ node_modules/ /before/ /after-*/ /findoverflow-baseline/ +indexer/.packages/ From 58a5e1cf24fa85650e10d68252740fd868f39d96 Mon Sep 17 00:00:00 2001 From: Kuba Sunderland-Ober Date: Wed, 3 Jun 2026 22:00:51 +0200 Subject: [PATCH 2/9] Reorganize the packages with anticipation of contributed packages. --- docs/Reference/Built-In.md | 21 ++++++++++++++++ docs/Reference/{ => Built-In}/Assert/Exact.md | 0 .../{ => Built-In}/Assert/Permissive.md | 0 .../Reference/{ => Built-In}/Assert/Strict.md | 0 docs/Reference/{ => Built-In}/Assert/index.md | 2 +- .../CEF/CefBrowser/EnvironmentOptions.md | 0 .../{ => Built-In}/CEF/CefBrowser/index.md | 0 .../CEF/Enumerations/CefLogSeverity.md | 0 .../CEF/Enumerations/cefPrintOrientation.md | 0 .../{ => Built-In}/CEF/Enumerations/index.md | 0 docs/Reference/{ => Built-In}/CEF/index.md | 2 +- .../Enumerations/BorderStyle.md | 0 .../CustomControls/Enumerations/ColorRGBA.md | 0 .../Enumerations/CornerShape.md | 0 .../CustomControls/Enumerations/Customtate.md | 0 .../CustomControls/Enumerations/DockMode.md | 0 .../Enumerations/FillPattern.md | 0 .../CustomControls/Enumerations/FontWeight.md | 0 .../CustomControls/Enumerations/PixelCount.md | 0 .../CustomControls/Enumerations/PointSize.md | 0 .../Enumerations/StartupPosition.md | 0 .../Enumerations/TextAlignment.md | 0 .../Enumerations/TextOverflowMode.md | 0 .../Enumerations/WindowState.md | 0 .../CustomControls/Enumerations/index.md | 0 .../CustomControls/Framework/Canvas.md | 0 .../Framework/CustomControlContext.md | 0 .../Framework/CustomControlTimer.md | 0 .../Framework/CustomControlsCollection.md | 0 .../Framework/CustomFormContext.md | 0 .../Framework/ICustomControl.md | 0 .../CustomControls/Framework/ICustomForm.md | 0 .../CustomControls/Framework/SerializeInfo.md | 0 .../CustomControls/Framework/index.md | 0 .../CustomControls/Styles/Anchors.md | 0 .../CustomControls/Styles/Borders.md | 0 .../CustomControls/Styles/Corners.md | 0 .../CustomControls/Styles/Fill.md | 0 .../CustomControls/Styles/Line.md | 0 .../CustomControls/Styles/Padding.md | 0 .../CustomControls/Styles/TextRendering.md | 0 .../CustomControls/Styles/index.md | 0 .../WaynesButton/WaynesButtonState.md | 0 .../CustomControls/WaynesButton/index.md | 0 .../WaynesForm/WindowsFormOptions.md | 0 .../CustomControls/WaynesForm/index.md | 0 .../CustomControls/WaynesFrame.md | 0 .../WaynesGrid/CellRenderingOptions.md | 0 .../CustomControls/WaynesGrid/Column.md | 0 .../CustomControls/WaynesGrid/index.md | 0 .../CustomControls/WaynesLabel.md | 0 .../WaynesSlider/WaynesSliderState.md | 0 .../CustomControls/WaynesSlider/index.md | 0 .../WaynesTextBox/WaynesTextBoxState.md | 0 .../CustomControls/WaynesTextBox/index.md | 0 .../CustomControls/WaynesTimer.md | 0 .../{ => Built-In}/CustomControls/index.md | 2 +- .../WebView2/Enumerations/index.md | 0 .../wv2DefaultDownloadCornerAlign.md | 0 .../WebView2/Enumerations/wv2ErrorStatus.md | 0 .../Enumerations/wv2HostResourceAccessKind.md | 0 .../WebView2/Enumerations/wv2KeyEventKind.md | 0 .../Enumerations/wv2PermissionKind.md | 0 .../Enumerations/wv2PermissionState.md | 0 .../Enumerations/wv2PrintOrientation.md | 0 .../Enumerations/wv2ProcessFailedKind.md | 0 .../Enumerations/wv2ScriptDialogKind.md | 0 .../Enumerations/wv2WebResourceContext.md | 0 .../Types/COREWEBVIEW2_PHYSICAL_KEY_STATUS.md | 0 .../{ => Built-In}/WebView2/Types/index.md | 0 .../WebView2/WebView2/EnvironmentOptions.md | 0 .../{ => Built-In}/WebView2/WebView2/index.md | 0 .../{ => Built-In}/WebView2/WebView2Header.md | 0 .../WebView2/WebView2HeadersCollection.md | 0 .../WebView2/WebView2Request.md | 0 .../WebView2/WebView2RequestHeaders.md | 0 .../WebView2/WebView2Response.md | 0 .../WebView2/WebView2ResponseHeaders.md | 0 .../{ => Built-In}/WebView2/index.md | 2 +- .../{ => Built-In}/WinEventLogLib/EventLog.md | 0 .../WinEventLogLib/EventLogHelperPublic.md | 0 .../{ => Built-In}/WinEventLogLib/index.md | 2 +- .../NamedPipeClientConnection.md | 0 .../NamedPipeClientManager.md | 0 .../WinNamedPipesLib/NamedPipeServer.md | 0 .../NamedPipeServerConnection.md | 0 .../{ => Built-In}/WinNamedPipesLib/index.md | 2 +- .../WinNativeCommonCtls/DTPicker.md | 0 .../Enumerations/DTPickerFormatConstants.md | 0 .../Enumerations/ImlDrawConstants.md | 0 .../Enumerations/OrientationConstants.md | 0 .../Enumerations/TreeBorderStyleConstants.md | 0 .../Enumerations/TreeLabelEditConstants.md | 0 .../Enumerations/TreeLineStyleConstants.md | 0 .../Enumerations/TreeRelationshipConstants.md | 0 .../Enumerations/TreeSortOrderConstants.md | 0 .../Enumerations/TreeSortTypeConstants.md | 0 .../Enumerations/TreeStyleConstants.md | 0 .../WinNativeCommonCtls/Enumerations/index.md | 0 .../ImageList/ListImage.md | 0 .../ImageList/ListImages.md | 0 .../WinNativeCommonCtls/ImageList/index.md | 0 .../ListView/ColumnHeader.md | 0 .../ListView/ColumnHeaders.md | 0 .../WinNativeCommonCtls/ListView/ListItem.md | 0 .../WinNativeCommonCtls/ListView/ListItems.md | 0 .../WinNativeCommonCtls/ListView/index.md | 0 .../WinNativeCommonCtls/MonthView.md | 0 .../WinNativeCommonCtls/ProgressBar.md | 0 .../WinNativeCommonCtls/Slider.md | 0 .../WinNativeCommonCtls/TreeView/Node.md | 0 .../WinNativeCommonCtls/TreeView/Nodes.md | 0 .../WinNativeCommonCtls/TreeView/index.md | 0 .../WinNativeCommonCtls/UpDown.md | 0 .../WinNativeCommonCtls/index.md | 2 +- .../ServiceControlCodeConstants.md | 0 .../Enumerations/ServiceStartConstants.md | 0 .../Enumerations/ServiceStatusConstants.md | 0 .../Enumerations/ServiceTypeConstants.md | 0 .../WinServicesLib/Enumerations/index.md | 0 .../WinServicesLib/ITbService.md | 0 .../WinServicesLib/ServiceCreator.md | 0 .../WinServicesLib/ServiceManager.md | 0 .../WinServicesLib/ServiceState.md | 0 .../{ => Built-In}/WinServicesLib/Services.md | 0 .../{ => Built-In}/WinServicesLib/index.md | 2 +- docs/Reference/{ => Built-In}/tbIDE/AddIn.md | 0 .../{ => Built-In}/tbIDE/AddinTimer.md | 0 docs/Reference/{ => Built-In}/tbIDE/Button.md | 0 .../{ => Built-In}/tbIDE/CodeEditor.md | 0 .../{ => Built-In}/tbIDE/DebugConsole.md | 0 docs/Reference/{ => Built-In}/tbIDE/Editor.md | 0 .../Reference/{ => Built-In}/tbIDE/Editors.md | 0 docs/Reference/{ => Built-In}/tbIDE/File.md | 0 .../{ => Built-In}/tbIDE/FileSystem.md | 0 .../{ => Built-In}/tbIDE/FileSystemItem.md | 0 docs/Reference/{ => Built-In}/tbIDE/Folder.md | 0 docs/Reference/{ => Built-In}/tbIDE/Host.md | 0 .../{ => Built-In}/tbIDE/HtmlElement.md | 0 .../tbIDE/HtmlElementProperties.md | 0 .../tbIDE/HtmlElementProperty.md | 0 .../{ => Built-In}/tbIDE/HtmlElements.md | 0 .../tbIDE/HtmlEventProperties.md | 0 .../{ => Built-In}/tbIDE/HtmlEventProperty.md | 0 .../{ => Built-In}/tbIDE/KeyboardShortcuts.md | 0 .../Reference/{ => Built-In}/tbIDE/Project.md | 0 docs/Reference/{ => Built-In}/tbIDE/Themes.md | 0 .../{ => Built-In}/tbIDE/ToolWindow.md | 0 .../{ => Built-In}/tbIDE/ToolWindows.md | 0 .../Reference/{ => Built-In}/tbIDE/Toolbar.md | 0 .../{ => Built-In}/tbIDE/Toolbars.md | 0 docs/Reference/{ => Built-In}/tbIDE/index.md | 2 +- docs/Reference/Default.md | 15 +++++++++++ docs/Reference/{ => Default}/VB/App/index.md | 0 .../{ => Default}/VB/CheckBox/index.md | 0 .../{ => Default}/VB/CheckMark/index.md | 0 .../{ => Default}/VB/Clipboard/index.md | 0 .../{ => Default}/VB/ComboBox/index.md | 0 .../{ => Default}/VB/CommandButton/index.md | 0 docs/Reference/{ => Default}/VB/Data/index.md | 0 .../{ => Default}/VB/DirListBox/index.md | 0 .../{ => Default}/VB/DriveListBox/index.md | 0 .../{ => Default}/VB/FileListBox/index.md | 0 docs/Reference/{ => Default}/VB/Form/index.md | 0 .../Reference/{ => Default}/VB/Frame/index.md | 0 .../{ => Default}/VB/Global/index.md | 0 .../{ => Default}/VB/HScrollBar/index.md | 0 .../Reference/{ => Default}/VB/Image/index.md | 0 .../Reference/{ => Default}/VB/Label/index.md | 0 docs/Reference/{ => Default}/VB/Line/index.md | 0 .../{ => Default}/VB/ListBox/index.md | 0 .../{ => Default}/VB/MDIForm/index.md | 0 docs/Reference/{ => Default}/VB/Menu/index.md | 0 .../{ => Default}/VB/MultiFrame/index.md | 0 docs/Reference/{ => Default}/VB/OLE/index.md | 0 .../{ => Default}/VB/OptionButton/index.md | 0 .../{ => Default}/VB/PictureBox/index.md | 0 .../{ => Default}/VB/Printer/index.md | 0 .../{ => Default}/VB/Printers/index.md | 0 .../{ => Default}/VB/PropertyPage/index.md | 0 .../{ => Default}/VB/QRCode/index.md | 0 .../{ => Default}/VB/Report/index.md | 0 .../{ => Default}/VB/Screen/index.md | 0 .../Reference/{ => Default}/VB/Shape/index.md | 0 .../{ => Default}/VB/TextBox/index.md | 0 .../Reference/{ => Default}/VB/Timer/index.md | 0 .../{ => Default}/VB/UserControl/index.md | 0 .../{ => Default}/VB/VScrollBar/index.md | 0 docs/Reference/{ => Default}/VB/index.md | 2 +- .../{ => Default}/VBA/Collection/Add.md | 0 .../{ => Default}/VBA/Collection/Clear.md | 0 .../{ => Default}/VBA/Collection/Count.md | 0 .../{ => Default}/VBA/Collection/Exists.md | 0 .../{ => Default}/VBA/Collection/Item.md | 0 .../{ => Default}/VBA/Collection/Items.md | 0 .../VBA/Collection/KeyCompareMode.md | 0 .../VBA/Collection/KeyCountHint.md | 0 .../{ => Default}/VBA/Collection/Keys.md | 0 .../{ => Default}/VBA/Collection/Remove.md | 0 .../{ => Default}/VBA/Collection/index.md | 0 .../VBA/Compilation/CompilerVersion.md | 0 .../VBA/Compilation/CurrentComponentCLSID.md | 0 .../VBA/Compilation/CurrentComponentName.md | 0 .../VBA/Compilation/CurrentProcedureName.md | 0 .../VBA/Compilation/CurrentProjectName.md | 0 .../VBA/Compilation/CurrentSourceFile.md | 0 .../VBA/Compilation/ProcessorArchitecture.md | 0 .../{ => Default}/VBA/Compilation/index.md | 0 .../VBA/Constants/VbAppWinStyle.md | 0 .../VBA/Constants/VbArchitecture.md | 0 .../{ => Default}/VBA/Constants/VbCalendar.md | 0 .../{ => Default}/VBA/Constants/VbCallType.md | 0 .../VBA/Constants/VbCompareMethod.md | 0 .../VBA/Constants/VbDateTimeFormat.md | 0 .../VBA/Constants/VbDayOfWeek.md | 0 .../VBA/Constants/VbFileAttribute.md | 0 .../VBA/Constants/VbFirstWeekOfYear.md | 0 .../VBA/Constants/VbIMEStatus.md | 0 .../VBA/Constants/VbMsgBoxResult.md | 0 .../VBA/Constants/VbMsgBoxStyle.md | 0 .../{ => Default}/VBA/Constants/VbStrConv.md | 0 .../{ => Default}/VBA/Constants/VbTriState.md | 0 .../{ => Default}/VBA/Constants/VbVarType.md | 0 .../{ => Default}/VBA/Constants/index.md | 0 .../{ => Default}/VBA/Conversion/CBool.md | 0 .../{ => Default}/VBA/Conversion/CByte.md | 0 .../{ => Default}/VBA/Conversion/CCur.md | 0 .../{ => Default}/VBA/Conversion/CDate.md | 0 .../{ => Default}/VBA/Conversion/CDbl.md | 0 .../{ => Default}/VBA/Conversion/CDec.md | 0 .../{ => Default}/VBA/Conversion/CInt.md | 0 .../{ => Default}/VBA/Conversion/CLng.md | 0 .../{ => Default}/VBA/Conversion/CLngLng.md | 0 .../{ => Default}/VBA/Conversion/CLngPtr.md | 0 .../{ => Default}/VBA/Conversion/CSng.md | 0 .../{ => Default}/VBA/Conversion/CStr.md | 0 .../{ => Default}/VBA/Conversion/CType.md | 0 .../{ => Default}/VBA/Conversion/CVDate.md | 0 .../{ => Default}/VBA/Conversion/CVErr.md | 0 .../{ => Default}/VBA/Conversion/CVar.md | 0 .../{ => Default}/VBA/Conversion/Error.md | 0 .../{ => Default}/VBA/Conversion/Fix.md | 0 .../{ => Default}/VBA/Conversion/Hex.md | 0 .../{ => Default}/VBA/Conversion/Int.md | 0 .../{ => Default}/VBA/Conversion/MacID.md | 0 .../{ => Default}/VBA/Conversion/Nz.md | 0 .../{ => Default}/VBA/Conversion/Oct.md | 0 .../{ => Default}/VBA/Conversion/Str.md | 0 .../{ => Default}/VBA/Conversion/Val.md | 0 .../{ => Default}/VBA/Conversion/ValDec.md | 0 .../{ => Default}/VBA/Conversion/index.md | 0 .../{ => Default}/VBA/DateTime/Calendar.md | 0 .../{ => Default}/VBA/DateTime/Date.md | 0 .../{ => Default}/VBA/DateTime/DateAdd.md | 0 .../{ => Default}/VBA/DateTime/DateDiff.md | 0 .../{ => Default}/VBA/DateTime/DatePart.md | 0 .../{ => Default}/VBA/DateTime/DateSerial.md | 0 .../{ => Default}/VBA/DateTime/DateValue.md | 0 .../{ => Default}/VBA/DateTime/Day.md | 0 .../{ => Default}/VBA/DateTime/Hour.md | 0 .../{ => Default}/VBA/DateTime/Minute.md | 0 .../{ => Default}/VBA/DateTime/Month.md | 0 .../{ => Default}/VBA/DateTime/Now.md | 0 .../{ => Default}/VBA/DateTime/Second.md | 0 .../{ => Default}/VBA/DateTime/Time.md | 0 .../{ => Default}/VBA/DateTime/TimeSerial.md | 0 .../{ => Default}/VBA/DateTime/TimeValue.md | 0 .../{ => Default}/VBA/DateTime/Timer.md | 0 .../{ => Default}/VBA/DateTime/Weekday.md | 0 .../{ => Default}/VBA/DateTime/Year.md | 0 .../{ => Default}/VBA/DateTime/index.md | 0 .../{ => Default}/VBA/ErrObject/Clear.md | 0 .../VBA/ErrObject/Description.md | 0 .../VBA/ErrObject/HelpContext.md | 0 .../{ => Default}/VBA/ErrObject/HelpFile.md | 0 .../VBA/ErrObject/LastDllError.md | 0 .../VBA/ErrObject/LastHresult.md | 0 .../{ => Default}/VBA/ErrObject/Number.md | 0 .../{ => Default}/VBA/ErrObject/Raise.md | 0 .../VBA/ErrObject/ReturnHResult.md | 0 .../{ => Default}/VBA/ErrObject/Source.md | 0 .../{ => Default}/VBA/ErrObject/index.md | 0 .../{ => Default}/VBA/FileSystem/ChDir.md | 0 .../{ => Default}/VBA/FileSystem/ChDrive.md | 0 .../{ => Default}/VBA/FileSystem/CurDir.md | 0 .../{ => Default}/VBA/FileSystem/Dir.md | 0 .../{ => Default}/VBA/FileSystem/EOF.md | 0 .../{ => Default}/VBA/FileSystem/FileAttr.md | 0 .../{ => Default}/VBA/FileSystem/FileCopy.md | 0 .../VBA/FileSystem/FileDateTime.md | 0 .../{ => Default}/VBA/FileSystem/FileLen.md | 0 .../{ => Default}/VBA/FileSystem/FreeFile.md | 0 .../{ => Default}/VBA/FileSystem/GetAttr.md | 0 .../{ => Default}/VBA/FileSystem/Input.md | 0 .../{ => Default}/VBA/FileSystem/InputB.md | 0 .../{ => Default}/VBA/FileSystem/Kill.md | 0 .../{ => Default}/VBA/FileSystem/LOF.md | 0 .../{ => Default}/VBA/FileSystem/Loc.md | 0 .../{ => Default}/VBA/FileSystem/MkDir.md | 0 .../{ => Default}/VBA/FileSystem/Reset.md | 0 .../{ => Default}/VBA/FileSystem/RmDir.md | 0 .../{ => Default}/VBA/FileSystem/Seek.md | 0 .../{ => Default}/VBA/FileSystem/SetAttr.md | 0 .../{ => Default}/VBA/FileSystem/Width.md | 0 .../{ => Default}/VBA/FileSystem/index.md | 0 .../{ => Default}/VBA/Financial/DDB.md | 0 .../{ => Default}/VBA/Financial/FV.md | 0 .../{ => Default}/VBA/Financial/IPmt.md | 0 .../{ => Default}/VBA/Financial/IRR.md | 0 .../{ => Default}/VBA/Financial/MIRR.md | 0 .../{ => Default}/VBA/Financial/NPV.md | 0 .../{ => Default}/VBA/Financial/NPer.md | 0 .../{ => Default}/VBA/Financial/PPmt.md | 0 .../{ => Default}/VBA/Financial/PV.md | 0 .../{ => Default}/VBA/Financial/Pmt.md | 0 .../{ => Default}/VBA/Financial/Rate.md | 0 .../{ => Default}/VBA/Financial/SLN.md | 0 .../{ => Default}/VBA/Financial/SYD.md | 0 .../{ => Default}/VBA/Financial/index.md | 0 .../VBA/HiddenModule/AllocMem.md | 0 .../VBA/HiddenModule/ConvertIconToBitmap.md | 0 .../VBA/HiddenModule/CreateGUID.md | 0 .../CreateStdPictureFromHandle.md | 0 .../{ => Default}/VBA/HiddenModule/Emit.md | 0 .../{ => Default}/VBA/HiddenModule/EmitAny.md | 0 .../{ => Default}/VBA/HiddenModule/Eval.md | 0 .../{ => Default}/VBA/HiddenModule/FreeMem.md | 0 .../HiddenModule/GetDeclaredMaxEnumValue.md | 0 .../HiddenModule/GetDeclaredMinEnumValue.md | 0 .../VBA/HiddenModule/GetDeclaredTypeClsid.md | 0 .../HiddenModule/GetDeclaredTypeEventIid.md | 0 .../VBA/HiddenModule/GetDeclaredTypeIid.md | 0 .../VBA/HiddenModule/GetDeclaredTypeProgId.md | 0 .../VBA/HiddenModule/GetInheritedOwner.md | 0 .../{ => Default}/VBA/HiddenModule/GetMem1.md | 0 .../{ => Default}/VBA/HiddenModule/GetMem2.md | 0 .../{ => Default}/VBA/HiddenModule/GetMem4.md | 0 .../{ => Default}/VBA/HiddenModule/GetMem8.md | 0 .../VBA/HiddenModule/GetMemPtr.md | 0 .../VBA/HiddenModule/GetShortcutTextByEnum.md | 0 .../InterlockedCompareExchange32.md | 0 .../InterlockedCompareExchange64.md | 0 .../InterlockedCompareExchangePointer.md | 0 .../HiddenModule/InterlockedDecrement32.md | 0 .../InterlockedExchangePointer.md | 0 .../HiddenModule/InterlockedIncrement32.md | 0 .../VBA/HiddenModule/PictureToByteArray.md | 0 .../{ => Default}/VBA/HiddenModule/PutMem1.md | 0 .../{ => Default}/VBA/HiddenModule/PutMem2.md | 0 .../{ => Default}/VBA/HiddenModule/PutMem4.md | 0 .../{ => Default}/VBA/HiddenModule/PutMem8.md | 0 .../VBA/HiddenModule/PutMemPtr.md | 0 .../VBA/HiddenModule/RegisterMessage.md | 0 .../RuntimeCreateGetMessageHook.md | 0 .../HiddenModule/SetThreadGlobalErrorTrap.md | 0 .../VBA/HiddenModule/StackArgsSize.md | 0 .../VBA/HiddenModule/StackOffset.md | 0 .../{ => Default}/VBA/HiddenModule/Start.md | 0 .../{ => Default}/VBA/HiddenModule/Stop.md | 0 .../VBA/HiddenModule/UnprotectedAccess.md | 0 .../{ => Default}/VBA/HiddenModule/index.md | 0 .../VBA/HiddenModule/vbaAryMove.md | 0 .../VBA/HiddenModule/vbaCastObj.md | 0 .../VBA/HiddenModule/vbaCopyBytes.md | 0 .../VBA/HiddenModule/vbaCopyBytesZero.md | 0 .../VBA/HiddenModule/vbaObjAddref.md | 0 .../VBA/HiddenModule/vbaObjSet.md | 0 .../VBA/HiddenModule/vbaObjSetAddref.md | 0 .../VBA/HiddenModule/vbaRefVarAry.md | 0 .../{ => Default}/VBA/Information/Array.md | 0 .../{ => Default}/VBA/Information/Erl.md | 0 .../{ => Default}/VBA/Information/Err.md | 0 .../VBA/Information/IMEStatus.md | 0 .../{ => Default}/VBA/Information/IsArray.md | 0 .../VBA/Information/IsArrayInitialized.md | 0 .../{ => Default}/VBA/Information/IsDate.md | 0 .../{ => Default}/VBA/Information/IsEmpty.md | 0 .../{ => Default}/VBA/Information/IsError.md | 0 .../VBA/Information/IsMissing.md | 0 .../{ => Default}/VBA/Information/IsNull.md | 0 .../VBA/Information/IsNumeric.md | 0 .../{ => Default}/VBA/Information/IsObject.md | 0 .../{ => Default}/VBA/Information/LBound.md | 0 .../{ => Default}/VBA/Information/ObjPtr.md | 0 .../{ => Default}/VBA/Information/QBColor.md | 0 .../{ => Default}/VBA/Information/RGB.md | 0 .../{ => Default}/VBA/Information/RGBA.md | 0 .../{ => Default}/VBA/Information/RGBA_A.md | 0 .../{ => Default}/VBA/Information/RGB_B.md | 0 .../{ => Default}/VBA/Information/RGB_G.md | 0 .../{ => Default}/VBA/Information/RGB_R.md | 0 .../{ => Default}/VBA/Information/StrPtr.md | 0 .../VBA/Information/TranslateColor.md | 0 .../{ => Default}/VBA/Information/TypeName.md | 0 .../{ => Default}/VBA/Information/UBound.md | 0 .../{ => Default}/VBA/Information/VarPtr.md | 0 .../{ => Default}/VBA/Information/VarType.md | 0 .../{ => Default}/VBA/Information/index.md | 0 .../VBA/Interaction/AppActivate.md | 0 .../{ => Default}/VBA/Interaction/Beep.md | 0 .../VBA/Interaction/CallByDispId.md | 0 .../VBA/Interaction/CallByName.md | 0 .../{ => Default}/VBA/Interaction/Choose.md | 0 .../{ => Default}/VBA/Interaction/Command.md | 0 .../VBA/Interaction/CreateObject.md | 0 .../VBA/Interaction/DeleteSetting.md | 0 .../{ => Default}/VBA/Interaction/DoEvents.md | 0 .../{ => Default}/VBA/Interaction/Environ.md | 0 .../VBA/Interaction/GetAllSettings.md | 0 .../VBA/Interaction/GetObject.md | 0 .../VBA/Interaction/GetSetting.md | 0 .../{ => Default}/VBA/Interaction/IIf.md | 0 .../{ => Default}/VBA/Interaction/If.md | 0 .../{ => Default}/VBA/Interaction/InputBox.md | 0 .../{ => Default}/VBA/Interaction/MsgBox.md | 0 .../VBA/Interaction/Partition.md | 0 .../VBA/Interaction/RaiseEventByName.md | 0 .../VBA/Interaction/RaiseEventByName2.md | 0 .../VBA/Interaction/SaveSetting.md | 0 .../{ => Default}/VBA/Interaction/SendKeys.md | 0 .../{ => Default}/VBA/Interaction/Shell.md | 0 .../{ => Default}/VBA/Interaction/Switch.md | 0 .../{ => Default}/VBA/Interaction/index.md | 0 docs/Reference/{ => Default}/VBA/Math/Abs.md | 0 docs/Reference/{ => Default}/VBA/Math/Atn.md | 0 docs/Reference/{ => Default}/VBA/Math/Cos.md | 0 docs/Reference/{ => Default}/VBA/Math/Exp.md | 0 docs/Reference/{ => Default}/VBA/Math/Log.md | 0 .../{ => Default}/VBA/Math/Randomize.md | 0 docs/Reference/{ => Default}/VBA/Math/Rnd.md | 0 .../Reference/{ => Default}/VBA/Math/Round.md | 0 docs/Reference/{ => Default}/VBA/Math/Sgn.md | 0 docs/Reference/{ => Default}/VBA/Math/Sin.md | 0 docs/Reference/{ => Default}/VBA/Math/Sqr.md | 0 docs/Reference/{ => Default}/VBA/Math/Tan.md | 0 .../Reference/{ => Default}/VBA/Math/index.md | 0 .../{ => Default}/VBA/Strings/Asc.md | 0 .../{ => Default}/VBA/Strings/Chr.md | 0 .../{ => Default}/VBA/Strings/Filter.md | 0 .../{ => Default}/VBA/Strings/Format.md | 0 .../VBA/Strings/FormatCurrency.md | 0 .../VBA/Strings/FormatDateTime.md | 0 .../{ => Default}/VBA/Strings/FormatNumber.md | 0 .../VBA/Strings/FormatPercent.md | 0 .../{ => Default}/VBA/Strings/InStr.md | 0 .../{ => Default}/VBA/Strings/InStrRev.md | 0 .../{ => Default}/VBA/Strings/Join.md | 0 .../{ => Default}/VBA/Strings/LCase.md | 0 .../{ => Default}/VBA/Strings/LTrim.md | 0 .../{ => Default}/VBA/Strings/Left.md | 0 .../{ => Default}/VBA/Strings/Len.md | 0 .../{ => Default}/VBA/Strings/Mid.md | 0 .../{ => Default}/VBA/Strings/MonthName.md | 0 .../{ => Default}/VBA/Strings/RTrim.md | 0 .../{ => Default}/VBA/Strings/Replace.md | 0 .../{ => Default}/VBA/Strings/Right.md | 0 .../{ => Default}/VBA/Strings/Space.md | 0 .../{ => Default}/VBA/Strings/Split.md | 0 .../{ => Default}/VBA/Strings/StrComp.md | 0 .../{ => Default}/VBA/Strings/StrConv.md | 0 .../{ => Default}/VBA/Strings/StrReverse.md | 0 .../{ => Default}/VBA/Strings/String.md | 0 .../{ => Default}/VBA/Strings/Trim.md | 0 .../{ => Default}/VBA/Strings/UCase.md | 0 .../{ => Default}/VBA/Strings/WeekdayName.md | 0 .../{ => Default}/VBA/Strings/index.md | 0 .../TbExpressionService/AddCustomBinder.md | 0 .../AddCustomBinderObject.md | 0 .../AddStdLibraryBinder.md | 0 .../VBA/TbExpressionService/Bind.md | 0 .../VBA/TbExpressionService/Compile.md | 0 .../VBA/TbExpressionService/Evaluate.md | 0 .../VBA/TbExpressionService/index.md | 0 docs/Reference/{ => Default}/VBA/index.md | 2 +- .../VBRUN/AmbientProperties/BackColor.md | 0 .../AmbientProperties/DisplayAsDefault.md | 0 .../VBRUN/AmbientProperties/DisplayName.md | 0 .../VBRUN/AmbientProperties/Font.md | 0 .../VBRUN/AmbientProperties/ForeColor.md | 0 .../VBRUN/AmbientProperties/LocaleID.md | 0 .../VBRUN/AmbientProperties/MessageReflect.md | 0 .../VBRUN/AmbientProperties/Palette.md | 0 .../VBRUN/AmbientProperties/RightToLeft.md | 0 .../VBRUN/AmbientProperties/ScaleUnits.md | 0 .../AmbientProperties/ShowGrabHandles.md | 0 .../VBRUN/AmbientProperties/ShowHatching.md | 0 .../AmbientProperties/SupportsMnemonics.md | 0 .../VBRUN/AmbientProperties/TextAlign.md | 0 .../VBRUN/AmbientProperties/UIDead.md | 0 .../VBRUN/AmbientProperties/UserMode.md | 0 .../VBRUN/AmbientProperties/index.md | 0 .../VBRUN/AsyncProperty/AsyncType.md | 0 .../VBRUN/AsyncProperty/BytesMax.md | 0 .../VBRUN/AsyncProperty/BytesRead.md | 0 .../VBRUN/AsyncProperty/PropertyName.md | 0 .../VBRUN/AsyncProperty/Status.md | 0 .../VBRUN/AsyncProperty/StatusCode.md | 0 .../VBRUN/AsyncProperty/Target.md | 0 .../VBRUN/AsyncProperty/Value.md | 0 .../VBRUN/AsyncProperty/index.md | 0 .../VBRUN/Constants/AlignConstants.md | 0 .../VBRUN/Constants/AlignmentConstants.md | 0 .../Constants/AlignmentConstantsNoCenter.md | 0 .../VBRUN/Constants/AppearanceConstants.md | 0 .../Constants/ApplicationStartConstants.md | 0 .../VBRUN/Constants/AspectTypeConstants.md | 0 .../VBRUN/Constants/AsyncReadConstants.md | 0 .../Constants/AsyncStatusCodeConstants.md | 0 .../VBRUN/Constants/AsyncTypeConstants.md | 0 .../VBRUN/Constants/BackFillStyleConstants.md | 0 .../VBRUN/Constants/BorderStyleConstants.md | 0 .../VBRUN/Constants/ButtonConstants.md | 0 .../VBRUN/Constants/CheckBoxConstants.md | 0 .../VBRUN/Constants/ClipboardConstants.md | 0 .../VBRUN/Constants/ColorConstants.md | 0 .../VBRUN/Constants/ComboBoxConstants.md | 0 .../Constants/ControlBorderStyleConstants.md | 0 .../ControlBorderStyleConstantsCustom.md | 0 .../VBRUN/Constants/ControlTypeConstants.md | 0 .../VBRUN/Constants/DataBOFconstants.md | 0 .../VBRUN/Constants/DataEOFConstants.md | 0 .../VBRUN/Constants/DataErrorConstants.md | 0 .../VBRUN/Constants/DataValidateConstants.md | 0 .../VBRUN/Constants/DatabaseTypeConstants.md | 0 .../Constants/DefaultCursorTypeConstants.md | 0 .../VBRUN/Constants/DockModeConstants.md | 0 .../VBRUN/Constants/DragConstants.md | 0 .../VBRUN/Constants/DragModeConstants.md | 0 .../VBRUN/Constants/DragOverConstants.md | 0 .../VBRUN/Constants/DrawModeConstants.md | 0 .../VBRUN/Constants/DrawStyleConstants.md | 0 .../VBRUN/Constants/FillStyleConstants.md | 0 .../VBRUN/Constants/FillStyleConstantsEx.md | 0 .../VBRUN/Constants/FormArrangeConstants.md | 0 .../Constants/FormBorderStyleConstants.md | 0 .../VBRUN/Constants/FormShowConstants.md | 0 .../Constants/FormWindowStateConstants.md | 0 .../VBRUN/Constants/HitResultConstants.md | 0 .../VBRUN/Constants/KeyCodeConstants.md | 0 .../VBRUN/Constants/LinkModeConstants.md | 0 .../VBRUN/Constants/ListBoxConstants.md | 0 .../Constants/LoadPictureColorConstants.md | 0 .../Constants/LoadPictureSizeConstants.md | 0 .../VBRUN/Constants/LoadResConstants.md | 0 .../VBRUN/Constants/LogEventTypeConstants.md | 0 .../VBRUN/Constants/LogModeConstants.md | 0 .../VBRUN/Constants/MenuAccelConstants.md | 0 .../VBRUN/Constants/MenuControlConstants.md | 0 .../VBRUN/Constants/MouseButtonConstants.md | 0 .../VBRUN/Constants/MousePointerConstants.md | 0 .../VBRUN/Constants/MultiSelectConstants.md | 0 .../Constants/NegotiatePositionConstants.md | 0 .../OLEContainerActivateConstants.md | 0 .../VBRUN/Constants/OLEContainerConstants.md | 0 .../OLEContainerDisplayTypeConstants.md | 0 .../OLEContainerSizeModeConstants.md | 0 .../OLEContainerTypesAllowedConstants.md | 0 .../OLEContainerUpdateOptionsConstants.md | 0 .../VBRUN/Constants/OLEDragConstants.md | 0 .../VBRUN/Constants/OLEDropConstants.md | 0 .../VBRUN/Constants/OLEDropEffectConstants.md | 0 .../VBRUN/Constants/OldLinkModeConstants.md | 0 .../VBRUN/Constants/PaletteModeConstants.md | 0 .../VBRUN/Constants/ParentControlsType.md | 0 .../VBRUN/Constants/PictureTypeConstants.md | 0 .../VBRUN/Constants/PrinterObjectConstants.md | 0 .../PrinterObjectConstants_ColorMode.md | 0 .../PrinterObjectConstants_Duplex.md | 0 .../PrinterObjectConstants_Orientation.md | 0 .../PrinterObjectConstants_PaperBin.md | 0 .../PrinterObjectConstants_PaperSize.md | 0 .../PrinterObjectConstants_PrintQuality.md | 0 .../VBRUN/Constants/QueryUnloadConstants.md | 0 .../VBRUN/Constants/RasterOpConstants.md | 0 .../VBRUN/Constants/RecordsetTypeConstants.md | 0 .../VBRUN/Constants/ScaleModeConstants.md | 0 .../VBRUN/Constants/ScrollBarConstants.md | 0 .../VBRUN/Constants/ShapeConstants.md | 0 .../VBRUN/Constants/ShiftConstants.md | 0 .../VBRUN/Constants/ShortcutConstants.md | 0 .../Constants/StartUpPositionConstants.md | 0 .../VBRUN/Constants/StorageTypeContants.md | 0 .../VBRUN/Constants/SystemColorConstants.md | 0 .../VBRUN/Constants/VariantTypeConstants.md | 0 .../Constants/VerticalAlignmentConstants.md | 0 .../VBRUN/Constants/ZOrderConstants.md | 0 .../{ => Default}/VBRUN/Constants/index.md | 0 .../VBRUN/ContainedControls/index.md | 0 .../{ => Default}/VBRUN/DataMembers/index.md | 0 .../VBRUN/DataObject/AvailableFormats.md | 0 .../{ => Default}/VBRUN/DataObject/Clear.md | 0 .../VBRUN/DataObject/DataObjectFiles.md | 0 .../VBRUN/DataObject/DataObjectFormat.md | 0 .../VBRUN/DataObject/DataObjectFormats.md | 0 .../{ => Default}/VBRUN/DataObject/Files.md | 0 .../{ => Default}/VBRUN/DataObject/GetData.md | 0 .../VBRUN/DataObject/GetDataByName.md | 0 .../VBRUN/DataObject/GetFormat.md | 0 .../VBRUN/DataObject/GetFormatByName.md | 0 .../{ => Default}/VBRUN/DataObject/SetData.md | 0 .../{ => Default}/VBRUN/DataObject/index.md | 0 .../VBRUN/ErrorCallstack/index.md | 0 .../{ => Default}/VBRUN/ErrorContext/index.md | 0 .../VBRUN/ErrorStackFrame/index.md | 0 .../{ => Default}/VBRUN/Hyperlink/index.md | 0 .../VBRUN/ParentControls/index.md | 0 .../{ => Default}/VBRUN/PropertyBag/index.md | 0 docs/Reference/{ => Default}/VBRUN/index.md | 2 +- docs/Reference/Packages.md | 25 +++---------------- docs/_book.yml | 12 +++++++++ 610 files changed, 63 insertions(+), 34 deletions(-) create mode 100644 docs/Reference/Built-In.md rename docs/Reference/{ => Built-In}/Assert/Exact.md (100%) rename docs/Reference/{ => Built-In}/Assert/Permissive.md (100%) rename docs/Reference/{ => Built-In}/Assert/Strict.md (100%) rename docs/Reference/{ => Built-In}/Assert/index.md (99%) rename docs/Reference/{ => Built-In}/CEF/CefBrowser/EnvironmentOptions.md (100%) rename docs/Reference/{ => Built-In}/CEF/CefBrowser/index.md (100%) rename docs/Reference/{ => Built-In}/CEF/Enumerations/CefLogSeverity.md (100%) rename docs/Reference/{ => Built-In}/CEF/Enumerations/cefPrintOrientation.md (100%) rename docs/Reference/{ => Built-In}/CEF/Enumerations/index.md (100%) rename docs/Reference/{ => Built-In}/CEF/index.md (99%) rename docs/Reference/{ => Built-In}/CustomControls/Enumerations/BorderStyle.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Enumerations/ColorRGBA.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Enumerations/CornerShape.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Enumerations/Customtate.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Enumerations/DockMode.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Enumerations/FillPattern.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Enumerations/FontWeight.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Enumerations/PixelCount.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Enumerations/PointSize.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Enumerations/StartupPosition.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Enumerations/TextAlignment.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Enumerations/TextOverflowMode.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Enumerations/WindowState.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Enumerations/index.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Framework/Canvas.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Framework/CustomControlContext.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Framework/CustomControlTimer.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Framework/CustomControlsCollection.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Framework/CustomFormContext.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Framework/ICustomControl.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Framework/ICustomForm.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Framework/SerializeInfo.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Framework/index.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Styles/Anchors.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Styles/Borders.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Styles/Corners.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Styles/Fill.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Styles/Line.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Styles/Padding.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Styles/TextRendering.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/Styles/index.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/WaynesButton/WaynesButtonState.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/WaynesButton/index.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/WaynesForm/WindowsFormOptions.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/WaynesForm/index.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/WaynesFrame.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/WaynesGrid/CellRenderingOptions.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/WaynesGrid/Column.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/WaynesGrid/index.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/WaynesLabel.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/WaynesSlider/WaynesSliderState.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/WaynesSlider/index.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/WaynesTextBox/WaynesTextBoxState.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/WaynesTextBox/index.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/WaynesTimer.md (100%) rename docs/Reference/{ => Built-In}/CustomControls/index.md (99%) rename docs/Reference/{ => Built-In}/WebView2/Enumerations/index.md (100%) rename docs/Reference/{ => Built-In}/WebView2/Enumerations/wv2DefaultDownloadCornerAlign.md (100%) rename docs/Reference/{ => Built-In}/WebView2/Enumerations/wv2ErrorStatus.md (100%) rename docs/Reference/{ => Built-In}/WebView2/Enumerations/wv2HostResourceAccessKind.md (100%) rename docs/Reference/{ => Built-In}/WebView2/Enumerations/wv2KeyEventKind.md (100%) rename docs/Reference/{ => Built-In}/WebView2/Enumerations/wv2PermissionKind.md (100%) rename docs/Reference/{ => Built-In}/WebView2/Enumerations/wv2PermissionState.md (100%) rename docs/Reference/{ => Built-In}/WebView2/Enumerations/wv2PrintOrientation.md (100%) rename docs/Reference/{ => Built-In}/WebView2/Enumerations/wv2ProcessFailedKind.md (100%) rename docs/Reference/{ => Built-In}/WebView2/Enumerations/wv2ScriptDialogKind.md (100%) rename docs/Reference/{ => Built-In}/WebView2/Enumerations/wv2WebResourceContext.md (100%) rename docs/Reference/{ => Built-In}/WebView2/Types/COREWEBVIEW2_PHYSICAL_KEY_STATUS.md (100%) rename docs/Reference/{ => Built-In}/WebView2/Types/index.md (100%) rename docs/Reference/{ => Built-In}/WebView2/WebView2/EnvironmentOptions.md (100%) rename docs/Reference/{ => Built-In}/WebView2/WebView2/index.md (100%) rename docs/Reference/{ => Built-In}/WebView2/WebView2Header.md (100%) rename docs/Reference/{ => Built-In}/WebView2/WebView2HeadersCollection.md (100%) rename docs/Reference/{ => Built-In}/WebView2/WebView2Request.md (100%) rename docs/Reference/{ => Built-In}/WebView2/WebView2RequestHeaders.md (100%) rename docs/Reference/{ => Built-In}/WebView2/WebView2Response.md (100%) rename docs/Reference/{ => Built-In}/WebView2/WebView2ResponseHeaders.md (100%) rename docs/Reference/{ => Built-In}/WebView2/index.md (99%) rename docs/Reference/{ => Built-In}/WinEventLogLib/EventLog.md (100%) rename docs/Reference/{ => Built-In}/WinEventLogLib/EventLogHelperPublic.md (100%) rename docs/Reference/{ => Built-In}/WinEventLogLib/index.md (99%) rename docs/Reference/{ => Built-In}/WinNamedPipesLib/NamedPipeClientConnection.md (100%) rename docs/Reference/{ => Built-In}/WinNamedPipesLib/NamedPipeClientManager.md (100%) rename docs/Reference/{ => Built-In}/WinNamedPipesLib/NamedPipeServer.md (100%) rename docs/Reference/{ => Built-In}/WinNamedPipesLib/NamedPipeServerConnection.md (100%) rename docs/Reference/{ => Built-In}/WinNamedPipesLib/index.md (99%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/DTPicker.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/Enumerations/DTPickerFormatConstants.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/Enumerations/ImlDrawConstants.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/Enumerations/OrientationConstants.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/Enumerations/TreeBorderStyleConstants.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/Enumerations/TreeLabelEditConstants.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/Enumerations/TreeLineStyleConstants.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/Enumerations/TreeRelationshipConstants.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/Enumerations/TreeSortOrderConstants.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/Enumerations/TreeSortTypeConstants.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/Enumerations/TreeStyleConstants.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/Enumerations/index.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/ImageList/ListImage.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/ImageList/ListImages.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/ImageList/index.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/ListView/ColumnHeader.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/ListView/ColumnHeaders.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/ListView/ListItem.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/ListView/ListItems.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/ListView/index.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/MonthView.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/ProgressBar.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/Slider.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/TreeView/Node.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/TreeView/Nodes.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/TreeView/index.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/UpDown.md (100%) rename docs/Reference/{ => Built-In}/WinNativeCommonCtls/index.md (99%) rename docs/Reference/{ => Built-In}/WinServicesLib/Enumerations/ServiceControlCodeConstants.md (100%) rename docs/Reference/{ => Built-In}/WinServicesLib/Enumerations/ServiceStartConstants.md (100%) rename docs/Reference/{ => Built-In}/WinServicesLib/Enumerations/ServiceStatusConstants.md (100%) rename docs/Reference/{ => Built-In}/WinServicesLib/Enumerations/ServiceTypeConstants.md (100%) rename docs/Reference/{ => Built-In}/WinServicesLib/Enumerations/index.md (100%) rename docs/Reference/{ => Built-In}/WinServicesLib/ITbService.md (100%) rename docs/Reference/{ => Built-In}/WinServicesLib/ServiceCreator.md (100%) rename docs/Reference/{ => Built-In}/WinServicesLib/ServiceManager.md (100%) rename docs/Reference/{ => Built-In}/WinServicesLib/ServiceState.md (100%) rename docs/Reference/{ => Built-In}/WinServicesLib/Services.md (100%) rename docs/Reference/{ => Built-In}/WinServicesLib/index.md (99%) rename docs/Reference/{ => Built-In}/tbIDE/AddIn.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/AddinTimer.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/Button.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/CodeEditor.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/DebugConsole.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/Editor.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/Editors.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/File.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/FileSystem.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/FileSystemItem.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/Folder.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/Host.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/HtmlElement.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/HtmlElementProperties.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/HtmlElementProperty.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/HtmlElements.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/HtmlEventProperties.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/HtmlEventProperty.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/KeyboardShortcuts.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/Project.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/Themes.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/ToolWindow.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/ToolWindows.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/Toolbar.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/Toolbars.md (100%) rename docs/Reference/{ => Built-In}/tbIDE/index.md (99%) create mode 100644 docs/Reference/Default.md rename docs/Reference/{ => Default}/VB/App/index.md (100%) rename docs/Reference/{ => Default}/VB/CheckBox/index.md (100%) rename docs/Reference/{ => Default}/VB/CheckMark/index.md (100%) rename docs/Reference/{ => Default}/VB/Clipboard/index.md (100%) rename docs/Reference/{ => Default}/VB/ComboBox/index.md (100%) rename docs/Reference/{ => Default}/VB/CommandButton/index.md (100%) rename docs/Reference/{ => Default}/VB/Data/index.md (100%) rename docs/Reference/{ => Default}/VB/DirListBox/index.md (100%) rename docs/Reference/{ => Default}/VB/DriveListBox/index.md (100%) rename docs/Reference/{ => Default}/VB/FileListBox/index.md (100%) rename docs/Reference/{ => Default}/VB/Form/index.md (100%) rename docs/Reference/{ => Default}/VB/Frame/index.md (100%) rename docs/Reference/{ => Default}/VB/Global/index.md (100%) rename docs/Reference/{ => Default}/VB/HScrollBar/index.md (100%) rename docs/Reference/{ => Default}/VB/Image/index.md (100%) rename docs/Reference/{ => Default}/VB/Label/index.md (100%) rename docs/Reference/{ => Default}/VB/Line/index.md (100%) rename docs/Reference/{ => Default}/VB/ListBox/index.md (100%) rename docs/Reference/{ => Default}/VB/MDIForm/index.md (100%) rename docs/Reference/{ => Default}/VB/Menu/index.md (100%) rename docs/Reference/{ => Default}/VB/MultiFrame/index.md (100%) rename docs/Reference/{ => Default}/VB/OLE/index.md (100%) rename docs/Reference/{ => Default}/VB/OptionButton/index.md (100%) rename docs/Reference/{ => Default}/VB/PictureBox/index.md (100%) rename docs/Reference/{ => Default}/VB/Printer/index.md (100%) rename docs/Reference/{ => Default}/VB/Printers/index.md (100%) rename docs/Reference/{ => Default}/VB/PropertyPage/index.md (100%) rename docs/Reference/{ => Default}/VB/QRCode/index.md (100%) rename docs/Reference/{ => Default}/VB/Report/index.md (100%) rename docs/Reference/{ => Default}/VB/Screen/index.md (100%) rename docs/Reference/{ => Default}/VB/Shape/index.md (100%) rename docs/Reference/{ => Default}/VB/TextBox/index.md (100%) rename docs/Reference/{ => Default}/VB/Timer/index.md (100%) rename docs/Reference/{ => Default}/VB/UserControl/index.md (100%) rename docs/Reference/{ => Default}/VB/VScrollBar/index.md (100%) rename docs/Reference/{ => Default}/VB/index.md (99%) rename docs/Reference/{ => Default}/VBA/Collection/Add.md (100%) rename docs/Reference/{ => Default}/VBA/Collection/Clear.md (100%) rename docs/Reference/{ => Default}/VBA/Collection/Count.md (100%) rename docs/Reference/{ => Default}/VBA/Collection/Exists.md (100%) rename docs/Reference/{ => Default}/VBA/Collection/Item.md (100%) rename docs/Reference/{ => Default}/VBA/Collection/Items.md (100%) rename docs/Reference/{ => Default}/VBA/Collection/KeyCompareMode.md (100%) rename docs/Reference/{ => Default}/VBA/Collection/KeyCountHint.md (100%) rename docs/Reference/{ => Default}/VBA/Collection/Keys.md (100%) rename docs/Reference/{ => Default}/VBA/Collection/Remove.md (100%) rename docs/Reference/{ => Default}/VBA/Collection/index.md (100%) rename docs/Reference/{ => Default}/VBA/Compilation/CompilerVersion.md (100%) rename docs/Reference/{ => Default}/VBA/Compilation/CurrentComponentCLSID.md (100%) rename docs/Reference/{ => Default}/VBA/Compilation/CurrentComponentName.md (100%) rename docs/Reference/{ => Default}/VBA/Compilation/CurrentProcedureName.md (100%) rename docs/Reference/{ => Default}/VBA/Compilation/CurrentProjectName.md (100%) rename docs/Reference/{ => Default}/VBA/Compilation/CurrentSourceFile.md (100%) rename docs/Reference/{ => Default}/VBA/Compilation/ProcessorArchitecture.md (100%) rename docs/Reference/{ => Default}/VBA/Compilation/index.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbAppWinStyle.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbArchitecture.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbCalendar.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbCallType.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbCompareMethod.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbDateTimeFormat.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbDayOfWeek.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbFileAttribute.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbFirstWeekOfYear.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbIMEStatus.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbMsgBoxResult.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbMsgBoxStyle.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbStrConv.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbTriState.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/VbVarType.md (100%) rename docs/Reference/{ => Default}/VBA/Constants/index.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CBool.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CByte.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CCur.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CDate.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CDbl.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CDec.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CInt.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CLng.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CLngLng.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CLngPtr.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CSng.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CStr.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CType.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CVDate.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CVErr.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/CVar.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/Error.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/Fix.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/Hex.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/Int.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/MacID.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/Nz.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/Oct.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/Str.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/Val.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/ValDec.md (100%) rename docs/Reference/{ => Default}/VBA/Conversion/index.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/Calendar.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/Date.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/DateAdd.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/DateDiff.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/DatePart.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/DateSerial.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/DateValue.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/Day.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/Hour.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/Minute.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/Month.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/Now.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/Second.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/Time.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/TimeSerial.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/TimeValue.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/Timer.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/Weekday.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/Year.md (100%) rename docs/Reference/{ => Default}/VBA/DateTime/index.md (100%) rename docs/Reference/{ => Default}/VBA/ErrObject/Clear.md (100%) rename docs/Reference/{ => Default}/VBA/ErrObject/Description.md (100%) rename docs/Reference/{ => Default}/VBA/ErrObject/HelpContext.md (100%) rename docs/Reference/{ => Default}/VBA/ErrObject/HelpFile.md (100%) rename docs/Reference/{ => Default}/VBA/ErrObject/LastDllError.md (100%) rename docs/Reference/{ => Default}/VBA/ErrObject/LastHresult.md (100%) rename docs/Reference/{ => Default}/VBA/ErrObject/Number.md (100%) rename docs/Reference/{ => Default}/VBA/ErrObject/Raise.md (100%) rename docs/Reference/{ => Default}/VBA/ErrObject/ReturnHResult.md (100%) rename docs/Reference/{ => Default}/VBA/ErrObject/Source.md (100%) rename docs/Reference/{ => Default}/VBA/ErrObject/index.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/ChDir.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/ChDrive.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/CurDir.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/Dir.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/EOF.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/FileAttr.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/FileCopy.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/FileDateTime.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/FileLen.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/FreeFile.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/GetAttr.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/Input.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/InputB.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/Kill.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/LOF.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/Loc.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/MkDir.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/Reset.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/RmDir.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/Seek.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/SetAttr.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/Width.md (100%) rename docs/Reference/{ => Default}/VBA/FileSystem/index.md (100%) rename docs/Reference/{ => Default}/VBA/Financial/DDB.md (100%) rename docs/Reference/{ => Default}/VBA/Financial/FV.md (100%) rename docs/Reference/{ => Default}/VBA/Financial/IPmt.md (100%) rename docs/Reference/{ => Default}/VBA/Financial/IRR.md (100%) rename docs/Reference/{ => Default}/VBA/Financial/MIRR.md (100%) rename docs/Reference/{ => Default}/VBA/Financial/NPV.md (100%) rename docs/Reference/{ => Default}/VBA/Financial/NPer.md (100%) rename docs/Reference/{ => Default}/VBA/Financial/PPmt.md (100%) rename docs/Reference/{ => Default}/VBA/Financial/PV.md (100%) rename docs/Reference/{ => Default}/VBA/Financial/Pmt.md (100%) rename docs/Reference/{ => Default}/VBA/Financial/Rate.md (100%) rename docs/Reference/{ => Default}/VBA/Financial/SLN.md (100%) rename docs/Reference/{ => Default}/VBA/Financial/SYD.md (100%) rename docs/Reference/{ => Default}/VBA/Financial/index.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/AllocMem.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/ConvertIconToBitmap.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/CreateGUID.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/CreateStdPictureFromHandle.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/Emit.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/EmitAny.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/Eval.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/FreeMem.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/GetDeclaredMaxEnumValue.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/GetDeclaredMinEnumValue.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/GetDeclaredTypeClsid.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/GetDeclaredTypeEventIid.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/GetDeclaredTypeIid.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/GetDeclaredTypeProgId.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/GetInheritedOwner.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/GetMem1.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/GetMem2.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/GetMem4.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/GetMem8.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/GetMemPtr.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/GetShortcutTextByEnum.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/InterlockedCompareExchange32.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/InterlockedCompareExchange64.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/InterlockedCompareExchangePointer.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/InterlockedDecrement32.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/InterlockedExchangePointer.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/InterlockedIncrement32.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/PictureToByteArray.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/PutMem1.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/PutMem2.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/PutMem4.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/PutMem8.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/PutMemPtr.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/RegisterMessage.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/RuntimeCreateGetMessageHook.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/SetThreadGlobalErrorTrap.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/StackArgsSize.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/StackOffset.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/Start.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/Stop.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/UnprotectedAccess.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/index.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/vbaAryMove.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/vbaCastObj.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/vbaCopyBytes.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/vbaCopyBytesZero.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/vbaObjAddref.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/vbaObjSet.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/vbaObjSetAddref.md (100%) rename docs/Reference/{ => Default}/VBA/HiddenModule/vbaRefVarAry.md (100%) rename docs/Reference/{ => Default}/VBA/Information/Array.md (100%) rename docs/Reference/{ => Default}/VBA/Information/Erl.md (100%) rename docs/Reference/{ => Default}/VBA/Information/Err.md (100%) rename docs/Reference/{ => Default}/VBA/Information/IMEStatus.md (100%) rename docs/Reference/{ => Default}/VBA/Information/IsArray.md (100%) rename docs/Reference/{ => Default}/VBA/Information/IsArrayInitialized.md (100%) rename docs/Reference/{ => Default}/VBA/Information/IsDate.md (100%) rename docs/Reference/{ => Default}/VBA/Information/IsEmpty.md (100%) rename docs/Reference/{ => Default}/VBA/Information/IsError.md (100%) rename docs/Reference/{ => Default}/VBA/Information/IsMissing.md (100%) rename docs/Reference/{ => Default}/VBA/Information/IsNull.md (100%) rename docs/Reference/{ => Default}/VBA/Information/IsNumeric.md (100%) rename docs/Reference/{ => Default}/VBA/Information/IsObject.md (100%) rename docs/Reference/{ => Default}/VBA/Information/LBound.md (100%) rename docs/Reference/{ => Default}/VBA/Information/ObjPtr.md (100%) rename docs/Reference/{ => Default}/VBA/Information/QBColor.md (100%) rename docs/Reference/{ => Default}/VBA/Information/RGB.md (100%) rename docs/Reference/{ => Default}/VBA/Information/RGBA.md (100%) rename docs/Reference/{ => Default}/VBA/Information/RGBA_A.md (100%) rename docs/Reference/{ => Default}/VBA/Information/RGB_B.md (100%) rename docs/Reference/{ => Default}/VBA/Information/RGB_G.md (100%) rename docs/Reference/{ => Default}/VBA/Information/RGB_R.md (100%) rename docs/Reference/{ => Default}/VBA/Information/StrPtr.md (100%) rename docs/Reference/{ => Default}/VBA/Information/TranslateColor.md (100%) rename docs/Reference/{ => Default}/VBA/Information/TypeName.md (100%) rename docs/Reference/{ => Default}/VBA/Information/UBound.md (100%) rename docs/Reference/{ => Default}/VBA/Information/VarPtr.md (100%) rename docs/Reference/{ => Default}/VBA/Information/VarType.md (100%) rename docs/Reference/{ => Default}/VBA/Information/index.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/AppActivate.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/Beep.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/CallByDispId.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/CallByName.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/Choose.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/Command.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/CreateObject.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/DeleteSetting.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/DoEvents.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/Environ.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/GetAllSettings.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/GetObject.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/GetSetting.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/IIf.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/If.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/InputBox.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/MsgBox.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/Partition.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/RaiseEventByName.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/RaiseEventByName2.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/SaveSetting.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/SendKeys.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/Shell.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/Switch.md (100%) rename docs/Reference/{ => Default}/VBA/Interaction/index.md (100%) rename docs/Reference/{ => Default}/VBA/Math/Abs.md (100%) rename docs/Reference/{ => Default}/VBA/Math/Atn.md (100%) rename docs/Reference/{ => Default}/VBA/Math/Cos.md (100%) rename docs/Reference/{ => Default}/VBA/Math/Exp.md (100%) rename docs/Reference/{ => Default}/VBA/Math/Log.md (100%) rename docs/Reference/{ => Default}/VBA/Math/Randomize.md (100%) rename docs/Reference/{ => Default}/VBA/Math/Rnd.md (100%) rename docs/Reference/{ => Default}/VBA/Math/Round.md (100%) rename docs/Reference/{ => Default}/VBA/Math/Sgn.md (100%) rename docs/Reference/{ => Default}/VBA/Math/Sin.md (100%) rename docs/Reference/{ => Default}/VBA/Math/Sqr.md (100%) rename docs/Reference/{ => Default}/VBA/Math/Tan.md (100%) rename docs/Reference/{ => Default}/VBA/Math/index.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/Asc.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/Chr.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/Filter.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/Format.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/FormatCurrency.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/FormatDateTime.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/FormatNumber.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/FormatPercent.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/InStr.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/InStrRev.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/Join.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/LCase.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/LTrim.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/Left.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/Len.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/Mid.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/MonthName.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/RTrim.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/Replace.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/Right.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/Space.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/Split.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/StrComp.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/StrConv.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/StrReverse.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/String.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/Trim.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/UCase.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/WeekdayName.md (100%) rename docs/Reference/{ => Default}/VBA/Strings/index.md (100%) rename docs/Reference/{ => Default}/VBA/TbExpressionService/AddCustomBinder.md (100%) rename docs/Reference/{ => Default}/VBA/TbExpressionService/AddCustomBinderObject.md (100%) rename docs/Reference/{ => Default}/VBA/TbExpressionService/AddStdLibraryBinder.md (100%) rename docs/Reference/{ => Default}/VBA/TbExpressionService/Bind.md (100%) rename docs/Reference/{ => Default}/VBA/TbExpressionService/Compile.md (100%) rename docs/Reference/{ => Default}/VBA/TbExpressionService/Evaluate.md (100%) rename docs/Reference/{ => Default}/VBA/TbExpressionService/index.md (100%) rename docs/Reference/{ => Default}/VBA/index.md (99%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/BackColor.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/DisplayAsDefault.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/DisplayName.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/Font.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/ForeColor.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/LocaleID.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/MessageReflect.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/Palette.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/RightToLeft.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/ScaleUnits.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/ShowGrabHandles.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/ShowHatching.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/SupportsMnemonics.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/TextAlign.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/UIDead.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/UserMode.md (100%) rename docs/Reference/{ => Default}/VBRUN/AmbientProperties/index.md (100%) rename docs/Reference/{ => Default}/VBRUN/AsyncProperty/AsyncType.md (100%) rename docs/Reference/{ => Default}/VBRUN/AsyncProperty/BytesMax.md (100%) rename docs/Reference/{ => Default}/VBRUN/AsyncProperty/BytesRead.md (100%) rename docs/Reference/{ => Default}/VBRUN/AsyncProperty/PropertyName.md (100%) rename docs/Reference/{ => Default}/VBRUN/AsyncProperty/Status.md (100%) rename docs/Reference/{ => Default}/VBRUN/AsyncProperty/StatusCode.md (100%) rename docs/Reference/{ => Default}/VBRUN/AsyncProperty/Target.md (100%) rename docs/Reference/{ => Default}/VBRUN/AsyncProperty/Value.md (100%) rename docs/Reference/{ => Default}/VBRUN/AsyncProperty/index.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/AlignConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/AlignmentConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/AlignmentConstantsNoCenter.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/AppearanceConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ApplicationStartConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/AspectTypeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/AsyncReadConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/AsyncStatusCodeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/AsyncTypeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/BackFillStyleConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/BorderStyleConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ButtonConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/CheckBoxConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ClipboardConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ColorConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ComboBoxConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ControlBorderStyleConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ControlBorderStyleConstantsCustom.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ControlTypeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/DataBOFconstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/DataEOFConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/DataErrorConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/DataValidateConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/DatabaseTypeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/DefaultCursorTypeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/DockModeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/DragConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/DragModeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/DragOverConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/DrawModeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/DrawStyleConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/FillStyleConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/FillStyleConstantsEx.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/FormArrangeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/FormBorderStyleConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/FormShowConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/FormWindowStateConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/HitResultConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/KeyCodeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/LinkModeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ListBoxConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/LoadPictureColorConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/LoadPictureSizeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/LoadResConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/LogEventTypeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/LogModeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/MenuAccelConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/MenuControlConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/MouseButtonConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/MousePointerConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/MultiSelectConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/NegotiatePositionConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/OLEContainerActivateConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/OLEContainerConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/OLEContainerDisplayTypeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/OLEContainerSizeModeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/OLEContainerTypesAllowedConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/OLEContainerUpdateOptionsConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/OLEDragConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/OLEDropConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/OLEDropEffectConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/OldLinkModeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/PaletteModeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ParentControlsType.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/PictureTypeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/PrinterObjectConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/PrinterObjectConstants_ColorMode.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/PrinterObjectConstants_Duplex.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/PrinterObjectConstants_Orientation.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/PrinterObjectConstants_PaperBin.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/PrinterObjectConstants_PaperSize.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/PrinterObjectConstants_PrintQuality.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/QueryUnloadConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/RasterOpConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/RecordsetTypeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ScaleModeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ScrollBarConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ShapeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ShiftConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ShortcutConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/StartUpPositionConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/StorageTypeContants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/SystemColorConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/VariantTypeConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/VerticalAlignmentConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/ZOrderConstants.md (100%) rename docs/Reference/{ => Default}/VBRUN/Constants/index.md (100%) rename docs/Reference/{ => Default}/VBRUN/ContainedControls/index.md (100%) rename docs/Reference/{ => Default}/VBRUN/DataMembers/index.md (100%) rename docs/Reference/{ => Default}/VBRUN/DataObject/AvailableFormats.md (100%) rename docs/Reference/{ => Default}/VBRUN/DataObject/Clear.md (100%) rename docs/Reference/{ => Default}/VBRUN/DataObject/DataObjectFiles.md (100%) rename docs/Reference/{ => Default}/VBRUN/DataObject/DataObjectFormat.md (100%) rename docs/Reference/{ => Default}/VBRUN/DataObject/DataObjectFormats.md (100%) rename docs/Reference/{ => Default}/VBRUN/DataObject/Files.md (100%) rename docs/Reference/{ => Default}/VBRUN/DataObject/GetData.md (100%) rename docs/Reference/{ => Default}/VBRUN/DataObject/GetDataByName.md (100%) rename docs/Reference/{ => Default}/VBRUN/DataObject/GetFormat.md (100%) rename docs/Reference/{ => Default}/VBRUN/DataObject/GetFormatByName.md (100%) rename docs/Reference/{ => Default}/VBRUN/DataObject/SetData.md (100%) rename docs/Reference/{ => Default}/VBRUN/DataObject/index.md (100%) rename docs/Reference/{ => Default}/VBRUN/ErrorCallstack/index.md (100%) rename docs/Reference/{ => Default}/VBRUN/ErrorContext/index.md (100%) rename docs/Reference/{ => Default}/VBRUN/ErrorStackFrame/index.md (100%) rename docs/Reference/{ => Default}/VBRUN/Hyperlink/index.md (100%) rename docs/Reference/{ => Default}/VBRUN/ParentControls/index.md (100%) rename docs/Reference/{ => Default}/VBRUN/PropertyBag/index.md (100%) rename docs/Reference/{ => Default}/VBRUN/index.md (99%) diff --git a/docs/Reference/Built-In.md b/docs/Reference/Built-In.md new file mode 100644 index 00000000..822ecf88 --- /dev/null +++ b/docs/Reference/Built-In.md @@ -0,0 +1,21 @@ +--- +title: Built-In Packages +parent: Packages +nav_order: 2 +permalink: /tB/Packages/Built-In/ +has_toc: false +--- + +# Built-In Packages + +These packages are built into twinBASIC and are always available, even offline. To use them, add them to Project → References (Ctrl-T) → Available Packages. + +- [Assert Package](../Assert/) -- assertion functions for unit tests -- three modules (**Exact**, **Strict**, **Permissive**) sharing the same fifteen-member API with different comparison strictness +- [CustomControls Package](../CustomControls/) -- owner-drawn `Waynes…` custom controls (button, form, frame, grid, label, slider, textbox, timer), the shared `Styles/` helpers that paint them, and the DESIGNER framework (interfaces, callback objects, **Canvas**, **SerializeInfo**) for authoring new custom controls +- [CEF Package](../CEF/) -- the **CefBrowser** control wrapping the Chromium Embedded Framework: cross-platform-ready browser embedding with a choice of three Chromium runtimes (v49 / v109 / v145); currently in BETA +- [WebView2 Package](../WebView2/) -- the **WebView2** control wrapping the Microsoft Edge runtime, plus its surrounding wrapper objects (request / response / headers / environment options) and the `wv2…` enumerations +- [WinEventLogLib Package](../WinEventLogLib/) -- writes Windows Event Log entries from twinBASIC; the generic **EventLog**(*Of EventIds, Categories*) class handles registration, registry setup, and the per-event `ReportEventW` call, with message-table resources for *EventIds* and *Categories* synthesised into the EXE at compile time +- [WinNamedPipesLib Package](../WinNamedPipesLib/) -- Windows named pipes as twinBASIC objects with an asynchronous IOCP-driven I/O model; **NamedPipeServer** + **NamedPipeServerConnection** on the host side, **NamedPipeClientManager** + **NamedPipeClientConnection** on the client side, with message-boundary semantics and a cookie-based correlation pattern across `AsyncRead` / `AsyncWrite` and their matching events +- [WinServicesLib Package](../WinServicesLib/) -- runs a twinBASIC EXE as one or more Windows services; the **Services** singleton coordinates configuration, install / uninstall, and the SCM dispatcher loop, while user-implemented **ITbService** classes are instantiated through **ServiceCreator**`(Of T)` +- [tbIDE Package](../tbIDE/) -- the **addin SDK** for the twinBASIC IDE: every addin is a Standard DLL that exports `tbCreateCompilerAddin`, returns an object implementing the **AddIn** contract, and from there reaches the IDE's toolbar, tool-window DOM, virtual file system, debug console, current project, keyboard shortcuts, and themes +- [WinNativeCommonCtls Package](../WinNativeCommonCtls/) -- VB6-compatible replacement for **Microsoft Common Controls 6.0** (`MSCOMCTL.OCX`) built on top of the Win32 ComCtl32 controls: eight controls (**DTPicker**, **ImageList**, **ListView**, **MonthView**, **ProgressBar**, **Slider**, **TreeView**, **UpDown**) with the original member names preserved, plus the collection sub-objects and user-facing enumerations diff --git a/docs/Reference/Assert/Exact.md b/docs/Reference/Built-In/Assert/Exact.md similarity index 100% rename from docs/Reference/Assert/Exact.md rename to docs/Reference/Built-In/Assert/Exact.md diff --git a/docs/Reference/Assert/Permissive.md b/docs/Reference/Built-In/Assert/Permissive.md similarity index 100% rename from docs/Reference/Assert/Permissive.md rename to docs/Reference/Built-In/Assert/Permissive.md diff --git a/docs/Reference/Assert/Strict.md b/docs/Reference/Built-In/Assert/Strict.md similarity index 100% rename from docs/Reference/Assert/Strict.md rename to docs/Reference/Built-In/Assert/Strict.md diff --git a/docs/Reference/Assert/index.md b/docs/Reference/Built-In/Assert/index.md similarity index 99% rename from docs/Reference/Assert/index.md rename to docs/Reference/Built-In/Assert/index.md index d1282c67..b73c12c1 100644 --- a/docs/Reference/Assert/index.md +++ b/docs/Reference/Built-In/Assert/index.md @@ -1,6 +1,6 @@ --- title: Assert Package -parent: Packages +parent: Built-In Packages nav_order: 4 permalink: /tB/Packages/Assert/ has_toc: false diff --git a/docs/Reference/CEF/CefBrowser/EnvironmentOptions.md b/docs/Reference/Built-In/CEF/CefBrowser/EnvironmentOptions.md similarity index 100% rename from docs/Reference/CEF/CefBrowser/EnvironmentOptions.md rename to docs/Reference/Built-In/CEF/CefBrowser/EnvironmentOptions.md diff --git a/docs/Reference/CEF/CefBrowser/index.md b/docs/Reference/Built-In/CEF/CefBrowser/index.md similarity index 100% rename from docs/Reference/CEF/CefBrowser/index.md rename to docs/Reference/Built-In/CEF/CefBrowser/index.md diff --git a/docs/Reference/CEF/Enumerations/CefLogSeverity.md b/docs/Reference/Built-In/CEF/Enumerations/CefLogSeverity.md similarity index 100% rename from docs/Reference/CEF/Enumerations/CefLogSeverity.md rename to docs/Reference/Built-In/CEF/Enumerations/CefLogSeverity.md diff --git a/docs/Reference/CEF/Enumerations/cefPrintOrientation.md b/docs/Reference/Built-In/CEF/Enumerations/cefPrintOrientation.md similarity index 100% rename from docs/Reference/CEF/Enumerations/cefPrintOrientation.md rename to docs/Reference/Built-In/CEF/Enumerations/cefPrintOrientation.md diff --git a/docs/Reference/CEF/Enumerations/index.md b/docs/Reference/Built-In/CEF/Enumerations/index.md similarity index 100% rename from docs/Reference/CEF/Enumerations/index.md rename to docs/Reference/Built-In/CEF/Enumerations/index.md diff --git a/docs/Reference/CEF/index.md b/docs/Reference/Built-In/CEF/index.md similarity index 99% rename from docs/Reference/CEF/index.md rename to docs/Reference/Built-In/CEF/index.md index 7ec5501c..2039f47c 100644 --- a/docs/Reference/CEF/index.md +++ b/docs/Reference/Built-In/CEF/index.md @@ -1,6 +1,6 @@ --- title: CEF Package -parent: Packages +parent: Built-In Packages nav_order: 6 permalink: /tB/Packages/CEF/ has_toc: false diff --git a/docs/Reference/CustomControls/Enumerations/BorderStyle.md b/docs/Reference/Built-In/CustomControls/Enumerations/BorderStyle.md similarity index 100% rename from docs/Reference/CustomControls/Enumerations/BorderStyle.md rename to docs/Reference/Built-In/CustomControls/Enumerations/BorderStyle.md diff --git a/docs/Reference/CustomControls/Enumerations/ColorRGBA.md b/docs/Reference/Built-In/CustomControls/Enumerations/ColorRGBA.md similarity index 100% rename from docs/Reference/CustomControls/Enumerations/ColorRGBA.md rename to docs/Reference/Built-In/CustomControls/Enumerations/ColorRGBA.md diff --git a/docs/Reference/CustomControls/Enumerations/CornerShape.md b/docs/Reference/Built-In/CustomControls/Enumerations/CornerShape.md similarity index 100% rename from docs/Reference/CustomControls/Enumerations/CornerShape.md rename to docs/Reference/Built-In/CustomControls/Enumerations/CornerShape.md diff --git a/docs/Reference/CustomControls/Enumerations/Customtate.md b/docs/Reference/Built-In/CustomControls/Enumerations/Customtate.md similarity index 100% rename from docs/Reference/CustomControls/Enumerations/Customtate.md rename to docs/Reference/Built-In/CustomControls/Enumerations/Customtate.md diff --git a/docs/Reference/CustomControls/Enumerations/DockMode.md b/docs/Reference/Built-In/CustomControls/Enumerations/DockMode.md similarity index 100% rename from docs/Reference/CustomControls/Enumerations/DockMode.md rename to docs/Reference/Built-In/CustomControls/Enumerations/DockMode.md diff --git a/docs/Reference/CustomControls/Enumerations/FillPattern.md b/docs/Reference/Built-In/CustomControls/Enumerations/FillPattern.md similarity index 100% rename from docs/Reference/CustomControls/Enumerations/FillPattern.md rename to docs/Reference/Built-In/CustomControls/Enumerations/FillPattern.md diff --git a/docs/Reference/CustomControls/Enumerations/FontWeight.md b/docs/Reference/Built-In/CustomControls/Enumerations/FontWeight.md similarity index 100% rename from docs/Reference/CustomControls/Enumerations/FontWeight.md rename to docs/Reference/Built-In/CustomControls/Enumerations/FontWeight.md diff --git a/docs/Reference/CustomControls/Enumerations/PixelCount.md b/docs/Reference/Built-In/CustomControls/Enumerations/PixelCount.md similarity index 100% rename from docs/Reference/CustomControls/Enumerations/PixelCount.md rename to docs/Reference/Built-In/CustomControls/Enumerations/PixelCount.md diff --git a/docs/Reference/CustomControls/Enumerations/PointSize.md b/docs/Reference/Built-In/CustomControls/Enumerations/PointSize.md similarity index 100% rename from docs/Reference/CustomControls/Enumerations/PointSize.md rename to docs/Reference/Built-In/CustomControls/Enumerations/PointSize.md diff --git a/docs/Reference/CustomControls/Enumerations/StartupPosition.md b/docs/Reference/Built-In/CustomControls/Enumerations/StartupPosition.md similarity index 100% rename from docs/Reference/CustomControls/Enumerations/StartupPosition.md rename to docs/Reference/Built-In/CustomControls/Enumerations/StartupPosition.md diff --git a/docs/Reference/CustomControls/Enumerations/TextAlignment.md b/docs/Reference/Built-In/CustomControls/Enumerations/TextAlignment.md similarity index 100% rename from docs/Reference/CustomControls/Enumerations/TextAlignment.md rename to docs/Reference/Built-In/CustomControls/Enumerations/TextAlignment.md diff --git a/docs/Reference/CustomControls/Enumerations/TextOverflowMode.md b/docs/Reference/Built-In/CustomControls/Enumerations/TextOverflowMode.md similarity index 100% rename from docs/Reference/CustomControls/Enumerations/TextOverflowMode.md rename to docs/Reference/Built-In/CustomControls/Enumerations/TextOverflowMode.md diff --git a/docs/Reference/CustomControls/Enumerations/WindowState.md b/docs/Reference/Built-In/CustomControls/Enumerations/WindowState.md similarity index 100% rename from docs/Reference/CustomControls/Enumerations/WindowState.md rename to docs/Reference/Built-In/CustomControls/Enumerations/WindowState.md diff --git a/docs/Reference/CustomControls/Enumerations/index.md b/docs/Reference/Built-In/CustomControls/Enumerations/index.md similarity index 100% rename from docs/Reference/CustomControls/Enumerations/index.md rename to docs/Reference/Built-In/CustomControls/Enumerations/index.md diff --git a/docs/Reference/CustomControls/Framework/Canvas.md b/docs/Reference/Built-In/CustomControls/Framework/Canvas.md similarity index 100% rename from docs/Reference/CustomControls/Framework/Canvas.md rename to docs/Reference/Built-In/CustomControls/Framework/Canvas.md diff --git a/docs/Reference/CustomControls/Framework/CustomControlContext.md b/docs/Reference/Built-In/CustomControls/Framework/CustomControlContext.md similarity index 100% rename from docs/Reference/CustomControls/Framework/CustomControlContext.md rename to docs/Reference/Built-In/CustomControls/Framework/CustomControlContext.md diff --git a/docs/Reference/CustomControls/Framework/CustomControlTimer.md b/docs/Reference/Built-In/CustomControls/Framework/CustomControlTimer.md similarity index 100% rename from docs/Reference/CustomControls/Framework/CustomControlTimer.md rename to docs/Reference/Built-In/CustomControls/Framework/CustomControlTimer.md diff --git a/docs/Reference/CustomControls/Framework/CustomControlsCollection.md b/docs/Reference/Built-In/CustomControls/Framework/CustomControlsCollection.md similarity index 100% rename from docs/Reference/CustomControls/Framework/CustomControlsCollection.md rename to docs/Reference/Built-In/CustomControls/Framework/CustomControlsCollection.md diff --git a/docs/Reference/CustomControls/Framework/CustomFormContext.md b/docs/Reference/Built-In/CustomControls/Framework/CustomFormContext.md similarity index 100% rename from docs/Reference/CustomControls/Framework/CustomFormContext.md rename to docs/Reference/Built-In/CustomControls/Framework/CustomFormContext.md diff --git a/docs/Reference/CustomControls/Framework/ICustomControl.md b/docs/Reference/Built-In/CustomControls/Framework/ICustomControl.md similarity index 100% rename from docs/Reference/CustomControls/Framework/ICustomControl.md rename to docs/Reference/Built-In/CustomControls/Framework/ICustomControl.md diff --git a/docs/Reference/CustomControls/Framework/ICustomForm.md b/docs/Reference/Built-In/CustomControls/Framework/ICustomForm.md similarity index 100% rename from docs/Reference/CustomControls/Framework/ICustomForm.md rename to docs/Reference/Built-In/CustomControls/Framework/ICustomForm.md diff --git a/docs/Reference/CustomControls/Framework/SerializeInfo.md b/docs/Reference/Built-In/CustomControls/Framework/SerializeInfo.md similarity index 100% rename from docs/Reference/CustomControls/Framework/SerializeInfo.md rename to docs/Reference/Built-In/CustomControls/Framework/SerializeInfo.md diff --git a/docs/Reference/CustomControls/Framework/index.md b/docs/Reference/Built-In/CustomControls/Framework/index.md similarity index 100% rename from docs/Reference/CustomControls/Framework/index.md rename to docs/Reference/Built-In/CustomControls/Framework/index.md diff --git a/docs/Reference/CustomControls/Styles/Anchors.md b/docs/Reference/Built-In/CustomControls/Styles/Anchors.md similarity index 100% rename from docs/Reference/CustomControls/Styles/Anchors.md rename to docs/Reference/Built-In/CustomControls/Styles/Anchors.md diff --git a/docs/Reference/CustomControls/Styles/Borders.md b/docs/Reference/Built-In/CustomControls/Styles/Borders.md similarity index 100% rename from docs/Reference/CustomControls/Styles/Borders.md rename to docs/Reference/Built-In/CustomControls/Styles/Borders.md diff --git a/docs/Reference/CustomControls/Styles/Corners.md b/docs/Reference/Built-In/CustomControls/Styles/Corners.md similarity index 100% rename from docs/Reference/CustomControls/Styles/Corners.md rename to docs/Reference/Built-In/CustomControls/Styles/Corners.md diff --git a/docs/Reference/CustomControls/Styles/Fill.md b/docs/Reference/Built-In/CustomControls/Styles/Fill.md similarity index 100% rename from docs/Reference/CustomControls/Styles/Fill.md rename to docs/Reference/Built-In/CustomControls/Styles/Fill.md diff --git a/docs/Reference/CustomControls/Styles/Line.md b/docs/Reference/Built-In/CustomControls/Styles/Line.md similarity index 100% rename from docs/Reference/CustomControls/Styles/Line.md rename to docs/Reference/Built-In/CustomControls/Styles/Line.md diff --git a/docs/Reference/CustomControls/Styles/Padding.md b/docs/Reference/Built-In/CustomControls/Styles/Padding.md similarity index 100% rename from docs/Reference/CustomControls/Styles/Padding.md rename to docs/Reference/Built-In/CustomControls/Styles/Padding.md diff --git a/docs/Reference/CustomControls/Styles/TextRendering.md b/docs/Reference/Built-In/CustomControls/Styles/TextRendering.md similarity index 100% rename from docs/Reference/CustomControls/Styles/TextRendering.md rename to docs/Reference/Built-In/CustomControls/Styles/TextRendering.md diff --git a/docs/Reference/CustomControls/Styles/index.md b/docs/Reference/Built-In/CustomControls/Styles/index.md similarity index 100% rename from docs/Reference/CustomControls/Styles/index.md rename to docs/Reference/Built-In/CustomControls/Styles/index.md diff --git a/docs/Reference/CustomControls/WaynesButton/WaynesButtonState.md b/docs/Reference/Built-In/CustomControls/WaynesButton/WaynesButtonState.md similarity index 100% rename from docs/Reference/CustomControls/WaynesButton/WaynesButtonState.md rename to docs/Reference/Built-In/CustomControls/WaynesButton/WaynesButtonState.md diff --git a/docs/Reference/CustomControls/WaynesButton/index.md b/docs/Reference/Built-In/CustomControls/WaynesButton/index.md similarity index 100% rename from docs/Reference/CustomControls/WaynesButton/index.md rename to docs/Reference/Built-In/CustomControls/WaynesButton/index.md diff --git a/docs/Reference/CustomControls/WaynesForm/WindowsFormOptions.md b/docs/Reference/Built-In/CustomControls/WaynesForm/WindowsFormOptions.md similarity index 100% rename from docs/Reference/CustomControls/WaynesForm/WindowsFormOptions.md rename to docs/Reference/Built-In/CustomControls/WaynesForm/WindowsFormOptions.md diff --git a/docs/Reference/CustomControls/WaynesForm/index.md b/docs/Reference/Built-In/CustomControls/WaynesForm/index.md similarity index 100% rename from docs/Reference/CustomControls/WaynesForm/index.md rename to docs/Reference/Built-In/CustomControls/WaynesForm/index.md diff --git a/docs/Reference/CustomControls/WaynesFrame.md b/docs/Reference/Built-In/CustomControls/WaynesFrame.md similarity index 100% rename from docs/Reference/CustomControls/WaynesFrame.md rename to docs/Reference/Built-In/CustomControls/WaynesFrame.md diff --git a/docs/Reference/CustomControls/WaynesGrid/CellRenderingOptions.md b/docs/Reference/Built-In/CustomControls/WaynesGrid/CellRenderingOptions.md similarity index 100% rename from docs/Reference/CustomControls/WaynesGrid/CellRenderingOptions.md rename to docs/Reference/Built-In/CustomControls/WaynesGrid/CellRenderingOptions.md diff --git a/docs/Reference/CustomControls/WaynesGrid/Column.md b/docs/Reference/Built-In/CustomControls/WaynesGrid/Column.md similarity index 100% rename from docs/Reference/CustomControls/WaynesGrid/Column.md rename to docs/Reference/Built-In/CustomControls/WaynesGrid/Column.md diff --git a/docs/Reference/CustomControls/WaynesGrid/index.md b/docs/Reference/Built-In/CustomControls/WaynesGrid/index.md similarity index 100% rename from docs/Reference/CustomControls/WaynesGrid/index.md rename to docs/Reference/Built-In/CustomControls/WaynesGrid/index.md diff --git a/docs/Reference/CustomControls/WaynesLabel.md b/docs/Reference/Built-In/CustomControls/WaynesLabel.md similarity index 100% rename from docs/Reference/CustomControls/WaynesLabel.md rename to docs/Reference/Built-In/CustomControls/WaynesLabel.md diff --git a/docs/Reference/CustomControls/WaynesSlider/WaynesSliderState.md b/docs/Reference/Built-In/CustomControls/WaynesSlider/WaynesSliderState.md similarity index 100% rename from docs/Reference/CustomControls/WaynesSlider/WaynesSliderState.md rename to docs/Reference/Built-In/CustomControls/WaynesSlider/WaynesSliderState.md diff --git a/docs/Reference/CustomControls/WaynesSlider/index.md b/docs/Reference/Built-In/CustomControls/WaynesSlider/index.md similarity index 100% rename from docs/Reference/CustomControls/WaynesSlider/index.md rename to docs/Reference/Built-In/CustomControls/WaynesSlider/index.md diff --git a/docs/Reference/CustomControls/WaynesTextBox/WaynesTextBoxState.md b/docs/Reference/Built-In/CustomControls/WaynesTextBox/WaynesTextBoxState.md similarity index 100% rename from docs/Reference/CustomControls/WaynesTextBox/WaynesTextBoxState.md rename to docs/Reference/Built-In/CustomControls/WaynesTextBox/WaynesTextBoxState.md diff --git a/docs/Reference/CustomControls/WaynesTextBox/index.md b/docs/Reference/Built-In/CustomControls/WaynesTextBox/index.md similarity index 100% rename from docs/Reference/CustomControls/WaynesTextBox/index.md rename to docs/Reference/Built-In/CustomControls/WaynesTextBox/index.md diff --git a/docs/Reference/CustomControls/WaynesTimer.md b/docs/Reference/Built-In/CustomControls/WaynesTimer.md similarity index 100% rename from docs/Reference/CustomControls/WaynesTimer.md rename to docs/Reference/Built-In/CustomControls/WaynesTimer.md diff --git a/docs/Reference/CustomControls/index.md b/docs/Reference/Built-In/CustomControls/index.md similarity index 99% rename from docs/Reference/CustomControls/index.md rename to docs/Reference/Built-In/CustomControls/index.md index 37e44567..0d3cb24b 100644 --- a/docs/Reference/CustomControls/index.md +++ b/docs/Reference/Built-In/CustomControls/index.md @@ -1,6 +1,6 @@ --- title: CustomControls Package -parent: Packages +parent: Built-In Packages nav_order: 5 permalink: /tB/Packages/CustomControls/ has_toc: false diff --git a/docs/Reference/WebView2/Enumerations/index.md b/docs/Reference/Built-In/WebView2/Enumerations/index.md similarity index 100% rename from docs/Reference/WebView2/Enumerations/index.md rename to docs/Reference/Built-In/WebView2/Enumerations/index.md diff --git a/docs/Reference/WebView2/Enumerations/wv2DefaultDownloadCornerAlign.md b/docs/Reference/Built-In/WebView2/Enumerations/wv2DefaultDownloadCornerAlign.md similarity index 100% rename from docs/Reference/WebView2/Enumerations/wv2DefaultDownloadCornerAlign.md rename to docs/Reference/Built-In/WebView2/Enumerations/wv2DefaultDownloadCornerAlign.md diff --git a/docs/Reference/WebView2/Enumerations/wv2ErrorStatus.md b/docs/Reference/Built-In/WebView2/Enumerations/wv2ErrorStatus.md similarity index 100% rename from docs/Reference/WebView2/Enumerations/wv2ErrorStatus.md rename to docs/Reference/Built-In/WebView2/Enumerations/wv2ErrorStatus.md diff --git a/docs/Reference/WebView2/Enumerations/wv2HostResourceAccessKind.md b/docs/Reference/Built-In/WebView2/Enumerations/wv2HostResourceAccessKind.md similarity index 100% rename from docs/Reference/WebView2/Enumerations/wv2HostResourceAccessKind.md rename to docs/Reference/Built-In/WebView2/Enumerations/wv2HostResourceAccessKind.md diff --git a/docs/Reference/WebView2/Enumerations/wv2KeyEventKind.md b/docs/Reference/Built-In/WebView2/Enumerations/wv2KeyEventKind.md similarity index 100% rename from docs/Reference/WebView2/Enumerations/wv2KeyEventKind.md rename to docs/Reference/Built-In/WebView2/Enumerations/wv2KeyEventKind.md diff --git a/docs/Reference/WebView2/Enumerations/wv2PermissionKind.md b/docs/Reference/Built-In/WebView2/Enumerations/wv2PermissionKind.md similarity index 100% rename from docs/Reference/WebView2/Enumerations/wv2PermissionKind.md rename to docs/Reference/Built-In/WebView2/Enumerations/wv2PermissionKind.md diff --git a/docs/Reference/WebView2/Enumerations/wv2PermissionState.md b/docs/Reference/Built-In/WebView2/Enumerations/wv2PermissionState.md similarity index 100% rename from docs/Reference/WebView2/Enumerations/wv2PermissionState.md rename to docs/Reference/Built-In/WebView2/Enumerations/wv2PermissionState.md diff --git a/docs/Reference/WebView2/Enumerations/wv2PrintOrientation.md b/docs/Reference/Built-In/WebView2/Enumerations/wv2PrintOrientation.md similarity index 100% rename from docs/Reference/WebView2/Enumerations/wv2PrintOrientation.md rename to docs/Reference/Built-In/WebView2/Enumerations/wv2PrintOrientation.md diff --git a/docs/Reference/WebView2/Enumerations/wv2ProcessFailedKind.md b/docs/Reference/Built-In/WebView2/Enumerations/wv2ProcessFailedKind.md similarity index 100% rename from docs/Reference/WebView2/Enumerations/wv2ProcessFailedKind.md rename to docs/Reference/Built-In/WebView2/Enumerations/wv2ProcessFailedKind.md diff --git a/docs/Reference/WebView2/Enumerations/wv2ScriptDialogKind.md b/docs/Reference/Built-In/WebView2/Enumerations/wv2ScriptDialogKind.md similarity index 100% rename from docs/Reference/WebView2/Enumerations/wv2ScriptDialogKind.md rename to docs/Reference/Built-In/WebView2/Enumerations/wv2ScriptDialogKind.md diff --git a/docs/Reference/WebView2/Enumerations/wv2WebResourceContext.md b/docs/Reference/Built-In/WebView2/Enumerations/wv2WebResourceContext.md similarity index 100% rename from docs/Reference/WebView2/Enumerations/wv2WebResourceContext.md rename to docs/Reference/Built-In/WebView2/Enumerations/wv2WebResourceContext.md diff --git a/docs/Reference/WebView2/Types/COREWEBVIEW2_PHYSICAL_KEY_STATUS.md b/docs/Reference/Built-In/WebView2/Types/COREWEBVIEW2_PHYSICAL_KEY_STATUS.md similarity index 100% rename from docs/Reference/WebView2/Types/COREWEBVIEW2_PHYSICAL_KEY_STATUS.md rename to docs/Reference/Built-In/WebView2/Types/COREWEBVIEW2_PHYSICAL_KEY_STATUS.md diff --git a/docs/Reference/WebView2/Types/index.md b/docs/Reference/Built-In/WebView2/Types/index.md similarity index 100% rename from docs/Reference/WebView2/Types/index.md rename to docs/Reference/Built-In/WebView2/Types/index.md diff --git a/docs/Reference/WebView2/WebView2/EnvironmentOptions.md b/docs/Reference/Built-In/WebView2/WebView2/EnvironmentOptions.md similarity index 100% rename from docs/Reference/WebView2/WebView2/EnvironmentOptions.md rename to docs/Reference/Built-In/WebView2/WebView2/EnvironmentOptions.md diff --git a/docs/Reference/WebView2/WebView2/index.md b/docs/Reference/Built-In/WebView2/WebView2/index.md similarity index 100% rename from docs/Reference/WebView2/WebView2/index.md rename to docs/Reference/Built-In/WebView2/WebView2/index.md diff --git a/docs/Reference/WebView2/WebView2Header.md b/docs/Reference/Built-In/WebView2/WebView2Header.md similarity index 100% rename from docs/Reference/WebView2/WebView2Header.md rename to docs/Reference/Built-In/WebView2/WebView2Header.md diff --git a/docs/Reference/WebView2/WebView2HeadersCollection.md b/docs/Reference/Built-In/WebView2/WebView2HeadersCollection.md similarity index 100% rename from docs/Reference/WebView2/WebView2HeadersCollection.md rename to docs/Reference/Built-In/WebView2/WebView2HeadersCollection.md diff --git a/docs/Reference/WebView2/WebView2Request.md b/docs/Reference/Built-In/WebView2/WebView2Request.md similarity index 100% rename from docs/Reference/WebView2/WebView2Request.md rename to docs/Reference/Built-In/WebView2/WebView2Request.md diff --git a/docs/Reference/WebView2/WebView2RequestHeaders.md b/docs/Reference/Built-In/WebView2/WebView2RequestHeaders.md similarity index 100% rename from docs/Reference/WebView2/WebView2RequestHeaders.md rename to docs/Reference/Built-In/WebView2/WebView2RequestHeaders.md diff --git a/docs/Reference/WebView2/WebView2Response.md b/docs/Reference/Built-In/WebView2/WebView2Response.md similarity index 100% rename from docs/Reference/WebView2/WebView2Response.md rename to docs/Reference/Built-In/WebView2/WebView2Response.md diff --git a/docs/Reference/WebView2/WebView2ResponseHeaders.md b/docs/Reference/Built-In/WebView2/WebView2ResponseHeaders.md similarity index 100% rename from docs/Reference/WebView2/WebView2ResponseHeaders.md rename to docs/Reference/Built-In/WebView2/WebView2ResponseHeaders.md diff --git a/docs/Reference/WebView2/index.md b/docs/Reference/Built-In/WebView2/index.md similarity index 99% rename from docs/Reference/WebView2/index.md rename to docs/Reference/Built-In/WebView2/index.md index 4b099774..ab26fa63 100644 --- a/docs/Reference/WebView2/index.md +++ b/docs/Reference/Built-In/WebView2/index.md @@ -1,6 +1,6 @@ --- title: WebView2 Package -parent: Packages +parent: Built-In Packages nav_order: 7 permalink: /tB/Packages/WebView2/ has_toc: false diff --git a/docs/Reference/WinEventLogLib/EventLog.md b/docs/Reference/Built-In/WinEventLogLib/EventLog.md similarity index 100% rename from docs/Reference/WinEventLogLib/EventLog.md rename to docs/Reference/Built-In/WinEventLogLib/EventLog.md diff --git a/docs/Reference/WinEventLogLib/EventLogHelperPublic.md b/docs/Reference/Built-In/WinEventLogLib/EventLogHelperPublic.md similarity index 100% rename from docs/Reference/WinEventLogLib/EventLogHelperPublic.md rename to docs/Reference/Built-In/WinEventLogLib/EventLogHelperPublic.md diff --git a/docs/Reference/WinEventLogLib/index.md b/docs/Reference/Built-In/WinEventLogLib/index.md similarity index 99% rename from docs/Reference/WinEventLogLib/index.md rename to docs/Reference/Built-In/WinEventLogLib/index.md index 9318a61f..46890103 100644 --- a/docs/Reference/WinEventLogLib/index.md +++ b/docs/Reference/Built-In/WinEventLogLib/index.md @@ -1,6 +1,6 @@ --- title: WinEventLogLib Package -parent: Packages +parent: Built-In Packages nav_order: 8 permalink: /tB/Packages/WinEventLogLib/ has_toc: false diff --git a/docs/Reference/WinNamedPipesLib/NamedPipeClientConnection.md b/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeClientConnection.md similarity index 100% rename from docs/Reference/WinNamedPipesLib/NamedPipeClientConnection.md rename to docs/Reference/Built-In/WinNamedPipesLib/NamedPipeClientConnection.md diff --git a/docs/Reference/WinNamedPipesLib/NamedPipeClientManager.md b/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeClientManager.md similarity index 100% rename from docs/Reference/WinNamedPipesLib/NamedPipeClientManager.md rename to docs/Reference/Built-In/WinNamedPipesLib/NamedPipeClientManager.md diff --git a/docs/Reference/WinNamedPipesLib/NamedPipeServer.md b/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeServer.md similarity index 100% rename from docs/Reference/WinNamedPipesLib/NamedPipeServer.md rename to docs/Reference/Built-In/WinNamedPipesLib/NamedPipeServer.md diff --git a/docs/Reference/WinNamedPipesLib/NamedPipeServerConnection.md b/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeServerConnection.md similarity index 100% rename from docs/Reference/WinNamedPipesLib/NamedPipeServerConnection.md rename to docs/Reference/Built-In/WinNamedPipesLib/NamedPipeServerConnection.md diff --git a/docs/Reference/WinNamedPipesLib/index.md b/docs/Reference/Built-In/WinNamedPipesLib/index.md similarity index 99% rename from docs/Reference/WinNamedPipesLib/index.md rename to docs/Reference/Built-In/WinNamedPipesLib/index.md index f521658d..15c0516a 100644 --- a/docs/Reference/WinNamedPipesLib/index.md +++ b/docs/Reference/Built-In/WinNamedPipesLib/index.md @@ -1,6 +1,6 @@ --- title: WinNamedPipesLib Package -parent: Packages +parent: Built-In Packages nav_order: 9 permalink: /tB/Packages/WinNamedPipesLib/ has_toc: false diff --git a/docs/Reference/WinNativeCommonCtls/DTPicker.md b/docs/Reference/Built-In/WinNativeCommonCtls/DTPicker.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/DTPicker.md rename to docs/Reference/Built-In/WinNativeCommonCtls/DTPicker.md diff --git a/docs/Reference/WinNativeCommonCtls/Enumerations/DTPickerFormatConstants.md b/docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/DTPickerFormatConstants.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/Enumerations/DTPickerFormatConstants.md rename to docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/DTPickerFormatConstants.md diff --git a/docs/Reference/WinNativeCommonCtls/Enumerations/ImlDrawConstants.md b/docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/ImlDrawConstants.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/Enumerations/ImlDrawConstants.md rename to docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/ImlDrawConstants.md diff --git a/docs/Reference/WinNativeCommonCtls/Enumerations/OrientationConstants.md b/docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/OrientationConstants.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/Enumerations/OrientationConstants.md rename to docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/OrientationConstants.md diff --git a/docs/Reference/WinNativeCommonCtls/Enumerations/TreeBorderStyleConstants.md b/docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/TreeBorderStyleConstants.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/Enumerations/TreeBorderStyleConstants.md rename to docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/TreeBorderStyleConstants.md diff --git a/docs/Reference/WinNativeCommonCtls/Enumerations/TreeLabelEditConstants.md b/docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/TreeLabelEditConstants.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/Enumerations/TreeLabelEditConstants.md rename to docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/TreeLabelEditConstants.md diff --git a/docs/Reference/WinNativeCommonCtls/Enumerations/TreeLineStyleConstants.md b/docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/TreeLineStyleConstants.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/Enumerations/TreeLineStyleConstants.md rename to docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/TreeLineStyleConstants.md diff --git a/docs/Reference/WinNativeCommonCtls/Enumerations/TreeRelationshipConstants.md b/docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/TreeRelationshipConstants.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/Enumerations/TreeRelationshipConstants.md rename to docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/TreeRelationshipConstants.md diff --git a/docs/Reference/WinNativeCommonCtls/Enumerations/TreeSortOrderConstants.md b/docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/TreeSortOrderConstants.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/Enumerations/TreeSortOrderConstants.md rename to docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/TreeSortOrderConstants.md diff --git a/docs/Reference/WinNativeCommonCtls/Enumerations/TreeSortTypeConstants.md b/docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/TreeSortTypeConstants.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/Enumerations/TreeSortTypeConstants.md rename to docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/TreeSortTypeConstants.md diff --git a/docs/Reference/WinNativeCommonCtls/Enumerations/TreeStyleConstants.md b/docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/TreeStyleConstants.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/Enumerations/TreeStyleConstants.md rename to docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/TreeStyleConstants.md diff --git a/docs/Reference/WinNativeCommonCtls/Enumerations/index.md b/docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/index.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/Enumerations/index.md rename to docs/Reference/Built-In/WinNativeCommonCtls/Enumerations/index.md diff --git a/docs/Reference/WinNativeCommonCtls/ImageList/ListImage.md b/docs/Reference/Built-In/WinNativeCommonCtls/ImageList/ListImage.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/ImageList/ListImage.md rename to docs/Reference/Built-In/WinNativeCommonCtls/ImageList/ListImage.md diff --git a/docs/Reference/WinNativeCommonCtls/ImageList/ListImages.md b/docs/Reference/Built-In/WinNativeCommonCtls/ImageList/ListImages.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/ImageList/ListImages.md rename to docs/Reference/Built-In/WinNativeCommonCtls/ImageList/ListImages.md diff --git a/docs/Reference/WinNativeCommonCtls/ImageList/index.md b/docs/Reference/Built-In/WinNativeCommonCtls/ImageList/index.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/ImageList/index.md rename to docs/Reference/Built-In/WinNativeCommonCtls/ImageList/index.md diff --git a/docs/Reference/WinNativeCommonCtls/ListView/ColumnHeader.md b/docs/Reference/Built-In/WinNativeCommonCtls/ListView/ColumnHeader.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/ListView/ColumnHeader.md rename to docs/Reference/Built-In/WinNativeCommonCtls/ListView/ColumnHeader.md diff --git a/docs/Reference/WinNativeCommonCtls/ListView/ColumnHeaders.md b/docs/Reference/Built-In/WinNativeCommonCtls/ListView/ColumnHeaders.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/ListView/ColumnHeaders.md rename to docs/Reference/Built-In/WinNativeCommonCtls/ListView/ColumnHeaders.md diff --git a/docs/Reference/WinNativeCommonCtls/ListView/ListItem.md b/docs/Reference/Built-In/WinNativeCommonCtls/ListView/ListItem.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/ListView/ListItem.md rename to docs/Reference/Built-In/WinNativeCommonCtls/ListView/ListItem.md diff --git a/docs/Reference/WinNativeCommonCtls/ListView/ListItems.md b/docs/Reference/Built-In/WinNativeCommonCtls/ListView/ListItems.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/ListView/ListItems.md rename to docs/Reference/Built-In/WinNativeCommonCtls/ListView/ListItems.md diff --git a/docs/Reference/WinNativeCommonCtls/ListView/index.md b/docs/Reference/Built-In/WinNativeCommonCtls/ListView/index.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/ListView/index.md rename to docs/Reference/Built-In/WinNativeCommonCtls/ListView/index.md diff --git a/docs/Reference/WinNativeCommonCtls/MonthView.md b/docs/Reference/Built-In/WinNativeCommonCtls/MonthView.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/MonthView.md rename to docs/Reference/Built-In/WinNativeCommonCtls/MonthView.md diff --git a/docs/Reference/WinNativeCommonCtls/ProgressBar.md b/docs/Reference/Built-In/WinNativeCommonCtls/ProgressBar.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/ProgressBar.md rename to docs/Reference/Built-In/WinNativeCommonCtls/ProgressBar.md diff --git a/docs/Reference/WinNativeCommonCtls/Slider.md b/docs/Reference/Built-In/WinNativeCommonCtls/Slider.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/Slider.md rename to docs/Reference/Built-In/WinNativeCommonCtls/Slider.md diff --git a/docs/Reference/WinNativeCommonCtls/TreeView/Node.md b/docs/Reference/Built-In/WinNativeCommonCtls/TreeView/Node.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/TreeView/Node.md rename to docs/Reference/Built-In/WinNativeCommonCtls/TreeView/Node.md diff --git a/docs/Reference/WinNativeCommonCtls/TreeView/Nodes.md b/docs/Reference/Built-In/WinNativeCommonCtls/TreeView/Nodes.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/TreeView/Nodes.md rename to docs/Reference/Built-In/WinNativeCommonCtls/TreeView/Nodes.md diff --git a/docs/Reference/WinNativeCommonCtls/TreeView/index.md b/docs/Reference/Built-In/WinNativeCommonCtls/TreeView/index.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/TreeView/index.md rename to docs/Reference/Built-In/WinNativeCommonCtls/TreeView/index.md diff --git a/docs/Reference/WinNativeCommonCtls/UpDown.md b/docs/Reference/Built-In/WinNativeCommonCtls/UpDown.md similarity index 100% rename from docs/Reference/WinNativeCommonCtls/UpDown.md rename to docs/Reference/Built-In/WinNativeCommonCtls/UpDown.md diff --git a/docs/Reference/WinNativeCommonCtls/index.md b/docs/Reference/Built-In/WinNativeCommonCtls/index.md similarity index 99% rename from docs/Reference/WinNativeCommonCtls/index.md rename to docs/Reference/Built-In/WinNativeCommonCtls/index.md index c6738b1f..476500d0 100644 --- a/docs/Reference/WinNativeCommonCtls/index.md +++ b/docs/Reference/Built-In/WinNativeCommonCtls/index.md @@ -1,6 +1,6 @@ --- title: WinNativeCommonCtls Package -parent: Packages +parent: Built-In Packages nav_order: 12 permalink: /tB/Packages/WinNativeCommonCtls/ has_toc: false diff --git a/docs/Reference/WinServicesLib/Enumerations/ServiceControlCodeConstants.md b/docs/Reference/Built-In/WinServicesLib/Enumerations/ServiceControlCodeConstants.md similarity index 100% rename from docs/Reference/WinServicesLib/Enumerations/ServiceControlCodeConstants.md rename to docs/Reference/Built-In/WinServicesLib/Enumerations/ServiceControlCodeConstants.md diff --git a/docs/Reference/WinServicesLib/Enumerations/ServiceStartConstants.md b/docs/Reference/Built-In/WinServicesLib/Enumerations/ServiceStartConstants.md similarity index 100% rename from docs/Reference/WinServicesLib/Enumerations/ServiceStartConstants.md rename to docs/Reference/Built-In/WinServicesLib/Enumerations/ServiceStartConstants.md diff --git a/docs/Reference/WinServicesLib/Enumerations/ServiceStatusConstants.md b/docs/Reference/Built-In/WinServicesLib/Enumerations/ServiceStatusConstants.md similarity index 100% rename from docs/Reference/WinServicesLib/Enumerations/ServiceStatusConstants.md rename to docs/Reference/Built-In/WinServicesLib/Enumerations/ServiceStatusConstants.md diff --git a/docs/Reference/WinServicesLib/Enumerations/ServiceTypeConstants.md b/docs/Reference/Built-In/WinServicesLib/Enumerations/ServiceTypeConstants.md similarity index 100% rename from docs/Reference/WinServicesLib/Enumerations/ServiceTypeConstants.md rename to docs/Reference/Built-In/WinServicesLib/Enumerations/ServiceTypeConstants.md diff --git a/docs/Reference/WinServicesLib/Enumerations/index.md b/docs/Reference/Built-In/WinServicesLib/Enumerations/index.md similarity index 100% rename from docs/Reference/WinServicesLib/Enumerations/index.md rename to docs/Reference/Built-In/WinServicesLib/Enumerations/index.md diff --git a/docs/Reference/WinServicesLib/ITbService.md b/docs/Reference/Built-In/WinServicesLib/ITbService.md similarity index 100% rename from docs/Reference/WinServicesLib/ITbService.md rename to docs/Reference/Built-In/WinServicesLib/ITbService.md diff --git a/docs/Reference/WinServicesLib/ServiceCreator.md b/docs/Reference/Built-In/WinServicesLib/ServiceCreator.md similarity index 100% rename from docs/Reference/WinServicesLib/ServiceCreator.md rename to docs/Reference/Built-In/WinServicesLib/ServiceCreator.md diff --git a/docs/Reference/WinServicesLib/ServiceManager.md b/docs/Reference/Built-In/WinServicesLib/ServiceManager.md similarity index 100% rename from docs/Reference/WinServicesLib/ServiceManager.md rename to docs/Reference/Built-In/WinServicesLib/ServiceManager.md diff --git a/docs/Reference/WinServicesLib/ServiceState.md b/docs/Reference/Built-In/WinServicesLib/ServiceState.md similarity index 100% rename from docs/Reference/WinServicesLib/ServiceState.md rename to docs/Reference/Built-In/WinServicesLib/ServiceState.md diff --git a/docs/Reference/WinServicesLib/Services.md b/docs/Reference/Built-In/WinServicesLib/Services.md similarity index 100% rename from docs/Reference/WinServicesLib/Services.md rename to docs/Reference/Built-In/WinServicesLib/Services.md diff --git a/docs/Reference/WinServicesLib/index.md b/docs/Reference/Built-In/WinServicesLib/index.md similarity index 99% rename from docs/Reference/WinServicesLib/index.md rename to docs/Reference/Built-In/WinServicesLib/index.md index fa555fb9..0d10ecea 100644 --- a/docs/Reference/WinServicesLib/index.md +++ b/docs/Reference/Built-In/WinServicesLib/index.md @@ -1,6 +1,6 @@ --- title: WinServicesLib Package -parent: Packages +parent: Built-In Packages nav_order: 10 permalink: /tB/Packages/WinServicesLib/ has_toc: false diff --git a/docs/Reference/tbIDE/AddIn.md b/docs/Reference/Built-In/tbIDE/AddIn.md similarity index 100% rename from docs/Reference/tbIDE/AddIn.md rename to docs/Reference/Built-In/tbIDE/AddIn.md diff --git a/docs/Reference/tbIDE/AddinTimer.md b/docs/Reference/Built-In/tbIDE/AddinTimer.md similarity index 100% rename from docs/Reference/tbIDE/AddinTimer.md rename to docs/Reference/Built-In/tbIDE/AddinTimer.md diff --git a/docs/Reference/tbIDE/Button.md b/docs/Reference/Built-In/tbIDE/Button.md similarity index 100% rename from docs/Reference/tbIDE/Button.md rename to docs/Reference/Built-In/tbIDE/Button.md diff --git a/docs/Reference/tbIDE/CodeEditor.md b/docs/Reference/Built-In/tbIDE/CodeEditor.md similarity index 100% rename from docs/Reference/tbIDE/CodeEditor.md rename to docs/Reference/Built-In/tbIDE/CodeEditor.md diff --git a/docs/Reference/tbIDE/DebugConsole.md b/docs/Reference/Built-In/tbIDE/DebugConsole.md similarity index 100% rename from docs/Reference/tbIDE/DebugConsole.md rename to docs/Reference/Built-In/tbIDE/DebugConsole.md diff --git a/docs/Reference/tbIDE/Editor.md b/docs/Reference/Built-In/tbIDE/Editor.md similarity index 100% rename from docs/Reference/tbIDE/Editor.md rename to docs/Reference/Built-In/tbIDE/Editor.md diff --git a/docs/Reference/tbIDE/Editors.md b/docs/Reference/Built-In/tbIDE/Editors.md similarity index 100% rename from docs/Reference/tbIDE/Editors.md rename to docs/Reference/Built-In/tbIDE/Editors.md diff --git a/docs/Reference/tbIDE/File.md b/docs/Reference/Built-In/tbIDE/File.md similarity index 100% rename from docs/Reference/tbIDE/File.md rename to docs/Reference/Built-In/tbIDE/File.md diff --git a/docs/Reference/tbIDE/FileSystem.md b/docs/Reference/Built-In/tbIDE/FileSystem.md similarity index 100% rename from docs/Reference/tbIDE/FileSystem.md rename to docs/Reference/Built-In/tbIDE/FileSystem.md diff --git a/docs/Reference/tbIDE/FileSystemItem.md b/docs/Reference/Built-In/tbIDE/FileSystemItem.md similarity index 100% rename from docs/Reference/tbIDE/FileSystemItem.md rename to docs/Reference/Built-In/tbIDE/FileSystemItem.md diff --git a/docs/Reference/tbIDE/Folder.md b/docs/Reference/Built-In/tbIDE/Folder.md similarity index 100% rename from docs/Reference/tbIDE/Folder.md rename to docs/Reference/Built-In/tbIDE/Folder.md diff --git a/docs/Reference/tbIDE/Host.md b/docs/Reference/Built-In/tbIDE/Host.md similarity index 100% rename from docs/Reference/tbIDE/Host.md rename to docs/Reference/Built-In/tbIDE/Host.md diff --git a/docs/Reference/tbIDE/HtmlElement.md b/docs/Reference/Built-In/tbIDE/HtmlElement.md similarity index 100% rename from docs/Reference/tbIDE/HtmlElement.md rename to docs/Reference/Built-In/tbIDE/HtmlElement.md diff --git a/docs/Reference/tbIDE/HtmlElementProperties.md b/docs/Reference/Built-In/tbIDE/HtmlElementProperties.md similarity index 100% rename from docs/Reference/tbIDE/HtmlElementProperties.md rename to docs/Reference/Built-In/tbIDE/HtmlElementProperties.md diff --git a/docs/Reference/tbIDE/HtmlElementProperty.md b/docs/Reference/Built-In/tbIDE/HtmlElementProperty.md similarity index 100% rename from docs/Reference/tbIDE/HtmlElementProperty.md rename to docs/Reference/Built-In/tbIDE/HtmlElementProperty.md diff --git a/docs/Reference/tbIDE/HtmlElements.md b/docs/Reference/Built-In/tbIDE/HtmlElements.md similarity index 100% rename from docs/Reference/tbIDE/HtmlElements.md rename to docs/Reference/Built-In/tbIDE/HtmlElements.md diff --git a/docs/Reference/tbIDE/HtmlEventProperties.md b/docs/Reference/Built-In/tbIDE/HtmlEventProperties.md similarity index 100% rename from docs/Reference/tbIDE/HtmlEventProperties.md rename to docs/Reference/Built-In/tbIDE/HtmlEventProperties.md diff --git a/docs/Reference/tbIDE/HtmlEventProperty.md b/docs/Reference/Built-In/tbIDE/HtmlEventProperty.md similarity index 100% rename from docs/Reference/tbIDE/HtmlEventProperty.md rename to docs/Reference/Built-In/tbIDE/HtmlEventProperty.md diff --git a/docs/Reference/tbIDE/KeyboardShortcuts.md b/docs/Reference/Built-In/tbIDE/KeyboardShortcuts.md similarity index 100% rename from docs/Reference/tbIDE/KeyboardShortcuts.md rename to docs/Reference/Built-In/tbIDE/KeyboardShortcuts.md diff --git a/docs/Reference/tbIDE/Project.md b/docs/Reference/Built-In/tbIDE/Project.md similarity index 100% rename from docs/Reference/tbIDE/Project.md rename to docs/Reference/Built-In/tbIDE/Project.md diff --git a/docs/Reference/tbIDE/Themes.md b/docs/Reference/Built-In/tbIDE/Themes.md similarity index 100% rename from docs/Reference/tbIDE/Themes.md rename to docs/Reference/Built-In/tbIDE/Themes.md diff --git a/docs/Reference/tbIDE/ToolWindow.md b/docs/Reference/Built-In/tbIDE/ToolWindow.md similarity index 100% rename from docs/Reference/tbIDE/ToolWindow.md rename to docs/Reference/Built-In/tbIDE/ToolWindow.md diff --git a/docs/Reference/tbIDE/ToolWindows.md b/docs/Reference/Built-In/tbIDE/ToolWindows.md similarity index 100% rename from docs/Reference/tbIDE/ToolWindows.md rename to docs/Reference/Built-In/tbIDE/ToolWindows.md diff --git a/docs/Reference/tbIDE/Toolbar.md b/docs/Reference/Built-In/tbIDE/Toolbar.md similarity index 100% rename from docs/Reference/tbIDE/Toolbar.md rename to docs/Reference/Built-In/tbIDE/Toolbar.md diff --git a/docs/Reference/tbIDE/Toolbars.md b/docs/Reference/Built-In/tbIDE/Toolbars.md similarity index 100% rename from docs/Reference/tbIDE/Toolbars.md rename to docs/Reference/Built-In/tbIDE/Toolbars.md diff --git a/docs/Reference/tbIDE/index.md b/docs/Reference/Built-In/tbIDE/index.md similarity index 99% rename from docs/Reference/tbIDE/index.md rename to docs/Reference/Built-In/tbIDE/index.md index b2f011a2..0ecee4a5 100644 --- a/docs/Reference/tbIDE/index.md +++ b/docs/Reference/Built-In/tbIDE/index.md @@ -1,6 +1,6 @@ --- title: tbIDE Package -parent: Packages +parent: Built-In Packages nav_order: 11 permalink: /tB/Packages/tbIDE/ has_toc: false diff --git a/docs/Reference/Default.md b/docs/Reference/Default.md new file mode 100644 index 00000000..557f0987 --- /dev/null +++ b/docs/Reference/Default.md @@ -0,0 +1,15 @@ +--- +title: Default Packages +parent: Packages +nav_order: 1 +permalink: /tB/Packages/Default/ +has_toc: false +--- + +# Default Packages + +These packages are included in every twinBASIC project by default. While they are included by default, the user always has the option of un-referencing them. E.g. a command-line application may not need the [VB Package](../VB/). + +- [VB Package](../VB/) -- standard controls (**CheckBox**, **CommandButton**, **TextBox**, …), forms, and the application-level singletons (**App**, **Screen**, **Clipboard**, **Printer**, …) +- [VBA Package](../VBA) -- the standard runtime library -- **MsgBox**, **CStr**, **Mid**, **Format**, … grouped into modules, plus the **Collection** and **Err** intrinsics and twinBASIC's runtime expression engine +- [VBRUN Package](../VBRUN/) -- runtime-only types -- ambient properties, asynchronous-read state, structured error context, the **PropertyBag**, the clipboard / drag-and-drop container, and the enumerations used by classic VB6 forms and controls diff --git a/docs/Reference/VB/App/index.md b/docs/Reference/Default/VB/App/index.md similarity index 100% rename from docs/Reference/VB/App/index.md rename to docs/Reference/Default/VB/App/index.md diff --git a/docs/Reference/VB/CheckBox/index.md b/docs/Reference/Default/VB/CheckBox/index.md similarity index 100% rename from docs/Reference/VB/CheckBox/index.md rename to docs/Reference/Default/VB/CheckBox/index.md diff --git a/docs/Reference/VB/CheckMark/index.md b/docs/Reference/Default/VB/CheckMark/index.md similarity index 100% rename from docs/Reference/VB/CheckMark/index.md rename to docs/Reference/Default/VB/CheckMark/index.md diff --git a/docs/Reference/VB/Clipboard/index.md b/docs/Reference/Default/VB/Clipboard/index.md similarity index 100% rename from docs/Reference/VB/Clipboard/index.md rename to docs/Reference/Default/VB/Clipboard/index.md diff --git a/docs/Reference/VB/ComboBox/index.md b/docs/Reference/Default/VB/ComboBox/index.md similarity index 100% rename from docs/Reference/VB/ComboBox/index.md rename to docs/Reference/Default/VB/ComboBox/index.md diff --git a/docs/Reference/VB/CommandButton/index.md b/docs/Reference/Default/VB/CommandButton/index.md similarity index 100% rename from docs/Reference/VB/CommandButton/index.md rename to docs/Reference/Default/VB/CommandButton/index.md diff --git a/docs/Reference/VB/Data/index.md b/docs/Reference/Default/VB/Data/index.md similarity index 100% rename from docs/Reference/VB/Data/index.md rename to docs/Reference/Default/VB/Data/index.md diff --git a/docs/Reference/VB/DirListBox/index.md b/docs/Reference/Default/VB/DirListBox/index.md similarity index 100% rename from docs/Reference/VB/DirListBox/index.md rename to docs/Reference/Default/VB/DirListBox/index.md diff --git a/docs/Reference/VB/DriveListBox/index.md b/docs/Reference/Default/VB/DriveListBox/index.md similarity index 100% rename from docs/Reference/VB/DriveListBox/index.md rename to docs/Reference/Default/VB/DriveListBox/index.md diff --git a/docs/Reference/VB/FileListBox/index.md b/docs/Reference/Default/VB/FileListBox/index.md similarity index 100% rename from docs/Reference/VB/FileListBox/index.md rename to docs/Reference/Default/VB/FileListBox/index.md diff --git a/docs/Reference/VB/Form/index.md b/docs/Reference/Default/VB/Form/index.md similarity index 100% rename from docs/Reference/VB/Form/index.md rename to docs/Reference/Default/VB/Form/index.md diff --git a/docs/Reference/VB/Frame/index.md b/docs/Reference/Default/VB/Frame/index.md similarity index 100% rename from docs/Reference/VB/Frame/index.md rename to docs/Reference/Default/VB/Frame/index.md diff --git a/docs/Reference/VB/Global/index.md b/docs/Reference/Default/VB/Global/index.md similarity index 100% rename from docs/Reference/VB/Global/index.md rename to docs/Reference/Default/VB/Global/index.md diff --git a/docs/Reference/VB/HScrollBar/index.md b/docs/Reference/Default/VB/HScrollBar/index.md similarity index 100% rename from docs/Reference/VB/HScrollBar/index.md rename to docs/Reference/Default/VB/HScrollBar/index.md diff --git a/docs/Reference/VB/Image/index.md b/docs/Reference/Default/VB/Image/index.md similarity index 100% rename from docs/Reference/VB/Image/index.md rename to docs/Reference/Default/VB/Image/index.md diff --git a/docs/Reference/VB/Label/index.md b/docs/Reference/Default/VB/Label/index.md similarity index 100% rename from docs/Reference/VB/Label/index.md rename to docs/Reference/Default/VB/Label/index.md diff --git a/docs/Reference/VB/Line/index.md b/docs/Reference/Default/VB/Line/index.md similarity index 100% rename from docs/Reference/VB/Line/index.md rename to docs/Reference/Default/VB/Line/index.md diff --git a/docs/Reference/VB/ListBox/index.md b/docs/Reference/Default/VB/ListBox/index.md similarity index 100% rename from docs/Reference/VB/ListBox/index.md rename to docs/Reference/Default/VB/ListBox/index.md diff --git a/docs/Reference/VB/MDIForm/index.md b/docs/Reference/Default/VB/MDIForm/index.md similarity index 100% rename from docs/Reference/VB/MDIForm/index.md rename to docs/Reference/Default/VB/MDIForm/index.md diff --git a/docs/Reference/VB/Menu/index.md b/docs/Reference/Default/VB/Menu/index.md similarity index 100% rename from docs/Reference/VB/Menu/index.md rename to docs/Reference/Default/VB/Menu/index.md diff --git a/docs/Reference/VB/MultiFrame/index.md b/docs/Reference/Default/VB/MultiFrame/index.md similarity index 100% rename from docs/Reference/VB/MultiFrame/index.md rename to docs/Reference/Default/VB/MultiFrame/index.md diff --git a/docs/Reference/VB/OLE/index.md b/docs/Reference/Default/VB/OLE/index.md similarity index 100% rename from docs/Reference/VB/OLE/index.md rename to docs/Reference/Default/VB/OLE/index.md diff --git a/docs/Reference/VB/OptionButton/index.md b/docs/Reference/Default/VB/OptionButton/index.md similarity index 100% rename from docs/Reference/VB/OptionButton/index.md rename to docs/Reference/Default/VB/OptionButton/index.md diff --git a/docs/Reference/VB/PictureBox/index.md b/docs/Reference/Default/VB/PictureBox/index.md similarity index 100% rename from docs/Reference/VB/PictureBox/index.md rename to docs/Reference/Default/VB/PictureBox/index.md diff --git a/docs/Reference/VB/Printer/index.md b/docs/Reference/Default/VB/Printer/index.md similarity index 100% rename from docs/Reference/VB/Printer/index.md rename to docs/Reference/Default/VB/Printer/index.md diff --git a/docs/Reference/VB/Printers/index.md b/docs/Reference/Default/VB/Printers/index.md similarity index 100% rename from docs/Reference/VB/Printers/index.md rename to docs/Reference/Default/VB/Printers/index.md diff --git a/docs/Reference/VB/PropertyPage/index.md b/docs/Reference/Default/VB/PropertyPage/index.md similarity index 100% rename from docs/Reference/VB/PropertyPage/index.md rename to docs/Reference/Default/VB/PropertyPage/index.md diff --git a/docs/Reference/VB/QRCode/index.md b/docs/Reference/Default/VB/QRCode/index.md similarity index 100% rename from docs/Reference/VB/QRCode/index.md rename to docs/Reference/Default/VB/QRCode/index.md diff --git a/docs/Reference/VB/Report/index.md b/docs/Reference/Default/VB/Report/index.md similarity index 100% rename from docs/Reference/VB/Report/index.md rename to docs/Reference/Default/VB/Report/index.md diff --git a/docs/Reference/VB/Screen/index.md b/docs/Reference/Default/VB/Screen/index.md similarity index 100% rename from docs/Reference/VB/Screen/index.md rename to docs/Reference/Default/VB/Screen/index.md diff --git a/docs/Reference/VB/Shape/index.md b/docs/Reference/Default/VB/Shape/index.md similarity index 100% rename from docs/Reference/VB/Shape/index.md rename to docs/Reference/Default/VB/Shape/index.md diff --git a/docs/Reference/VB/TextBox/index.md b/docs/Reference/Default/VB/TextBox/index.md similarity index 100% rename from docs/Reference/VB/TextBox/index.md rename to docs/Reference/Default/VB/TextBox/index.md diff --git a/docs/Reference/VB/Timer/index.md b/docs/Reference/Default/VB/Timer/index.md similarity index 100% rename from docs/Reference/VB/Timer/index.md rename to docs/Reference/Default/VB/Timer/index.md diff --git a/docs/Reference/VB/UserControl/index.md b/docs/Reference/Default/VB/UserControl/index.md similarity index 100% rename from docs/Reference/VB/UserControl/index.md rename to docs/Reference/Default/VB/UserControl/index.md diff --git a/docs/Reference/VB/VScrollBar/index.md b/docs/Reference/Default/VB/VScrollBar/index.md similarity index 100% rename from docs/Reference/VB/VScrollBar/index.md rename to docs/Reference/Default/VB/VScrollBar/index.md diff --git a/docs/Reference/VB/index.md b/docs/Reference/Default/VB/index.md similarity index 99% rename from docs/Reference/VB/index.md rename to docs/Reference/Default/VB/index.md index ec0af10b..dc4d1b4a 100644 --- a/docs/Reference/VB/index.md +++ b/docs/Reference/Default/VB/index.md @@ -1,6 +1,6 @@ --- title: VB Package -parent: Packages +parent: Default Packages nav_order: 1 permalink: /tB/Packages/VB/ has_toc: false diff --git a/docs/Reference/VBA/Collection/Add.md b/docs/Reference/Default/VBA/Collection/Add.md similarity index 100% rename from docs/Reference/VBA/Collection/Add.md rename to docs/Reference/Default/VBA/Collection/Add.md diff --git a/docs/Reference/VBA/Collection/Clear.md b/docs/Reference/Default/VBA/Collection/Clear.md similarity index 100% rename from docs/Reference/VBA/Collection/Clear.md rename to docs/Reference/Default/VBA/Collection/Clear.md diff --git a/docs/Reference/VBA/Collection/Count.md b/docs/Reference/Default/VBA/Collection/Count.md similarity index 100% rename from docs/Reference/VBA/Collection/Count.md rename to docs/Reference/Default/VBA/Collection/Count.md diff --git a/docs/Reference/VBA/Collection/Exists.md b/docs/Reference/Default/VBA/Collection/Exists.md similarity index 100% rename from docs/Reference/VBA/Collection/Exists.md rename to docs/Reference/Default/VBA/Collection/Exists.md diff --git a/docs/Reference/VBA/Collection/Item.md b/docs/Reference/Default/VBA/Collection/Item.md similarity index 100% rename from docs/Reference/VBA/Collection/Item.md rename to docs/Reference/Default/VBA/Collection/Item.md diff --git a/docs/Reference/VBA/Collection/Items.md b/docs/Reference/Default/VBA/Collection/Items.md similarity index 100% rename from docs/Reference/VBA/Collection/Items.md rename to docs/Reference/Default/VBA/Collection/Items.md diff --git a/docs/Reference/VBA/Collection/KeyCompareMode.md b/docs/Reference/Default/VBA/Collection/KeyCompareMode.md similarity index 100% rename from docs/Reference/VBA/Collection/KeyCompareMode.md rename to docs/Reference/Default/VBA/Collection/KeyCompareMode.md diff --git a/docs/Reference/VBA/Collection/KeyCountHint.md b/docs/Reference/Default/VBA/Collection/KeyCountHint.md similarity index 100% rename from docs/Reference/VBA/Collection/KeyCountHint.md rename to docs/Reference/Default/VBA/Collection/KeyCountHint.md diff --git a/docs/Reference/VBA/Collection/Keys.md b/docs/Reference/Default/VBA/Collection/Keys.md similarity index 100% rename from docs/Reference/VBA/Collection/Keys.md rename to docs/Reference/Default/VBA/Collection/Keys.md diff --git a/docs/Reference/VBA/Collection/Remove.md b/docs/Reference/Default/VBA/Collection/Remove.md similarity index 100% rename from docs/Reference/VBA/Collection/Remove.md rename to docs/Reference/Default/VBA/Collection/Remove.md diff --git a/docs/Reference/VBA/Collection/index.md b/docs/Reference/Default/VBA/Collection/index.md similarity index 100% rename from docs/Reference/VBA/Collection/index.md rename to docs/Reference/Default/VBA/Collection/index.md diff --git a/docs/Reference/VBA/Compilation/CompilerVersion.md b/docs/Reference/Default/VBA/Compilation/CompilerVersion.md similarity index 100% rename from docs/Reference/VBA/Compilation/CompilerVersion.md rename to docs/Reference/Default/VBA/Compilation/CompilerVersion.md diff --git a/docs/Reference/VBA/Compilation/CurrentComponentCLSID.md b/docs/Reference/Default/VBA/Compilation/CurrentComponentCLSID.md similarity index 100% rename from docs/Reference/VBA/Compilation/CurrentComponentCLSID.md rename to docs/Reference/Default/VBA/Compilation/CurrentComponentCLSID.md diff --git a/docs/Reference/VBA/Compilation/CurrentComponentName.md b/docs/Reference/Default/VBA/Compilation/CurrentComponentName.md similarity index 100% rename from docs/Reference/VBA/Compilation/CurrentComponentName.md rename to docs/Reference/Default/VBA/Compilation/CurrentComponentName.md diff --git a/docs/Reference/VBA/Compilation/CurrentProcedureName.md b/docs/Reference/Default/VBA/Compilation/CurrentProcedureName.md similarity index 100% rename from docs/Reference/VBA/Compilation/CurrentProcedureName.md rename to docs/Reference/Default/VBA/Compilation/CurrentProcedureName.md diff --git a/docs/Reference/VBA/Compilation/CurrentProjectName.md b/docs/Reference/Default/VBA/Compilation/CurrentProjectName.md similarity index 100% rename from docs/Reference/VBA/Compilation/CurrentProjectName.md rename to docs/Reference/Default/VBA/Compilation/CurrentProjectName.md diff --git a/docs/Reference/VBA/Compilation/CurrentSourceFile.md b/docs/Reference/Default/VBA/Compilation/CurrentSourceFile.md similarity index 100% rename from docs/Reference/VBA/Compilation/CurrentSourceFile.md rename to docs/Reference/Default/VBA/Compilation/CurrentSourceFile.md diff --git a/docs/Reference/VBA/Compilation/ProcessorArchitecture.md b/docs/Reference/Default/VBA/Compilation/ProcessorArchitecture.md similarity index 100% rename from docs/Reference/VBA/Compilation/ProcessorArchitecture.md rename to docs/Reference/Default/VBA/Compilation/ProcessorArchitecture.md diff --git a/docs/Reference/VBA/Compilation/index.md b/docs/Reference/Default/VBA/Compilation/index.md similarity index 100% rename from docs/Reference/VBA/Compilation/index.md rename to docs/Reference/Default/VBA/Compilation/index.md diff --git a/docs/Reference/VBA/Constants/VbAppWinStyle.md b/docs/Reference/Default/VBA/Constants/VbAppWinStyle.md similarity index 100% rename from docs/Reference/VBA/Constants/VbAppWinStyle.md rename to docs/Reference/Default/VBA/Constants/VbAppWinStyle.md diff --git a/docs/Reference/VBA/Constants/VbArchitecture.md b/docs/Reference/Default/VBA/Constants/VbArchitecture.md similarity index 100% rename from docs/Reference/VBA/Constants/VbArchitecture.md rename to docs/Reference/Default/VBA/Constants/VbArchitecture.md diff --git a/docs/Reference/VBA/Constants/VbCalendar.md b/docs/Reference/Default/VBA/Constants/VbCalendar.md similarity index 100% rename from docs/Reference/VBA/Constants/VbCalendar.md rename to docs/Reference/Default/VBA/Constants/VbCalendar.md diff --git a/docs/Reference/VBA/Constants/VbCallType.md b/docs/Reference/Default/VBA/Constants/VbCallType.md similarity index 100% rename from docs/Reference/VBA/Constants/VbCallType.md rename to docs/Reference/Default/VBA/Constants/VbCallType.md diff --git a/docs/Reference/VBA/Constants/VbCompareMethod.md b/docs/Reference/Default/VBA/Constants/VbCompareMethod.md similarity index 100% rename from docs/Reference/VBA/Constants/VbCompareMethod.md rename to docs/Reference/Default/VBA/Constants/VbCompareMethod.md diff --git a/docs/Reference/VBA/Constants/VbDateTimeFormat.md b/docs/Reference/Default/VBA/Constants/VbDateTimeFormat.md similarity index 100% rename from docs/Reference/VBA/Constants/VbDateTimeFormat.md rename to docs/Reference/Default/VBA/Constants/VbDateTimeFormat.md diff --git a/docs/Reference/VBA/Constants/VbDayOfWeek.md b/docs/Reference/Default/VBA/Constants/VbDayOfWeek.md similarity index 100% rename from docs/Reference/VBA/Constants/VbDayOfWeek.md rename to docs/Reference/Default/VBA/Constants/VbDayOfWeek.md diff --git a/docs/Reference/VBA/Constants/VbFileAttribute.md b/docs/Reference/Default/VBA/Constants/VbFileAttribute.md similarity index 100% rename from docs/Reference/VBA/Constants/VbFileAttribute.md rename to docs/Reference/Default/VBA/Constants/VbFileAttribute.md diff --git a/docs/Reference/VBA/Constants/VbFirstWeekOfYear.md b/docs/Reference/Default/VBA/Constants/VbFirstWeekOfYear.md similarity index 100% rename from docs/Reference/VBA/Constants/VbFirstWeekOfYear.md rename to docs/Reference/Default/VBA/Constants/VbFirstWeekOfYear.md diff --git a/docs/Reference/VBA/Constants/VbIMEStatus.md b/docs/Reference/Default/VBA/Constants/VbIMEStatus.md similarity index 100% rename from docs/Reference/VBA/Constants/VbIMEStatus.md rename to docs/Reference/Default/VBA/Constants/VbIMEStatus.md diff --git a/docs/Reference/VBA/Constants/VbMsgBoxResult.md b/docs/Reference/Default/VBA/Constants/VbMsgBoxResult.md similarity index 100% rename from docs/Reference/VBA/Constants/VbMsgBoxResult.md rename to docs/Reference/Default/VBA/Constants/VbMsgBoxResult.md diff --git a/docs/Reference/VBA/Constants/VbMsgBoxStyle.md b/docs/Reference/Default/VBA/Constants/VbMsgBoxStyle.md similarity index 100% rename from docs/Reference/VBA/Constants/VbMsgBoxStyle.md rename to docs/Reference/Default/VBA/Constants/VbMsgBoxStyle.md diff --git a/docs/Reference/VBA/Constants/VbStrConv.md b/docs/Reference/Default/VBA/Constants/VbStrConv.md similarity index 100% rename from docs/Reference/VBA/Constants/VbStrConv.md rename to docs/Reference/Default/VBA/Constants/VbStrConv.md diff --git a/docs/Reference/VBA/Constants/VbTriState.md b/docs/Reference/Default/VBA/Constants/VbTriState.md similarity index 100% rename from docs/Reference/VBA/Constants/VbTriState.md rename to docs/Reference/Default/VBA/Constants/VbTriState.md diff --git a/docs/Reference/VBA/Constants/VbVarType.md b/docs/Reference/Default/VBA/Constants/VbVarType.md similarity index 100% rename from docs/Reference/VBA/Constants/VbVarType.md rename to docs/Reference/Default/VBA/Constants/VbVarType.md diff --git a/docs/Reference/VBA/Constants/index.md b/docs/Reference/Default/VBA/Constants/index.md similarity index 100% rename from docs/Reference/VBA/Constants/index.md rename to docs/Reference/Default/VBA/Constants/index.md diff --git a/docs/Reference/VBA/Conversion/CBool.md b/docs/Reference/Default/VBA/Conversion/CBool.md similarity index 100% rename from docs/Reference/VBA/Conversion/CBool.md rename to docs/Reference/Default/VBA/Conversion/CBool.md diff --git a/docs/Reference/VBA/Conversion/CByte.md b/docs/Reference/Default/VBA/Conversion/CByte.md similarity index 100% rename from docs/Reference/VBA/Conversion/CByte.md rename to docs/Reference/Default/VBA/Conversion/CByte.md diff --git a/docs/Reference/VBA/Conversion/CCur.md b/docs/Reference/Default/VBA/Conversion/CCur.md similarity index 100% rename from docs/Reference/VBA/Conversion/CCur.md rename to docs/Reference/Default/VBA/Conversion/CCur.md diff --git a/docs/Reference/VBA/Conversion/CDate.md b/docs/Reference/Default/VBA/Conversion/CDate.md similarity index 100% rename from docs/Reference/VBA/Conversion/CDate.md rename to docs/Reference/Default/VBA/Conversion/CDate.md diff --git a/docs/Reference/VBA/Conversion/CDbl.md b/docs/Reference/Default/VBA/Conversion/CDbl.md similarity index 100% rename from docs/Reference/VBA/Conversion/CDbl.md rename to docs/Reference/Default/VBA/Conversion/CDbl.md diff --git a/docs/Reference/VBA/Conversion/CDec.md b/docs/Reference/Default/VBA/Conversion/CDec.md similarity index 100% rename from docs/Reference/VBA/Conversion/CDec.md rename to docs/Reference/Default/VBA/Conversion/CDec.md diff --git a/docs/Reference/VBA/Conversion/CInt.md b/docs/Reference/Default/VBA/Conversion/CInt.md similarity index 100% rename from docs/Reference/VBA/Conversion/CInt.md rename to docs/Reference/Default/VBA/Conversion/CInt.md diff --git a/docs/Reference/VBA/Conversion/CLng.md b/docs/Reference/Default/VBA/Conversion/CLng.md similarity index 100% rename from docs/Reference/VBA/Conversion/CLng.md rename to docs/Reference/Default/VBA/Conversion/CLng.md diff --git a/docs/Reference/VBA/Conversion/CLngLng.md b/docs/Reference/Default/VBA/Conversion/CLngLng.md similarity index 100% rename from docs/Reference/VBA/Conversion/CLngLng.md rename to docs/Reference/Default/VBA/Conversion/CLngLng.md diff --git a/docs/Reference/VBA/Conversion/CLngPtr.md b/docs/Reference/Default/VBA/Conversion/CLngPtr.md similarity index 100% rename from docs/Reference/VBA/Conversion/CLngPtr.md rename to docs/Reference/Default/VBA/Conversion/CLngPtr.md diff --git a/docs/Reference/VBA/Conversion/CSng.md b/docs/Reference/Default/VBA/Conversion/CSng.md similarity index 100% rename from docs/Reference/VBA/Conversion/CSng.md rename to docs/Reference/Default/VBA/Conversion/CSng.md diff --git a/docs/Reference/VBA/Conversion/CStr.md b/docs/Reference/Default/VBA/Conversion/CStr.md similarity index 100% rename from docs/Reference/VBA/Conversion/CStr.md rename to docs/Reference/Default/VBA/Conversion/CStr.md diff --git a/docs/Reference/VBA/Conversion/CType.md b/docs/Reference/Default/VBA/Conversion/CType.md similarity index 100% rename from docs/Reference/VBA/Conversion/CType.md rename to docs/Reference/Default/VBA/Conversion/CType.md diff --git a/docs/Reference/VBA/Conversion/CVDate.md b/docs/Reference/Default/VBA/Conversion/CVDate.md similarity index 100% rename from docs/Reference/VBA/Conversion/CVDate.md rename to docs/Reference/Default/VBA/Conversion/CVDate.md diff --git a/docs/Reference/VBA/Conversion/CVErr.md b/docs/Reference/Default/VBA/Conversion/CVErr.md similarity index 100% rename from docs/Reference/VBA/Conversion/CVErr.md rename to docs/Reference/Default/VBA/Conversion/CVErr.md diff --git a/docs/Reference/VBA/Conversion/CVar.md b/docs/Reference/Default/VBA/Conversion/CVar.md similarity index 100% rename from docs/Reference/VBA/Conversion/CVar.md rename to docs/Reference/Default/VBA/Conversion/CVar.md diff --git a/docs/Reference/VBA/Conversion/Error.md b/docs/Reference/Default/VBA/Conversion/Error.md similarity index 100% rename from docs/Reference/VBA/Conversion/Error.md rename to docs/Reference/Default/VBA/Conversion/Error.md diff --git a/docs/Reference/VBA/Conversion/Fix.md b/docs/Reference/Default/VBA/Conversion/Fix.md similarity index 100% rename from docs/Reference/VBA/Conversion/Fix.md rename to docs/Reference/Default/VBA/Conversion/Fix.md diff --git a/docs/Reference/VBA/Conversion/Hex.md b/docs/Reference/Default/VBA/Conversion/Hex.md similarity index 100% rename from docs/Reference/VBA/Conversion/Hex.md rename to docs/Reference/Default/VBA/Conversion/Hex.md diff --git a/docs/Reference/VBA/Conversion/Int.md b/docs/Reference/Default/VBA/Conversion/Int.md similarity index 100% rename from docs/Reference/VBA/Conversion/Int.md rename to docs/Reference/Default/VBA/Conversion/Int.md diff --git a/docs/Reference/VBA/Conversion/MacID.md b/docs/Reference/Default/VBA/Conversion/MacID.md similarity index 100% rename from docs/Reference/VBA/Conversion/MacID.md rename to docs/Reference/Default/VBA/Conversion/MacID.md diff --git a/docs/Reference/VBA/Conversion/Nz.md b/docs/Reference/Default/VBA/Conversion/Nz.md similarity index 100% rename from docs/Reference/VBA/Conversion/Nz.md rename to docs/Reference/Default/VBA/Conversion/Nz.md diff --git a/docs/Reference/VBA/Conversion/Oct.md b/docs/Reference/Default/VBA/Conversion/Oct.md similarity index 100% rename from docs/Reference/VBA/Conversion/Oct.md rename to docs/Reference/Default/VBA/Conversion/Oct.md diff --git a/docs/Reference/VBA/Conversion/Str.md b/docs/Reference/Default/VBA/Conversion/Str.md similarity index 100% rename from docs/Reference/VBA/Conversion/Str.md rename to docs/Reference/Default/VBA/Conversion/Str.md diff --git a/docs/Reference/VBA/Conversion/Val.md b/docs/Reference/Default/VBA/Conversion/Val.md similarity index 100% rename from docs/Reference/VBA/Conversion/Val.md rename to docs/Reference/Default/VBA/Conversion/Val.md diff --git a/docs/Reference/VBA/Conversion/ValDec.md b/docs/Reference/Default/VBA/Conversion/ValDec.md similarity index 100% rename from docs/Reference/VBA/Conversion/ValDec.md rename to docs/Reference/Default/VBA/Conversion/ValDec.md diff --git a/docs/Reference/VBA/Conversion/index.md b/docs/Reference/Default/VBA/Conversion/index.md similarity index 100% rename from docs/Reference/VBA/Conversion/index.md rename to docs/Reference/Default/VBA/Conversion/index.md diff --git a/docs/Reference/VBA/DateTime/Calendar.md b/docs/Reference/Default/VBA/DateTime/Calendar.md similarity index 100% rename from docs/Reference/VBA/DateTime/Calendar.md rename to docs/Reference/Default/VBA/DateTime/Calendar.md diff --git a/docs/Reference/VBA/DateTime/Date.md b/docs/Reference/Default/VBA/DateTime/Date.md similarity index 100% rename from docs/Reference/VBA/DateTime/Date.md rename to docs/Reference/Default/VBA/DateTime/Date.md diff --git a/docs/Reference/VBA/DateTime/DateAdd.md b/docs/Reference/Default/VBA/DateTime/DateAdd.md similarity index 100% rename from docs/Reference/VBA/DateTime/DateAdd.md rename to docs/Reference/Default/VBA/DateTime/DateAdd.md diff --git a/docs/Reference/VBA/DateTime/DateDiff.md b/docs/Reference/Default/VBA/DateTime/DateDiff.md similarity index 100% rename from docs/Reference/VBA/DateTime/DateDiff.md rename to docs/Reference/Default/VBA/DateTime/DateDiff.md diff --git a/docs/Reference/VBA/DateTime/DatePart.md b/docs/Reference/Default/VBA/DateTime/DatePart.md similarity index 100% rename from docs/Reference/VBA/DateTime/DatePart.md rename to docs/Reference/Default/VBA/DateTime/DatePart.md diff --git a/docs/Reference/VBA/DateTime/DateSerial.md b/docs/Reference/Default/VBA/DateTime/DateSerial.md similarity index 100% rename from docs/Reference/VBA/DateTime/DateSerial.md rename to docs/Reference/Default/VBA/DateTime/DateSerial.md diff --git a/docs/Reference/VBA/DateTime/DateValue.md b/docs/Reference/Default/VBA/DateTime/DateValue.md similarity index 100% rename from docs/Reference/VBA/DateTime/DateValue.md rename to docs/Reference/Default/VBA/DateTime/DateValue.md diff --git a/docs/Reference/VBA/DateTime/Day.md b/docs/Reference/Default/VBA/DateTime/Day.md similarity index 100% rename from docs/Reference/VBA/DateTime/Day.md rename to docs/Reference/Default/VBA/DateTime/Day.md diff --git a/docs/Reference/VBA/DateTime/Hour.md b/docs/Reference/Default/VBA/DateTime/Hour.md similarity index 100% rename from docs/Reference/VBA/DateTime/Hour.md rename to docs/Reference/Default/VBA/DateTime/Hour.md diff --git a/docs/Reference/VBA/DateTime/Minute.md b/docs/Reference/Default/VBA/DateTime/Minute.md similarity index 100% rename from docs/Reference/VBA/DateTime/Minute.md rename to docs/Reference/Default/VBA/DateTime/Minute.md diff --git a/docs/Reference/VBA/DateTime/Month.md b/docs/Reference/Default/VBA/DateTime/Month.md similarity index 100% rename from docs/Reference/VBA/DateTime/Month.md rename to docs/Reference/Default/VBA/DateTime/Month.md diff --git a/docs/Reference/VBA/DateTime/Now.md b/docs/Reference/Default/VBA/DateTime/Now.md similarity index 100% rename from docs/Reference/VBA/DateTime/Now.md rename to docs/Reference/Default/VBA/DateTime/Now.md diff --git a/docs/Reference/VBA/DateTime/Second.md b/docs/Reference/Default/VBA/DateTime/Second.md similarity index 100% rename from docs/Reference/VBA/DateTime/Second.md rename to docs/Reference/Default/VBA/DateTime/Second.md diff --git a/docs/Reference/VBA/DateTime/Time.md b/docs/Reference/Default/VBA/DateTime/Time.md similarity index 100% rename from docs/Reference/VBA/DateTime/Time.md rename to docs/Reference/Default/VBA/DateTime/Time.md diff --git a/docs/Reference/VBA/DateTime/TimeSerial.md b/docs/Reference/Default/VBA/DateTime/TimeSerial.md similarity index 100% rename from docs/Reference/VBA/DateTime/TimeSerial.md rename to docs/Reference/Default/VBA/DateTime/TimeSerial.md diff --git a/docs/Reference/VBA/DateTime/TimeValue.md b/docs/Reference/Default/VBA/DateTime/TimeValue.md similarity index 100% rename from docs/Reference/VBA/DateTime/TimeValue.md rename to docs/Reference/Default/VBA/DateTime/TimeValue.md diff --git a/docs/Reference/VBA/DateTime/Timer.md b/docs/Reference/Default/VBA/DateTime/Timer.md similarity index 100% rename from docs/Reference/VBA/DateTime/Timer.md rename to docs/Reference/Default/VBA/DateTime/Timer.md diff --git a/docs/Reference/VBA/DateTime/Weekday.md b/docs/Reference/Default/VBA/DateTime/Weekday.md similarity index 100% rename from docs/Reference/VBA/DateTime/Weekday.md rename to docs/Reference/Default/VBA/DateTime/Weekday.md diff --git a/docs/Reference/VBA/DateTime/Year.md b/docs/Reference/Default/VBA/DateTime/Year.md similarity index 100% rename from docs/Reference/VBA/DateTime/Year.md rename to docs/Reference/Default/VBA/DateTime/Year.md diff --git a/docs/Reference/VBA/DateTime/index.md b/docs/Reference/Default/VBA/DateTime/index.md similarity index 100% rename from docs/Reference/VBA/DateTime/index.md rename to docs/Reference/Default/VBA/DateTime/index.md diff --git a/docs/Reference/VBA/ErrObject/Clear.md b/docs/Reference/Default/VBA/ErrObject/Clear.md similarity index 100% rename from docs/Reference/VBA/ErrObject/Clear.md rename to docs/Reference/Default/VBA/ErrObject/Clear.md diff --git a/docs/Reference/VBA/ErrObject/Description.md b/docs/Reference/Default/VBA/ErrObject/Description.md similarity index 100% rename from docs/Reference/VBA/ErrObject/Description.md rename to docs/Reference/Default/VBA/ErrObject/Description.md diff --git a/docs/Reference/VBA/ErrObject/HelpContext.md b/docs/Reference/Default/VBA/ErrObject/HelpContext.md similarity index 100% rename from docs/Reference/VBA/ErrObject/HelpContext.md rename to docs/Reference/Default/VBA/ErrObject/HelpContext.md diff --git a/docs/Reference/VBA/ErrObject/HelpFile.md b/docs/Reference/Default/VBA/ErrObject/HelpFile.md similarity index 100% rename from docs/Reference/VBA/ErrObject/HelpFile.md rename to docs/Reference/Default/VBA/ErrObject/HelpFile.md diff --git a/docs/Reference/VBA/ErrObject/LastDllError.md b/docs/Reference/Default/VBA/ErrObject/LastDllError.md similarity index 100% rename from docs/Reference/VBA/ErrObject/LastDllError.md rename to docs/Reference/Default/VBA/ErrObject/LastDllError.md diff --git a/docs/Reference/VBA/ErrObject/LastHresult.md b/docs/Reference/Default/VBA/ErrObject/LastHresult.md similarity index 100% rename from docs/Reference/VBA/ErrObject/LastHresult.md rename to docs/Reference/Default/VBA/ErrObject/LastHresult.md diff --git a/docs/Reference/VBA/ErrObject/Number.md b/docs/Reference/Default/VBA/ErrObject/Number.md similarity index 100% rename from docs/Reference/VBA/ErrObject/Number.md rename to docs/Reference/Default/VBA/ErrObject/Number.md diff --git a/docs/Reference/VBA/ErrObject/Raise.md b/docs/Reference/Default/VBA/ErrObject/Raise.md similarity index 100% rename from docs/Reference/VBA/ErrObject/Raise.md rename to docs/Reference/Default/VBA/ErrObject/Raise.md diff --git a/docs/Reference/VBA/ErrObject/ReturnHResult.md b/docs/Reference/Default/VBA/ErrObject/ReturnHResult.md similarity index 100% rename from docs/Reference/VBA/ErrObject/ReturnHResult.md rename to docs/Reference/Default/VBA/ErrObject/ReturnHResult.md diff --git a/docs/Reference/VBA/ErrObject/Source.md b/docs/Reference/Default/VBA/ErrObject/Source.md similarity index 100% rename from docs/Reference/VBA/ErrObject/Source.md rename to docs/Reference/Default/VBA/ErrObject/Source.md diff --git a/docs/Reference/VBA/ErrObject/index.md b/docs/Reference/Default/VBA/ErrObject/index.md similarity index 100% rename from docs/Reference/VBA/ErrObject/index.md rename to docs/Reference/Default/VBA/ErrObject/index.md diff --git a/docs/Reference/VBA/FileSystem/ChDir.md b/docs/Reference/Default/VBA/FileSystem/ChDir.md similarity index 100% rename from docs/Reference/VBA/FileSystem/ChDir.md rename to docs/Reference/Default/VBA/FileSystem/ChDir.md diff --git a/docs/Reference/VBA/FileSystem/ChDrive.md b/docs/Reference/Default/VBA/FileSystem/ChDrive.md similarity index 100% rename from docs/Reference/VBA/FileSystem/ChDrive.md rename to docs/Reference/Default/VBA/FileSystem/ChDrive.md diff --git a/docs/Reference/VBA/FileSystem/CurDir.md b/docs/Reference/Default/VBA/FileSystem/CurDir.md similarity index 100% rename from docs/Reference/VBA/FileSystem/CurDir.md rename to docs/Reference/Default/VBA/FileSystem/CurDir.md diff --git a/docs/Reference/VBA/FileSystem/Dir.md b/docs/Reference/Default/VBA/FileSystem/Dir.md similarity index 100% rename from docs/Reference/VBA/FileSystem/Dir.md rename to docs/Reference/Default/VBA/FileSystem/Dir.md diff --git a/docs/Reference/VBA/FileSystem/EOF.md b/docs/Reference/Default/VBA/FileSystem/EOF.md similarity index 100% rename from docs/Reference/VBA/FileSystem/EOF.md rename to docs/Reference/Default/VBA/FileSystem/EOF.md diff --git a/docs/Reference/VBA/FileSystem/FileAttr.md b/docs/Reference/Default/VBA/FileSystem/FileAttr.md similarity index 100% rename from docs/Reference/VBA/FileSystem/FileAttr.md rename to docs/Reference/Default/VBA/FileSystem/FileAttr.md diff --git a/docs/Reference/VBA/FileSystem/FileCopy.md b/docs/Reference/Default/VBA/FileSystem/FileCopy.md similarity index 100% rename from docs/Reference/VBA/FileSystem/FileCopy.md rename to docs/Reference/Default/VBA/FileSystem/FileCopy.md diff --git a/docs/Reference/VBA/FileSystem/FileDateTime.md b/docs/Reference/Default/VBA/FileSystem/FileDateTime.md similarity index 100% rename from docs/Reference/VBA/FileSystem/FileDateTime.md rename to docs/Reference/Default/VBA/FileSystem/FileDateTime.md diff --git a/docs/Reference/VBA/FileSystem/FileLen.md b/docs/Reference/Default/VBA/FileSystem/FileLen.md similarity index 100% rename from docs/Reference/VBA/FileSystem/FileLen.md rename to docs/Reference/Default/VBA/FileSystem/FileLen.md diff --git a/docs/Reference/VBA/FileSystem/FreeFile.md b/docs/Reference/Default/VBA/FileSystem/FreeFile.md similarity index 100% rename from docs/Reference/VBA/FileSystem/FreeFile.md rename to docs/Reference/Default/VBA/FileSystem/FreeFile.md diff --git a/docs/Reference/VBA/FileSystem/GetAttr.md b/docs/Reference/Default/VBA/FileSystem/GetAttr.md similarity index 100% rename from docs/Reference/VBA/FileSystem/GetAttr.md rename to docs/Reference/Default/VBA/FileSystem/GetAttr.md diff --git a/docs/Reference/VBA/FileSystem/Input.md b/docs/Reference/Default/VBA/FileSystem/Input.md similarity index 100% rename from docs/Reference/VBA/FileSystem/Input.md rename to docs/Reference/Default/VBA/FileSystem/Input.md diff --git a/docs/Reference/VBA/FileSystem/InputB.md b/docs/Reference/Default/VBA/FileSystem/InputB.md similarity index 100% rename from docs/Reference/VBA/FileSystem/InputB.md rename to docs/Reference/Default/VBA/FileSystem/InputB.md diff --git a/docs/Reference/VBA/FileSystem/Kill.md b/docs/Reference/Default/VBA/FileSystem/Kill.md similarity index 100% rename from docs/Reference/VBA/FileSystem/Kill.md rename to docs/Reference/Default/VBA/FileSystem/Kill.md diff --git a/docs/Reference/VBA/FileSystem/LOF.md b/docs/Reference/Default/VBA/FileSystem/LOF.md similarity index 100% rename from docs/Reference/VBA/FileSystem/LOF.md rename to docs/Reference/Default/VBA/FileSystem/LOF.md diff --git a/docs/Reference/VBA/FileSystem/Loc.md b/docs/Reference/Default/VBA/FileSystem/Loc.md similarity index 100% rename from docs/Reference/VBA/FileSystem/Loc.md rename to docs/Reference/Default/VBA/FileSystem/Loc.md diff --git a/docs/Reference/VBA/FileSystem/MkDir.md b/docs/Reference/Default/VBA/FileSystem/MkDir.md similarity index 100% rename from docs/Reference/VBA/FileSystem/MkDir.md rename to docs/Reference/Default/VBA/FileSystem/MkDir.md diff --git a/docs/Reference/VBA/FileSystem/Reset.md b/docs/Reference/Default/VBA/FileSystem/Reset.md similarity index 100% rename from docs/Reference/VBA/FileSystem/Reset.md rename to docs/Reference/Default/VBA/FileSystem/Reset.md diff --git a/docs/Reference/VBA/FileSystem/RmDir.md b/docs/Reference/Default/VBA/FileSystem/RmDir.md similarity index 100% rename from docs/Reference/VBA/FileSystem/RmDir.md rename to docs/Reference/Default/VBA/FileSystem/RmDir.md diff --git a/docs/Reference/VBA/FileSystem/Seek.md b/docs/Reference/Default/VBA/FileSystem/Seek.md similarity index 100% rename from docs/Reference/VBA/FileSystem/Seek.md rename to docs/Reference/Default/VBA/FileSystem/Seek.md diff --git a/docs/Reference/VBA/FileSystem/SetAttr.md b/docs/Reference/Default/VBA/FileSystem/SetAttr.md similarity index 100% rename from docs/Reference/VBA/FileSystem/SetAttr.md rename to docs/Reference/Default/VBA/FileSystem/SetAttr.md diff --git a/docs/Reference/VBA/FileSystem/Width.md b/docs/Reference/Default/VBA/FileSystem/Width.md similarity index 100% rename from docs/Reference/VBA/FileSystem/Width.md rename to docs/Reference/Default/VBA/FileSystem/Width.md diff --git a/docs/Reference/VBA/FileSystem/index.md b/docs/Reference/Default/VBA/FileSystem/index.md similarity index 100% rename from docs/Reference/VBA/FileSystem/index.md rename to docs/Reference/Default/VBA/FileSystem/index.md diff --git a/docs/Reference/VBA/Financial/DDB.md b/docs/Reference/Default/VBA/Financial/DDB.md similarity index 100% rename from docs/Reference/VBA/Financial/DDB.md rename to docs/Reference/Default/VBA/Financial/DDB.md diff --git a/docs/Reference/VBA/Financial/FV.md b/docs/Reference/Default/VBA/Financial/FV.md similarity index 100% rename from docs/Reference/VBA/Financial/FV.md rename to docs/Reference/Default/VBA/Financial/FV.md diff --git a/docs/Reference/VBA/Financial/IPmt.md b/docs/Reference/Default/VBA/Financial/IPmt.md similarity index 100% rename from docs/Reference/VBA/Financial/IPmt.md rename to docs/Reference/Default/VBA/Financial/IPmt.md diff --git a/docs/Reference/VBA/Financial/IRR.md b/docs/Reference/Default/VBA/Financial/IRR.md similarity index 100% rename from docs/Reference/VBA/Financial/IRR.md rename to docs/Reference/Default/VBA/Financial/IRR.md diff --git a/docs/Reference/VBA/Financial/MIRR.md b/docs/Reference/Default/VBA/Financial/MIRR.md similarity index 100% rename from docs/Reference/VBA/Financial/MIRR.md rename to docs/Reference/Default/VBA/Financial/MIRR.md diff --git a/docs/Reference/VBA/Financial/NPV.md b/docs/Reference/Default/VBA/Financial/NPV.md similarity index 100% rename from docs/Reference/VBA/Financial/NPV.md rename to docs/Reference/Default/VBA/Financial/NPV.md diff --git a/docs/Reference/VBA/Financial/NPer.md b/docs/Reference/Default/VBA/Financial/NPer.md similarity index 100% rename from docs/Reference/VBA/Financial/NPer.md rename to docs/Reference/Default/VBA/Financial/NPer.md diff --git a/docs/Reference/VBA/Financial/PPmt.md b/docs/Reference/Default/VBA/Financial/PPmt.md similarity index 100% rename from docs/Reference/VBA/Financial/PPmt.md rename to docs/Reference/Default/VBA/Financial/PPmt.md diff --git a/docs/Reference/VBA/Financial/PV.md b/docs/Reference/Default/VBA/Financial/PV.md similarity index 100% rename from docs/Reference/VBA/Financial/PV.md rename to docs/Reference/Default/VBA/Financial/PV.md diff --git a/docs/Reference/VBA/Financial/Pmt.md b/docs/Reference/Default/VBA/Financial/Pmt.md similarity index 100% rename from docs/Reference/VBA/Financial/Pmt.md rename to docs/Reference/Default/VBA/Financial/Pmt.md diff --git a/docs/Reference/VBA/Financial/Rate.md b/docs/Reference/Default/VBA/Financial/Rate.md similarity index 100% rename from docs/Reference/VBA/Financial/Rate.md rename to docs/Reference/Default/VBA/Financial/Rate.md diff --git a/docs/Reference/VBA/Financial/SLN.md b/docs/Reference/Default/VBA/Financial/SLN.md similarity index 100% rename from docs/Reference/VBA/Financial/SLN.md rename to docs/Reference/Default/VBA/Financial/SLN.md diff --git a/docs/Reference/VBA/Financial/SYD.md b/docs/Reference/Default/VBA/Financial/SYD.md similarity index 100% rename from docs/Reference/VBA/Financial/SYD.md rename to docs/Reference/Default/VBA/Financial/SYD.md diff --git a/docs/Reference/VBA/Financial/index.md b/docs/Reference/Default/VBA/Financial/index.md similarity index 100% rename from docs/Reference/VBA/Financial/index.md rename to docs/Reference/Default/VBA/Financial/index.md diff --git a/docs/Reference/VBA/HiddenModule/AllocMem.md b/docs/Reference/Default/VBA/HiddenModule/AllocMem.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/AllocMem.md rename to docs/Reference/Default/VBA/HiddenModule/AllocMem.md diff --git a/docs/Reference/VBA/HiddenModule/ConvertIconToBitmap.md b/docs/Reference/Default/VBA/HiddenModule/ConvertIconToBitmap.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/ConvertIconToBitmap.md rename to docs/Reference/Default/VBA/HiddenModule/ConvertIconToBitmap.md diff --git a/docs/Reference/VBA/HiddenModule/CreateGUID.md b/docs/Reference/Default/VBA/HiddenModule/CreateGUID.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/CreateGUID.md rename to docs/Reference/Default/VBA/HiddenModule/CreateGUID.md diff --git a/docs/Reference/VBA/HiddenModule/CreateStdPictureFromHandle.md b/docs/Reference/Default/VBA/HiddenModule/CreateStdPictureFromHandle.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/CreateStdPictureFromHandle.md rename to docs/Reference/Default/VBA/HiddenModule/CreateStdPictureFromHandle.md diff --git a/docs/Reference/VBA/HiddenModule/Emit.md b/docs/Reference/Default/VBA/HiddenModule/Emit.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/Emit.md rename to docs/Reference/Default/VBA/HiddenModule/Emit.md diff --git a/docs/Reference/VBA/HiddenModule/EmitAny.md b/docs/Reference/Default/VBA/HiddenModule/EmitAny.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/EmitAny.md rename to docs/Reference/Default/VBA/HiddenModule/EmitAny.md diff --git a/docs/Reference/VBA/HiddenModule/Eval.md b/docs/Reference/Default/VBA/HiddenModule/Eval.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/Eval.md rename to docs/Reference/Default/VBA/HiddenModule/Eval.md diff --git a/docs/Reference/VBA/HiddenModule/FreeMem.md b/docs/Reference/Default/VBA/HiddenModule/FreeMem.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/FreeMem.md rename to docs/Reference/Default/VBA/HiddenModule/FreeMem.md diff --git a/docs/Reference/VBA/HiddenModule/GetDeclaredMaxEnumValue.md b/docs/Reference/Default/VBA/HiddenModule/GetDeclaredMaxEnumValue.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/GetDeclaredMaxEnumValue.md rename to docs/Reference/Default/VBA/HiddenModule/GetDeclaredMaxEnumValue.md diff --git a/docs/Reference/VBA/HiddenModule/GetDeclaredMinEnumValue.md b/docs/Reference/Default/VBA/HiddenModule/GetDeclaredMinEnumValue.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/GetDeclaredMinEnumValue.md rename to docs/Reference/Default/VBA/HiddenModule/GetDeclaredMinEnumValue.md diff --git a/docs/Reference/VBA/HiddenModule/GetDeclaredTypeClsid.md b/docs/Reference/Default/VBA/HiddenModule/GetDeclaredTypeClsid.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/GetDeclaredTypeClsid.md rename to docs/Reference/Default/VBA/HiddenModule/GetDeclaredTypeClsid.md diff --git a/docs/Reference/VBA/HiddenModule/GetDeclaredTypeEventIid.md b/docs/Reference/Default/VBA/HiddenModule/GetDeclaredTypeEventIid.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/GetDeclaredTypeEventIid.md rename to docs/Reference/Default/VBA/HiddenModule/GetDeclaredTypeEventIid.md diff --git a/docs/Reference/VBA/HiddenModule/GetDeclaredTypeIid.md b/docs/Reference/Default/VBA/HiddenModule/GetDeclaredTypeIid.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/GetDeclaredTypeIid.md rename to docs/Reference/Default/VBA/HiddenModule/GetDeclaredTypeIid.md diff --git a/docs/Reference/VBA/HiddenModule/GetDeclaredTypeProgId.md b/docs/Reference/Default/VBA/HiddenModule/GetDeclaredTypeProgId.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/GetDeclaredTypeProgId.md rename to docs/Reference/Default/VBA/HiddenModule/GetDeclaredTypeProgId.md diff --git a/docs/Reference/VBA/HiddenModule/GetInheritedOwner.md b/docs/Reference/Default/VBA/HiddenModule/GetInheritedOwner.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/GetInheritedOwner.md rename to docs/Reference/Default/VBA/HiddenModule/GetInheritedOwner.md diff --git a/docs/Reference/VBA/HiddenModule/GetMem1.md b/docs/Reference/Default/VBA/HiddenModule/GetMem1.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/GetMem1.md rename to docs/Reference/Default/VBA/HiddenModule/GetMem1.md diff --git a/docs/Reference/VBA/HiddenModule/GetMem2.md b/docs/Reference/Default/VBA/HiddenModule/GetMem2.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/GetMem2.md rename to docs/Reference/Default/VBA/HiddenModule/GetMem2.md diff --git a/docs/Reference/VBA/HiddenModule/GetMem4.md b/docs/Reference/Default/VBA/HiddenModule/GetMem4.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/GetMem4.md rename to docs/Reference/Default/VBA/HiddenModule/GetMem4.md diff --git a/docs/Reference/VBA/HiddenModule/GetMem8.md b/docs/Reference/Default/VBA/HiddenModule/GetMem8.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/GetMem8.md rename to docs/Reference/Default/VBA/HiddenModule/GetMem8.md diff --git a/docs/Reference/VBA/HiddenModule/GetMemPtr.md b/docs/Reference/Default/VBA/HiddenModule/GetMemPtr.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/GetMemPtr.md rename to docs/Reference/Default/VBA/HiddenModule/GetMemPtr.md diff --git a/docs/Reference/VBA/HiddenModule/GetShortcutTextByEnum.md b/docs/Reference/Default/VBA/HiddenModule/GetShortcutTextByEnum.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/GetShortcutTextByEnum.md rename to docs/Reference/Default/VBA/HiddenModule/GetShortcutTextByEnum.md diff --git a/docs/Reference/VBA/HiddenModule/InterlockedCompareExchange32.md b/docs/Reference/Default/VBA/HiddenModule/InterlockedCompareExchange32.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/InterlockedCompareExchange32.md rename to docs/Reference/Default/VBA/HiddenModule/InterlockedCompareExchange32.md diff --git a/docs/Reference/VBA/HiddenModule/InterlockedCompareExchange64.md b/docs/Reference/Default/VBA/HiddenModule/InterlockedCompareExchange64.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/InterlockedCompareExchange64.md rename to docs/Reference/Default/VBA/HiddenModule/InterlockedCompareExchange64.md diff --git a/docs/Reference/VBA/HiddenModule/InterlockedCompareExchangePointer.md b/docs/Reference/Default/VBA/HiddenModule/InterlockedCompareExchangePointer.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/InterlockedCompareExchangePointer.md rename to docs/Reference/Default/VBA/HiddenModule/InterlockedCompareExchangePointer.md diff --git a/docs/Reference/VBA/HiddenModule/InterlockedDecrement32.md b/docs/Reference/Default/VBA/HiddenModule/InterlockedDecrement32.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/InterlockedDecrement32.md rename to docs/Reference/Default/VBA/HiddenModule/InterlockedDecrement32.md diff --git a/docs/Reference/VBA/HiddenModule/InterlockedExchangePointer.md b/docs/Reference/Default/VBA/HiddenModule/InterlockedExchangePointer.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/InterlockedExchangePointer.md rename to docs/Reference/Default/VBA/HiddenModule/InterlockedExchangePointer.md diff --git a/docs/Reference/VBA/HiddenModule/InterlockedIncrement32.md b/docs/Reference/Default/VBA/HiddenModule/InterlockedIncrement32.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/InterlockedIncrement32.md rename to docs/Reference/Default/VBA/HiddenModule/InterlockedIncrement32.md diff --git a/docs/Reference/VBA/HiddenModule/PictureToByteArray.md b/docs/Reference/Default/VBA/HiddenModule/PictureToByteArray.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/PictureToByteArray.md rename to docs/Reference/Default/VBA/HiddenModule/PictureToByteArray.md diff --git a/docs/Reference/VBA/HiddenModule/PutMem1.md b/docs/Reference/Default/VBA/HiddenModule/PutMem1.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/PutMem1.md rename to docs/Reference/Default/VBA/HiddenModule/PutMem1.md diff --git a/docs/Reference/VBA/HiddenModule/PutMem2.md b/docs/Reference/Default/VBA/HiddenModule/PutMem2.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/PutMem2.md rename to docs/Reference/Default/VBA/HiddenModule/PutMem2.md diff --git a/docs/Reference/VBA/HiddenModule/PutMem4.md b/docs/Reference/Default/VBA/HiddenModule/PutMem4.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/PutMem4.md rename to docs/Reference/Default/VBA/HiddenModule/PutMem4.md diff --git a/docs/Reference/VBA/HiddenModule/PutMem8.md b/docs/Reference/Default/VBA/HiddenModule/PutMem8.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/PutMem8.md rename to docs/Reference/Default/VBA/HiddenModule/PutMem8.md diff --git a/docs/Reference/VBA/HiddenModule/PutMemPtr.md b/docs/Reference/Default/VBA/HiddenModule/PutMemPtr.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/PutMemPtr.md rename to docs/Reference/Default/VBA/HiddenModule/PutMemPtr.md diff --git a/docs/Reference/VBA/HiddenModule/RegisterMessage.md b/docs/Reference/Default/VBA/HiddenModule/RegisterMessage.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/RegisterMessage.md rename to docs/Reference/Default/VBA/HiddenModule/RegisterMessage.md diff --git a/docs/Reference/VBA/HiddenModule/RuntimeCreateGetMessageHook.md b/docs/Reference/Default/VBA/HiddenModule/RuntimeCreateGetMessageHook.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/RuntimeCreateGetMessageHook.md rename to docs/Reference/Default/VBA/HiddenModule/RuntimeCreateGetMessageHook.md diff --git a/docs/Reference/VBA/HiddenModule/SetThreadGlobalErrorTrap.md b/docs/Reference/Default/VBA/HiddenModule/SetThreadGlobalErrorTrap.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/SetThreadGlobalErrorTrap.md rename to docs/Reference/Default/VBA/HiddenModule/SetThreadGlobalErrorTrap.md diff --git a/docs/Reference/VBA/HiddenModule/StackArgsSize.md b/docs/Reference/Default/VBA/HiddenModule/StackArgsSize.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/StackArgsSize.md rename to docs/Reference/Default/VBA/HiddenModule/StackArgsSize.md diff --git a/docs/Reference/VBA/HiddenModule/StackOffset.md b/docs/Reference/Default/VBA/HiddenModule/StackOffset.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/StackOffset.md rename to docs/Reference/Default/VBA/HiddenModule/StackOffset.md diff --git a/docs/Reference/VBA/HiddenModule/Start.md b/docs/Reference/Default/VBA/HiddenModule/Start.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/Start.md rename to docs/Reference/Default/VBA/HiddenModule/Start.md diff --git a/docs/Reference/VBA/HiddenModule/Stop.md b/docs/Reference/Default/VBA/HiddenModule/Stop.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/Stop.md rename to docs/Reference/Default/VBA/HiddenModule/Stop.md diff --git a/docs/Reference/VBA/HiddenModule/UnprotectedAccess.md b/docs/Reference/Default/VBA/HiddenModule/UnprotectedAccess.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/UnprotectedAccess.md rename to docs/Reference/Default/VBA/HiddenModule/UnprotectedAccess.md diff --git a/docs/Reference/VBA/HiddenModule/index.md b/docs/Reference/Default/VBA/HiddenModule/index.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/index.md rename to docs/Reference/Default/VBA/HiddenModule/index.md diff --git a/docs/Reference/VBA/HiddenModule/vbaAryMove.md b/docs/Reference/Default/VBA/HiddenModule/vbaAryMove.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/vbaAryMove.md rename to docs/Reference/Default/VBA/HiddenModule/vbaAryMove.md diff --git a/docs/Reference/VBA/HiddenModule/vbaCastObj.md b/docs/Reference/Default/VBA/HiddenModule/vbaCastObj.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/vbaCastObj.md rename to docs/Reference/Default/VBA/HiddenModule/vbaCastObj.md diff --git a/docs/Reference/VBA/HiddenModule/vbaCopyBytes.md b/docs/Reference/Default/VBA/HiddenModule/vbaCopyBytes.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/vbaCopyBytes.md rename to docs/Reference/Default/VBA/HiddenModule/vbaCopyBytes.md diff --git a/docs/Reference/VBA/HiddenModule/vbaCopyBytesZero.md b/docs/Reference/Default/VBA/HiddenModule/vbaCopyBytesZero.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/vbaCopyBytesZero.md rename to docs/Reference/Default/VBA/HiddenModule/vbaCopyBytesZero.md diff --git a/docs/Reference/VBA/HiddenModule/vbaObjAddref.md b/docs/Reference/Default/VBA/HiddenModule/vbaObjAddref.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/vbaObjAddref.md rename to docs/Reference/Default/VBA/HiddenModule/vbaObjAddref.md diff --git a/docs/Reference/VBA/HiddenModule/vbaObjSet.md b/docs/Reference/Default/VBA/HiddenModule/vbaObjSet.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/vbaObjSet.md rename to docs/Reference/Default/VBA/HiddenModule/vbaObjSet.md diff --git a/docs/Reference/VBA/HiddenModule/vbaObjSetAddref.md b/docs/Reference/Default/VBA/HiddenModule/vbaObjSetAddref.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/vbaObjSetAddref.md rename to docs/Reference/Default/VBA/HiddenModule/vbaObjSetAddref.md diff --git a/docs/Reference/VBA/HiddenModule/vbaRefVarAry.md b/docs/Reference/Default/VBA/HiddenModule/vbaRefVarAry.md similarity index 100% rename from docs/Reference/VBA/HiddenModule/vbaRefVarAry.md rename to docs/Reference/Default/VBA/HiddenModule/vbaRefVarAry.md diff --git a/docs/Reference/VBA/Information/Array.md b/docs/Reference/Default/VBA/Information/Array.md similarity index 100% rename from docs/Reference/VBA/Information/Array.md rename to docs/Reference/Default/VBA/Information/Array.md diff --git a/docs/Reference/VBA/Information/Erl.md b/docs/Reference/Default/VBA/Information/Erl.md similarity index 100% rename from docs/Reference/VBA/Information/Erl.md rename to docs/Reference/Default/VBA/Information/Erl.md diff --git a/docs/Reference/VBA/Information/Err.md b/docs/Reference/Default/VBA/Information/Err.md similarity index 100% rename from docs/Reference/VBA/Information/Err.md rename to docs/Reference/Default/VBA/Information/Err.md diff --git a/docs/Reference/VBA/Information/IMEStatus.md b/docs/Reference/Default/VBA/Information/IMEStatus.md similarity index 100% rename from docs/Reference/VBA/Information/IMEStatus.md rename to docs/Reference/Default/VBA/Information/IMEStatus.md diff --git a/docs/Reference/VBA/Information/IsArray.md b/docs/Reference/Default/VBA/Information/IsArray.md similarity index 100% rename from docs/Reference/VBA/Information/IsArray.md rename to docs/Reference/Default/VBA/Information/IsArray.md diff --git a/docs/Reference/VBA/Information/IsArrayInitialized.md b/docs/Reference/Default/VBA/Information/IsArrayInitialized.md similarity index 100% rename from docs/Reference/VBA/Information/IsArrayInitialized.md rename to docs/Reference/Default/VBA/Information/IsArrayInitialized.md diff --git a/docs/Reference/VBA/Information/IsDate.md b/docs/Reference/Default/VBA/Information/IsDate.md similarity index 100% rename from docs/Reference/VBA/Information/IsDate.md rename to docs/Reference/Default/VBA/Information/IsDate.md diff --git a/docs/Reference/VBA/Information/IsEmpty.md b/docs/Reference/Default/VBA/Information/IsEmpty.md similarity index 100% rename from docs/Reference/VBA/Information/IsEmpty.md rename to docs/Reference/Default/VBA/Information/IsEmpty.md diff --git a/docs/Reference/VBA/Information/IsError.md b/docs/Reference/Default/VBA/Information/IsError.md similarity index 100% rename from docs/Reference/VBA/Information/IsError.md rename to docs/Reference/Default/VBA/Information/IsError.md diff --git a/docs/Reference/VBA/Information/IsMissing.md b/docs/Reference/Default/VBA/Information/IsMissing.md similarity index 100% rename from docs/Reference/VBA/Information/IsMissing.md rename to docs/Reference/Default/VBA/Information/IsMissing.md diff --git a/docs/Reference/VBA/Information/IsNull.md b/docs/Reference/Default/VBA/Information/IsNull.md similarity index 100% rename from docs/Reference/VBA/Information/IsNull.md rename to docs/Reference/Default/VBA/Information/IsNull.md diff --git a/docs/Reference/VBA/Information/IsNumeric.md b/docs/Reference/Default/VBA/Information/IsNumeric.md similarity index 100% rename from docs/Reference/VBA/Information/IsNumeric.md rename to docs/Reference/Default/VBA/Information/IsNumeric.md diff --git a/docs/Reference/VBA/Information/IsObject.md b/docs/Reference/Default/VBA/Information/IsObject.md similarity index 100% rename from docs/Reference/VBA/Information/IsObject.md rename to docs/Reference/Default/VBA/Information/IsObject.md diff --git a/docs/Reference/VBA/Information/LBound.md b/docs/Reference/Default/VBA/Information/LBound.md similarity index 100% rename from docs/Reference/VBA/Information/LBound.md rename to docs/Reference/Default/VBA/Information/LBound.md diff --git a/docs/Reference/VBA/Information/ObjPtr.md b/docs/Reference/Default/VBA/Information/ObjPtr.md similarity index 100% rename from docs/Reference/VBA/Information/ObjPtr.md rename to docs/Reference/Default/VBA/Information/ObjPtr.md diff --git a/docs/Reference/VBA/Information/QBColor.md b/docs/Reference/Default/VBA/Information/QBColor.md similarity index 100% rename from docs/Reference/VBA/Information/QBColor.md rename to docs/Reference/Default/VBA/Information/QBColor.md diff --git a/docs/Reference/VBA/Information/RGB.md b/docs/Reference/Default/VBA/Information/RGB.md similarity index 100% rename from docs/Reference/VBA/Information/RGB.md rename to docs/Reference/Default/VBA/Information/RGB.md diff --git a/docs/Reference/VBA/Information/RGBA.md b/docs/Reference/Default/VBA/Information/RGBA.md similarity index 100% rename from docs/Reference/VBA/Information/RGBA.md rename to docs/Reference/Default/VBA/Information/RGBA.md diff --git a/docs/Reference/VBA/Information/RGBA_A.md b/docs/Reference/Default/VBA/Information/RGBA_A.md similarity index 100% rename from docs/Reference/VBA/Information/RGBA_A.md rename to docs/Reference/Default/VBA/Information/RGBA_A.md diff --git a/docs/Reference/VBA/Information/RGB_B.md b/docs/Reference/Default/VBA/Information/RGB_B.md similarity index 100% rename from docs/Reference/VBA/Information/RGB_B.md rename to docs/Reference/Default/VBA/Information/RGB_B.md diff --git a/docs/Reference/VBA/Information/RGB_G.md b/docs/Reference/Default/VBA/Information/RGB_G.md similarity index 100% rename from docs/Reference/VBA/Information/RGB_G.md rename to docs/Reference/Default/VBA/Information/RGB_G.md diff --git a/docs/Reference/VBA/Information/RGB_R.md b/docs/Reference/Default/VBA/Information/RGB_R.md similarity index 100% rename from docs/Reference/VBA/Information/RGB_R.md rename to docs/Reference/Default/VBA/Information/RGB_R.md diff --git a/docs/Reference/VBA/Information/StrPtr.md b/docs/Reference/Default/VBA/Information/StrPtr.md similarity index 100% rename from docs/Reference/VBA/Information/StrPtr.md rename to docs/Reference/Default/VBA/Information/StrPtr.md diff --git a/docs/Reference/VBA/Information/TranslateColor.md b/docs/Reference/Default/VBA/Information/TranslateColor.md similarity index 100% rename from docs/Reference/VBA/Information/TranslateColor.md rename to docs/Reference/Default/VBA/Information/TranslateColor.md diff --git a/docs/Reference/VBA/Information/TypeName.md b/docs/Reference/Default/VBA/Information/TypeName.md similarity index 100% rename from docs/Reference/VBA/Information/TypeName.md rename to docs/Reference/Default/VBA/Information/TypeName.md diff --git a/docs/Reference/VBA/Information/UBound.md b/docs/Reference/Default/VBA/Information/UBound.md similarity index 100% rename from docs/Reference/VBA/Information/UBound.md rename to docs/Reference/Default/VBA/Information/UBound.md diff --git a/docs/Reference/VBA/Information/VarPtr.md b/docs/Reference/Default/VBA/Information/VarPtr.md similarity index 100% rename from docs/Reference/VBA/Information/VarPtr.md rename to docs/Reference/Default/VBA/Information/VarPtr.md diff --git a/docs/Reference/VBA/Information/VarType.md b/docs/Reference/Default/VBA/Information/VarType.md similarity index 100% rename from docs/Reference/VBA/Information/VarType.md rename to docs/Reference/Default/VBA/Information/VarType.md diff --git a/docs/Reference/VBA/Information/index.md b/docs/Reference/Default/VBA/Information/index.md similarity index 100% rename from docs/Reference/VBA/Information/index.md rename to docs/Reference/Default/VBA/Information/index.md diff --git a/docs/Reference/VBA/Interaction/AppActivate.md b/docs/Reference/Default/VBA/Interaction/AppActivate.md similarity index 100% rename from docs/Reference/VBA/Interaction/AppActivate.md rename to docs/Reference/Default/VBA/Interaction/AppActivate.md diff --git a/docs/Reference/VBA/Interaction/Beep.md b/docs/Reference/Default/VBA/Interaction/Beep.md similarity index 100% rename from docs/Reference/VBA/Interaction/Beep.md rename to docs/Reference/Default/VBA/Interaction/Beep.md diff --git a/docs/Reference/VBA/Interaction/CallByDispId.md b/docs/Reference/Default/VBA/Interaction/CallByDispId.md similarity index 100% rename from docs/Reference/VBA/Interaction/CallByDispId.md rename to docs/Reference/Default/VBA/Interaction/CallByDispId.md diff --git a/docs/Reference/VBA/Interaction/CallByName.md b/docs/Reference/Default/VBA/Interaction/CallByName.md similarity index 100% rename from docs/Reference/VBA/Interaction/CallByName.md rename to docs/Reference/Default/VBA/Interaction/CallByName.md diff --git a/docs/Reference/VBA/Interaction/Choose.md b/docs/Reference/Default/VBA/Interaction/Choose.md similarity index 100% rename from docs/Reference/VBA/Interaction/Choose.md rename to docs/Reference/Default/VBA/Interaction/Choose.md diff --git a/docs/Reference/VBA/Interaction/Command.md b/docs/Reference/Default/VBA/Interaction/Command.md similarity index 100% rename from docs/Reference/VBA/Interaction/Command.md rename to docs/Reference/Default/VBA/Interaction/Command.md diff --git a/docs/Reference/VBA/Interaction/CreateObject.md b/docs/Reference/Default/VBA/Interaction/CreateObject.md similarity index 100% rename from docs/Reference/VBA/Interaction/CreateObject.md rename to docs/Reference/Default/VBA/Interaction/CreateObject.md diff --git a/docs/Reference/VBA/Interaction/DeleteSetting.md b/docs/Reference/Default/VBA/Interaction/DeleteSetting.md similarity index 100% rename from docs/Reference/VBA/Interaction/DeleteSetting.md rename to docs/Reference/Default/VBA/Interaction/DeleteSetting.md diff --git a/docs/Reference/VBA/Interaction/DoEvents.md b/docs/Reference/Default/VBA/Interaction/DoEvents.md similarity index 100% rename from docs/Reference/VBA/Interaction/DoEvents.md rename to docs/Reference/Default/VBA/Interaction/DoEvents.md diff --git a/docs/Reference/VBA/Interaction/Environ.md b/docs/Reference/Default/VBA/Interaction/Environ.md similarity index 100% rename from docs/Reference/VBA/Interaction/Environ.md rename to docs/Reference/Default/VBA/Interaction/Environ.md diff --git a/docs/Reference/VBA/Interaction/GetAllSettings.md b/docs/Reference/Default/VBA/Interaction/GetAllSettings.md similarity index 100% rename from docs/Reference/VBA/Interaction/GetAllSettings.md rename to docs/Reference/Default/VBA/Interaction/GetAllSettings.md diff --git a/docs/Reference/VBA/Interaction/GetObject.md b/docs/Reference/Default/VBA/Interaction/GetObject.md similarity index 100% rename from docs/Reference/VBA/Interaction/GetObject.md rename to docs/Reference/Default/VBA/Interaction/GetObject.md diff --git a/docs/Reference/VBA/Interaction/GetSetting.md b/docs/Reference/Default/VBA/Interaction/GetSetting.md similarity index 100% rename from docs/Reference/VBA/Interaction/GetSetting.md rename to docs/Reference/Default/VBA/Interaction/GetSetting.md diff --git a/docs/Reference/VBA/Interaction/IIf.md b/docs/Reference/Default/VBA/Interaction/IIf.md similarity index 100% rename from docs/Reference/VBA/Interaction/IIf.md rename to docs/Reference/Default/VBA/Interaction/IIf.md diff --git a/docs/Reference/VBA/Interaction/If.md b/docs/Reference/Default/VBA/Interaction/If.md similarity index 100% rename from docs/Reference/VBA/Interaction/If.md rename to docs/Reference/Default/VBA/Interaction/If.md diff --git a/docs/Reference/VBA/Interaction/InputBox.md b/docs/Reference/Default/VBA/Interaction/InputBox.md similarity index 100% rename from docs/Reference/VBA/Interaction/InputBox.md rename to docs/Reference/Default/VBA/Interaction/InputBox.md diff --git a/docs/Reference/VBA/Interaction/MsgBox.md b/docs/Reference/Default/VBA/Interaction/MsgBox.md similarity index 100% rename from docs/Reference/VBA/Interaction/MsgBox.md rename to docs/Reference/Default/VBA/Interaction/MsgBox.md diff --git a/docs/Reference/VBA/Interaction/Partition.md b/docs/Reference/Default/VBA/Interaction/Partition.md similarity index 100% rename from docs/Reference/VBA/Interaction/Partition.md rename to docs/Reference/Default/VBA/Interaction/Partition.md diff --git a/docs/Reference/VBA/Interaction/RaiseEventByName.md b/docs/Reference/Default/VBA/Interaction/RaiseEventByName.md similarity index 100% rename from docs/Reference/VBA/Interaction/RaiseEventByName.md rename to docs/Reference/Default/VBA/Interaction/RaiseEventByName.md diff --git a/docs/Reference/VBA/Interaction/RaiseEventByName2.md b/docs/Reference/Default/VBA/Interaction/RaiseEventByName2.md similarity index 100% rename from docs/Reference/VBA/Interaction/RaiseEventByName2.md rename to docs/Reference/Default/VBA/Interaction/RaiseEventByName2.md diff --git a/docs/Reference/VBA/Interaction/SaveSetting.md b/docs/Reference/Default/VBA/Interaction/SaveSetting.md similarity index 100% rename from docs/Reference/VBA/Interaction/SaveSetting.md rename to docs/Reference/Default/VBA/Interaction/SaveSetting.md diff --git a/docs/Reference/VBA/Interaction/SendKeys.md b/docs/Reference/Default/VBA/Interaction/SendKeys.md similarity index 100% rename from docs/Reference/VBA/Interaction/SendKeys.md rename to docs/Reference/Default/VBA/Interaction/SendKeys.md diff --git a/docs/Reference/VBA/Interaction/Shell.md b/docs/Reference/Default/VBA/Interaction/Shell.md similarity index 100% rename from docs/Reference/VBA/Interaction/Shell.md rename to docs/Reference/Default/VBA/Interaction/Shell.md diff --git a/docs/Reference/VBA/Interaction/Switch.md b/docs/Reference/Default/VBA/Interaction/Switch.md similarity index 100% rename from docs/Reference/VBA/Interaction/Switch.md rename to docs/Reference/Default/VBA/Interaction/Switch.md diff --git a/docs/Reference/VBA/Interaction/index.md b/docs/Reference/Default/VBA/Interaction/index.md similarity index 100% rename from docs/Reference/VBA/Interaction/index.md rename to docs/Reference/Default/VBA/Interaction/index.md diff --git a/docs/Reference/VBA/Math/Abs.md b/docs/Reference/Default/VBA/Math/Abs.md similarity index 100% rename from docs/Reference/VBA/Math/Abs.md rename to docs/Reference/Default/VBA/Math/Abs.md diff --git a/docs/Reference/VBA/Math/Atn.md b/docs/Reference/Default/VBA/Math/Atn.md similarity index 100% rename from docs/Reference/VBA/Math/Atn.md rename to docs/Reference/Default/VBA/Math/Atn.md diff --git a/docs/Reference/VBA/Math/Cos.md b/docs/Reference/Default/VBA/Math/Cos.md similarity index 100% rename from docs/Reference/VBA/Math/Cos.md rename to docs/Reference/Default/VBA/Math/Cos.md diff --git a/docs/Reference/VBA/Math/Exp.md b/docs/Reference/Default/VBA/Math/Exp.md similarity index 100% rename from docs/Reference/VBA/Math/Exp.md rename to docs/Reference/Default/VBA/Math/Exp.md diff --git a/docs/Reference/VBA/Math/Log.md b/docs/Reference/Default/VBA/Math/Log.md similarity index 100% rename from docs/Reference/VBA/Math/Log.md rename to docs/Reference/Default/VBA/Math/Log.md diff --git a/docs/Reference/VBA/Math/Randomize.md b/docs/Reference/Default/VBA/Math/Randomize.md similarity index 100% rename from docs/Reference/VBA/Math/Randomize.md rename to docs/Reference/Default/VBA/Math/Randomize.md diff --git a/docs/Reference/VBA/Math/Rnd.md b/docs/Reference/Default/VBA/Math/Rnd.md similarity index 100% rename from docs/Reference/VBA/Math/Rnd.md rename to docs/Reference/Default/VBA/Math/Rnd.md diff --git a/docs/Reference/VBA/Math/Round.md b/docs/Reference/Default/VBA/Math/Round.md similarity index 100% rename from docs/Reference/VBA/Math/Round.md rename to docs/Reference/Default/VBA/Math/Round.md diff --git a/docs/Reference/VBA/Math/Sgn.md b/docs/Reference/Default/VBA/Math/Sgn.md similarity index 100% rename from docs/Reference/VBA/Math/Sgn.md rename to docs/Reference/Default/VBA/Math/Sgn.md diff --git a/docs/Reference/VBA/Math/Sin.md b/docs/Reference/Default/VBA/Math/Sin.md similarity index 100% rename from docs/Reference/VBA/Math/Sin.md rename to docs/Reference/Default/VBA/Math/Sin.md diff --git a/docs/Reference/VBA/Math/Sqr.md b/docs/Reference/Default/VBA/Math/Sqr.md similarity index 100% rename from docs/Reference/VBA/Math/Sqr.md rename to docs/Reference/Default/VBA/Math/Sqr.md diff --git a/docs/Reference/VBA/Math/Tan.md b/docs/Reference/Default/VBA/Math/Tan.md similarity index 100% rename from docs/Reference/VBA/Math/Tan.md rename to docs/Reference/Default/VBA/Math/Tan.md diff --git a/docs/Reference/VBA/Math/index.md b/docs/Reference/Default/VBA/Math/index.md similarity index 100% rename from docs/Reference/VBA/Math/index.md rename to docs/Reference/Default/VBA/Math/index.md diff --git a/docs/Reference/VBA/Strings/Asc.md b/docs/Reference/Default/VBA/Strings/Asc.md similarity index 100% rename from docs/Reference/VBA/Strings/Asc.md rename to docs/Reference/Default/VBA/Strings/Asc.md diff --git a/docs/Reference/VBA/Strings/Chr.md b/docs/Reference/Default/VBA/Strings/Chr.md similarity index 100% rename from docs/Reference/VBA/Strings/Chr.md rename to docs/Reference/Default/VBA/Strings/Chr.md diff --git a/docs/Reference/VBA/Strings/Filter.md b/docs/Reference/Default/VBA/Strings/Filter.md similarity index 100% rename from docs/Reference/VBA/Strings/Filter.md rename to docs/Reference/Default/VBA/Strings/Filter.md diff --git a/docs/Reference/VBA/Strings/Format.md b/docs/Reference/Default/VBA/Strings/Format.md similarity index 100% rename from docs/Reference/VBA/Strings/Format.md rename to docs/Reference/Default/VBA/Strings/Format.md diff --git a/docs/Reference/VBA/Strings/FormatCurrency.md b/docs/Reference/Default/VBA/Strings/FormatCurrency.md similarity index 100% rename from docs/Reference/VBA/Strings/FormatCurrency.md rename to docs/Reference/Default/VBA/Strings/FormatCurrency.md diff --git a/docs/Reference/VBA/Strings/FormatDateTime.md b/docs/Reference/Default/VBA/Strings/FormatDateTime.md similarity index 100% rename from docs/Reference/VBA/Strings/FormatDateTime.md rename to docs/Reference/Default/VBA/Strings/FormatDateTime.md diff --git a/docs/Reference/VBA/Strings/FormatNumber.md b/docs/Reference/Default/VBA/Strings/FormatNumber.md similarity index 100% rename from docs/Reference/VBA/Strings/FormatNumber.md rename to docs/Reference/Default/VBA/Strings/FormatNumber.md diff --git a/docs/Reference/VBA/Strings/FormatPercent.md b/docs/Reference/Default/VBA/Strings/FormatPercent.md similarity index 100% rename from docs/Reference/VBA/Strings/FormatPercent.md rename to docs/Reference/Default/VBA/Strings/FormatPercent.md diff --git a/docs/Reference/VBA/Strings/InStr.md b/docs/Reference/Default/VBA/Strings/InStr.md similarity index 100% rename from docs/Reference/VBA/Strings/InStr.md rename to docs/Reference/Default/VBA/Strings/InStr.md diff --git a/docs/Reference/VBA/Strings/InStrRev.md b/docs/Reference/Default/VBA/Strings/InStrRev.md similarity index 100% rename from docs/Reference/VBA/Strings/InStrRev.md rename to docs/Reference/Default/VBA/Strings/InStrRev.md diff --git a/docs/Reference/VBA/Strings/Join.md b/docs/Reference/Default/VBA/Strings/Join.md similarity index 100% rename from docs/Reference/VBA/Strings/Join.md rename to docs/Reference/Default/VBA/Strings/Join.md diff --git a/docs/Reference/VBA/Strings/LCase.md b/docs/Reference/Default/VBA/Strings/LCase.md similarity index 100% rename from docs/Reference/VBA/Strings/LCase.md rename to docs/Reference/Default/VBA/Strings/LCase.md diff --git a/docs/Reference/VBA/Strings/LTrim.md b/docs/Reference/Default/VBA/Strings/LTrim.md similarity index 100% rename from docs/Reference/VBA/Strings/LTrim.md rename to docs/Reference/Default/VBA/Strings/LTrim.md diff --git a/docs/Reference/VBA/Strings/Left.md b/docs/Reference/Default/VBA/Strings/Left.md similarity index 100% rename from docs/Reference/VBA/Strings/Left.md rename to docs/Reference/Default/VBA/Strings/Left.md diff --git a/docs/Reference/VBA/Strings/Len.md b/docs/Reference/Default/VBA/Strings/Len.md similarity index 100% rename from docs/Reference/VBA/Strings/Len.md rename to docs/Reference/Default/VBA/Strings/Len.md diff --git a/docs/Reference/VBA/Strings/Mid.md b/docs/Reference/Default/VBA/Strings/Mid.md similarity index 100% rename from docs/Reference/VBA/Strings/Mid.md rename to docs/Reference/Default/VBA/Strings/Mid.md diff --git a/docs/Reference/VBA/Strings/MonthName.md b/docs/Reference/Default/VBA/Strings/MonthName.md similarity index 100% rename from docs/Reference/VBA/Strings/MonthName.md rename to docs/Reference/Default/VBA/Strings/MonthName.md diff --git a/docs/Reference/VBA/Strings/RTrim.md b/docs/Reference/Default/VBA/Strings/RTrim.md similarity index 100% rename from docs/Reference/VBA/Strings/RTrim.md rename to docs/Reference/Default/VBA/Strings/RTrim.md diff --git a/docs/Reference/VBA/Strings/Replace.md b/docs/Reference/Default/VBA/Strings/Replace.md similarity index 100% rename from docs/Reference/VBA/Strings/Replace.md rename to docs/Reference/Default/VBA/Strings/Replace.md diff --git a/docs/Reference/VBA/Strings/Right.md b/docs/Reference/Default/VBA/Strings/Right.md similarity index 100% rename from docs/Reference/VBA/Strings/Right.md rename to docs/Reference/Default/VBA/Strings/Right.md diff --git a/docs/Reference/VBA/Strings/Space.md b/docs/Reference/Default/VBA/Strings/Space.md similarity index 100% rename from docs/Reference/VBA/Strings/Space.md rename to docs/Reference/Default/VBA/Strings/Space.md diff --git a/docs/Reference/VBA/Strings/Split.md b/docs/Reference/Default/VBA/Strings/Split.md similarity index 100% rename from docs/Reference/VBA/Strings/Split.md rename to docs/Reference/Default/VBA/Strings/Split.md diff --git a/docs/Reference/VBA/Strings/StrComp.md b/docs/Reference/Default/VBA/Strings/StrComp.md similarity index 100% rename from docs/Reference/VBA/Strings/StrComp.md rename to docs/Reference/Default/VBA/Strings/StrComp.md diff --git a/docs/Reference/VBA/Strings/StrConv.md b/docs/Reference/Default/VBA/Strings/StrConv.md similarity index 100% rename from docs/Reference/VBA/Strings/StrConv.md rename to docs/Reference/Default/VBA/Strings/StrConv.md diff --git a/docs/Reference/VBA/Strings/StrReverse.md b/docs/Reference/Default/VBA/Strings/StrReverse.md similarity index 100% rename from docs/Reference/VBA/Strings/StrReverse.md rename to docs/Reference/Default/VBA/Strings/StrReverse.md diff --git a/docs/Reference/VBA/Strings/String.md b/docs/Reference/Default/VBA/Strings/String.md similarity index 100% rename from docs/Reference/VBA/Strings/String.md rename to docs/Reference/Default/VBA/Strings/String.md diff --git a/docs/Reference/VBA/Strings/Trim.md b/docs/Reference/Default/VBA/Strings/Trim.md similarity index 100% rename from docs/Reference/VBA/Strings/Trim.md rename to docs/Reference/Default/VBA/Strings/Trim.md diff --git a/docs/Reference/VBA/Strings/UCase.md b/docs/Reference/Default/VBA/Strings/UCase.md similarity index 100% rename from docs/Reference/VBA/Strings/UCase.md rename to docs/Reference/Default/VBA/Strings/UCase.md diff --git a/docs/Reference/VBA/Strings/WeekdayName.md b/docs/Reference/Default/VBA/Strings/WeekdayName.md similarity index 100% rename from docs/Reference/VBA/Strings/WeekdayName.md rename to docs/Reference/Default/VBA/Strings/WeekdayName.md diff --git a/docs/Reference/VBA/Strings/index.md b/docs/Reference/Default/VBA/Strings/index.md similarity index 100% rename from docs/Reference/VBA/Strings/index.md rename to docs/Reference/Default/VBA/Strings/index.md diff --git a/docs/Reference/VBA/TbExpressionService/AddCustomBinder.md b/docs/Reference/Default/VBA/TbExpressionService/AddCustomBinder.md similarity index 100% rename from docs/Reference/VBA/TbExpressionService/AddCustomBinder.md rename to docs/Reference/Default/VBA/TbExpressionService/AddCustomBinder.md diff --git a/docs/Reference/VBA/TbExpressionService/AddCustomBinderObject.md b/docs/Reference/Default/VBA/TbExpressionService/AddCustomBinderObject.md similarity index 100% rename from docs/Reference/VBA/TbExpressionService/AddCustomBinderObject.md rename to docs/Reference/Default/VBA/TbExpressionService/AddCustomBinderObject.md diff --git a/docs/Reference/VBA/TbExpressionService/AddStdLibraryBinder.md b/docs/Reference/Default/VBA/TbExpressionService/AddStdLibraryBinder.md similarity index 100% rename from docs/Reference/VBA/TbExpressionService/AddStdLibraryBinder.md rename to docs/Reference/Default/VBA/TbExpressionService/AddStdLibraryBinder.md diff --git a/docs/Reference/VBA/TbExpressionService/Bind.md b/docs/Reference/Default/VBA/TbExpressionService/Bind.md similarity index 100% rename from docs/Reference/VBA/TbExpressionService/Bind.md rename to docs/Reference/Default/VBA/TbExpressionService/Bind.md diff --git a/docs/Reference/VBA/TbExpressionService/Compile.md b/docs/Reference/Default/VBA/TbExpressionService/Compile.md similarity index 100% rename from docs/Reference/VBA/TbExpressionService/Compile.md rename to docs/Reference/Default/VBA/TbExpressionService/Compile.md diff --git a/docs/Reference/VBA/TbExpressionService/Evaluate.md b/docs/Reference/Default/VBA/TbExpressionService/Evaluate.md similarity index 100% rename from docs/Reference/VBA/TbExpressionService/Evaluate.md rename to docs/Reference/Default/VBA/TbExpressionService/Evaluate.md diff --git a/docs/Reference/VBA/TbExpressionService/index.md b/docs/Reference/Default/VBA/TbExpressionService/index.md similarity index 100% rename from docs/Reference/VBA/TbExpressionService/index.md rename to docs/Reference/Default/VBA/TbExpressionService/index.md diff --git a/docs/Reference/VBA/index.md b/docs/Reference/Default/VBA/index.md similarity index 99% rename from docs/Reference/VBA/index.md rename to docs/Reference/Default/VBA/index.md index d2571e05..1b048152 100644 --- a/docs/Reference/VBA/index.md +++ b/docs/Reference/Default/VBA/index.md @@ -1,6 +1,6 @@ --- title: VBA Package -parent: Packages +parent: Default Packages nav_order: 2 permalink: /tB/Packages/VBA redirect_from: diff --git a/docs/Reference/VBRUN/AmbientProperties/BackColor.md b/docs/Reference/Default/VBRUN/AmbientProperties/BackColor.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/BackColor.md rename to docs/Reference/Default/VBRUN/AmbientProperties/BackColor.md diff --git a/docs/Reference/VBRUN/AmbientProperties/DisplayAsDefault.md b/docs/Reference/Default/VBRUN/AmbientProperties/DisplayAsDefault.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/DisplayAsDefault.md rename to docs/Reference/Default/VBRUN/AmbientProperties/DisplayAsDefault.md diff --git a/docs/Reference/VBRUN/AmbientProperties/DisplayName.md b/docs/Reference/Default/VBRUN/AmbientProperties/DisplayName.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/DisplayName.md rename to docs/Reference/Default/VBRUN/AmbientProperties/DisplayName.md diff --git a/docs/Reference/VBRUN/AmbientProperties/Font.md b/docs/Reference/Default/VBRUN/AmbientProperties/Font.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/Font.md rename to docs/Reference/Default/VBRUN/AmbientProperties/Font.md diff --git a/docs/Reference/VBRUN/AmbientProperties/ForeColor.md b/docs/Reference/Default/VBRUN/AmbientProperties/ForeColor.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/ForeColor.md rename to docs/Reference/Default/VBRUN/AmbientProperties/ForeColor.md diff --git a/docs/Reference/VBRUN/AmbientProperties/LocaleID.md b/docs/Reference/Default/VBRUN/AmbientProperties/LocaleID.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/LocaleID.md rename to docs/Reference/Default/VBRUN/AmbientProperties/LocaleID.md diff --git a/docs/Reference/VBRUN/AmbientProperties/MessageReflect.md b/docs/Reference/Default/VBRUN/AmbientProperties/MessageReflect.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/MessageReflect.md rename to docs/Reference/Default/VBRUN/AmbientProperties/MessageReflect.md diff --git a/docs/Reference/VBRUN/AmbientProperties/Palette.md b/docs/Reference/Default/VBRUN/AmbientProperties/Palette.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/Palette.md rename to docs/Reference/Default/VBRUN/AmbientProperties/Palette.md diff --git a/docs/Reference/VBRUN/AmbientProperties/RightToLeft.md b/docs/Reference/Default/VBRUN/AmbientProperties/RightToLeft.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/RightToLeft.md rename to docs/Reference/Default/VBRUN/AmbientProperties/RightToLeft.md diff --git a/docs/Reference/VBRUN/AmbientProperties/ScaleUnits.md b/docs/Reference/Default/VBRUN/AmbientProperties/ScaleUnits.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/ScaleUnits.md rename to docs/Reference/Default/VBRUN/AmbientProperties/ScaleUnits.md diff --git a/docs/Reference/VBRUN/AmbientProperties/ShowGrabHandles.md b/docs/Reference/Default/VBRUN/AmbientProperties/ShowGrabHandles.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/ShowGrabHandles.md rename to docs/Reference/Default/VBRUN/AmbientProperties/ShowGrabHandles.md diff --git a/docs/Reference/VBRUN/AmbientProperties/ShowHatching.md b/docs/Reference/Default/VBRUN/AmbientProperties/ShowHatching.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/ShowHatching.md rename to docs/Reference/Default/VBRUN/AmbientProperties/ShowHatching.md diff --git a/docs/Reference/VBRUN/AmbientProperties/SupportsMnemonics.md b/docs/Reference/Default/VBRUN/AmbientProperties/SupportsMnemonics.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/SupportsMnemonics.md rename to docs/Reference/Default/VBRUN/AmbientProperties/SupportsMnemonics.md diff --git a/docs/Reference/VBRUN/AmbientProperties/TextAlign.md b/docs/Reference/Default/VBRUN/AmbientProperties/TextAlign.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/TextAlign.md rename to docs/Reference/Default/VBRUN/AmbientProperties/TextAlign.md diff --git a/docs/Reference/VBRUN/AmbientProperties/UIDead.md b/docs/Reference/Default/VBRUN/AmbientProperties/UIDead.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/UIDead.md rename to docs/Reference/Default/VBRUN/AmbientProperties/UIDead.md diff --git a/docs/Reference/VBRUN/AmbientProperties/UserMode.md b/docs/Reference/Default/VBRUN/AmbientProperties/UserMode.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/UserMode.md rename to docs/Reference/Default/VBRUN/AmbientProperties/UserMode.md diff --git a/docs/Reference/VBRUN/AmbientProperties/index.md b/docs/Reference/Default/VBRUN/AmbientProperties/index.md similarity index 100% rename from docs/Reference/VBRUN/AmbientProperties/index.md rename to docs/Reference/Default/VBRUN/AmbientProperties/index.md diff --git a/docs/Reference/VBRUN/AsyncProperty/AsyncType.md b/docs/Reference/Default/VBRUN/AsyncProperty/AsyncType.md similarity index 100% rename from docs/Reference/VBRUN/AsyncProperty/AsyncType.md rename to docs/Reference/Default/VBRUN/AsyncProperty/AsyncType.md diff --git a/docs/Reference/VBRUN/AsyncProperty/BytesMax.md b/docs/Reference/Default/VBRUN/AsyncProperty/BytesMax.md similarity index 100% rename from docs/Reference/VBRUN/AsyncProperty/BytesMax.md rename to docs/Reference/Default/VBRUN/AsyncProperty/BytesMax.md diff --git a/docs/Reference/VBRUN/AsyncProperty/BytesRead.md b/docs/Reference/Default/VBRUN/AsyncProperty/BytesRead.md similarity index 100% rename from docs/Reference/VBRUN/AsyncProperty/BytesRead.md rename to docs/Reference/Default/VBRUN/AsyncProperty/BytesRead.md diff --git a/docs/Reference/VBRUN/AsyncProperty/PropertyName.md b/docs/Reference/Default/VBRUN/AsyncProperty/PropertyName.md similarity index 100% rename from docs/Reference/VBRUN/AsyncProperty/PropertyName.md rename to docs/Reference/Default/VBRUN/AsyncProperty/PropertyName.md diff --git a/docs/Reference/VBRUN/AsyncProperty/Status.md b/docs/Reference/Default/VBRUN/AsyncProperty/Status.md similarity index 100% rename from docs/Reference/VBRUN/AsyncProperty/Status.md rename to docs/Reference/Default/VBRUN/AsyncProperty/Status.md diff --git a/docs/Reference/VBRUN/AsyncProperty/StatusCode.md b/docs/Reference/Default/VBRUN/AsyncProperty/StatusCode.md similarity index 100% rename from docs/Reference/VBRUN/AsyncProperty/StatusCode.md rename to docs/Reference/Default/VBRUN/AsyncProperty/StatusCode.md diff --git a/docs/Reference/VBRUN/AsyncProperty/Target.md b/docs/Reference/Default/VBRUN/AsyncProperty/Target.md similarity index 100% rename from docs/Reference/VBRUN/AsyncProperty/Target.md rename to docs/Reference/Default/VBRUN/AsyncProperty/Target.md diff --git a/docs/Reference/VBRUN/AsyncProperty/Value.md b/docs/Reference/Default/VBRUN/AsyncProperty/Value.md similarity index 100% rename from docs/Reference/VBRUN/AsyncProperty/Value.md rename to docs/Reference/Default/VBRUN/AsyncProperty/Value.md diff --git a/docs/Reference/VBRUN/AsyncProperty/index.md b/docs/Reference/Default/VBRUN/AsyncProperty/index.md similarity index 100% rename from docs/Reference/VBRUN/AsyncProperty/index.md rename to docs/Reference/Default/VBRUN/AsyncProperty/index.md diff --git a/docs/Reference/VBRUN/Constants/AlignConstants.md b/docs/Reference/Default/VBRUN/Constants/AlignConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/AlignConstants.md rename to docs/Reference/Default/VBRUN/Constants/AlignConstants.md diff --git a/docs/Reference/VBRUN/Constants/AlignmentConstants.md b/docs/Reference/Default/VBRUN/Constants/AlignmentConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/AlignmentConstants.md rename to docs/Reference/Default/VBRUN/Constants/AlignmentConstants.md diff --git a/docs/Reference/VBRUN/Constants/AlignmentConstantsNoCenter.md b/docs/Reference/Default/VBRUN/Constants/AlignmentConstantsNoCenter.md similarity index 100% rename from docs/Reference/VBRUN/Constants/AlignmentConstantsNoCenter.md rename to docs/Reference/Default/VBRUN/Constants/AlignmentConstantsNoCenter.md diff --git a/docs/Reference/VBRUN/Constants/AppearanceConstants.md b/docs/Reference/Default/VBRUN/Constants/AppearanceConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/AppearanceConstants.md rename to docs/Reference/Default/VBRUN/Constants/AppearanceConstants.md diff --git a/docs/Reference/VBRUN/Constants/ApplicationStartConstants.md b/docs/Reference/Default/VBRUN/Constants/ApplicationStartConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ApplicationStartConstants.md rename to docs/Reference/Default/VBRUN/Constants/ApplicationStartConstants.md diff --git a/docs/Reference/VBRUN/Constants/AspectTypeConstants.md b/docs/Reference/Default/VBRUN/Constants/AspectTypeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/AspectTypeConstants.md rename to docs/Reference/Default/VBRUN/Constants/AspectTypeConstants.md diff --git a/docs/Reference/VBRUN/Constants/AsyncReadConstants.md b/docs/Reference/Default/VBRUN/Constants/AsyncReadConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/AsyncReadConstants.md rename to docs/Reference/Default/VBRUN/Constants/AsyncReadConstants.md diff --git a/docs/Reference/VBRUN/Constants/AsyncStatusCodeConstants.md b/docs/Reference/Default/VBRUN/Constants/AsyncStatusCodeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/AsyncStatusCodeConstants.md rename to docs/Reference/Default/VBRUN/Constants/AsyncStatusCodeConstants.md diff --git a/docs/Reference/VBRUN/Constants/AsyncTypeConstants.md b/docs/Reference/Default/VBRUN/Constants/AsyncTypeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/AsyncTypeConstants.md rename to docs/Reference/Default/VBRUN/Constants/AsyncTypeConstants.md diff --git a/docs/Reference/VBRUN/Constants/BackFillStyleConstants.md b/docs/Reference/Default/VBRUN/Constants/BackFillStyleConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/BackFillStyleConstants.md rename to docs/Reference/Default/VBRUN/Constants/BackFillStyleConstants.md diff --git a/docs/Reference/VBRUN/Constants/BorderStyleConstants.md b/docs/Reference/Default/VBRUN/Constants/BorderStyleConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/BorderStyleConstants.md rename to docs/Reference/Default/VBRUN/Constants/BorderStyleConstants.md diff --git a/docs/Reference/VBRUN/Constants/ButtonConstants.md b/docs/Reference/Default/VBRUN/Constants/ButtonConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ButtonConstants.md rename to docs/Reference/Default/VBRUN/Constants/ButtonConstants.md diff --git a/docs/Reference/VBRUN/Constants/CheckBoxConstants.md b/docs/Reference/Default/VBRUN/Constants/CheckBoxConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/CheckBoxConstants.md rename to docs/Reference/Default/VBRUN/Constants/CheckBoxConstants.md diff --git a/docs/Reference/VBRUN/Constants/ClipboardConstants.md b/docs/Reference/Default/VBRUN/Constants/ClipboardConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ClipboardConstants.md rename to docs/Reference/Default/VBRUN/Constants/ClipboardConstants.md diff --git a/docs/Reference/VBRUN/Constants/ColorConstants.md b/docs/Reference/Default/VBRUN/Constants/ColorConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ColorConstants.md rename to docs/Reference/Default/VBRUN/Constants/ColorConstants.md diff --git a/docs/Reference/VBRUN/Constants/ComboBoxConstants.md b/docs/Reference/Default/VBRUN/Constants/ComboBoxConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ComboBoxConstants.md rename to docs/Reference/Default/VBRUN/Constants/ComboBoxConstants.md diff --git a/docs/Reference/VBRUN/Constants/ControlBorderStyleConstants.md b/docs/Reference/Default/VBRUN/Constants/ControlBorderStyleConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ControlBorderStyleConstants.md rename to docs/Reference/Default/VBRUN/Constants/ControlBorderStyleConstants.md diff --git a/docs/Reference/VBRUN/Constants/ControlBorderStyleConstantsCustom.md b/docs/Reference/Default/VBRUN/Constants/ControlBorderStyleConstantsCustom.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ControlBorderStyleConstantsCustom.md rename to docs/Reference/Default/VBRUN/Constants/ControlBorderStyleConstantsCustom.md diff --git a/docs/Reference/VBRUN/Constants/ControlTypeConstants.md b/docs/Reference/Default/VBRUN/Constants/ControlTypeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ControlTypeConstants.md rename to docs/Reference/Default/VBRUN/Constants/ControlTypeConstants.md diff --git a/docs/Reference/VBRUN/Constants/DataBOFconstants.md b/docs/Reference/Default/VBRUN/Constants/DataBOFconstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/DataBOFconstants.md rename to docs/Reference/Default/VBRUN/Constants/DataBOFconstants.md diff --git a/docs/Reference/VBRUN/Constants/DataEOFConstants.md b/docs/Reference/Default/VBRUN/Constants/DataEOFConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/DataEOFConstants.md rename to docs/Reference/Default/VBRUN/Constants/DataEOFConstants.md diff --git a/docs/Reference/VBRUN/Constants/DataErrorConstants.md b/docs/Reference/Default/VBRUN/Constants/DataErrorConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/DataErrorConstants.md rename to docs/Reference/Default/VBRUN/Constants/DataErrorConstants.md diff --git a/docs/Reference/VBRUN/Constants/DataValidateConstants.md b/docs/Reference/Default/VBRUN/Constants/DataValidateConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/DataValidateConstants.md rename to docs/Reference/Default/VBRUN/Constants/DataValidateConstants.md diff --git a/docs/Reference/VBRUN/Constants/DatabaseTypeConstants.md b/docs/Reference/Default/VBRUN/Constants/DatabaseTypeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/DatabaseTypeConstants.md rename to docs/Reference/Default/VBRUN/Constants/DatabaseTypeConstants.md diff --git a/docs/Reference/VBRUN/Constants/DefaultCursorTypeConstants.md b/docs/Reference/Default/VBRUN/Constants/DefaultCursorTypeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/DefaultCursorTypeConstants.md rename to docs/Reference/Default/VBRUN/Constants/DefaultCursorTypeConstants.md diff --git a/docs/Reference/VBRUN/Constants/DockModeConstants.md b/docs/Reference/Default/VBRUN/Constants/DockModeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/DockModeConstants.md rename to docs/Reference/Default/VBRUN/Constants/DockModeConstants.md diff --git a/docs/Reference/VBRUN/Constants/DragConstants.md b/docs/Reference/Default/VBRUN/Constants/DragConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/DragConstants.md rename to docs/Reference/Default/VBRUN/Constants/DragConstants.md diff --git a/docs/Reference/VBRUN/Constants/DragModeConstants.md b/docs/Reference/Default/VBRUN/Constants/DragModeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/DragModeConstants.md rename to docs/Reference/Default/VBRUN/Constants/DragModeConstants.md diff --git a/docs/Reference/VBRUN/Constants/DragOverConstants.md b/docs/Reference/Default/VBRUN/Constants/DragOverConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/DragOverConstants.md rename to docs/Reference/Default/VBRUN/Constants/DragOverConstants.md diff --git a/docs/Reference/VBRUN/Constants/DrawModeConstants.md b/docs/Reference/Default/VBRUN/Constants/DrawModeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/DrawModeConstants.md rename to docs/Reference/Default/VBRUN/Constants/DrawModeConstants.md diff --git a/docs/Reference/VBRUN/Constants/DrawStyleConstants.md b/docs/Reference/Default/VBRUN/Constants/DrawStyleConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/DrawStyleConstants.md rename to docs/Reference/Default/VBRUN/Constants/DrawStyleConstants.md diff --git a/docs/Reference/VBRUN/Constants/FillStyleConstants.md b/docs/Reference/Default/VBRUN/Constants/FillStyleConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/FillStyleConstants.md rename to docs/Reference/Default/VBRUN/Constants/FillStyleConstants.md diff --git a/docs/Reference/VBRUN/Constants/FillStyleConstantsEx.md b/docs/Reference/Default/VBRUN/Constants/FillStyleConstantsEx.md similarity index 100% rename from docs/Reference/VBRUN/Constants/FillStyleConstantsEx.md rename to docs/Reference/Default/VBRUN/Constants/FillStyleConstantsEx.md diff --git a/docs/Reference/VBRUN/Constants/FormArrangeConstants.md b/docs/Reference/Default/VBRUN/Constants/FormArrangeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/FormArrangeConstants.md rename to docs/Reference/Default/VBRUN/Constants/FormArrangeConstants.md diff --git a/docs/Reference/VBRUN/Constants/FormBorderStyleConstants.md b/docs/Reference/Default/VBRUN/Constants/FormBorderStyleConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/FormBorderStyleConstants.md rename to docs/Reference/Default/VBRUN/Constants/FormBorderStyleConstants.md diff --git a/docs/Reference/VBRUN/Constants/FormShowConstants.md b/docs/Reference/Default/VBRUN/Constants/FormShowConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/FormShowConstants.md rename to docs/Reference/Default/VBRUN/Constants/FormShowConstants.md diff --git a/docs/Reference/VBRUN/Constants/FormWindowStateConstants.md b/docs/Reference/Default/VBRUN/Constants/FormWindowStateConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/FormWindowStateConstants.md rename to docs/Reference/Default/VBRUN/Constants/FormWindowStateConstants.md diff --git a/docs/Reference/VBRUN/Constants/HitResultConstants.md b/docs/Reference/Default/VBRUN/Constants/HitResultConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/HitResultConstants.md rename to docs/Reference/Default/VBRUN/Constants/HitResultConstants.md diff --git a/docs/Reference/VBRUN/Constants/KeyCodeConstants.md b/docs/Reference/Default/VBRUN/Constants/KeyCodeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/KeyCodeConstants.md rename to docs/Reference/Default/VBRUN/Constants/KeyCodeConstants.md diff --git a/docs/Reference/VBRUN/Constants/LinkModeConstants.md b/docs/Reference/Default/VBRUN/Constants/LinkModeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/LinkModeConstants.md rename to docs/Reference/Default/VBRUN/Constants/LinkModeConstants.md diff --git a/docs/Reference/VBRUN/Constants/ListBoxConstants.md b/docs/Reference/Default/VBRUN/Constants/ListBoxConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ListBoxConstants.md rename to docs/Reference/Default/VBRUN/Constants/ListBoxConstants.md diff --git a/docs/Reference/VBRUN/Constants/LoadPictureColorConstants.md b/docs/Reference/Default/VBRUN/Constants/LoadPictureColorConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/LoadPictureColorConstants.md rename to docs/Reference/Default/VBRUN/Constants/LoadPictureColorConstants.md diff --git a/docs/Reference/VBRUN/Constants/LoadPictureSizeConstants.md b/docs/Reference/Default/VBRUN/Constants/LoadPictureSizeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/LoadPictureSizeConstants.md rename to docs/Reference/Default/VBRUN/Constants/LoadPictureSizeConstants.md diff --git a/docs/Reference/VBRUN/Constants/LoadResConstants.md b/docs/Reference/Default/VBRUN/Constants/LoadResConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/LoadResConstants.md rename to docs/Reference/Default/VBRUN/Constants/LoadResConstants.md diff --git a/docs/Reference/VBRUN/Constants/LogEventTypeConstants.md b/docs/Reference/Default/VBRUN/Constants/LogEventTypeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/LogEventTypeConstants.md rename to docs/Reference/Default/VBRUN/Constants/LogEventTypeConstants.md diff --git a/docs/Reference/VBRUN/Constants/LogModeConstants.md b/docs/Reference/Default/VBRUN/Constants/LogModeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/LogModeConstants.md rename to docs/Reference/Default/VBRUN/Constants/LogModeConstants.md diff --git a/docs/Reference/VBRUN/Constants/MenuAccelConstants.md b/docs/Reference/Default/VBRUN/Constants/MenuAccelConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/MenuAccelConstants.md rename to docs/Reference/Default/VBRUN/Constants/MenuAccelConstants.md diff --git a/docs/Reference/VBRUN/Constants/MenuControlConstants.md b/docs/Reference/Default/VBRUN/Constants/MenuControlConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/MenuControlConstants.md rename to docs/Reference/Default/VBRUN/Constants/MenuControlConstants.md diff --git a/docs/Reference/VBRUN/Constants/MouseButtonConstants.md b/docs/Reference/Default/VBRUN/Constants/MouseButtonConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/MouseButtonConstants.md rename to docs/Reference/Default/VBRUN/Constants/MouseButtonConstants.md diff --git a/docs/Reference/VBRUN/Constants/MousePointerConstants.md b/docs/Reference/Default/VBRUN/Constants/MousePointerConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/MousePointerConstants.md rename to docs/Reference/Default/VBRUN/Constants/MousePointerConstants.md diff --git a/docs/Reference/VBRUN/Constants/MultiSelectConstants.md b/docs/Reference/Default/VBRUN/Constants/MultiSelectConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/MultiSelectConstants.md rename to docs/Reference/Default/VBRUN/Constants/MultiSelectConstants.md diff --git a/docs/Reference/VBRUN/Constants/NegotiatePositionConstants.md b/docs/Reference/Default/VBRUN/Constants/NegotiatePositionConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/NegotiatePositionConstants.md rename to docs/Reference/Default/VBRUN/Constants/NegotiatePositionConstants.md diff --git a/docs/Reference/VBRUN/Constants/OLEContainerActivateConstants.md b/docs/Reference/Default/VBRUN/Constants/OLEContainerActivateConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/OLEContainerActivateConstants.md rename to docs/Reference/Default/VBRUN/Constants/OLEContainerActivateConstants.md diff --git a/docs/Reference/VBRUN/Constants/OLEContainerConstants.md b/docs/Reference/Default/VBRUN/Constants/OLEContainerConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/OLEContainerConstants.md rename to docs/Reference/Default/VBRUN/Constants/OLEContainerConstants.md diff --git a/docs/Reference/VBRUN/Constants/OLEContainerDisplayTypeConstants.md b/docs/Reference/Default/VBRUN/Constants/OLEContainerDisplayTypeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/OLEContainerDisplayTypeConstants.md rename to docs/Reference/Default/VBRUN/Constants/OLEContainerDisplayTypeConstants.md diff --git a/docs/Reference/VBRUN/Constants/OLEContainerSizeModeConstants.md b/docs/Reference/Default/VBRUN/Constants/OLEContainerSizeModeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/OLEContainerSizeModeConstants.md rename to docs/Reference/Default/VBRUN/Constants/OLEContainerSizeModeConstants.md diff --git a/docs/Reference/VBRUN/Constants/OLEContainerTypesAllowedConstants.md b/docs/Reference/Default/VBRUN/Constants/OLEContainerTypesAllowedConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/OLEContainerTypesAllowedConstants.md rename to docs/Reference/Default/VBRUN/Constants/OLEContainerTypesAllowedConstants.md diff --git a/docs/Reference/VBRUN/Constants/OLEContainerUpdateOptionsConstants.md b/docs/Reference/Default/VBRUN/Constants/OLEContainerUpdateOptionsConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/OLEContainerUpdateOptionsConstants.md rename to docs/Reference/Default/VBRUN/Constants/OLEContainerUpdateOptionsConstants.md diff --git a/docs/Reference/VBRUN/Constants/OLEDragConstants.md b/docs/Reference/Default/VBRUN/Constants/OLEDragConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/OLEDragConstants.md rename to docs/Reference/Default/VBRUN/Constants/OLEDragConstants.md diff --git a/docs/Reference/VBRUN/Constants/OLEDropConstants.md b/docs/Reference/Default/VBRUN/Constants/OLEDropConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/OLEDropConstants.md rename to docs/Reference/Default/VBRUN/Constants/OLEDropConstants.md diff --git a/docs/Reference/VBRUN/Constants/OLEDropEffectConstants.md b/docs/Reference/Default/VBRUN/Constants/OLEDropEffectConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/OLEDropEffectConstants.md rename to docs/Reference/Default/VBRUN/Constants/OLEDropEffectConstants.md diff --git a/docs/Reference/VBRUN/Constants/OldLinkModeConstants.md b/docs/Reference/Default/VBRUN/Constants/OldLinkModeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/OldLinkModeConstants.md rename to docs/Reference/Default/VBRUN/Constants/OldLinkModeConstants.md diff --git a/docs/Reference/VBRUN/Constants/PaletteModeConstants.md b/docs/Reference/Default/VBRUN/Constants/PaletteModeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/PaletteModeConstants.md rename to docs/Reference/Default/VBRUN/Constants/PaletteModeConstants.md diff --git a/docs/Reference/VBRUN/Constants/ParentControlsType.md b/docs/Reference/Default/VBRUN/Constants/ParentControlsType.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ParentControlsType.md rename to docs/Reference/Default/VBRUN/Constants/ParentControlsType.md diff --git a/docs/Reference/VBRUN/Constants/PictureTypeConstants.md b/docs/Reference/Default/VBRUN/Constants/PictureTypeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/PictureTypeConstants.md rename to docs/Reference/Default/VBRUN/Constants/PictureTypeConstants.md diff --git a/docs/Reference/VBRUN/Constants/PrinterObjectConstants.md b/docs/Reference/Default/VBRUN/Constants/PrinterObjectConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/PrinterObjectConstants.md rename to docs/Reference/Default/VBRUN/Constants/PrinterObjectConstants.md diff --git a/docs/Reference/VBRUN/Constants/PrinterObjectConstants_ColorMode.md b/docs/Reference/Default/VBRUN/Constants/PrinterObjectConstants_ColorMode.md similarity index 100% rename from docs/Reference/VBRUN/Constants/PrinterObjectConstants_ColorMode.md rename to docs/Reference/Default/VBRUN/Constants/PrinterObjectConstants_ColorMode.md diff --git a/docs/Reference/VBRUN/Constants/PrinterObjectConstants_Duplex.md b/docs/Reference/Default/VBRUN/Constants/PrinterObjectConstants_Duplex.md similarity index 100% rename from docs/Reference/VBRUN/Constants/PrinterObjectConstants_Duplex.md rename to docs/Reference/Default/VBRUN/Constants/PrinterObjectConstants_Duplex.md diff --git a/docs/Reference/VBRUN/Constants/PrinterObjectConstants_Orientation.md b/docs/Reference/Default/VBRUN/Constants/PrinterObjectConstants_Orientation.md similarity index 100% rename from docs/Reference/VBRUN/Constants/PrinterObjectConstants_Orientation.md rename to docs/Reference/Default/VBRUN/Constants/PrinterObjectConstants_Orientation.md diff --git a/docs/Reference/VBRUN/Constants/PrinterObjectConstants_PaperBin.md b/docs/Reference/Default/VBRUN/Constants/PrinterObjectConstants_PaperBin.md similarity index 100% rename from docs/Reference/VBRUN/Constants/PrinterObjectConstants_PaperBin.md rename to docs/Reference/Default/VBRUN/Constants/PrinterObjectConstants_PaperBin.md diff --git a/docs/Reference/VBRUN/Constants/PrinterObjectConstants_PaperSize.md b/docs/Reference/Default/VBRUN/Constants/PrinterObjectConstants_PaperSize.md similarity index 100% rename from docs/Reference/VBRUN/Constants/PrinterObjectConstants_PaperSize.md rename to docs/Reference/Default/VBRUN/Constants/PrinterObjectConstants_PaperSize.md diff --git a/docs/Reference/VBRUN/Constants/PrinterObjectConstants_PrintQuality.md b/docs/Reference/Default/VBRUN/Constants/PrinterObjectConstants_PrintQuality.md similarity index 100% rename from docs/Reference/VBRUN/Constants/PrinterObjectConstants_PrintQuality.md rename to docs/Reference/Default/VBRUN/Constants/PrinterObjectConstants_PrintQuality.md diff --git a/docs/Reference/VBRUN/Constants/QueryUnloadConstants.md b/docs/Reference/Default/VBRUN/Constants/QueryUnloadConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/QueryUnloadConstants.md rename to docs/Reference/Default/VBRUN/Constants/QueryUnloadConstants.md diff --git a/docs/Reference/VBRUN/Constants/RasterOpConstants.md b/docs/Reference/Default/VBRUN/Constants/RasterOpConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/RasterOpConstants.md rename to docs/Reference/Default/VBRUN/Constants/RasterOpConstants.md diff --git a/docs/Reference/VBRUN/Constants/RecordsetTypeConstants.md b/docs/Reference/Default/VBRUN/Constants/RecordsetTypeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/RecordsetTypeConstants.md rename to docs/Reference/Default/VBRUN/Constants/RecordsetTypeConstants.md diff --git a/docs/Reference/VBRUN/Constants/ScaleModeConstants.md b/docs/Reference/Default/VBRUN/Constants/ScaleModeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ScaleModeConstants.md rename to docs/Reference/Default/VBRUN/Constants/ScaleModeConstants.md diff --git a/docs/Reference/VBRUN/Constants/ScrollBarConstants.md b/docs/Reference/Default/VBRUN/Constants/ScrollBarConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ScrollBarConstants.md rename to docs/Reference/Default/VBRUN/Constants/ScrollBarConstants.md diff --git a/docs/Reference/VBRUN/Constants/ShapeConstants.md b/docs/Reference/Default/VBRUN/Constants/ShapeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ShapeConstants.md rename to docs/Reference/Default/VBRUN/Constants/ShapeConstants.md diff --git a/docs/Reference/VBRUN/Constants/ShiftConstants.md b/docs/Reference/Default/VBRUN/Constants/ShiftConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ShiftConstants.md rename to docs/Reference/Default/VBRUN/Constants/ShiftConstants.md diff --git a/docs/Reference/VBRUN/Constants/ShortcutConstants.md b/docs/Reference/Default/VBRUN/Constants/ShortcutConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ShortcutConstants.md rename to docs/Reference/Default/VBRUN/Constants/ShortcutConstants.md diff --git a/docs/Reference/VBRUN/Constants/StartUpPositionConstants.md b/docs/Reference/Default/VBRUN/Constants/StartUpPositionConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/StartUpPositionConstants.md rename to docs/Reference/Default/VBRUN/Constants/StartUpPositionConstants.md diff --git a/docs/Reference/VBRUN/Constants/StorageTypeContants.md b/docs/Reference/Default/VBRUN/Constants/StorageTypeContants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/StorageTypeContants.md rename to docs/Reference/Default/VBRUN/Constants/StorageTypeContants.md diff --git a/docs/Reference/VBRUN/Constants/SystemColorConstants.md b/docs/Reference/Default/VBRUN/Constants/SystemColorConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/SystemColorConstants.md rename to docs/Reference/Default/VBRUN/Constants/SystemColorConstants.md diff --git a/docs/Reference/VBRUN/Constants/VariantTypeConstants.md b/docs/Reference/Default/VBRUN/Constants/VariantTypeConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/VariantTypeConstants.md rename to docs/Reference/Default/VBRUN/Constants/VariantTypeConstants.md diff --git a/docs/Reference/VBRUN/Constants/VerticalAlignmentConstants.md b/docs/Reference/Default/VBRUN/Constants/VerticalAlignmentConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/VerticalAlignmentConstants.md rename to docs/Reference/Default/VBRUN/Constants/VerticalAlignmentConstants.md diff --git a/docs/Reference/VBRUN/Constants/ZOrderConstants.md b/docs/Reference/Default/VBRUN/Constants/ZOrderConstants.md similarity index 100% rename from docs/Reference/VBRUN/Constants/ZOrderConstants.md rename to docs/Reference/Default/VBRUN/Constants/ZOrderConstants.md diff --git a/docs/Reference/VBRUN/Constants/index.md b/docs/Reference/Default/VBRUN/Constants/index.md similarity index 100% rename from docs/Reference/VBRUN/Constants/index.md rename to docs/Reference/Default/VBRUN/Constants/index.md diff --git a/docs/Reference/VBRUN/ContainedControls/index.md b/docs/Reference/Default/VBRUN/ContainedControls/index.md similarity index 100% rename from docs/Reference/VBRUN/ContainedControls/index.md rename to docs/Reference/Default/VBRUN/ContainedControls/index.md diff --git a/docs/Reference/VBRUN/DataMembers/index.md b/docs/Reference/Default/VBRUN/DataMembers/index.md similarity index 100% rename from docs/Reference/VBRUN/DataMembers/index.md rename to docs/Reference/Default/VBRUN/DataMembers/index.md diff --git a/docs/Reference/VBRUN/DataObject/AvailableFormats.md b/docs/Reference/Default/VBRUN/DataObject/AvailableFormats.md similarity index 100% rename from docs/Reference/VBRUN/DataObject/AvailableFormats.md rename to docs/Reference/Default/VBRUN/DataObject/AvailableFormats.md diff --git a/docs/Reference/VBRUN/DataObject/Clear.md b/docs/Reference/Default/VBRUN/DataObject/Clear.md similarity index 100% rename from docs/Reference/VBRUN/DataObject/Clear.md rename to docs/Reference/Default/VBRUN/DataObject/Clear.md diff --git a/docs/Reference/VBRUN/DataObject/DataObjectFiles.md b/docs/Reference/Default/VBRUN/DataObject/DataObjectFiles.md similarity index 100% rename from docs/Reference/VBRUN/DataObject/DataObjectFiles.md rename to docs/Reference/Default/VBRUN/DataObject/DataObjectFiles.md diff --git a/docs/Reference/VBRUN/DataObject/DataObjectFormat.md b/docs/Reference/Default/VBRUN/DataObject/DataObjectFormat.md similarity index 100% rename from docs/Reference/VBRUN/DataObject/DataObjectFormat.md rename to docs/Reference/Default/VBRUN/DataObject/DataObjectFormat.md diff --git a/docs/Reference/VBRUN/DataObject/DataObjectFormats.md b/docs/Reference/Default/VBRUN/DataObject/DataObjectFormats.md similarity index 100% rename from docs/Reference/VBRUN/DataObject/DataObjectFormats.md rename to docs/Reference/Default/VBRUN/DataObject/DataObjectFormats.md diff --git a/docs/Reference/VBRUN/DataObject/Files.md b/docs/Reference/Default/VBRUN/DataObject/Files.md similarity index 100% rename from docs/Reference/VBRUN/DataObject/Files.md rename to docs/Reference/Default/VBRUN/DataObject/Files.md diff --git a/docs/Reference/VBRUN/DataObject/GetData.md b/docs/Reference/Default/VBRUN/DataObject/GetData.md similarity index 100% rename from docs/Reference/VBRUN/DataObject/GetData.md rename to docs/Reference/Default/VBRUN/DataObject/GetData.md diff --git a/docs/Reference/VBRUN/DataObject/GetDataByName.md b/docs/Reference/Default/VBRUN/DataObject/GetDataByName.md similarity index 100% rename from docs/Reference/VBRUN/DataObject/GetDataByName.md rename to docs/Reference/Default/VBRUN/DataObject/GetDataByName.md diff --git a/docs/Reference/VBRUN/DataObject/GetFormat.md b/docs/Reference/Default/VBRUN/DataObject/GetFormat.md similarity index 100% rename from docs/Reference/VBRUN/DataObject/GetFormat.md rename to docs/Reference/Default/VBRUN/DataObject/GetFormat.md diff --git a/docs/Reference/VBRUN/DataObject/GetFormatByName.md b/docs/Reference/Default/VBRUN/DataObject/GetFormatByName.md similarity index 100% rename from docs/Reference/VBRUN/DataObject/GetFormatByName.md rename to docs/Reference/Default/VBRUN/DataObject/GetFormatByName.md diff --git a/docs/Reference/VBRUN/DataObject/SetData.md b/docs/Reference/Default/VBRUN/DataObject/SetData.md similarity index 100% rename from docs/Reference/VBRUN/DataObject/SetData.md rename to docs/Reference/Default/VBRUN/DataObject/SetData.md diff --git a/docs/Reference/VBRUN/DataObject/index.md b/docs/Reference/Default/VBRUN/DataObject/index.md similarity index 100% rename from docs/Reference/VBRUN/DataObject/index.md rename to docs/Reference/Default/VBRUN/DataObject/index.md diff --git a/docs/Reference/VBRUN/ErrorCallstack/index.md b/docs/Reference/Default/VBRUN/ErrorCallstack/index.md similarity index 100% rename from docs/Reference/VBRUN/ErrorCallstack/index.md rename to docs/Reference/Default/VBRUN/ErrorCallstack/index.md diff --git a/docs/Reference/VBRUN/ErrorContext/index.md b/docs/Reference/Default/VBRUN/ErrorContext/index.md similarity index 100% rename from docs/Reference/VBRUN/ErrorContext/index.md rename to docs/Reference/Default/VBRUN/ErrorContext/index.md diff --git a/docs/Reference/VBRUN/ErrorStackFrame/index.md b/docs/Reference/Default/VBRUN/ErrorStackFrame/index.md similarity index 100% rename from docs/Reference/VBRUN/ErrorStackFrame/index.md rename to docs/Reference/Default/VBRUN/ErrorStackFrame/index.md diff --git a/docs/Reference/VBRUN/Hyperlink/index.md b/docs/Reference/Default/VBRUN/Hyperlink/index.md similarity index 100% rename from docs/Reference/VBRUN/Hyperlink/index.md rename to docs/Reference/Default/VBRUN/Hyperlink/index.md diff --git a/docs/Reference/VBRUN/ParentControls/index.md b/docs/Reference/Default/VBRUN/ParentControls/index.md similarity index 100% rename from docs/Reference/VBRUN/ParentControls/index.md rename to docs/Reference/Default/VBRUN/ParentControls/index.md diff --git a/docs/Reference/VBRUN/PropertyBag/index.md b/docs/Reference/Default/VBRUN/PropertyBag/index.md similarity index 100% rename from docs/Reference/VBRUN/PropertyBag/index.md rename to docs/Reference/Default/VBRUN/PropertyBag/index.md diff --git a/docs/Reference/VBRUN/index.md b/docs/Reference/Default/VBRUN/index.md similarity index 99% rename from docs/Reference/VBRUN/index.md rename to docs/Reference/Default/VBRUN/index.md index 13f71e34..cf356b38 100644 --- a/docs/Reference/VBRUN/index.md +++ b/docs/Reference/Default/VBRUN/index.md @@ -1,6 +1,6 @@ --- title: VBRUN Package -parent: Packages +parent: Default Packages nav_order: 3 permalink: /tB/Packages/VBRUN/ has_toc: false diff --git a/docs/Reference/Packages.md b/docs/Reference/Packages.md index c7716c3a..14513a40 100644 --- a/docs/Reference/Packages.md +++ b/docs/Reference/Packages.md @@ -7,26 +7,7 @@ has_toc: false # Packages -A *package* groups related code --- modules, classes, controls, and enumerations --- under a single namespace, and is referenced from a project as a single dependency. See [Features → Packages](../../Features/Packages/) for how packages are built and distributed in general; the pages below document the *built-in* packages that ship with twinBASIC itself. +A *package* groups related code --- modules, classes, controls, and enumerations --- under a single namespace, and is referenced from a project as a single dependency. See [Features → Packages](../../Features/Packages/) for how packages are built and distributed in general. -## Default Packages - -These packages are included in every project by default. - -- [VB Package](VB/) -- standard controls (**CheckBox**, **CommandButton**, **TextBox**, …), forms, and the application-level singletons (**App**, **Screen**, **Clipboard**, **Printer**, …) -- [VBA Package](VBA) -- the standard runtime library -- **MsgBox**, **CStr**, **Mid**, **Format**, … grouped into modules, plus the **Collection** and **Err** intrinsics and twinBASIC's runtime expression engine -- [VBRUN Package](VBRUN/) -- runtime-only types -- ambient properties, asynchronous-read state, structured error context, the **PropertyBag**, the clipboard / drag-and-drop container, and the enumerations used by classic VB6 forms and controls - -## Built-In Packages - -These packages are built into twinBASIC and are always available, even offline. To use them, add them to Project → References (Ctrl-T) → Available Packages. - -- [Assert Package](Assert/) -- assertion functions for unit tests -- three modules (**Exact**, **Strict**, **Permissive**) sharing the same fifteen-member API with different comparison strictness -- [CustomControls Package](CustomControls/) -- owner-drawn `Waynes…` custom controls (button, form, frame, grid, label, slider, textbox, timer), the shared `Styles/` helpers that paint them, and the DESIGNER framework (interfaces, callback objects, **Canvas**, **SerializeInfo**) for authoring new custom controls -- [CEF Package](CEF/) -- the **CefBrowser** control wrapping the Chromium Embedded Framework: cross-platform-ready browser embedding with a choice of three Chromium runtimes (v49 / v109 / v145); currently in BETA -- [WebView2 Package](WebView2/) -- the **WebView2** control wrapping the Microsoft Edge runtime, plus its surrounding wrapper objects (request / response / headers / environment options) and the `wv2…` enumerations -- [WinEventLogLib Package](WinEventLogLib/) -- writes Windows Event Log entries from twinBASIC; the generic **EventLog**(*Of EventIds, Categories*) class handles registration, registry setup, and the per-event `ReportEventW` call, with message-table resources for *EventIds* and *Categories* synthesised into the EXE at compile time -- [WinNamedPipesLib Package](WinNamedPipesLib/) -- Windows named pipes as twinBASIC objects with an asynchronous IOCP-driven I/O model; **NamedPipeServer** + **NamedPipeServerConnection** on the host side, **NamedPipeClientManager** + **NamedPipeClientConnection** on the client side, with message-boundary semantics and a cookie-based correlation pattern across `AsyncRead` / `AsyncWrite` and their matching events -- [WinServicesLib Package](WinServicesLib/) -- runs a twinBASIC EXE as one or more Windows services; the **Services** singleton coordinates configuration, install / uninstall, and the SCM dispatcher loop, while user-implemented [**ITbService**](WinServicesLib/ITbService) classes are instantiated through [**ServiceCreator**](WinServicesLib/ServiceCreator)`(Of T)` -- [tbIDE Package](tbIDE/) -- the **addin SDK** for the twinBASIC IDE: every addin is a Standard DLL that exports `tbCreateCompilerAddin`, returns an object implementing the [**AddIn**](tbIDE/AddIn) contract, and from there reaches the IDE's toolbar, tool-window DOM, virtual file system, debug console, current project (and its `Evaluate` debug-console hook), keyboard shortcuts, and themes -- all through the [**Host**](tbIDE/Host) object the IDE passes in -- [WinNativeCommonCtls Package](WinNativeCommonCtls/) -- VB6-compatible replacement for **Microsoft Common Controls 6.0** (`MSCOMCTL.OCX`) built on top of the Win32 ComCtl32 controls: eight controls ([**DTPicker**](WinNativeCommonCtls/DTPicker), [**ImageList**](WinNativeCommonCtls/ImageList/), [**ListView**](WinNativeCommonCtls/ListView/), [**MonthView**](WinNativeCommonCtls/MonthView), [**ProgressBar**](WinNativeCommonCtls/ProgressBar), [**Slider**](WinNativeCommonCtls/Slider), [**TreeView**](WinNativeCommonCtls/TreeView/), [**UpDown**](WinNativeCommonCtls/UpDown)) with the original member names preserved, plus the collection sub-objects ([**ListItems**](WinNativeCommonCtls/ListView/ListItems), [**ColumnHeaders**](WinNativeCommonCtls/ListView/ColumnHeaders), [**Nodes**](WinNativeCommonCtls/TreeView/Nodes), [**ListImages**](WinNativeCommonCtls/ImageList/ListImages)) and the user-facing enumerations +- [**Default Packages**](Default/) -- VB, VBA, and VBRUN -- included in every project by default +- [**Built-In Packages**](Built-In/) -- nine optional packages shipped with twinBASIC, always available offline diff --git a/docs/_book.yml b/docs/_book.yml index 6e406728..bff72bc8 100644 --- a/docs/_book.yml +++ b/docs/_book.yml @@ -276,6 +276,12 @@ parts: # control pages in URL order. foreword_page: /tB/Packages/ chapters: + - title: Default Packages + subtitle: VB, VBA, and VBRUN --- included in every project by default + landing_page: /tB/Packages/Default/ + landing_is_target: true + outline_closed: true + - title: VBA Package subtitle: Standard runtime modules --- Strings, Math, FileSystem, and the rest landing_page: /tB/Packages/VBA @@ -297,6 +303,12 @@ parts: landing_is_target: true outline_closed: true + - title: Built-In Packages + subtitle: Nine optional packages shipped with twinBASIC, always available offline + landing_page: /tB/Packages/Built-In/ + landing_is_target: true + outline_closed: true + - title: WebView2 Package subtitle: Chromium-based browser control via Microsoft Edge WebView2 landing_page: /tB/Packages/WebView2/ From eadcef5704d2092a46cab29d9ddd3bc6323dcd22 Mon Sep 17 00:00:00 2001 From: Kuba Sunderland-Ober Date: Thu, 4 Jun 2026 17:07:03 +0200 Subject: [PATCH 3/9] Move TwinBasicAssertions docs to a folder of same name. --- docs/Reference/Built-In/{Assert => TwinBasicAssertions}/Exact.md | 0 .../Built-In/{Assert => TwinBasicAssertions}/Permissive.md | 0 docs/Reference/Built-In/{Assert => TwinBasicAssertions}/Strict.md | 0 docs/Reference/Built-In/{Assert => TwinBasicAssertions}/index.md | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename docs/Reference/Built-In/{Assert => TwinBasicAssertions}/Exact.md (100%) rename docs/Reference/Built-In/{Assert => TwinBasicAssertions}/Permissive.md (100%) rename docs/Reference/Built-In/{Assert => TwinBasicAssertions}/Strict.md (100%) rename docs/Reference/Built-In/{Assert => TwinBasicAssertions}/index.md (100%) diff --git a/docs/Reference/Built-In/Assert/Exact.md b/docs/Reference/Built-In/TwinBasicAssertions/Exact.md similarity index 100% rename from docs/Reference/Built-In/Assert/Exact.md rename to docs/Reference/Built-In/TwinBasicAssertions/Exact.md diff --git a/docs/Reference/Built-In/Assert/Permissive.md b/docs/Reference/Built-In/TwinBasicAssertions/Permissive.md similarity index 100% rename from docs/Reference/Built-In/Assert/Permissive.md rename to docs/Reference/Built-In/TwinBasicAssertions/Permissive.md diff --git a/docs/Reference/Built-In/Assert/Strict.md b/docs/Reference/Built-In/TwinBasicAssertions/Strict.md similarity index 100% rename from docs/Reference/Built-In/Assert/Strict.md rename to docs/Reference/Built-In/TwinBasicAssertions/Strict.md diff --git a/docs/Reference/Built-In/Assert/index.md b/docs/Reference/Built-In/TwinBasicAssertions/index.md similarity index 100% rename from docs/Reference/Built-In/Assert/index.md rename to docs/Reference/Built-In/TwinBasicAssertions/index.md From 77c6a036c4bffd6e887b665c848c0484b34db78b Mon Sep 17 00:00:00 2001 From: Kuba Sunderland-Ober Date: Thu, 4 Jun 2026 17:54:45 +0200 Subject: [PATCH 4/9] Update TwinBasicAssertions documentation. --- .../Built-In/TwinBasicAssertions/Exact.md | 49 +++++++++++++- .../TwinBasicAssertions/Permissive.md | 57 +++++++++++++++- .../Built-In/TwinBasicAssertions/Strict.md | 57 +++++++++++++++- .../Built-In/TwinBasicAssertions/index.md | 65 ++++++++++++++++--- 4 files changed, 214 insertions(+), 14 deletions(-) diff --git a/docs/Reference/Built-In/TwinBasicAssertions/Exact.md b/docs/Reference/Built-In/TwinBasicAssertions/Exact.md index a9421761..2d8b444f 100644 --- a/docs/Reference/Built-In/TwinBasicAssertions/Exact.md +++ b/docs/Reference/Built-In/TwinBasicAssertions/Exact.md @@ -89,6 +89,16 @@ Syntax: **Exact.AreEqual** *Expected*, *Actual* [, *Message* ] The comparison follows this module's [comparison semantics](#comparison-semantics) --- *Expected* and *Actual* must have the same datatype, strings are compared case-sensitively, and `Empty`, `vbNullString`, and `""` are all distinct from one another. If either operand is **Null**, the assertion fails --- `Null` is never equal to anything; use [**IsNull**](#isnull) to test for **Null** explicitly. +```tb +Exact.AreEqual 42, result ' passes only if result is Long 42 +Exact.AreEqual "Hello", greeting ' passes only if greeting is exactly "Hello" + +' These all fail under Exact: +Exact.AreEqual 5, 5.0 ' Long vs Double — datatypes differ +Exact.AreEqual "", vbNullString ' the two empty-string forms are distinct +Exact.AreEqual Empty, 0 ' Empty is distinct from 0 +``` + ### AreNotEqual Asserts that *Actual* is not equal to *Expected*. @@ -104,7 +114,14 @@ Syntax: **Exact.AreNotEqual** *Expected*, *Actual* [, *Message* ] *Message* : *optional* A **String** included in the failure record if the values are equal. -Comparison uses this module's [comparison semantics](#comparison-semantics). If either operand is **Null**, the assertion passes --- `Null` is never equal to anything. +The comparison follows this module's [comparison semantics](#comparison-semantics) --- *Expected* and *Actual* must have the same datatype for the values to be considered equal, strings are compared case-sensitively, and `Empty`, `vbNullString`, and `""` are all treated as distinct values. If either operand is **Null**, the assertion passes --- `Null` is never equal to anything, including another `Null`. + +```tb +Exact.AreNotEqual 5, 6 ' passes — different values +Exact.AreNotEqual "A", "a" ' passes — case-sensitive, so "A" <> "a" +Exact.AreNotEqual 5, 5.0 ' passes — Long vs Double, datatypes differ +Exact.AreNotEqual "", vbNullString ' passes — distinct empty-string forms +``` ### AreSame @@ -138,6 +155,15 @@ Syntax: **Exact.AreNotSame** *Expected*, *Actual* [, *Message* ] *Message* : *optional* A **String** included in the failure record if the references are the same. +Reference identity is independent of the module's other comparison rules --- **AreNotSame** always uses the **IsNot** operator, never default-member equality. To compare values rather than references, use [**AreNotEqual**](#arenotequal). + +```tb +Dim a As New Collection +Dim b As New Collection +Exact.AreNotSame a, b ' passes — a and b are distinct object instances +Exact.AreNotSame a, a ' fails — same reference +``` + ## Boolean ### IsTrue @@ -208,7 +234,13 @@ Syntax: **Exact.IsNull** *Value* [, *Message* ] *Message* : *optional* A **String** included in the failure record if *Value* is not **Null**. -Equivalent to checking [**IsNull**](../../Modules/Information/IsNull)`(Value) = True`. To check for the **Nothing** object reference instead, use [**IsNothing**](#isnothing). +Equivalent to checking [**IsNull**](../../Modules/Information/IsNull)`(Value) = True`. Because `Null` is never equal to anything --- not even to itself --- the equality assertions ([**AreEqual**](#areequal), [**AreNotEqual**](#arenotequal)) cannot be used to test for **Null**; this assertion exists specifically for that purpose. To check for the **Nothing** object reference instead, use [**IsNothing**](#isnothing). + +```tb +Dim rs As Object ' assume this is a Recordset +' A field value may be Null when the database column contains no data: +Exact.IsNull rs.Fields("MiddleName").Value +``` ### IsNotNull @@ -222,6 +254,19 @@ Syntax: **Exact.IsNotNull** *Value* [, *Message* ] *Message* : *optional* A **String** included in the failure record if *Value* is **Null**. +**IsNotNull** is the inverse of [**IsNull**](#isnull): it passes when `IsNull(Value)` would return **False**, and fails when `IsNull(Value)` would return **True**. Because `Null` is never considered equal to anything --- including itself --- `AreNotEqual(Null, value)` is not a reliable way to assert the absence of **Null**; **IsNotNull** is the correct assertion for that purpose. To check for the **Nothing** object reference instead, use [**IsNotNothing**](#isnotnothing). + +```tb +Sub TestQueryResult() + Dim result As Variant + result = db.ReadField("Name") + + ' Assert the field was present and not null before inspecting its value. + Exact.IsNotNull result, "expected a non-null Name field" + Exact.AreEqual "Alice", result +End Sub +``` + ## Sequence ### SequenceEquals diff --git a/docs/Reference/Built-In/TwinBasicAssertions/Permissive.md b/docs/Reference/Built-In/TwinBasicAssertions/Permissive.md index ac9623c6..3780ca27 100644 --- a/docs/Reference/Built-In/TwinBasicAssertions/Permissive.md +++ b/docs/Reference/Built-In/TwinBasicAssertions/Permissive.md @@ -85,6 +85,16 @@ Syntax: **Permissive.AreEqual** *Expected*, *Actual* [, *Message* ] The comparison follows this module's [comparison semantics](#comparison-semantics) --- strings are compared case-insensitively, object comparison reads default members where they exist, and everything else uses normal twinBASIC equality (so numeric promotions apply and `vbNullString` matches `""`). If either operand is **Null**, the assertion fails --- `Null` is never equal to anything; use [**IsNull**](#isnull) to test for **Null** explicitly. +```tb +Permissive.AreEqual 42, result ' passes if result equals 42 (numeric promotion applies) +Permissive.AreEqual "Hello", greeting ' passes if greeting equals "hello", "HELLO", etc. + +' These all pass under Permissive (would fail under Exact or Strict): +Permissive.AreEqual "Hello", "hello" ' case-insensitive string comparison +Permissive.AreEqual 5, 5.0 ' numeric promotion makes them equal +Permissive.AreEqual "", vbNullString ' both treated as the empty string +``` + ### AreNotEqual Asserts that *Actual* is not equal to *Expected*. @@ -100,7 +110,14 @@ Syntax: **Permissive.AreNotEqual** *Expected*, *Actual* [, *Message* ] *Message* : *optional* A **String** included in the failure record if the values are equal. -Comparison uses this module's [comparison semantics](#comparison-semantics). If either operand is **Null**, the assertion passes --- `Null` is never equal to anything. +Comparison uses this module's [comparison semantics](#comparison-semantics) --- strings are compared case-insensitively, object comparison reads default members where they exist, and numeric promotions apply. If either operand is **Null**, the assertion passes --- `Null` is never equal to anything. + +```tb +Permissive.AreNotEqual "Hello", "world" ' passes — different strings +Permissive.AreNotEqual 5, 6 ' passes — different numeric values +Permissive.AreNotEqual "Hello", "hello" ' fails — Permissive is case-insensitive +Permissive.AreNotEqual 5, 5.0 ' fails — numeric promotion makes them equal +``` ### AreSame @@ -134,6 +151,15 @@ Syntax: **Permissive.AreNotSame** *Expected*, *Actual* [, *Message* ] *Message* : *optional* A **String** included in the failure record if the references are the same. +Reference identity is independent of the module's other comparison rules --- **AreNotSame** always uses the **IsNot** operator, never default-member equality. To compare values rather than references, use [**AreNotEqual**](#arenotequal). + +```tb +Dim a As New Collection +Dim b As New Collection +Permissive.AreNotSame a, b ' passes — a and b are distinct object instances +Permissive.AreNotSame a, a ' fails — same reference +``` + ## Boolean ### IsTrue @@ -192,6 +218,17 @@ Syntax: **Permissive.IsNotNothing** *Value* [, *Message* ] *Message* : *optional* A **String** included in the failure record if *Value* is **Nothing**. +This is the object-reference test, equivalent to `Not (Value Is Nothing)`. To check that a **Variant** does not hold the **Null** value instead, use [**IsNotNull**](#isnotnull). + +```tb +Dim col As Collection +Set col = New Collection + +Permissive.IsNotNothing col ' passes — col refers to a Collection object +Set col = Nothing +Permissive.IsNotNothing col ' fails — col is Nothing +``` + ### IsNull Asserts that *Value* is the **Null** value of a **Variant**. @@ -204,7 +241,13 @@ Syntax: **Permissive.IsNull** *Value* [, *Message* ] *Message* : *optional* A **String** included in the failure record if *Value* is not **Null**. -Equivalent to checking [**IsNull**](../../Modules/Information/IsNull)`(Value) = True`. To check for the **Nothing** object reference instead, use [**IsNothing**](#isnothing). +Equivalent to checking [**IsNull**](../../Modules/Information/IsNull)`(Value) = True`. Because `Null` is never equal to anything --- not even to itself --- the equality assertions ([**AreEqual**](#areequal), [**AreNotEqual**](#arenotequal)) cannot be used to test for **Null**; this assertion exists specifically for that purpose. To check for the **Nothing** object reference instead, use [**IsNothing**](#isnothing). + +```tb +Dim rs As Object ' assume this is a Recordset +' A field value may be Null when the database column contains no data: +Permissive.IsNull rs.Fields("MiddleName").Value +``` ### IsNotNull @@ -218,6 +261,14 @@ Syntax: **Permissive.IsNotNull** *Value* [, *Message* ] *Message* : *optional* A **String** included in the failure record if *Value* is **Null**. +Equivalent to checking [**IsNull**](../../Modules/Information/IsNull)`(Value) = False`. Because `Null` is never equal to anything --- not even to itself --- the equality assertions ([**AreEqual**](#areequal), [**AreNotEqual**](#arenotequal)) cannot be used to confirm absence of **Null**; this assertion exists specifically for that purpose. To check that an object reference is not **Nothing** instead, use [**IsNotNothing**](#isnotnothing). + +```tb +Dim rs As Object ' assume this is a Recordset +' Assert that a required field is not Null before reading it: +Permissive.IsNotNull rs.Fields("CustomerID").Value +``` + ## Sequence ### SequenceEquals @@ -252,6 +303,8 @@ Syntax: **Permissive.NotSequenceEquals** *Expected*, *Actual* [, *FailMessage* ] *FailMessage* : *optional* A **String** included in the failure record if the sequences are equal. +Both arguments must support iteration via **For Each**. The assertion passes when the sequences have a different number of elements, or when at least one pair of corresponding elements differs under this module's [comparison semantics](#comparison-semantics) --- meaning string elements are compared case-insensitively and numbers follow normal twinBASIC equality. The inverse of [**SequenceEquals**](#sequenceequals). + ## See Also - [Exact](Exact) -- the strictest comparison flavour: datatypes must match and conversions never happen diff --git a/docs/Reference/Built-In/TwinBasicAssertions/Strict.md b/docs/Reference/Built-In/TwinBasicAssertions/Strict.md index cd244e45..e0ebbf4c 100644 --- a/docs/Reference/Built-In/TwinBasicAssertions/Strict.md +++ b/docs/Reference/Built-In/TwinBasicAssertions/Strict.md @@ -103,7 +103,16 @@ Syntax: **Strict.AreNotEqual** *Expected*, *Actual* [, *Message* ] *Message* : *optional* A **String** included in the failure record if the values are equal. -Comparison uses this module's [comparison semantics](#comparison-semantics). If either operand is **Null**, the assertion passes --- `Null` is never equal to anything. +The comparison follows this module's [comparison semantics](#comparison-semantics) --- strings are compared case-sensitively, object references are compared by identity, and everything else uses normal twinBASIC equality. If either operand is **Null**, the assertion passes --- `Null` is never equal to anything, including another `Null`. + +```tb +Strict.AreNotEqual "Hello", "hello" ' passes — strings are compared case-sensitively +Strict.AreNotEqual 1, 2 ' passes — different numeric values + +' Under Strict, numeric promotions apply, so these would fail (the values are equal): +' Strict.AreNotEqual 5, 5.0 ' fails — 5 and 5.0 are equal under twinBASIC equality +' Strict.AreNotEqual "", vbNullString ' fails — both are the empty string +``` ### AreSame @@ -137,6 +146,15 @@ Syntax: **Strict.AreNotSame** *Expected*, *Actual* [, *Message* ] *Message* : *optional* A **String** included in the failure record if the references are the same. +Reference identity is independent of the module's other comparison rules --- **AreNotSame** always uses the **IsNot** operator, never default-member equality. To compare values rather than references, use [**AreNotEqual**](#arenotequal). + +```tb +Dim a As New Collection +Dim b As New Collection +Strict.AreNotSame a, b ' passes — a and b are distinct object instances +Strict.AreNotSame a, a ' fails — same reference +``` + ## Boolean ### IsTrue @@ -195,6 +213,16 @@ Syntax: **Strict.IsNotNothing** *Value* [, *Message* ] *Message* : *optional* A **String** included in the failure record if *Value* is **Nothing**. +This is the complement of [**IsNothing**](#isnothing), equivalent to `Value IsNot Nothing`. Use this assertion to confirm that a factory call, a lookup, or any other expression that is expected to return an object did not return **Nothing**. + +```tb +Dim result As Widget +Set result = factory.CreateWidget("blue") +Strict.IsNotNothing result ' fails if CreateWidget returned Nothing +``` + +To check for the **Null** value of a **Variant** rather than an unset object reference, use [**IsNotNull**](#isnotnull). + ### IsNull Asserts that *Value* is the **Null** value of a **Variant**. @@ -221,6 +249,19 @@ Syntax: **Strict.IsNotNull** *Value* [, *Message* ] *Message* : *optional* A **String** included in the failure record if *Value* is **Null**. +**IsNotNull** is the inverse of [**IsNull**](#isnull): it passes when `IsNull(Value)` would return **False**, and fails when `IsNull(Value)` would return **True**. Because `Null` is never considered equal to anything --- including itself --- `AreNotEqual(Null, value)` is not a reliable way to assert the absence of **Null**; **IsNotNull** is the correct assertion for that purpose. To check for the **Nothing** object reference instead, use [**IsNotNothing**](#isnotnothing). + +```tb +Sub TestQueryResult() + Dim result As Variant + result = db.ReadField("Name") + + ' Assert the field was present and not null before inspecting its value. + Strict.IsNotNull result, "expected a non-null Name field" + Strict.AreEqual "Alice", result +End Sub +``` + ## Sequence ### SequenceEquals @@ -255,6 +296,20 @@ Syntax: **Strict.NotSequenceEquals** *Expected*, *Actual* [, *FailMessage* ] *FailMessage* : *optional* A **String** included in the failure record if the sequences are equal. +Both arguments must support iteration via **For Each**. The assertion passes when the two sequences have a different element count, or when any corresponding element pair differs under this module's comparison rules --- strings are compared case-sensitively, numeric values are compared with normal twinBASIC equality (so `5` equals `5.0`), and object references are compared by identity. **NotSequenceEquals** is the inverse of [**SequenceEquals**](#sequenceequals): if **SequenceEquals** would pass, **NotSequenceEquals** fails, and vice versa. + +```tb +Dim expected(0 To 1) As String +expected(0) = "alpha" +expected(1) = "beta" + +Dim actual(0 To 1) As String +actual(0) = "alpha" +actual(1) = "Beta" ' differs in case + +Strict.NotSequenceEquals expected, actual ' passes — "beta" <> "Beta" under case-sensitive comparison +``` + ## See Also - [Exact](Exact) -- the strictest comparison flavour: datatypes must match and conversions never happen diff --git a/docs/Reference/Built-In/TwinBasicAssertions/index.md b/docs/Reference/Built-In/TwinBasicAssertions/index.md index b73c12c1..d985670a 100644 --- a/docs/Reference/Built-In/TwinBasicAssertions/index.md +++ b/docs/Reference/Built-In/TwinBasicAssertions/index.md @@ -4,6 +4,7 @@ parent: Built-In Packages nav_order: 4 permalink: /tB/Packages/Assert/ has_toc: false +indexed_from: beta-x-0983 --- # Assert Package @@ -50,12 +51,58 @@ Every assertion is tagged `[DebugOnly(True)]` --- the calls compile to *nothing* ## Members -Each module exposes the same fifteen functions, grouped here by purpose: - -- **Diagnostic outcome** --- **Succeed**, **Fail**, **Inconclusive** -- **Equality** --- **AreEqual** / **AreNotEqual**, **AreSame** / **AreNotSame** -- **Boolean** --- **IsTrue**, **IsFalse** -- **Reference and value state** --- **IsNothing** / **IsNotNothing**, **IsNull** / **IsNotNull** -- **Sequence** --- **SequenceEquals** / **NotSequenceEquals** - -See the per-module pages for the full signatures and the comparison semantics that apply to each member. +Each module exposes the same fifteen functions. See the per-module pages for the full signatures and the comparison semantics that apply to each member. + +### Exact + +- [AreEqual](Exact#areequal) -- asserts that *Actual* is equal to *Expected* under strictest semantics; datatypes must match and no implicit conversions occur +- [AreNotEqual](Exact#arenotequal) -- asserts that *Actual* is not equal to *Expected* under strictest semantics; datatypes must match and no implicit conversions occur +- [AreNotSame](Exact#arenotsame) -- asserts that *Actual* and *Expected* refer to different objects +- [AreSame](Exact#aresame) -- asserts that *Actual* and *Expected* refer to the same object +- [Fail](Exact#fail) -- unconditionally records a test failure +- [Inconclusive](Exact#inconclusive) -- records the test as inconclusive --- neither a pass nor a failure +- [IsFalse](Exact#isfalse) -- asserts that *Condition* evaluates to **False** +- [IsNothing](Exact#isnothing) -- asserts that *Value* is the **Nothing** object reference +- [IsNotNothing](Exact#isnotnothing) -- asserts that *Value* refers to an object and is not **Nothing** +- [IsNotNull](Exact#isnotnull) -- asserts that *Value* is not the **Null** value of a **Variant** +- [IsNull](Exact#isnull) -- asserts that *Value* is the **Null** value of a **Variant** +- [IsTrue](Exact#istrue) -- asserts that *Condition* evaluates to **True** +- [NotSequenceEquals](Exact#notsequenceequals) -- asserts that *Actual* and *Expected* differ in length or in at least one element +- [SequenceEquals](Exact#sequenceequals) -- asserts that *Actual* and *Expected* contain the same elements in the same order +- [Succeed](Exact#succeed) -- records that the test reached this point without failure + +### Permissive + +- [AreEqual](Permissive#areequal) -- asserts that *Actual* is equal to *Expected* with case-insensitive strings and numeric promotion +- [AreNotEqual](Permissive#arenotequal) -- asserts that *Actual* is not equal to *Expected* with case-insensitive strings and numeric promotion +- [AreNotSame](Permissive#arenotsame) -- asserts that *Actual* and *Expected* refer to different objects +- [AreSame](Permissive#aresame) -- asserts that *Actual* and *Expected* refer to the same object +- [Fail](Permissive#fail) -- unconditionally records a test failure +- [Inconclusive](Permissive#inconclusive) -- records the test as inconclusive --- neither a pass nor a failure +- [IsFalse](Permissive#isfalse) -- asserts that *Condition* evaluates to **False** +- [IsNothing](Permissive#isnothing) -- asserts that *Value* is the **Nothing** object reference +- [IsNotNothing](Permissive#isnotnothing) -- asserts that *Value* refers to an object and is not **Nothing** +- [IsNotNull](Permissive#isnotnull) -- asserts that *Value* is not the **Null** value of a **Variant** +- [IsNull](Permissive#isnull) -- asserts that *Value* is the **Null** value of a **Variant** +- [IsTrue](Permissive#istrue) -- asserts that *Condition* evaluates to **True** +- [NotSequenceEquals](Permissive#notsequenceequals) -- asserts that *Actual* and *Expected* differ in length or in at least one element +- [SequenceEquals](Permissive#sequenceequals) -- asserts that *Actual* and *Expected* contain the same elements in the same order +- [Succeed](Permissive#succeed) -- records that the test reached this point without failure + +### Strict + +- [AreEqual](Strict#areequal) -- asserts that *Actual* is equal to *Expected* with case-sensitive strings and normal twinBASIC equality +- [AreNotEqual](Strict#arenotequal) -- asserts that *Actual* is not equal to *Expected* with case-sensitive strings and normal twinBASIC equality +- [AreNotSame](Strict#arenotsame) -- asserts that *Actual* and *Expected* refer to different objects +- [AreSame](Strict#aresame) -- asserts that *Actual* and *Expected* refer to the same object +- [Fail](Strict#fail) -- unconditionally records a test failure +- [Inconclusive](Strict#inconclusive) -- records the test as inconclusive --- neither a pass nor a failure +- [IsFalse](Strict#isfalse) -- asserts that *Condition* evaluates to **False** +- [IsNothing](Strict#isnothing) -- asserts that *Value* is the **Nothing** object reference +- [IsNotNothing](Strict#isnotnothing) -- asserts that *Value* refers to an object and is not **Nothing** +- [IsNotNull](Strict#isnotnull) -- asserts that *Value* is not the **Null** value of a **Variant** +- [IsNull](Strict#isnull) -- asserts that *Value* is the **Null** value of a **Variant** +- [IsTrue](Strict#istrue) -- asserts that *Condition* evaluates to **True** +- [NotSequenceEquals](Strict#notsequenceequals) -- asserts that *Actual* and *Expected* differ in length or in at least one element +- [SequenceEquals](Strict#sequenceequals) -- asserts that *Actual* and *Expected* contain the same elements in the same order +- [Succeed](Strict#succeed) -- records that the test reached this point without failure From 4cd4f4b9fd250005eec4603917fbcad50b8d659d Mon Sep 17 00:00:00 2001 From: Kuba Sunderland-Ober Date: Thu, 4 Jun 2026 16:48:06 +0200 Subject: [PATCH 5/9] Update WinEventLibLogLib documentation. --- .../Built-In/WinEventLogLib/EventLog.md | 53 +++++++++++++++++-- .../WinEventLogLib/EventLogHelperPublic.md | 20 +++++-- .../WinEventLogLib/EventLogTypeConstants.md | 26 +++++++++ .../Built-In/WinEventLogLib/index.md | 15 ++++++ 4 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 docs/Reference/Built-In/WinEventLogLib/EventLogTypeConstants.md diff --git a/docs/Reference/Built-In/WinEventLogLib/EventLog.md b/docs/Reference/Built-In/WinEventLogLib/EventLog.md index a588548c..a7431305 100644 --- a/docs/Reference/Built-In/WinEventLogLib/EventLog.md +++ b/docs/Reference/Built-In/WinEventLogLib/EventLog.md @@ -60,7 +60,7 @@ Syntax: *object*.**LogFailure** *EventId*, *CategoryId* [, *AdditionalStrings* . : *required* A *T2* value naming the category the event belongs to. Becomes the numeric **Task Category** column. *AdditionalStrings* -: *optional* A **ParamArray** of values inserted into the event's message string at the `%1`, `%2`, … placeholders. Each value is converted to a **String** before being passed to `ReportEventW`. +: *optional* A **ParamArray** of values inserted into the event's message string at the `%1`, `%2`, ... placeholders. Each value is converted to a **String** before being passed to `ReportEventW`. > [!NOTE] > Despite the name, **LogFailure** writes an **Error** entry --- the Windows event type `EVENTLOG_ERROR_TYPE` (= 1). It does *not* write an *Audit Failure* entry. That event type, and *Warning* and *Audit Success*, are not currently reachable through this class. @@ -78,14 +78,16 @@ Syntax: *object*.**LogSuccess** *EventId*, *CategoryId* [, *AdditionalStrings* . : *required* A *T1* value naming the event being reported. Becomes the numeric **Event ID** column in the Event Viewer. *CategoryId* -: *required* A *T2* value naming the category the event belongs to. +: *required* A *T2* value naming the category the event belongs to. Becomes the numeric **Task Category** column. *AdditionalStrings* -: *optional* A **ParamArray** of values inserted into the event's message string at the `%1`, `%2`, … placeholders. +: *optional* A **ParamArray** of values inserted into the event's message string at the `%1`, `%2`, ... placeholders. Each value is converted to a **String** before being passed to `ReportEventW`. > [!NOTE] > The Windows event type for this call is `EVENTLOG_SUCCESS` (= 0), which is the Win32 SDK's literal name for the **Information** event type --- *not* an Audit Success entry. The class spells the method **LogSuccess** to track the SDK constant, but the entries that appear in `eventvwr.msc` are tagged **Information**. +The first call after construction lazily resolves the source handle via `RegisterEventSourceW`; if [**Register**](#register) has not been run for this *LogName*, the entry is still written but the Event Viewer cannot resolve the message strings and shows *"The description for Event ID X cannot be found"*. + ### New {: .no_toc } @@ -94,9 +96,21 @@ Constructs an **EventLog** instance bound to a single source name. Syntax: **New EventLog(Of** *T1*, *T2* **)** ( *LogName* ) *LogName* -: *required* A **String** naming the source. See the top of this page for the leaf-name vs full-path syntax. +: *required* A **String** naming the event source. A simple name such as `"MyService"` registers the source under the **Application** parent log (`Application\MyService`). A backslash-separated path such as `"System\MyService"` registers the source under the named parent log instead. The final segment is always the source name and appears in the Event Viewer's **Source** column. + +The constructor only stores *LogName*; no Win32 call is made at construction time. The source handle is acquired lazily by `RegisterEventSourceW` on the first call to [**LogSuccess**](#logsuccess) or [**LogFailure**](#logfailure). If the handle cannot be acquired at that point, run-time error 5 is raised. + +[**Register**](#register) must be called separately --- once, with administrator rights --- to write the registry entries the Event Viewer reads when rendering message strings. Constructing an **EventLog** instance and calling [**LogSuccess**](#logsuccess) / [**LogFailure**](#logfailure) without a prior [**Register**](#register) still writes entries to the log, but the Event Viewer cannot resolve message strings and displays *"The description for Event ID X cannot be found"* for each entry. + +Both type arguments *T1* and *T2* are required at instantiation; twinBASIC does not deduce them from the *LogName* argument. -The constructor only stores *LogName*. The first call to [**LogSuccess**](#logsuccess) / [**LogFailure**](#logfailure) lazily acquires the Win32 source handle via `RegisterEventSourceW`. [**Register**](#register) writes the registry entries the Event Viewer reads when rendering messages --- it must be run separately, once, with admin rights. +```tb +' Bind to "MyService" under the Application log. +Dim Log As New EventLog(Of MyEventIds, MyCategories)("MyService") + +' Bind to a source under a named parent log. +Dim SysLog As New EventLog(Of MyEventIds, MyCategories)("System\MyService") +``` ### Register {: .no_toc } @@ -120,6 +134,35 @@ If the registry key cannot be opened for write, **Register** raises run-time err The lower-level [**EventLogHelperPublic.RegisterEventLogInternal**](EventLogHelperPublic#registereventloginternal) is what **Register** delegates to; use it directly only when registering a source without binding it to a generic *T2* (and so without using **GetDeclaredMaxEnumValue** to derive the category count). +## Example + +This example registers a source on first install (requires admin) and then writes an **Information**-type entry at runtime. + +```tb +Public Enum MyEventIds + StartupOk = 1000 + StartupFailed = 1001 + ShutdownClean = 1100 +End Enum + +Public Enum MyCategories + General = 1 + Network = 2 +End Enum + +' One-time install step (requires admin): +Sub Install() + Dim Log As New EventLog(Of MyEventIds, MyCategories)("MyService") + Log.Register +End Sub + +' Runtime use (no admin required): +Sub OnServiceStart() + Dim Log As New EventLog(Of MyEventIds, MyCategories)("MyService") + Log.LogSuccess StartupOk, General, "Service started", App.ModulePath +End Sub +``` + ## See Also - [WinEventLogLib](.) package -- overview, lifecycle, message-resource generation diff --git a/docs/Reference/Built-In/WinEventLogLib/EventLogHelperPublic.md b/docs/Reference/Built-In/WinEventLogLib/EventLogHelperPublic.md index 1a855d02..09660e7a 100644 --- a/docs/Reference/Built-In/WinEventLogLib/EventLogHelperPublic.md +++ b/docs/Reference/Built-In/WinEventLogLib/EventLogHelperPublic.md @@ -10,9 +10,6 @@ has_toc: false A single low-level helper that writes the registry entries Windows reads when rendering Event Log messages. Most projects do not call into this module directly --- [**EventLog.Register**](EventLog#register) wraps the call and automatically supplies the category count from the *T2* type argument. Use **EventLogHelperPublic** only when registering a source outside the generic [**EventLog**](EventLog) class (for example, when the category count cannot be derived from a declared enum). -* TOC -{:toc} - ## RegisterEventLogInternal Writes the registry entries that declare the running EXE as the message provider for an event source. @@ -34,7 +31,22 @@ Creates `HKLM\SYSTEM\CurrentControlSet\Services\EventLog\` and writes: > [!IMPORTANT] > **RegisterEventLogInternal** writes under `HKEY_LOCAL_MACHINE` and requires administrator rights. The usual pattern is to call it once from an elevated installer, not from the application's normal startup path. -If the registry key cannot be opened for write, **RegisterEventLogInternal** raises run-time error 5 with the message *"Failed to register event log source (\)"*, where `` is the trailing segment of *LogPath*. Typical causes are insufficient privileges and a *LogPath* whose parent log (e.g. `"Application"`, `"System"`) does not exist. +If the registry key cannot be opened for write, **RegisterEventLogInternal** raises run-time error 5 with the message *"Failed to register event log source (\)"*, where `` is the trailing segment of *LogPath*. Typical causes are insufficient privileges and a *LogPath* whose parent log (for example, `"Application"` or `"System"`) does not exist. + +### Example + +This example registers a custom event source under the Application log, supplying three categories. + +```tb +' Requires administrator rights. +EventLogHelperPublic.RegisterEventLogInternal "Application\MyService", 3 +``` + +To register under a non-default parent log, pass the full path: + +```tb +EventLogHelperPublic.RegisterEventLogInternal "System\MyService", 3 +``` ## See Also diff --git a/docs/Reference/Built-In/WinEventLogLib/EventLogTypeConstants.md b/docs/Reference/Built-In/WinEventLogLib/EventLogTypeConstants.md new file mode 100644 index 00000000..a9ba37b1 --- /dev/null +++ b/docs/Reference/Built-In/WinEventLogLib/EventLogTypeConstants.md @@ -0,0 +1,26 @@ +--- +title: EventLogTypeConstants +parent: WinEventLogLib Package +permalink: /tB/Packages/WinEventLogLib/EventLogTypeConstants +has_toc: false +--- +# EventLogTypeConstants +{: .no_toc } + +The Windows Event Log entry-type values. Corresponds to the Win32 `EVENTLOG_*` type constants passed to `ReportEventW`. + +| Constant | Value | Description | +|----------|-------|-------------| +| **vbEventLogTypeSuccess**{: #vbEventLogTypeSuccess } | 0 | An information entry. Maps to the Win32 `EVENTLOG_SUCCESS` constant. This is the type written by [**EventLog.LogSuccess**](EventLog#logsuccess). | +| **vbEventLogTypeError**{: #vbEventLogTypeError } | &H1 | An error entry. Maps to the Win32 `EVENTLOG_ERROR_TYPE` constant. This is the type written by [**EventLog.LogFailure**](EventLog#logfailure). | +| **vbEventLogTypeWarning**{: #vbEventLogTypeWarning } | &H2 | A warning entry. Maps to the Win32 `EVENTLOG_WARNING_TYPE` constant. | +| **vbEventLogTypeAuditSuccess**{: #vbEventLogTypeAuditSuccess } | &H8 | A success-audit entry. Maps to the Win32 `EVENTLOG_AUDIT_SUCCESS` constant. Typically used in the Security log; not applicable to the Application log. | +| **vbEventLogTypeAuditFailure**{: #vbEventLogTypeAuditFailure } | &H10 | A failure-audit entry. Maps to the Win32 `EVENTLOG_AUDIT_FAILURE` constant. Typically used in the Security log; not applicable to the Application log. | + +> [!NOTE] +> The current [**EventLog**](EventLog) public API exposes only [**LogSuccess**](EventLog#logsuccess) (type **vbEventLogTypeSuccess**) and [**LogFailure**](EventLog#logfailure) (type **vbEventLogTypeError**). The **Warning**, **AuditSuccess**, and **AuditFailure** constants are not yet reachable through the generic class. + +### See Also + +- [EventLog](EventLog) -- the generic event-log source class +- [EventLogHelperPublic](EventLogHelperPublic) -- the low-level registry helper diff --git a/docs/Reference/Built-In/WinEventLogLib/index.md b/docs/Reference/Built-In/WinEventLogLib/index.md index 46890103..35764f5e 100644 --- a/docs/Reference/Built-In/WinEventLogLib/index.md +++ b/docs/Reference/Built-In/WinEventLogLib/index.md @@ -4,6 +4,12 @@ parent: Built-In Packages nav_order: 8 permalink: /tB/Packages/WinEventLogLib/ has_toc: false +exclude_from_docs: + - EventLogHelperPrivate + - EventLogAPIs +exclude_kinds: + - Declare +indexed_from: beta-x-0983 --- # WinEventLogLib Package @@ -143,7 +149,16 @@ The three other Windows Event Log entry types --- **Warning**, **Audit Success** ## Classes - [EventLog](EventLog) -- the generic event-log source -- open / register / log entries against one event log, parameterised by an event-ID enum and a category enum + - [LogFailure](EventLog#logfailure) -- writes an **Error**-type entry to the log + - [LogSuccess](EventLog#logsuccess) -- writes an **Information**-type entry to the log + - [New](EventLog#new) -- constructs an **EventLog** instance bound to a single source name + - [Register](EventLog#register) -- writes the registry entries that declare this EXE as the message provider for the source + +## Enumerations + +- [EventLogTypeConstants](EventLogTypeConstants) -- the Windows Event Log entry-type constants (`EVENTLOG_SUCCESS`, `EVENTLOG_ERROR_TYPE`, etc.) passed to `ReportEventW` ## Modules - [EventLogHelperPublic](EventLogHelperPublic) -- the low-level registry helper underlying [**EventLog.Register**](EventLog#register); call it directly only when a category count must be supplied without using the generic class + - [RegisterEventLogInternal](EventLogHelperPublic#registereventloginternal) -- writes the registry entries that declare the running EXE as the message provider for an event source From 05ed96b718a3a66e5ad0f09be8e204793796da26 Mon Sep 17 00:00:00 2001 From: Kuba Sunderland-Ober Date: Thu, 4 Jun 2026 21:00:18 +0200 Subject: [PATCH 6/9] Update the CustomControl documentation. --- .../Built-In/CustomControls/Constants.md | 45 +++++++ .../Framework/CustomControlContext.md | 66 ++++++++- .../Framework/CustomControlTimer.md | 27 ++-- .../Framework/CustomControlsCollection.md | 4 +- .../Framework/CustomFormContext.md | 37 +++-- .../Framework/ICustomControl.md | 45 ++++--- .../CustomControls/Framework/ICustomForm.md | 58 +++++++- .../Framework/_CustomControlContext.md | 127 ++++++++++++++++++ .../Framework/_CustomControlTimer.md | 41 ++++++ .../Framework/_CustomControlTimerEvents.md | 44 ++++++ .../Framework/_CustomControlsCollection.md | 80 +++++++++++ .../Framework/_CustomFormContext.md | 61 +++++++++ .../Built-In/CustomControls/index.md | 18 ++- 13 files changed, 605 insertions(+), 48 deletions(-) create mode 100644 docs/Reference/Built-In/CustomControls/Constants.md create mode 100644 docs/Reference/Built-In/CustomControls/Framework/_CustomControlContext.md create mode 100644 docs/Reference/Built-In/CustomControls/Framework/_CustomControlTimer.md create mode 100644 docs/Reference/Built-In/CustomControls/Framework/_CustomControlTimerEvents.md create mode 100644 docs/Reference/Built-In/CustomControls/Framework/_CustomControlsCollection.md create mode 100644 docs/Reference/Built-In/CustomControls/Framework/_CustomFormContext.md diff --git a/docs/Reference/Built-In/CustomControls/Constants.md b/docs/Reference/Built-In/CustomControls/Constants.md new file mode 100644 index 00000000..2d0a6e0f --- /dev/null +++ b/docs/Reference/Built-In/CustomControls/Constants.md @@ -0,0 +1,45 @@ +--- +title: Constants +parent: CustomControls Package +permalink: /tB/Packages/CustomControls/Constants +has_toc: false +--- +# Constants +{: .no_toc } + +The **Constants** module in the **CustomControls DESIGNER** library declares the enumerations and UDTs shared across the entire **CustomControls** package. + +The module is internal to the DESIGNER library; user code does not reference it by name. The members it exposes are: + +- **Enumerations** --- the full set of public constants used by the package's controls, style objects, and form options. Each is documented on its own page under [Enumerations](Enumerations/). +- **UDTs** --- [**SerializeInfo**](Framework/SerializeInfo) and [**Canvas**](Framework/Canvas), the two value types passed to custom control implementations; both carry twinBASIC pseudo-DLL method bindings and are documented under [Framework](Framework/). + +## Enumerations + +| Enumeration | Purpose | +|-------------|---------| +| [ColorRGBA](Enumerations/ColorRGBA) | `Long`-compatible type alias for 32-bit ABGR colour values | +| [CornerShape](Enumerations/CornerShape) | How a single corner of a control is shaped: curve, notch, or cut-out | +| [Customtate](Enumerations/Customtate) | Reserved duplicate of [**WindowState**](Enumerations/WindowState) | +| [DockMode](Enumerations/DockMode) | How a control is docked inside its container | +| [FillPattern](Enumerations/FillPattern) | The gradient or fill pattern used by a [**Fill**](Styles/Fill) | +| [FontWeight](Enumerations/FontWeight) | Font weights from **tbThin** (100) through **tbHeavy** (900), mirroring the OpenType `wght` scale | +| [PixelCount](Enumerations/PixelCount) | `Long`-compatible type alias for measurements expressed in pixels | +| [PointSize](Enumerations/PointSize) | `Long`-compatible type alias for font sizes expressed in points | +| [StartupPosition](Enumerations/StartupPosition) | Initial position of a form when it is first shown | +| [TextAlignment](Enumerations/TextAlignment) | Horizontal and vertical alignment of text within a [**TextRendering**](Styles/TextRendering) | +| [TextOverflowMode](Enumerations/TextOverflowMode) | How text longer than the available area is truncated | +| [BorderStyle](Enumerations/BorderStyle) | Window-frame style passed to [**WindowsFormOptions.BorderStyle**](WaynesForm/WindowsFormOptions#borderstyle) | +| [WindowState](Enumerations/WindowState) | The minimized / normal / maximized window state of a form | + +## UDTs + +| Type | Purpose | +|------|---------| +| [SerializeInfo](Framework/SerializeInfo) | Per-instance serializer returned by [**CustomControlContext.GetSerializer**](Framework/CustomControlContext#getserializer); used to deserialize designer-set property values and to query the runtime mode | +| [Canvas](Framework/Canvas) | Drawing surface passed to [**ICustomControl.Paint**](Framework/ICustomControl#paint); exposes element-adding and DPI / size query methods | + +### See Also + +- [Enumerations](Enumerations/) -- package enumeration index +- [Framework](Framework/) -- host-side contract for custom control authors diff --git a/docs/Reference/Built-In/CustomControls/Framework/CustomControlContext.md b/docs/Reference/Built-In/CustomControls/Framework/CustomControlContext.md index 61ffde6e..aa27ee02 100644 --- a/docs/Reference/Built-In/CustomControls/Framework/CustomControlContext.md +++ b/docs/Reference/Built-In/CustomControls/Framework/CustomControlContext.md @@ -42,24 +42,80 @@ Syntax: *object*.**ChangeFocusedElement** *ElementTabIndex* ### CreateTimer {: .no_toc } -Returns a new [**CustomControlTimer**](CustomControlTimer) bound to this control's lifetime. The timer is **Disabled** on creation; the caller sets [**Interval**](CustomControlTimer#interval), subscribes to the timer's **OnTimer** event, and sets [**Enabled**](CustomControlTimer#enabled) to **True** to start it. +Returns a new [**CustomControlTimer**](CustomControlTimer) bound to this control's lifetime. The timer is disabled on creation; the caller sets [**Interval**](CustomControlTimer#interval), subscribes to the timer's [**OnTimer**](CustomControlTimer#ontimer) event, and sets [**Enabled**](CustomControlTimer#enabled) to **True** to start it. Syntax: *object*.**CreateTimer** ( ) **As stdole.IUnknown** -The framework returns the timer typed as **stdole.IUnknown**; cast with `CType(Of CustomControlTimer)(…)` to get a strongly-typed reference. [**WaynesTimer**](../WaynesTimer) and [**WaynesSlider**](../WaynesSlider/) both use this pattern. +The timer is returned as **stdole.IUnknown**. Cast to [**CustomControlTimer**](CustomControlTimer) with `CType(Of CustomControlTimer)(…)` before accessing its members. Declare the holding field with **WithEvents** so that the **OnTimer** event can be handled. + +```tb +Private WithEvents InternalTimer As CustomControlTimer + +Private Sub OnInitialize(ByVal Ctx As CustomControls.CustomControlContext) _ + Implements CustomControls.ICustomControl.Initialize + + Set Me.ControlContext = Ctx + Set Me.InternalTimer = CType(Of CustomControlTimer)(Ctx.CreateTimer()) + Me.InternalTimer.Interval = 250 + Me.InternalTimer.Enabled = True +End Sub + +Private Sub OnTimer() Handles InternalTimer.OnTimer + ' called every 250 ms +End Sub +``` ### GetSerializer {: .no_toc } -Returns the [**SerializeInfo**](SerializeInfo) handle for this control instance. The serializer exposes the deserialization entry point and the run-time / design-time mode flags. +Returns the [**SerializeInfo**](SerializeInfo) handle for this control instance. The serializer exposes the deserialization entry point and the run-time/design-time mode flags. Syntax: *object*.**GetSerializer** ( ) **As SerializeInfo** +Call **GetSerializer** at the start of a control's [**Initialize**](ICustomControl#initialize) implementation to load any property values that were set in the form designer, and to read the mode flags before storing the context for later use. + +```tb +Private Sub OnInitialize(ByVal Ctx As CustomControls.CustomControlContext) _ + Implements CustomControls.ICustomControl.Initialize + + With Ctx.GetSerializer + If Not .RuntimeUISrzDeserialize(Me, False) Then + InitializeDefaultValues + End If + + Me.IsDesignMode = .RuntimeUISrzIsDesignMode() + End With + + Set Me.ControlContext = Ctx +End Sub +``` + ### Repaint {: .no_toc } -Tells the framework that the control's appearance has changed and that the canvas should be repainted at the next opportunity. The framework eventually calls back into [**ICustomControl.Paint**](ICustomControl#paint); calling **Repaint** multiple times in quick succession produces at most one paint. +Tells the framework that the control's appearance has changed and that the canvas should be repainted at the next opportunity. Syntax: *object*.**Repaint** ( ) -Every concrete `Waynes…` control hooks the **OnChanged** events on its state and style sub-objects, and calls **Repaint** from the handler --- so a runtime assignment like `btn.NormalState.BackgroundFill.ColorPoints.SetSolidColor vbBlue` triggers an automatic redraw. +The framework schedules one paint pass regardless of how many times **Repaint** is called before it runs --- multiple calls in quick succession produce at most one call to [**ICustomControl.Paint**](ICustomControl#paint). This means it is safe to call **Repaint** from multiple **OnChanged** handlers that fire together when several style properties are set in sequence. + +When writing a new custom control, call **Repaint** whenever the control's internal state changes in a way that affects what the next **Paint** call should draw. Every concrete `Waynes...` control hooks the **OnChanged** events raised by its style sub-objects and calls **Repaint** from each handler, so a runtime property assignment triggers an automatic redraw without the caller needing to call **Repaint** directly. + +```tb +' In a custom control class: +Private m_Context As CustomControls.CustomControlContext +Private m_Caption As String + +Public Property Let Caption(ByVal Value As String) + m_Caption = Value + m_Context.Repaint ' schedule a repaint to show the new caption +End Property +``` + +## See Also + +- [_CustomControlContext](_CustomControlContext) interface -- the COM interface definition this CoClass implements +- [CustomFormContext](CustomFormContext) class -- extends **CustomControlContext** with **Show** and **Close** for form-class controls +- [ICustomControl](ICustomControl) interface -- the interface a custom control implements; receives the context on **Initialize** +- [SerializeInfo](SerializeInfo) type (UDT) -- the per-instance serializer returned by **GetSerializer** +- [CustomControlTimer](CustomControlTimer) class -- the timer object returned by **CreateTimer** diff --git a/docs/Reference/Built-In/CustomControls/Framework/CustomControlTimer.md b/docs/Reference/Built-In/CustomControls/Framework/CustomControlTimer.md index 8e28ca4c..72252f8c 100644 --- a/docs/Reference/Built-In/CustomControls/Framework/CustomControlTimer.md +++ b/docs/Reference/Built-In/CustomControls/Framework/CustomControlTimer.md @@ -11,7 +11,7 @@ has_toc: false A timer created by [**CustomControlContext.CreateTimer**](CustomControlContext#createtimer) and owned by the control that created it. The timer raises [**OnTimer**](#ontimer) at the rate given by [**Interval**](#interval), once it has been started by setting [**Enabled**](#enabled) to **True**. -The framework returns timers typed as **stdole.IUnknown**; cast to **CustomControlTimer** with `CType(Of CustomControlTimer)(…)` before storing. The control should also declare the field with `WithEvents` so that the **OnTimer** event can be handled. +The framework returns timers typed as **stdole.IUnknown**; cast to **CustomControlTimer** with `CType(Of CustomControlTimer)(…)` before storing. Declare the field with **WithEvents** so that the **OnTimer** event can be handled. ```tb Private WithEvents InternalTimer As CustomControlTimer @@ -26,29 +26,35 @@ Private Sub OnInitialize(ByVal Ctx As CustomControls.CustomControlContext) _ End Sub Private Sub OnTimer() Handles InternalTimer.OnTimer - ' fire every 250ms + ' raised every 250 ms End Sub ``` -[**WaynesTimer**](../WaynesTimer) wraps a single **CustomControlTimer** and re-exposes its **Interval** / **Enabled** as designer-visible properties. [**WaynesSlider**](../WaynesSlider/) uses one as an internal mouse-down auto-repeat timer. +[**WaynesTimer**](../WaynesTimer) wraps a single **CustomControlTimer** and re-exposes its **Interval** and **Enabled** as designer-visible properties. [**WaynesSlider**](../WaynesSlider/) uses one internally for mouse-down auto-repeat. ## Properties ### Enabled {: .no_toc } -Whether the timer is currently running. Setting to **True** starts it; setting to **False** stops it. **Boolean**. +Whether the timer is currently running. Read/write **Boolean**. Setting to **True** starts it; setting to **False** stops it. -Syntax: *object*.**Enabled** [ = *value* ] +Syntax: *object*.**Enabled** [ **=** *value* ] + +*value* +: A **Boolean** specifying the running state. **True** starts the timer; **False** stops it. ### Interval {: .no_toc } -The number of milliseconds between successive [**OnTimer**](#ontimer) events. **Long**. A timer with an interval of 0 never fires. +The number of milliseconds between successive [**OnTimer**](#ontimer) events. Read/write **Long**. A value of `0` prevents the timer from firing. + +Syntax: *object*.**Interval** [ **=** *value* ] -Syntax: *object*.**Interval** [ = *value* ] +*value* +: A **Long** specifying the number of milliseconds between timer firings. -Changing **Interval** while the timer is enabled takes effect on the next tick. +Changing **Interval** while the timer is running takes effect on the next tick --- the current tick completes at the old interval before the new one begins. ## Events @@ -58,3 +64,8 @@ Changing **Interval** while the timer is enabled takes effect on the next tick. Raised every [**Interval**](#interval) milliseconds while the timer is enabled. Syntax: *object*\_**OnTimer**( ) + +## See Also + +- [CustomControlContext](CustomControlContext) class -- the callback object whose **CreateTimer** returns a **CustomControlTimer** +- [ICustomControl](ICustomControl) interface diff --git a/docs/Reference/Built-In/CustomControls/Framework/CustomControlsCollection.md b/docs/Reference/Built-In/CustomControls/Framework/CustomControlsCollection.md index ca764056..17f141d9 100644 --- a/docs/Reference/Built-In/CustomControls/Framework/CustomControlsCollection.md +++ b/docs/Reference/Built-In/CustomControls/Framework/CustomControlsCollection.md @@ -30,7 +30,7 @@ Syntax: *object*.**Count** ### Item {: .no_toc } -Returns the control at the given index or with the given name. The **Default property** --- the **Controls** ( *…* ) shorthand calls **Item**. +Returns the control at the given index or with the given name. The **Default property** --- the **Controls** ( *...* ) shorthand calls **Item**. Syntax: *object*.**Item** ( *IndexOrName* ) **As Object** @@ -74,7 +74,7 @@ A `For Each` loop over the collection produces every hosted control in turn: ```tb Dim ctl As Object For Each ctl In MyForm.Controls - ' … + ' ... Next ``` diff --git a/docs/Reference/Built-In/CustomControls/Framework/CustomFormContext.md b/docs/Reference/Built-In/CustomControls/Framework/CustomFormContext.md index f382cbd3..3b470bff 100644 --- a/docs/Reference/Built-In/CustomControls/Framework/CustomFormContext.md +++ b/docs/Reference/Built-In/CustomControls/Framework/CustomFormContext.md @@ -9,34 +9,55 @@ has_toc: false # CustomFormContext class {: .no_toc } -The form-class counterpart to [**CustomControlContext**](CustomControlContext). Extends the base context with **Show** and **Close** --- the operations a top-level form needs that an embedded control does not. +The form-class counterpart to [**CustomControlContext**](CustomControlContext). Extends the base context with **Show** and **Close** --- the operations a top-level custom form needs that an embedded control does not. -[**WaynesForm**](../WaynesForm/) receives its context as a [**CustomControlContext**](CustomControlContext) (because it implements [**ICustomControl**](ICustomControl)) and casts it to **CustomFormContext** internally so that it can call **Show** from its own **Show** method and **Close** from its **Close** method. +A custom form class receives a [**CustomFormContext**](CustomFormContext) through its [**ICustomForm.Initialize**](ICustomForm#initialize) method. It stores that reference and delegates its own **Show** and **Close** methods to the corresponding context methods. The underlying COM interface is [**_CustomFormContext**](_CustomFormContext). ```tb -Private Sub OnInitialize(ByVal Ctx As CustomControls.CustomControlContext) _ - Implements CustomControls.ICustomControl.Initialize +Private m_Context As CustomControls.CustomFormContext - Set Me.ControlContext = CType(Of CustomFormContext)(Ctx) +Private Sub OnInitialize(ByVal Ctx As CustomControls.CustomFormContext) _ + Implements CustomControls.ICustomForm.Initialize + + Set m_Context = Ctx +End Sub + +Public Sub Show() + m_Context.Show +End Sub + +Public Sub Close() + m_Context.Close End Sub ``` ## Inherited -A **CustomFormContext** includes every member from [**CustomControlContext**](CustomControlContext) --- [**ChangeFocusedElement**](CustomControlContext#changefocusedelement), [**CreateTimer**](CustomControlContext#createtimer), [**GetSerializer**](CustomControlContext#getserializer), and [**Repaint**](CustomControlContext#repaint) --- and adds the two form-specific members below. +A **CustomFormContext** includes every member from [**CustomControlContext**](CustomControlContext) --- [**GetSerializer**](CustomControlContext#getserializer), [**Repaint**](CustomControlContext#repaint), [**CreateTimer**](CustomControlContext#createtimer), and [**ChangeFocusedElement**](CustomControlContext#changefocusedelement) --- and adds the two form-specific members below. ## Methods ### Close {: .no_toc } -Closes the underlying window. Equivalent to the user clicking the title-bar close button. Application code typically calls [**WaynesForm.Close**](../WaynesForm/#close), which in turn calls into this method. +Closes the underlying window. Equivalent to the user clicking the title-bar close button. Syntax: *object*.**Close** ( ) +Application code typically calls [**WaynesForm.Close**](../WaynesForm/#close), which in turn calls this method through the stored **CustomFormContext** reference. + ### Show {: .no_toc } -Shows the underlying window. Application code typically calls [**WaynesForm.Show**](../WaynesForm/#show), which in turn calls into this method. +Makes the underlying window visible. Syntax: *object*.**Show** ( ) + +Application code typically calls [**WaynesForm.Show**](../WaynesForm/#show), which in turn calls this method through the stored **CustomFormContext** reference. + +## See Also + +- [_CustomFormContext](_CustomFormContext) interface -- the COM interface this CoClass exposes as its default +- [CustomControlContext](CustomControlContext) class -- the base context for embedded custom controls +- [ICustomForm](ICustomForm) interface -- the interface a custom form class implements; receives a **CustomFormContext** in **Initialize** +- [WaynesForm](../WaynesForm/) -- the built-in custom form that uses **CustomFormContext** diff --git a/docs/Reference/Built-In/CustomControls/Framework/ICustomControl.md b/docs/Reference/Built-In/CustomControls/Framework/ICustomControl.md index 4fe32248..c4e7f899 100644 --- a/docs/Reference/Built-In/CustomControls/Framework/ICustomControl.md +++ b/docs/Reference/Built-In/CustomControls/Framework/ICustomControl.md @@ -9,9 +9,11 @@ has_toc: false # ICustomControl interface {: .no_toc } -The interface every custom control implements. The framework calls **Initialize** once after the control has been instantiated and its serialized property values have been deserialized, **Paint** every time the framework needs to redraw the control's area, and **Destroy** once when the control is being released. +The interface every custom control implements. -The eight concrete `Waynes…` classes in the package all implement this interface, alongside an inherited mixin base class for the standard layout / name members. +The framework calls **Initialize** once after the control has been constructed and its designer-set property values have been deserialized, **Paint** every time the control's area must be redrawn, and **Destroy** once when the control is being released. + +The eight concrete `Waynes...` classes in the package all implement this interface, together with an inherited mixin base class that supplies the standard layout and name members. ```tb Class MyControl @@ -19,30 +21,23 @@ Class MyControl Private Sub OnInitialize(ByVal Context As CustomControls.CustomControlContext) _ Implements CustomControls.ICustomControl.Initialize - ' … + ' store Context and deserialize designer-set property values End Sub Private Sub OnDestroy() _ Implements CustomControls.ICustomControl.Destroy - ' … + ' drop any back-references held by stored objects End Sub Private Sub OnPaint(ByVal Canvas As CustomControls.Canvas) _ Implements CustomControls.ICustomControl.Paint - ' … + ' build ElementDescriptor records and pass each to Canvas.RuntimeUICCCanvasAddElement End Sub End Class ``` ## Methods -### Destroy -{: .no_toc } - -Called once when the control is being released. The implementation should drop any references it holds to objects that themselves hold references back to it, so that the reference graph can collapse without cycles. - -Syntax: *object*.**Destroy** ( ) - ### Initialize {: .no_toc } @@ -51,20 +46,36 @@ Called once after the framework has constructed the control and deserialized any Syntax: *object*.**Initialize** ( *Context* ) *Context* -: *required* The [**CustomControlContext**](CustomControlContext) for this control instance. Store it (typically as a class field named **ControlContext**) --- it is the only way to request repaints, create timers, or check the runtime mode after **Initialize** returns. +: *required* The [**CustomControlContext**](CustomControlContext) for this control instance. Store it---typically as a class field named **ControlContext**---because it is the only way to request repaints, create timers, or shift keyboard focus after **Initialize** returns. + +A typical implementation calls **Context.GetSerializer().RuntimeUISrzDeserialize(Me, False)** to load the designer-set values. If that call returns **False**, no serialized data was found and the control should apply its own defaults instead. -A common implementation calls **Context.GetSerializer().RuntimeUISrzDeserialize(Me, False)** to load designer-set property values into the instance; if the call returns **False**, no serialized data was found and the control should apply its own defaults. +### Destroy +{: .no_toc } + +Called once when the control is being released. + +Syntax: *object*.**Destroy** ( ) + +The implementation should drop any references it holds to objects that themselves hold references back to it, so that the reference graph can collapse without cycles. ### Paint {: .no_toc } -Called every time the framework needs to redraw the control's client area. The implementation builds one or more `ElementDescriptor` records describing the rectangles to draw and passes each to *Canvas*. **RuntimeUICCCanvasAddElement**. +Called every time the framework needs to redraw the control's client area. Syntax: *object*.**Paint** ( *Canvas* ) *Canvas* : *required* The [**Canvas**](Canvas) drawing surface for this paint pass. Its **RuntimeUICCGetWidth**, **RuntimeUICCGetHeight**, and **RuntimeUICCGetDpiScaleFactor** methods supply the size and DPI of the area being painted, in device pixels. -A descriptor may include event callbacks (`OnClick`, `OnMouseDown`, …) as `AddressOf` pointers; the framework dispatches input back through those pointers without the control needing to subscribe explicitly to anything. +The implementation builds one or more `ElementDescriptor` records describing the regions to draw and passes each to *Canvas*.**RuntimeUICCCanvasAddElement**. A descriptor may include event callbacks (`OnClick`, `OnMouseDown`, and so on) as **AddressOf** pointers; the framework dispatches input back through those pointers without the control subscribing explicitly to anything. + +A control should request additional repaints by calling [**CustomControlContext.Repaint**](CustomControlContext#repaint), not by calling **Paint** directly---the framework controls when to issue the actual paint pass. + +### See Also -A control should request additional repaints by calling [**CustomControlContext.Repaint**](CustomControlContext#repaint), not by calling **Paint** directly --- the framework controls when to issue the actual paint pass. +- [ICustomForm](ICustomForm) interface +- [CustomControlContext](CustomControlContext) class +- [Canvas](Canvas) class +- [SerializeInfo](SerializeInfo) class diff --git a/docs/Reference/Built-In/CustomControls/Framework/ICustomForm.md b/docs/Reference/Built-In/CustomControls/Framework/ICustomForm.md index 561d02f7..d1f9cb7d 100644 --- a/docs/Reference/Built-In/CustomControls/Framework/ICustomForm.md +++ b/docs/Reference/Built-In/CustomControls/Framework/ICustomForm.md @@ -18,10 +18,12 @@ The form-class counterpart to [**ICustomControl**](ICustomControl). Custom *form ### Destroy {: .no_toc } -Called once when the form is being released. See [**ICustomControl.Destroy**](ICustomControl#destroy). +Called once when the form is being released. The implementation should drop any references it holds to objects that themselves hold references back to it, so that the reference graph can collapse without cycles. Syntax: *object*.**Destroy** ( ) +The framework calls **Destroy** exactly once per instance, after the form has been closed and is no longer visible. No further calls to **Initialize** or **Paint** will arrive after **Destroy** returns. The implementation should set any stored [**CustomFormContext**](CustomFormContext) or [**CustomControlTimer**](CustomControlTimer) references to **Nothing** here. + ### Initialize {: .no_toc } @@ -30,14 +32,62 @@ Called once after the framework has constructed the form and deserialized any de Syntax: *object*.**Initialize** ( *Context* ) *Context* -: *required* The [**CustomFormContext**](CustomFormContext) for this form instance. +: *required* The [**CustomFormContext**](CustomFormContext) for this form instance. Store it (typically as a class field) --- it is the only way to request repaints, show or close the form, create timers, or check the runtime mode after **Initialize** returns. + +A common implementation calls **Context.GetSerializer().RuntimeUISrzDeserialize(Me, False)** to load designer-set property values into the instance; if the call returns **False**, no serialized data was found and the form should apply its own defaults. ### Paint {: .no_toc } -Called every time the framework needs to redraw the form's client area. See [**ICustomControl.Paint**](ICustomControl#paint). +Called every time the framework needs to redraw the form's client area. The implementation builds one or more `ElementDescriptor` records describing the rectangles to draw and passes each to *Canvas*.**RuntimeUICCCanvasAddElement**. Syntax: *object*.**Paint** ( *Canvas* ) *Canvas* -: *required* The [**Canvas**](Canvas) drawing surface for this paint pass. +: *required* The [**Canvas**](Canvas) drawing surface for this paint pass. Its **RuntimeUICCGetWidth**, **RuntimeUICCGetHeight**, and **RuntimeUICCGetDpiScaleFactor** methods supply the size and DPI of the area being painted, in device pixels. + +A form implementation typically fills the form's background by adding one `ElementDescriptor` covering the full canvas area, then adds further descriptors for any content drawn directly on the form surface. Controls hosted in the form are painted separately by the framework --- the **Paint** implementation covers only the form's own background and direct decorations. + +A form should request additional repaints by calling [**CustomFormContext.Repaint**](CustomControlContext#repaint) (inherited from [**CustomControlContext**](CustomControlContext#repaint)), not by calling **Paint** directly --- the framework controls when to issue the actual paint pass. + +### Example + +This example shows a minimal **ICustomForm** implementation whose **Paint** method fills the form with a solid background colour. + +```tb +Class MyForm + Implements CustomControls.ICustomForm + + Private m_Context As CustomControls.CustomFormContext + + Private Sub OnInitialize(ByVal Context As CustomControls.CustomFormContext) _ + Implements CustomControls.ICustomForm.Initialize + Set m_Context = Context + End Sub + + Private Sub OnDestroy() _ + Implements CustomControls.ICustomForm.Destroy + Set m_Context = Nothing + End Sub + + Private Sub OnPaint(ByVal Canvas As CustomControls.Canvas) _ + Implements CustomControls.ICustomForm.Paint + Dim descriptor As ElementDescriptor + With descriptor + .Left = 0 + .Top = 0 + .Width = Canvas.RuntimeUICCGetWidth() + .Height = Canvas.RuntimeUICCGetHeight() + Set .BackgroundFill = Me.BackgroundFill + End With + Canvas.RuntimeUICCCanvasAddElement(descriptor) + End Sub +End Class +``` + +### See Also + +- [ICustomControl](ICustomControl) -- the parallel interface for non-form custom controls +- [ICustomControl.Paint](ICustomControl#paint) -- the equivalent method on the control interface +- [Canvas](Canvas) -- the drawing surface passed to **Paint** +- [CustomFormContext](CustomFormContext) -- the callback object available after **Initialize** diff --git a/docs/Reference/Built-In/CustomControls/Framework/_CustomControlContext.md b/docs/Reference/Built-In/CustomControls/Framework/_CustomControlContext.md new file mode 100644 index 00000000..aa38f026 --- /dev/null +++ b/docs/Reference/Built-In/CustomControls/Framework/_CustomControlContext.md @@ -0,0 +1,127 @@ +--- +title: _CustomControlContext +parent: Framework +grand_parent: CustomControls Package +permalink: /tB/Packages/CustomControls/Framework/_CustomControlContext +has_toc: false +--- + +# _CustomControlContext interface +{: .no_toc } + +The default COM interface of the [**CustomControlContext**](CustomControlContext) CoClass, defining the four callback methods the framework exposes to a custom control: serializer access, repaint requests, timer creation, and focus changes. + +User code does not reference this interface by name. Any variable declared `As CustomControlContext` automatically binds to `_CustomControlContext` because the CoClass declares it as its default interface. [**_CustomFormContext**](CustomFormContext) extends this interface with the form-specific **Show** and **Close** methods. + +## Methods + +### GetSerializer +{: .no_toc } + +Returns the [**SerializeInfo**](SerializeInfo) handle for this control instance. The serializer exposes the deserialization entry point and the run-time/design-time mode flags. + +Syntax: *object*.**GetSerializer** ( ) **As SerializeInfo** + +Call **GetSerializer** at the start of a control's [**Initialize**](ICustomControl#initialize) implementation to load any property values that were set in the form designer, and to read the mode flags before storing the context for later use. + +```tb +Private Sub OnInitialize(ByVal Ctx As CustomControls.CustomControlContext) _ + Implements CustomControls.ICustomControl.Initialize + + With Ctx.GetSerializer + If Not .RuntimeUISrzDeserialize(Me, False) Then + InitializeDefaultValues + End If + + Me.IsDesignMode = .RuntimeUISrzIsDesignMode() + End With + + Set Me.ControlContext = Ctx +End Sub +``` + +### Repaint +{: .no_toc } + +Tells the framework that the control's appearance has changed and that the canvas should be repainted at the next opportunity. + +Syntax: *object*.**Repaint** ( ) + +The framework schedules one paint pass regardless of how many times **Repaint** is called before it runs --- multiple calls in quick succession produce at most one call to [**ICustomControl.Paint**](ICustomControl#paint). This means it is safe to call **Repaint** from multiple **OnChanged** handlers that fire together when several style properties are set in sequence. + +When writing a new custom control, call **Repaint** whenever the control's internal state changes in a way that affects what the next **Paint** call should draw. Every concrete `Waynes...` control hooks the **OnChanged** events raised by its style sub-objects and calls **Repaint** from each handler, so a runtime property assignment triggers an automatic redraw without the caller needing to call **Repaint** directly. + +```tb +' In a custom control class: +Private m_Context As CustomControls.CustomControlContext +Private m_Caption As String + +Public Property Let Caption(ByVal Value As String) + m_Caption = Value + m_Context.Repaint ' schedule a repaint to show the new caption +End Property +``` + +### CreateTimer +{: .no_toc } + +Returns a new [**CustomControlTimer**](CustomControlTimer) bound to this control's lifetime. The timer is disabled on creation; the caller sets [**Interval**](CustomControlTimer#interval), subscribes to [**OnTimer**](CustomControlTimer#ontimer), and sets [**Enabled**](CustomControlTimer#enabled) to **True** to start it. + +Syntax: *object*.**CreateTimer** ( ) **As stdole.IUnknown** + +The timer is returned as **stdole.IUnknown**. Cast to [**CustomControlTimer**](CustomControlTimer) with `CType(Of CustomControlTimer)(…)` before accessing its members. Declare the holding field with **WithEvents** so that the **OnTimer** event can be handled. + +```tb +Private WithEvents InternalTimer As CustomControlTimer + +Private Sub OnInitialize(ByVal Ctx As CustomControls.CustomControlContext) _ + Implements CustomControls.ICustomControl.Initialize + + Set Me.ControlContext = Ctx + Set Me.InternalTimer = CType(Of CustomControlTimer)(Ctx.CreateTimer()) + Me.InternalTimer.Interval = 250 + Me.InternalTimer.Enabled = True +End Sub + +Private Sub OnTimer() Handles InternalTimer.OnTimer + ' called every 250 ms +End Sub +``` + +### ChangeFocusedElement +{: .no_toc } + +Asks the framework to move the keyboard focus to the element identified by *ElementTabIndex*. + +Syntax: *object*.**ChangeFocusedElement** *ElementTabIndex* + +*ElementTabIndex* +: *required* A **Long** matching the **ElementTabIndex** of an element that was registered in the most recent paint pass. + +The framework maintains a focus cursor over the elements a control adds to the [**Canvas**](Canvas) during **Paint**. Normally the cursor advances when the user presses **TAB** or **SHIFT+TAB**. Calling **ChangeFocusedElement** moves it programmatically to the element whose tab index equals *ElementTabIndex*, as if the user had tabbed to that position directly --- without any actual key press. + +Use this method when the control changes its own selection state without user keyboard input and needs the form-level focus tracking to reflect the new selection. [**WaynesGrid**](../WaynesGrid/) calls **ChangeFocusedElement** whenever a cell is selected programmatically: it updates **SelectedCellX** and **SelectedCellY**, then calls this method with the element tab index corresponding to the newly selected cell so that the framework's focus cursor stays consistent with the grid's internal selection. + +*ElementTabIndex* must correspond to an element added in the **most recent** call to [**ICustomControl.Paint**](ICustomControl#paint). If the value does not match any registered element, the framework ignores the call. + +```tb +' In a custom control that renders multiple clickable regions: +Private m_Context As CustomControls.CustomControlContext + +Private Sub SelectItem(ByVal ItemIndex As Long) + m_SelectedIndex = ItemIndex + ' Move the framework's focus cursor to the matching element. + ' The element's ElementTabIndex was set equal to ItemIndex when + ' added to the canvas in the last Paint call. + m_Context.ChangeFocusedElement ItemIndex + m_Context.Repaint +End Sub +``` + +## See Also + +- [CustomControlContext](CustomControlContext) -- the CoClass that exposes this interface as its default +- [CustomFormContext](CustomFormContext) -- extends this interface with **Show** and **Close** for form-class controls +- [ICustomControl](ICustomControl) -- the interface a custom control implements; receives a **CustomControlContext** in **Initialize** +- [SerializeInfo](SerializeInfo) -- the handle returned by **GetSerializer** +- [CustomControlTimer](CustomControlTimer) -- the timer object returned by **CreateTimer** diff --git a/docs/Reference/Built-In/CustomControls/Framework/_CustomControlTimer.md b/docs/Reference/Built-In/CustomControls/Framework/_CustomControlTimer.md new file mode 100644 index 00000000..e3bfff9f --- /dev/null +++ b/docs/Reference/Built-In/CustomControls/Framework/_CustomControlTimer.md @@ -0,0 +1,41 @@ +--- +title: _CustomControlTimer +parent: Framework +grand_parent: CustomControls Package +permalink: /tB/Packages/CustomControls/Framework/_CustomControlTimer +has_toc: false +--- + +# _CustomControlTimer interface +{: .no_toc } + +The underlying COM interface for [**CustomControlTimer**](CustomControlTimer), defining the **Interval** and **Enabled** properties that control the timer's rate and running state. + +User code works with [**CustomControlTimer**](CustomControlTimer) directly; this interface page documents the property contract that the CoClass exposes. + +## Properties + +### Interval +{: .no_toc } + +The number of milliseconds between successive [**OnTimer**](CustomControlTimer#ontimer) events. Read/write **Long**. + +Syntax: *object*.**Interval** [ **=** *value* ] + +*value* +: A **Long** specifying the number of milliseconds between timer firings. A value of `0` prevents the timer from firing. + +Changing **Interval** while the timer is running takes effect on the next tick --- the current tick completes at the old interval before the new one begins. + +### Enabled +{: .no_toc } + +Whether the timer is currently running. Read/write **Boolean**. Setting to **True** starts it; setting to **False** stops it. + +Syntax: *object*.**Enabled** [ **=** *value* ] + +## See Also + +- [CustomControlTimer](CustomControlTimer) class +- [CustomControlContext](CustomControlContext) class -- the callback object whose **CreateTimer** returns a **CustomControlTimer** +- [_CustomControlTimerEvents](_CustomControlTimerEvents) interface -- the event source interface with the **OnTimer** callback diff --git a/docs/Reference/Built-In/CustomControls/Framework/_CustomControlTimerEvents.md b/docs/Reference/Built-In/CustomControls/Framework/_CustomControlTimerEvents.md new file mode 100644 index 00000000..889c559e --- /dev/null +++ b/docs/Reference/Built-In/CustomControls/Framework/_CustomControlTimerEvents.md @@ -0,0 +1,44 @@ +--- +title: _CustomControlTimerEvents +parent: Framework +grand_parent: CustomControls Package +permalink: /tB/Packages/CustomControls/Framework/_CustomControlTimerEvents +has_toc: false +--- + +# _CustomControlTimerEvents interface +{: .no_toc } + +The event source interface of [**CustomControlTimer**](CustomControlTimer), declaring the single [**OnTimer**](#ontimer) callback that fires on each tick. + +This interface is the **\[Default, Source\]** interface of the **CustomControlTimer** CoClass. A field declared with `WithEvents` receives the **OnTimer** event through this interface automatically; there is no need to reference `_CustomControlTimerEvents` by name in application code. + +```tb +Private WithEvents InternalTimer As CustomControlTimer + +Private Sub OnInitialize(ByVal Ctx As CustomControls.CustomControlContext) _ + Implements CustomControls.ICustomControl.Initialize + + Set Me.InternalTimer = CType(Of CustomControlTimer)(Ctx.CreateTimer()) + Me.InternalTimer.Interval = 100 + Me.InternalTimer.Enabled = True +End Sub + +Private Sub OnTimer() Handles InternalTimer.OnTimer + ' called every 100 ms while the timer is enabled +End Sub +``` + +## Events + +### OnTimer +{: .no_toc } + +Raised every [**Interval**](CustomControlTimer#interval) milliseconds while the timer's [**Enabled**](CustomControlTimer#enabled) property is **True**. + +Syntax: *object*\_**OnTimer**( ) + +## See Also + +- [CustomControlTimer](CustomControlTimer) -- the timer class whose ticks fire **OnTimer**; exposes **Interval** and **Enabled** +- [CustomControlContext](CustomControlContext) -- supplies **CreateTimer**, the factory method that returns a **CustomControlTimer** diff --git a/docs/Reference/Built-In/CustomControls/Framework/_CustomControlsCollection.md b/docs/Reference/Built-In/CustomControls/Framework/_CustomControlsCollection.md new file mode 100644 index 00000000..b113fc9a --- /dev/null +++ b/docs/Reference/Built-In/CustomControls/Framework/_CustomControlsCollection.md @@ -0,0 +1,80 @@ +--- +title: _CustomControlsCollection +parent: Framework +grand_parent: CustomControls Package +permalink: /tB/Packages/CustomControls/Framework/_CustomControlsCollection +has_toc: false +--- + +# _CustomControlsCollection interface +{: .no_toc } + +The default interface of the [**CustomControlsCollection**](CustomControlsCollection) CoClass. Defines the collection contract for the set of controls hosted on a custom form: indexed access by integer or name, enumeration with **For Each**, and runtime add and remove of controls. + +Application code normally works through [**CustomControlsCollection**](CustomControlsCollection) rather than this interface directly. The interface name is prefixed with an underscore because it is a compiler-generated default interface, not an independently usable type. + +## Properties + +### Count +{: .no_toc } + +The number of controls in the collection. **Long**. Read-only. + +Syntax: *object*.**Count** + +### Item +{: .no_toc } + +Returns the control at the given index or with the given name. The default member (DispId 0) --- the shorthand *collection*( *IndexOrName* ) calls **Item**. + +Syntax: *object*.**Item** ( *IndexOrName* ) **As Object** + +*IndexOrName* +: *required* A **Variant** that is either a **Long** zero-based index or a **String** matching the control's **Name**. + +## Methods + +### Add +{: .no_toc } + +Adds a new control to the collection by class **ProgID**, assigns it a name, and attaches it to a container. + +Syntax: *object*.**Add** ( *ProgId*, *ControlName*, *Container* ) **As Object** + +*ProgId* +: *required* A **String** holding the class **ProgID** of the control to create. + +*ControlName* +: *required* A **String** giving the **Name** to assign to the new control. + +*Container* +: *required* An **Object** reference to the form, frame, or other container that will host the new control. + +Returns the newly created control as **Object**. + +### Remove +{: .no_toc } + +Removes the control at the given index or with the given name from the collection. + +Syntax: *object*.**Remove** *IndexOrName* + +*IndexOrName* +: *required* A **Variant** that is either a **Long** zero-based index or a **String** matching the control's **Name**. + +## Iteration + +A `For Each` loop over the collection produces every hosted control in turn. The hidden `_NewEnum` member (DispId -4) provides the enumerator; application code does not call it directly. + +```tb +Dim ctl As Object +For Each ctl In MyForm.Controls + Debug.Print ctl.Name +Next +``` + +## See Also + +- [CustomControlsCollection](CustomControlsCollection) -- the CoClass whose default interface this is +- [ICustomControl](ICustomControl) -- the interface implemented by each control in the collection +- [CustomControlContext](CustomControlContext) -- the callback object passed to a control on **Initialize** diff --git a/docs/Reference/Built-In/CustomControls/Framework/_CustomFormContext.md b/docs/Reference/Built-In/CustomControls/Framework/_CustomFormContext.md new file mode 100644 index 00000000..dca71169 --- /dev/null +++ b/docs/Reference/Built-In/CustomControls/Framework/_CustomFormContext.md @@ -0,0 +1,61 @@ +--- +title: _CustomFormContext +parent: Framework +grand_parent: CustomControls Package +permalink: /tB/Packages/CustomControls/Framework/_CustomFormContext +has_toc: false +--- + +# _CustomFormContext interface +{: .no_toc } + +The underlying COM interface for [**CustomFormContext**](CustomFormContext), extending [**_CustomControlContext**](_CustomControlContext) with **Show** and **Close** --- the two operations a top-level custom form needs that an embedded control does not. + +User code works with [**CustomFormContext**](CustomFormContext) directly; this interface page documents the method contract that the CoClass exposes. + +## Inherited + +Every member of [**_CustomControlContext**](_CustomControlContext) is also present on **_CustomFormContext** --- [**GetSerializer**](_CustomControlContext#getserializer), [**Repaint**](_CustomControlContext#repaint), [**CreateTimer**](_CustomControlContext#createtimer), and [**ChangeFocusedElement**](_CustomControlContext#changefocusedelement). + +## Methods + +### Show +{: .no_toc } + +Makes the underlying window visible. + +Syntax: *object*.**Show** ( ) + +The method maps to the Win32 show-window operation on the form's HWND. Application code typically calls [**WaynesForm.Show**](../WaynesForm/#show), which in turn calls this method through the stored [**CustomFormContext**](CustomFormContext) reference. + +A custom form class casts the [**CustomControlContext**](CustomControlContext) it receives in [**ICustomForm.Initialize**](ICustomForm#initialize) to [**CustomFormContext**](CustomFormContext) and stores it; it then exposes its own **Show** method that delegates here: + +```tb +Private m_Context As CustomControls.CustomFormContext + +Private Sub OnInitialize(ByVal Ctx As CustomControls.CustomFormContext) _ + Implements CustomControls.ICustomForm.Initialize + + Set m_Context = Ctx +End Sub + +Public Sub Show() + m_Context.Show +End Sub +``` + +### Close +{: .no_toc } + +Closes the underlying window. Equivalent to the user clicking the title-bar close button. + +Syntax: *object*.**Close** ( ) + +Application code typically calls [**WaynesForm.Close**](../WaynesForm/#close), which in turn calls this method through the stored [**CustomFormContext**](CustomFormContext) reference. + +## See Also + +- [CustomFormContext](CustomFormContext) class +- [_CustomControlContext](_CustomControlContext) interface +- [ICustomForm](ICustomForm) interface +- [CustomControlContext](CustomControlContext) class diff --git a/docs/Reference/Built-In/CustomControls/index.md b/docs/Reference/Built-In/CustomControls/index.md index 0d3cb24b..93749ad8 100644 --- a/docs/Reference/Built-In/CustomControls/index.md +++ b/docs/Reference/Built-In/CustomControls/index.md @@ -4,6 +4,7 @@ parent: Built-In Packages nav_order: 5 permalink: /tB/Packages/CustomControls/ has_toc: false +indexed_from: beta-x-0983 --- # CustomControls Package @@ -64,15 +65,24 @@ Every style object raises an **OnChanged** event whenever one of its fields is s For authoring new custom controls or forms, the **CustomControls DESIGNER** half of the package supplies: -- [ICustomControl](Framework/ICustomControl) -- the interface every custom control implements: **Initialize**, **Destroy**, **Paint** -- [ICustomForm](Framework/ICustomForm) -- the analogous interface for custom form classes +- [_CustomControlContext](Framework/_CustomControlContext) -- the underlying COM interface of [**CustomControlContext**](Framework/CustomControlContext), defining the four callback methods: serializer access, repaint requests, timer creation, and focus changes +- [_CustomControlsCollection](Framework/_CustomControlsCollection) -- the underlying COM interface of [**CustomControlsCollection**](Framework/CustomControlsCollection), defining the collection contract: indexed access, enumeration, and add/remove +- [_CustomControlTimer](Framework/_CustomControlTimer) -- the underlying COM interface of [**CustomControlTimer**](Framework/CustomControlTimer), defining the **Interval** and **Enabled** properties +- [_CustomControlTimerEvents](Framework/_CustomControlTimerEvents) -- the event-source interface of [**CustomControlTimer**](Framework/CustomControlTimer), declaring the **OnTimer** callback that fires on each tick +- [_CustomFormContext](Framework/_CustomFormContext) -- the underlying COM interface of [**CustomFormContext**](Framework/CustomFormContext), extending **_CustomControlContext** with **Show** and **Close** +- [Canvas](Framework/Canvas) -- the drawing surface passed to **Paint**; the only way to put pixels into a custom control - [CustomControlContext](Framework/CustomControlContext) -- callback object passed to **Initialize**; offers serializer access, repaint requests, timer creation, and focus changes -- [CustomFormContext](Framework/CustomFormContext) -- a **CustomControlContext** extended with **Show** and **Close** for form-class controls - [CustomControlTimer](Framework/CustomControlTimer) -- the timer returned by **CustomControlContext.CreateTimer**; has **Interval**, **Enabled**, and an **OnTimer** event - [CustomControlsCollection](Framework/CustomControlsCollection) -- the **Controls** collection on a form -- [Canvas](Framework/Canvas) -- the drawing surface passed to **Paint**; the only way to put pixels into a custom control +- [CustomFormContext](Framework/CustomFormContext) -- a **CustomControlContext** extended with **Show** and **Close** for form-class controls +- [ICustomControl](Framework/ICustomControl) -- the interface every custom control implements: **Initialize**, **Destroy**, **Paint** +- [ICustomForm](Framework/ICustomForm) -- the analogous interface for custom form classes - [SerializeInfo](Framework/SerializeInfo) -- the per-instance serializer returned by **CustomControlContext.GetSerializer**; used to deserialize designer-set property values and to query the runtime mode +## Modules + +- [Constants](Constants) -- declares the enumerations and UDTs shared across the entire **CustomControls** package; internal to the DESIGNER library + ## Enumerations - [BorderStyle](Enumerations/BorderStyle) -- window-frame style passed to [**WindowsFormOptions.BorderStyle**](WaynesForm/WindowsFormOptions#borderstyle) From 3429b97319ef442ec6ef3882d1d272676541324d Mon Sep 17 00:00:00 2001 From: Kuba Sunderland-Ober Date: Thu, 4 Jun 2026 21:29:41 +0200 Subject: [PATCH 7/9] Update the WinNamedPipesLib documentation. --- .../NamedPipeClientConnection.md | 127 ++++++++- .../NamedPipeClientManager.md | 61 +++- .../WinNamedPipesLib/NamedPipeServer.md | 269 +++++++++++++++++- .../NamedPipeServerConnection.md | 201 +++++++++++-- .../Built-In/WinNamedPipesLib/index.md | 11 + 5 files changed, 620 insertions(+), 49 deletions(-) diff --git a/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeClientConnection.md b/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeClientConnection.md index 62864bc8..aefd2a96 100644 --- a/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeClientConnection.md +++ b/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeClientConnection.md @@ -45,19 +45,63 @@ See the package [overview](.) for the IOCP / event-marshalling architecture, the ## Properties ### CustomData -{: .no_toc } +{: #customdata .no_toc } + +A per-connection opaque slot the consumer can use to attach arbitrary state to this connection object. + +Syntax: *connection*.**CustomData** [ **=** *value* ] + +*value* +: Any **Variant**-compatible value to store with this connection. Default **Empty**. + +The package never reads or writes **CustomData**. It exists solely as a convenience field so consumer code does not need a separate dictionary or parallel array to correlate a `NamedPipeClientConnection` reference with application-level state. + +Typical uses include a session object, a pending-replies dictionary, a display name, or any other per-connection value the application needs to retrieve when a [**MessageReceived**](#messagereceived) or [**Disconnected**](#disconnected) event fires. + +#### Example + +This example attaches a user-defined session object to a connection when it connects, then retrieves it inside the message-received handler. -A per-connection opaque slot the consumer can attach state to --- typically a session object or a pending-replies dictionary tied to this one connection. **Variant**, default **Empty**. The package never reads or writes this field. +```tb +Private manager As NamedPipeClientManager +Private WithEvents connection As NamedPipeClientConnection + +Private Sub OpenConnection(ByVal pipeName As String, ByVal session As ClientSession) + Set manager = New NamedPipeClientManager + Set connection = manager.Connect(pipeName) + Set connection.CustomData = session ' attach session state to this connection +End Sub + +Private Sub connection_MessageReceived(ByRef Cookie As Variant, ByRef Data() As Byte) + Dim session As ClientSession = connection.CustomData + session.HandleReply Data +End Sub +``` ### Handle -{: .no_toc } +{: #handle .no_toc } + +The underlying Win32 file handle returned by `CreateFileW("\\.\pipe\")`. **LongPtr**. -The underlying Win32 file handle returned by `CreateFileW("\\.\pipe\")`. **LongPtr**. Exposed for low-level / debugging use --- most consumers can ignore it. Do not call `CloseHandle` on this value directly; use [**AsyncClose**](#asyncclose) so the IOCP loop and the parent manager's bookkeeping stay consistent. +Syntax: *connection*.**Handle** + +The value is **0** (`vbNullPtr`) before the asynchronous connection sequence completes and after [**AsyncClose**](#asyncclose) has been called. Once the [**Connected**](#connected) event has fired, **Handle** holds the file handle that the package uses for all subsequent `ReadFile` and `WriteFile` calls against this connection. + +> [!WARNING] +> Do not call `CloseHandle` on this value directly. Use [**AsyncClose**](#asyncclose) instead, so the IOCP loop and the parent manager's bookkeeping stay consistent. Closing the handle outside the package leaves pending IOCP completions referencing freed memory. + +Most consumers do not need this field. It is exposed for low-level diagnostics --- for example, passing the handle to `GetNamedPipeInfo` or other Win32 APIs to inspect pipe state. ### PipeName -{: .no_toc } +{: #pipename .no_toc } -The leaf pipe name this connection was opened against --- the same value that was passed to [**NamedPipeClientManager.Connect**](NamedPipeClientManager#connect). **String**. Read-only in practice; the package sets it from the constructor argument and never changes it. +The leaf pipe name this connection was opened against. **String**. + +Syntax: *connection*.**PipeName** + +The value is set by the constructor from the *serverPipeName* argument supplied to [**NamedPipeClientManager.Connect**](NamedPipeClientManager#connect) and is not changed after that. The package uses it internally to compose the Win32 UNC path `\\.\pipe\` when calling `CreateFileW`. + +Read the field to identify which server a given connection object is bound to --- useful when a single form or class manages several **NamedPipeClientConnection** instances against different pipe names. ## Events @@ -101,14 +145,18 @@ Syntax: *connection*_**MessageSent**(**ByRef** *Cookie* **As Variant**) ## Methods ### AsyncClose -{: .no_toc } +{: #asyncclose .no_toc } -Cancels every outstanding I/O against this connection and closes the underlying pipe handle. Eventually triggers the [**Disconnected**](#disconnected) event once the cancellation completes. Automatically invoked from `Class_Terminate` when the last reference to the connection drops. +Cancels every outstanding asynchronous I/O against this connection and closes the underlying pipe handle. Syntax: *connection*.**AsyncClose** +Internally, **AsyncClose** calls `CancelIoEx` on the pipe handle to abort any pending reads or writes, then calls `CloseHandle` to release it. Once **AsyncClose** returns, no further I/O is possible on the connection. The [**Disconnected**](#disconnected) event fires asynchronously once every outstanding IOCP completion has been processed and the outstanding-request counter reaches zero. + +**AsyncClose** is called automatically from `Class_Terminate` when the last reference to the connection object drops, so letting the variable go out of scope is sufficient when the connection is short-lived and no module-level reference is kept. + > [!IMPORTANT] -> See the class intro: the README requires that either this method runs (explicitly, or through `Class_Terminate`) before the connection is considered finished. +> If the connection object is stored in a long-lived container --- a module-level **Collection**, a class field, or a global variable --- `Class_Terminate` does not run until that container is also released. Call **AsyncClose** explicitly before dropping the last reference whenever the lifetime is not guaranteed to be short. Failure to do so keeps the underlying pipe handle open and the IOCP worker thread running. ### AsyncRead {: .no_toc } @@ -130,7 +178,7 @@ Only needed when the parent manager's [**ContinuouslyReadFromPipe**](NamedPipeCl Sends a message to the server. -Syntax: *connection*.**AsyncWrite** *Data*() [, *Cookie* ] +Syntax: *connection*.**AsyncWrite** *Data*() [**,** *Cookie* ] *Data* : *required* A **Byte()** array containing the bytes to send. An uninitialised or zero-length array is a no-op. For typed multi-field payloads the recommended encoding is [**PropertyBag**](../VBRUN/PropertyBag/) --- see [Recommended payload encoding: `PropertyBag`](.#propertybag-carrier) on the package overview. @@ -140,6 +188,65 @@ Syntax: *connection*.**AsyncWrite** *Data*() [, *Cookie* ] Returns immediately; the actual transmission runs through the IOCP loop. The completion fires [**MessageSent**](#messagesent) on this connection. +> [!WARNING] +> The bytes are copied into a per-completion buffer sized at [**NamedPipeClientManager.MessageBufferSize**](NamedPipeClientManager#messagebuffersize) (default **131072** bytes) without a bounds check. Passing an array longer than that value overruns the buffer. Raise **MessageBufferSize** above the largest expected message before the first [**NamedPipeClientManager.Connect**](NamedPipeClientManager#connect) call; the value is read once at that point and propagated to every per-connection buffer. + +### Example + +This example connects to a named pipe server, sends a request encoded as a [**PropertyBag**](../VBRUN/PropertyBag/), and prints the reply. + +```tb +Private manager As NamedPipeClientManager +Private WithEvents connection As NamedPipeClientConnection + +Private Sub Form_Load() + Set manager = New NamedPipeClientManager + Set connection = manager.Connect("MyService") +End Sub + +Private Sub connection_Connected() + Dim request As New PropertyBag + request.WriteProperty "CommandID", "WHAT_TIME_IS_IT" + connection.AsyncWrite request.Contents, cookie:=42 +End Sub + +Private Sub connection_MessageSent(ByRef Cookie As Variant) + Debug.Print "request sent (cookie=" & Cookie & ")" +End Sub + +Private Sub connection_MessageReceived(ByRef Cookie As Variant, ByRef Data() As Byte) + Dim incoming As New PropertyBag + incoming.Contents = Data ' deep-copies bytes; safe past the handler + Debug.Print "time: " & incoming.ReadProperty("ResponseData") +End Sub + +Private Sub Form_Unload(Cancel As Integer) + connection.AsyncClose +End Sub +``` + +### New +{: .no_toc } + +Constructs a connection object in the not-yet-connected state and binds it to the parent manager's IOCP infrastructure. + +Syntax: **New NamedPipeClientConnection**(*server*, *serverPipeName*, *serverCompletionPortHandle*, *serverMessageWindowHandle*) + +> [!NOTE] +> The constructor signature is package-private. The first parameter type (`INamedPipeClientManagerInternal`) is an internal interface not accessible to consumer code. Do not construct `NamedPipeClientConnection` directly --- obtain instances from [**NamedPipeClientManager.Connect**](NamedPipeClientManager#connect). + +*server* +: *required* An `INamedPipeClientManagerInternal` reference to the owning manager. The constructor reads [**MessageBufferSize**](NamedPipeClientManager#messagebuffersize), [**FreeThreadingEvents**](NamedPipeClientManager#freethreadingevents), and [**ContinuouslyReadFromPipe**](NamedPipeClientManager#continuouslyreadfrompipe) from this object, so the values are frozen at construction time. + +*serverPipeName* +: *required* The leaf pipe name to open, stored as [**PipeName**](#pipename). + +*serverCompletionPortHandle* +: *required* A **LongPtr** handle to the manager's I/O Completion Port, used when associating the pipe handle and posting I/O completions. + +*serverMessageWindowHandle* +: *required* A **LongPtr** handle to the manager's hidden message-only window, used to marshal IOCP-thread events back to the UI thread when [**FreeThreadingEvents**](NamedPipeClientManager#freethreadingevents) is **False**. + ## See Also - [WinNamedPipesLib package](.) -- overview, IOCP / event-marshalling architecture, cookie pattern, `Data()` lifetime caveat, the **AsyncClose** rule diff --git a/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeClientManager.md b/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeClientManager.md index 16c91545..8edfd8af 100644 --- a/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeClientManager.md +++ b/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeClientManager.md @@ -42,19 +42,56 @@ See the package [overview](.) for the IOCP / event-marshalling architecture, the The four configuration fields are read once on the first [**Connect**](#connect) call and propagated to every [**NamedPipeClientConnection**](NamedPipeClientConnection) created through this manager. Subsequent changes affect connections opened thereafter but **not** connections that already exist --- set the fields before the first [**Connect**](#connect). ### ContinuouslyReadFromPipe +{: #continuouslyreadfrompipe } {: .no_toc } -When **True** (the default), each [**NamedPipeClientConnection**](NamedPipeClientConnection) keeps a read pending against its pipe at all times --- every [**MessageReceived**](NamedPipeClientConnection#messagereceived) is followed by an automatic `AsyncRead` issued from inside the IOCP thread. Set to **False** to handle reads one-at-a-time; each [**MessageReceived**](NamedPipeClientConnection#messagereceived) handler must then call [**NamedPipeClientConnection.AsyncRead**](NamedPipeClientConnection#asyncread) to receive the next message. **Boolean**, default **True**. +Controls whether each connection keeps a read pending automatically after every received message. **Boolean**, default **True**. + +Syntax: *manager*.**ContinuouslyReadFromPipe** [ **=** *value* ] + +*value* +: A **Boolean**. **True** (the default) to keep a read pending at all times; **False** to require an explicit [**NamedPipeClientConnection.AsyncRead**](NamedPipeClientConnection#asyncread) call after each message. + +When **True**, the IOCP worker thread issues a new `AsyncRead` immediately after delivering each [**MessageReceived**](NamedPipeClientConnection#messagereceived) event. The next message is received without consumer code having to do anything. This is the right choice for most scenarios. + +When **False**, no automatic re-read is issued. The consumer's [**MessageReceived**](NamedPipeClientConnection#messagereceived) handler must call [**NamedPipeClientConnection.AsyncRead**](NamedPipeClientConnection#asyncread) before the next message can be received. This allows back-pressure: the consumer can delay calling [**AsyncRead**](NamedPipeClientConnection#asyncread) until it is ready to process another message, preventing the IOCP loop from delivering messages faster than the handler can cope. + +> [!NOTE] +> The value is read once when each [**NamedPipeClientConnection**](NamedPipeClientConnection) is constructed by [**Connect**](#connect) and stored on the connection object. Changing **ContinuouslyReadFromPipe** after the first [**Connect**](#connect) has no effect on connections that already exist. ### FreeThreadingEvents {: .no_toc } -Controls where the [**NamedPipeClientConnection**](NamedPipeClientConnection) events are raised. When **False** (the default), the IOCP worker threads marshal each event to the main UI thread through the manager's hidden message-only window, and the consuming process must be pumping a Win32 message loop. When **True**, events fire directly on whichever IOCP worker thread received the completion --- no message-loop dependency, but the consumer's event handlers must be thread-safe. **Boolean**, default **False**. +Controls where [**NamedPipeClientConnection**](NamedPipeClientConnection) events are raised. **Boolean**, default **False**. + +Syntax: *manager*.**FreeThreadingEvents** [ **=** *value* ] + +*value* +: A **Boolean**. **False** (the default) marshals each event to the main UI thread through the manager's hidden message-only window; **True** fires events directly on whichever IOCP worker thread received the completion. + +When **False**, the IOCP worker threads post each completion to a hidden `STATIC`-class window owned by the manager. That window's subclassed `WndProc` then raises the event on the main UI thread. The consuming process must be pumping a Win32 message loop for delivery to occur. Forms-based hosts already pump one; console hosts and Windows services do not, and need either [**NamedPipeServer.ManualMessageLoopEnter**](NamedPipeServer#manualmessageloopenter) / `ManualMessageLoopLeave` or **FreeThreadingEvents** = **True**. + +When **True**, the IOCP thread raises each event directly --- no message-loop dependency --- but the consumer's event handlers must be thread-safe. Multiple [**MessageReceived**](NamedPipeClientConnection#messagereceived) events from different connections can fire concurrently, and any global or class state the handler reads or writes is **not** protected by the implicit single-threaded serialisation that the default mode provides. + +> [!IMPORTANT] +> Set **FreeThreadingEvents** before the first [**Connect**](#connect) call. The value is read once at that point and propagated to every [**NamedPipeClientConnection**](NamedPipeClientConnection) created through this manager. ### MessageBufferSize {: .no_toc } -The size, in bytes, of the per-completion `ReadFile` buffer initially allocated for each client connection. **Long**, default **131072** (128 KiB). Does not cap the maximum message size --- on `ERROR_MORE_DATA` the IOCP loop allocates a larger overflow buffer and re-issues the read --- but the initial size affects throughput for sustained large-message traffic. +The size, in bytes, of the per-completion `ReadFile` buffer initially allocated for each client connection. **Long**, default **131072** (128 KiB). + +Syntax: *manager*.**MessageBufferSize** [ **=** *value* ] + +*value* +: A **Long** giving the buffer size in bytes. Default **131072** (128 KiB). + +The receive path does not treat this as a cap: when a message is larger than the buffer, the IOCP loop receives `ERROR_MORE_DATA`, allocates a larger overflow buffer, and re-issues the read until all bytes arrive. The initial size therefore affects throughput for sustained large-message traffic rather than limiting the maximum readable message size. + +The send path is different: [**NamedPipeClientConnection.AsyncWrite**](NamedPipeClientConnection#asyncwrite) copies the caller's `Byte()` into a per-completion buffer sized at **MessageBufferSize** without a bounds check. A message larger than the buffer overruns it --- likely a crash or heap corruption rather than a clean error. + +> [!IMPORTANT] +> Set **MessageBufferSize** to at least the size of the largest message the application expects to send, *before* the first [**Connect**](#connect) call. The value is read once when the completion port is created and propagated to every per-connection buffer; changes after the first [**Connect**](#connect) do not affect existing connections. ### NumThreadsIOCP {: .no_toc } @@ -85,9 +122,13 @@ Enumerates the named pipes currently published on the local machine. Syntax: *manager*.**FindNamedPipes** ( [ *Pattern* ] ) **As Collection** *Pattern* -: *optional* A wildcard pattern matched against the leaf pipe name (no `\\.\pipe\` prefix; the package adds it). `*` matches any sequence, `?` matches any single character. Default `"*"` --- return every pipe. +: *optional* A wildcard pattern matched against the leaf pipe name (no `\\.\pipe\` prefix; the package adds it). `*` matches any sequence of characters, `?` matches any single character. Default `"*"` --- return every pipe. + +Returns a **Collection** of **String** values, each a leaf pipe name suitable to pass directly to [**Connect**](#connect). The underlying implementation calls `FindFirstFileW("\\.\pipe\")` --- the Win32 pipe namespace --- so only pipes hosted on the local machine are enumerated. -Returns a **Collection** of **String** values, each a leaf pipe name suitable to pass to [**Connect**](#connect). Useful as a discovery step when the consumer doesn't know the exact server name in advance: +Named pipes can appear and disappear at any time as their server processes start and stop. The function returns a snapshot; it does not watch for subsequent changes. Dynamic UIs that list available servers typically refresh the list from a low-frequency [**Timer**](../VB/Timer/) --- see [Discovering pipes](.#discovering-pipes) on the package overview for the polling-loop pattern that preserves the user's current selection across refreshes. + +### Example ```tb Dim names As Collection = manager.FindNamedPipes("MyService_*") @@ -97,8 +138,6 @@ For Each name In names Next ``` -The package does not publish an event when pipes appear or disappear, so dynamic UIs that list available servers typically refresh the list from a low-frequency [**Timer**](../VB/Timer/) --- see [Discovering pipes](.#discovering-pipes) on the package overview for the polling-loop pattern that preserves the user's current selection across refreshes. - ### Stop {: .no_toc } @@ -111,10 +150,16 @@ Syntax: *manager*.**Stop** ### New {: .no_toc } -Constructs a manager in the not-yet-connected state. Creates the hidden `STATIC`-class message window used to marshal IOCP-thread completions back to the UI thread. +Constructs a **NamedPipeClientManager** in the not-yet-connected state. Syntax: **New NamedPipeClientManager** +**New** creates a hidden `STATIC`-class message window and subclasses its `WndProc` with the manager's internal `MessageWindowProc`. This window is the marshalling endpoint used by the IOCP worker threads when [**FreeThreadingEvents**](#freethreadingevents) is **False** (the default): each IOCP completion calls `PostMessage` to the window, and the subclassed procedure raises the corresponding [**NamedPipeClientConnection**](NamedPipeClientConnection) event on the UI thread. + +The window is created in the constructor because the marshalling infrastructure must be in place before any connection is opened. No IOCP threads are started at this point --- those are deferred to the first [**Connect**](#connect) call. + +`Class_Terminate` reverses the construction: it calls [**Stop**](#stop) (which cancels all I/O and joins the worker threads), then restores the original `WndProc` and destroys the message window. Letting the manager go out of scope is therefore equivalent to calling [**Stop**](#stop) explicitly before releasing the reference. + ## See Also - [WinNamedPipesLib package](.) -- overview, IOCP / event-marshalling architecture, cookie pattern, `Data()` lifetime caveat, **AsyncClose** rule diff --git a/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeServer.md b/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeServer.md index c43176e1..3d51cc5b 100644 --- a/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeServer.md +++ b/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeServer.md @@ -43,32 +43,173 @@ See the package [overview](.) for the IOCP / event-marshalling architecture, the ### ContinuouslyReadFromPipe {: .no_toc } -When **True** (the default), the server keeps a read pending against every connected client at all times --- every [**ClientMessageReceived**](#clientmessagereceived) is followed by an automatic `AsyncRead` issued from inside the IOCP thread. Set to **False** to handle reads one-at-a-time; each [**ClientMessageReceived**](#clientmessagereceived) handler must then call [**NamedPipeServerConnection.AsyncRead**](NamedPipeServerConnection#asyncread) to receive the next message. **Boolean**, default **True**. +Controls whether the server automatically re-issues a read after every received message. **Boolean**, default **True**. + +Syntax: *server*.**ContinuouslyReadFromPipe** [ **=** *value* ] + +*value* +: A **Boolean**. **True** keeps a read pending against every connected client at all times: when [**ClientMessageReceived**](#clientmessagereceived) fires, the IOCP worker thread has already issued the next `AsyncRead` before the event is delivered. **False** disables the automatic re-issue; the consumer must call [**NamedPipeServerConnection.AsyncRead**](NamedPipeServerConnection#asyncread) from inside [**ClientMessageReceived**](#clientmessagereceived) (or from [**ClientConnected**](#clientconnected) to prime the first read) to receive each message. + +When **True**, the *Cookie* parameter of [**ClientMessageReceived**](#clientmessagereceived) is always **Empty** for auto-issued reads --- only explicit [**NamedPipeServerConnection.AsyncRead**](NamedPipeServerConnection#asyncread) calls can attach a correlation value. + +Set this before calling [**Start**](#start). The value is read during connection setup and propagated to every [**NamedPipeServerConnection**](NamedPipeServerConnection); changing it after [**Start**](#start) has no effect on already-connected clients. + +**False** is useful for back-pressure when the consumer cannot process messages as fast as they arrive: no new read is queued until the handler explicitly calls [**NamedPipeServerConnection.AsyncRead**](NamedPipeServerConnection#asyncread), which prevents the IOCP loop from queuing further messages ahead of the consumer. + +#### Example + +This example sets **ContinuouslyReadFromPipe** to **False** to process one message at a time, priming the first read from [**ClientConnected**](#clientconnected) and re-arming from [**ClientMessageReceived**](#clientmessagereceived). + +```tb +Private WithEvents server As NamedPipeServer + +Private Sub Form_Load() + Set server = New NamedPipeServer + server.PipeName = "MyService" + server.ContinuouslyReadFromPipe = False ' manual re-arm + server.Start +End Sub + +Private Sub server_ClientConnected(Connection As NamedPipeServerConnection) + Connection.AsyncRead ' prime the first read for this client +End Sub + +Private Sub server_ClientMessageReceived( _ + Connection As NamedPipeServerConnection, _ + ByRef Cookie As Variant, _ + ByRef Data() As Byte) + ProcessMessage Connection, Data + Connection.AsyncRead ' re-arm to receive the next message +End Sub +``` ### FreeThreadingEvents -{: .no_toc } +{: #freethreadingevents .no_toc } + +Controls where the lifecycle and message events are raised. **Boolean**, default **False**. + +Syntax: *server*.**FreeThreadingEvents** [ **=** *value* ] + +*value* +: A **Boolean**. **False** (default) marshals events to the main UI thread through a hidden message-only window. **True** raises events directly on the IOCP worker thread that received the completion. -Controls where the lifecycle and message events are raised. When **False** (the default), the IOCP worker threads marshal each event to the main UI thread through a hidden message-only window, and the consuming process must be pumping a Win32 message loop. When **True**, events fire directly on whichever IOCP worker thread received the completion --- no message-loop dependency, but the consumer's event handlers must be thread-safe. **Boolean**, default **False**. +When **False**, the IOCP thread posts each completion result to a hidden `STATIC`-class window that the server creates in its constructor. The window's subclassed `WndProc` raises the corresponding BASIC event from the caller's message loop. The consuming process must be running a Win32 message loop --- a Forms host already does; a console host or Windows service does not, and must either call [**ManualMessageLoopEnter**](#manualmessageloopenter) (and the matching [**ManualMessageLoopLeave**](#manualmessageloopleave)) or set **FreeThreadingEvents** to **True**. -Set this before calling [**Start**](#start); it is read once when the worker threads are created and propagated to every [**NamedPipeServerConnection**](NamedPipeServerConnection). +When **True**, each event fires directly on the IOCP worker thread that received the completion. There is no message-loop dependency, but multiple events can arrive concurrently --- for example, two [**ClientMessageReceived**](#clientmessagereceived) handlers from different clients can run simultaneously if [**NumThreadsIOCP**](#numthreadsiocp) is greater than one. Any shared state accessed from these handlers must be protected by the caller. + +> [!IMPORTANT] +> **FreeThreadingEvents** must be set before [**Start**](#start). It is read once when the worker threads are created and propagated to every [**NamedPipeServerConnection**](NamedPipeServerConnection) at that point; changing the value after [**Start**](#start) has no effect on the running server. + +> [!WARNING] +> Setting **FreeThreadingEvents** to **True** and calling [**ManualMessageLoopEnter**](#manualmessageloopenter) is not useful: in free-threaded mode events bypass the marshalling window entirely, so the manual message loop has nothing to dispatch. Pick one mode and stay with it for the lifetime of the server. + +#### Example + +This example sets **FreeThreadingEvents** to **True** to host the server in a console application without requiring a message loop. + +```tb +Private WithEvents server As NamedPipeServer + +Sub Main() + Set server = New NamedPipeServer + server.PipeName = "MyService" + server.FreeThreadingEvents = True ' events fire on the IOCP worker thread + server.Start + + ' No ManualMessageLoopEnter needed; block here however is appropriate. + Sleep 10000 + server.Stop +End Sub + +Private Sub server_ClientMessageReceived( _ + Connection As NamedPipeServerConnection, _ + ByRef Cookie As Variant, _ + ByRef Data() As Byte) + ' This handler executes on the IOCP worker thread. + ' Shared state accessed here requires external synchronisation. + Connection.AsyncWrite Data +End Sub +``` ### MessageBufferSize +{: #messagebuffersize } {: .no_toc } -The size, in bytes, of the per-completion `ReadFile` buffer initially allocated for each connection. **Long**, default **131072** (128 KiB). Does not cap the maximum message size --- on `ERROR_MORE_DATA` the IOCP loop allocates a larger overflow buffer and re-issues the read --- but the initial size affects how often that overflow path runs, and so affects throughput for sustained large-message traffic. +The size, in bytes, of the `ReadFile` buffer initially allocated for each I/O completion. **Long**, default **131072** (128 KiB). + +Syntax: *server*.**MessageBufferSize** [ **=** *value* ] + +*value* +: A **Long** specifying the buffer size in bytes. Must be set before [**Start**](#start); the value is read once at that point and propagated to every [**NamedPipeServerConnection**](NamedPipeServerConnection) buffer allocated by the IOCP loop. + +This value does not cap the maximum receivable message size. When `ReadFile` returns `ERROR_MORE_DATA`, the IOCP loop allocates a larger overflow buffer and re-issues the read, so arbitrarily large incoming messages are handled correctly. The initial buffer size does affect how often that overflow path runs: a value smaller than the typical incoming message size incurs an extra allocation and read round-trip per message, reducing throughput under sustained large-message traffic. + +> [!IMPORTANT] +> The send path does **not** grow dynamically. [**AsyncWrite**](NamedPipeServerConnection#asyncwrite) (and [**AsyncBroadcast**](#asyncbroadcast)) copies the caller's `Byte()` into a per-completion buffer of this size *without a bounds-check*. Sending a message larger than **MessageBufferSize** overwrites memory past the buffer --- a crash or heap corruption rather than a clean error. Set **MessageBufferSize** above the largest message the application will ever send before calling [**Start**](#start). ### NumThreadsIOCP {: .no_toc } -The number of IOCP worker threads created by [**Start**](#start). **Long**, default **1**. One thread is enough for most scenarios because every blocking call inside the worker is an overlapped Win32 operation that releases the thread immediately. Raise this to allow multiple [**ClientMessageReceived**](#clientmessagereceived) handlers to run concurrently under [**FreeThreadingEvents**](#freethreadingevents) = **True**, or to keep up with heavy traffic on multi-core hardware. Set this before calling [**Start**](#start). +The number of IOCP worker threads created by [**Start**](#start). **Long**, default **1**. + +Syntax: *server*.**NumThreadsIOCP** [ **=** *value* ] + +*value* +: A **Long** specifying the number of worker threads to create. Must be set before [**Start**](#start); the value is read once when [**Start**](#start) is called and cannot be changed while the server is running. + +One thread is sufficient for most scenarios because every blocking operation inside the worker is an overlapped Win32 call (`GetQueuedCompletionStatus`) that yields the thread while it waits --- the thread is not consumed by I/O wait, only by the time spent inside event handler callbacks. Raise the count to allow multiple [**ClientMessageReceived**](#clientmessagereceived) handlers to run concurrently when [**FreeThreadingEvents**](#freethreadingevents) is **True**, or to increase throughput when many clients generate simultaneous completions on multi-core hardware. + +> [!IMPORTANT] +> When [**FreeThreadingEvents**](#freethreadingevents) is **False** (the default), raising **NumThreadsIOCP** above **1** produces no throughput gain for event delivery, because all events are serialised through a single hidden window on the UI thread regardless of how many workers produce completions. Multiple threads are useful in that mode only if the IOCP workers themselves perform significant work before posting to the window. + +#### Example + +This example configures two worker threads for a server where [**FreeThreadingEvents**](#freethreadingevents) is **True**, allowing two [**ClientMessageReceived**](#clientmessagereceived) events from different clients to run concurrently. + +```tb +Private WithEvents server As NamedPipeServer + +Private Sub Form_Load() + Set server = New NamedPipeServer + server.PipeName = "MyService" + server.NumThreadsIOCP = 2 + server.FreeThreadingEvents = True + server.Start +End Sub +``` ### PipeName {: .no_toc } -The name the pipe is published under. **String**, no default. The Win32 pipe namespace path is `\\.\pipe\` --- the package prepends `\\.\pipe\` itself; pass just the leaf name. +The name the pipe is published under. **String**, no default. + +Syntax: *server*.**PipeName** [ **=** *name* ] + +*name* +: A **String** giving the leaf name for the pipe. The Win32 pipe namespace path is `\\.\pipe\` --- the package prepends `\\.\pipe\` itself; pass just the leaf name (for example, `"MyService"`). > [!IMPORTANT] -> [**PipeName**](#pipename) must be set to a non-empty value before [**Start**](#start), or [**Start**](#start) raises run-time error 5 (*"cannot start without specifying a pipe name"*). +> **PipeName** must be set to a non-empty value before [**Start**](#start), or [**Start**](#start) raises run-time error 5 (*"cannot start without specifying a pipe name"*). + +The value is read at [**Start**](#start) time and passed to every `CreateNamedPipeW` call issued by the IOCP worker threads. Changing **PipeName** after [**Start**](#start) has no effect on the running server. + +#### Example + +This example creates a server that publishes under the name `"Greeter"`. The Win32 path a client connects to is `\\.\pipe\Greeter`. + +```tb +Private WithEvents server As NamedPipeServer + +Private Sub Form_Load() + Set server = New NamedPipeServer + server.PipeName = "Greeter" + server.Start +End Sub + +Private Sub server_ServerReady() + Debug.Print "listening on \\.\pipe\" & server.PipeName +End Sub +``` ## Events @@ -80,7 +221,34 @@ Fires after a client's `ConnectNamedPipe` has completed and the connection is re Syntax: *server*_**ClientConnected**(*Connection* **As NamedPipeServerConnection**) *Connection* -: The newly-connected client's server-side connection object. Hold the reference to keep per-client state across messages --- the same instance is passed to every event for this client. **Cookie** / `Tag`-style storage is available through [**NamedPipeServerConnection.CustomData**](NamedPipeServerConnection#customdata). +: The newly-connected client's server-side connection object. Hold the reference to keep per-client state across messages --- the same instance is passed to every event for this client. Tag-style storage is available through [**NamedPipeServerConnection.CustomData**](NamedPipeServerConnection#customdata). + +When [**ContinuouslyReadFromPipe**](#continuouslyreadfrompipe) is **False**, the first [**NamedPipeServerConnection.AsyncRead**](NamedPipeServerConnection#asyncread) for this client must be issued from this handler to prime the read pump; if it is not called, no [**ClientMessageReceived**](#clientmessagereceived) event will fire for this client. + +#### Example + +This example records each newly-connected client in a module-level **Collection** keyed by its Win32 handle and reports the connection count. When [**ContinuouslyReadFromPipe**](#continuouslyreadfrompipe) is **False**, the first read is primed here. + +```tb +Private WithEvents server As NamedPipeServer +Private clients As New Collection + +Private Sub Form_Load() + Set server = New NamedPipeServer + server.PipeName = "MyService" + server.Start +End Sub + +Private Sub server_ClientConnected(Connection As NamedPipeServerConnection) + clients.Add Connection, CStr(Connection.Handle) + Debug.Print "connected: " & Connection.Handle & " (" & clients.Count & " total)" +End Sub + +Private Sub server_ClientDisconnected(Connection As NamedPipeServerConnection) + clients.Remove CStr(Connection.Handle) + Debug.Print "disconnected: " & Connection.Handle & " (" & clients.Count & " remaining)" +End Sub +``` ### ClientDisconnected {: .no_toc } @@ -124,10 +292,32 @@ Syntax: *server*_**ClientMessageSent**(*Connection* **As NamedPipeServerConnecti ### ServerReady {: .no_toc } -Fires once, after [**Start**](#start), when every IOCP worker thread has joined the completion-port loop and the first connection listener is published. Use this as the "the server is now accepting connections" signal. +Fires once, after [**Start**](#start) returns, when every IOCP worker thread has joined the completion-port loop and the first connection listener has been published to `\\.\pipe\`. Use this as the signal that the server is now accepting connections. Syntax: *server*_**ServerReady**() +The event fires on whichever thread delivers completions: on the main UI thread (marshalled through the hidden message-only window) when [**FreeThreadingEvents**](#freethreadingevents) is **False** (the default), or directly on the last IOCP worker thread to join when [**FreeThreadingEvents**](#freethreadingevents) is **True**. In both cases the event fires exactly once per [**Start**](#start) call. + +The internal mechanism counts the number of outstanding worker-thread joins in a shared `OutstandingWorkerThreadJoins` counter. Each worker thread decrements the counter with an atomic operation when it enters the IOCP loop; whichever thread brings the count to zero raises **ServerReady**. + +#### Example + +```tb +Private WithEvents server As NamedPipeServer + +Private Sub Form_Load() + Set server = New NamedPipeServer + server.PipeName = "MyService" + server.Start + ' ServerReady fires asynchronously -- do not assume the server + ' is accepting connections before the event fires. +End Sub + +Private Sub server_ServerReady() + Debug.Print "server is ready on \\.\pipe\" & server.PipeName +End Sub +``` + ## Methods ### AsyncBroadcast @@ -148,11 +338,11 @@ The set of recipients is snapshotted under a lock at the start of the call. Clie ### ManualMessageLoopEnter {: .no_toc } -Runs a Win32 message loop on the calling thread until [**ManualMessageLoopLeave**](#manualmessageloopleave) is called from another thread (or any handler raises a `WM_USER_QUITTING` posting). +Runs a Win32 message loop on the calling thread until [**ManualMessageLoopLeave**](#manualmessageloopleave) is called from another thread. Syntax: *server*.**ManualMessageLoopEnter** -Intended for console / service hosts that do not have a Forms-style message pump of their own but want the default ([**FreeThreadingEvents**](#freethreadingevents) = **False**) marshalled-event semantics. UI hosts already pump messages naturally and do not need this method. +Intended for console and service hosts that do not have a Forms-style message pump of their own but want the default ([**FreeThreadingEvents**](#freethreadingevents) = **False**) marshalled-event semantics. UI hosts already pump messages naturally and do not need this method. The canonical caller is a Windows service that owns this server: the service-thread entry-point opens the server, transitions the service to `Running`, calls **ManualMessageLoopEnter** to block while events flow, and a control-code handler running on the dispatcher thread calls [**ManualMessageLoopLeave**](#manualmessageloopleave) when the SCM signals stop. See [Hosting inside a Windows service](.#service-host-idiom) on the package overview for the complete pattern, including the two-thread coordination and the *Pause* / *Continue* extension. @@ -168,7 +358,7 @@ The intended caller is a thread *other* than the one inside [**ManualMessageLoop ### Start {: .no_toc } -Creates the I/O Completion Port, starts [**NumThreadsIOCP**](#numthreadsiocp) worker threads, and publishes the first connection listener under `\\.\pipe\`. Fires [**ServerReady**](#serverready) when every worker has joined. +Creates the I/O Completion Port, starts [**NumThreadsIOCP**](#numthreadsiocp) worker threads, and publishes the first connection listener under `\\.\pipe\`. Fires [**ServerReady**](#serverready) when every worker has joined the completion-port loop. Syntax: *server*.**Start** @@ -176,20 +366,69 @@ Raises run-time error 5 *"cannot start without specifying a pipe name"* if [**Pi Idempotent: calling [**Start**](#start) while the server is already running is a no-op. +> [!IMPORTANT] +> Set all configuration properties ([**PipeName**](#pipename), [**NumThreadsIOCP**](#numthreadsiocp), [**FreeThreadingEvents**](#freethreadingevents), [**MessageBufferSize**](#messagebuffersize), [**ContinuouslyReadFromPipe**](#continuouslyreadfrompipe)) before calling [**Start**](#start). The worker threads read these values once at start-up and propagate them to every [**NamedPipeServerConnection**](NamedPipeServerConnection); changes after [**Start**](#start) has been called do not take effect. + +#### Example + +This example configures a server for free-threaded event delivery with a larger message buffer, then starts it and waits for the ready signal before advertising the service. + +```tb +Private WithEvents server As NamedPipeServer + +Private Sub Form_Load() + Set server = New NamedPipeServer + server.PipeName = "MyService" + server.FreeThreadingEvents = True ' events fire on IOCP worker threads + server.MessageBufferSize = 524288 ' 512 KiB initial read buffer + server.Start ' creates the IOCP port and worker threads + ' server_ServerReady fires asynchronously once all workers have joined +End Sub + +Private Sub server_ServerReady() + Debug.Print "server is accepting connections on \\.\pipe\" & server.PipeName +End Sub +``` + ### Stop {: .no_toc } -Cancels every outstanding I/O on every connection, posts the IOCP shutdown sentinel to each worker, waits for the threads to exit, closes every pipe handle, and frees the completion port. Idempotent: calling [**Stop**](#stop) on a server that has not been started --- or has already been stopped --- is a no-op. Automatically invoked from `Class_Terminate`, so a server going out of scope closes resources implicitly. +Shuts down the server: cancels every outstanding I/O on every connection, posts a shutdown sentinel to each IOCP worker thread, waits for all worker threads to exit, drains the hidden marshalling window's message queue, closes every pipe handle, and releases the completion port. Syntax: *server*.**Stop** +The shutdown sequence proceeds in order to avoid lost events. First the connection list is locked in a "destroying" state so no new connections can be added. Connections still in `IsOpening` state (the brief window between object creation and `ConnectNamedPipe` returning) are waited on so that the cancel arrives after the pipe handle is fully open. Outstanding I/O on each connection is then cancelled. Once every IOCP worker thread has exited, the hidden marshalling window's message queue is drained so that any in-flight [**ClientDisconnected**](#clientdisconnected) events are delivered before the connection objects are freed. Finally the completion port handle is closed and the internal `HasStarted` flag is reset. + +Idempotent: calling [**Stop**](#stop) on a server that has not been started, or one that has already been stopped, is a no-op. Automatically invoked from `Class_Terminate`, so a server going out of scope closes all resources implicitly. + +> [!NOTE] +> The message-queue drain step runs only when [**FreeThreadingEvents**](#freethreadingevents) is **False** (the default). In that mode, the hidden window may hold queued `WM_USER_IOCP_EVENT_*` messages that have not yet been dispatched; **Stop** processes them synchronously to ensure [**ClientDisconnected**](#clientdisconnected) events are not lost. When [**FreeThreadingEvents**](#freethreadingevents) is **True**, events are raised directly on the IOCP thread as completions arrive, so no queued messages remain by the time the threads have exited. + ### New {: .no_toc } -Constructs a server in the not-yet-started state. Creates the hidden `STATIC`-class message window used to marshal IOCP-thread completions back to the UI thread. +Constructs a **NamedPipeServer** in the not-yet-started state. Syntax: **New NamedPipeServer** +The constructor creates a hidden `STATIC`-class window and subclasses its window procedure. This window is the message target used to marshal IOCP-thread completions back to the UI thread when [**FreeThreadingEvents**](#freethreadingevents) is **False** (the default). No pipe, completion port, or worker thread is created at this point --- those are created by [**Start**](#start). + +The public fields ([**PipeName**](#pipename), [**NumThreadsIOCP**](#numthreadsiocp), [**FreeThreadingEvents**](#freethreadingevents), [**ContinuouslyReadFromPipe**](#continuouslyreadfrompipe), [**MessageBufferSize**](#messagebuffersize)) carry their default values after construction and may be set freely before [**Start**](#start) is called. + +`Class_Terminate` destroys the hidden window and calls [**Stop**](#stop) implicitly, so a server going out of scope without an explicit [**Stop**](#stop) call cleans up the underlying resources. + +#### Example + +```tb +Private WithEvents server As NamedPipeServer + +Private Sub Form_Load() + Set server = New NamedPipeServer ' constructor runs here + server.PipeName = "MyService" + server.Start +End Sub +``` + ## See Also - [WinNamedPipesLib package](.) -- overview, IOCP / event-marshalling architecture, cookie pattern, `Data()` lifetime caveat, known limitations diff --git a/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeServerConnection.md b/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeServerConnection.md index 5283c6ea..6aa69a85 100644 --- a/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeServerConnection.md +++ b/docs/Reference/Built-In/WinNamedPipesLib/NamedPipeServerConnection.md @@ -36,55 +36,199 @@ See the package [overview](.) for the IOCP / event-marshalling architecture, the ## Properties ### CustomData -{: .no_toc } +{: #customdata } + +A per-connection opaque slot for attaching consumer-defined state to a connection. **Variant**, default **Empty**. + +Syntax: *connection*.**CustomData** [ **=** *value* ] + +*value* +: A **Variant** value to store against this connection. Any **Variant**-compatible value is accepted: an object reference, a scalar, an array, or **Empty** to clear the slot. -A per-connection opaque slot the consumer can attach state to --- typically a session object scoped to that one client. **Variant**, default **Empty**. The package never reads or writes this field; it is provided for convenience so that consumers do not have to maintain a parallel `Dictionary` keyed by [**Handle**](#handle). +The package never reads or writes this field. Its purpose is to avoid the need for a parallel dictionary keyed by [**Handle**](#handle): attach state directly to the connection object as soon as it is created in [**ClientConnected**](NamedPipeServer#clientconnected) and read it back from any subsequent event that receives the same *Connection* parameter. + +#### Example + +This example attaches a session object to each new connection and uses it to route incoming messages and clean up on disconnect. + +```tb +Private Sub server_ClientConnected(Connection As NamedPipeServerConnection) + Dim session As New ClientSession + session.RemoteId = Connection.Handle + Connection.CustomData = session +End Sub + +Private Sub server_ClientMessageReceived( _ + Connection As NamedPipeServerConnection, _ + ByRef Cookie As Variant, _ + ByRef Data() As Byte) + + Dim session As ClientSession = Connection.CustomData + session.HandleMessage Data +End Sub + +Private Sub server_ClientDisconnected(Connection As NamedPipeServerConnection) + Dim session As ClientSession = Connection.CustomData + session.Cleanup + Connection.CustomData = Empty +End Sub +``` ### Handle -{: .no_toc } +{: #handle .no_toc } + +The underlying Win32 named-pipe handle returned by `CreateNamedPipeW`. **LongPtr**. -The underlying Win32 named-pipe handle. **LongPtr**. Exposed for low-level / debugging use --- most consumers can ignore it. Do not call `CloseHandle` on this value directly; use [**AsyncClose**](#asyncclose) so the IOCP loop and the parent server's bookkeeping stay consistent. +Syntax: *connection*.**Handle** + +The value is **0** (`vbNullPtr`) before `ConnectNamedPipe` completes and after [**AsyncClose**](#asyncclose) has been called. Once the [**ClientConnected**](NamedPipeServer#clientconnected) event has fired on the parent server, **Handle** holds the pipe handle that the package uses for all subsequent `ReadFile` and `WriteFile` calls against this connection. + +> [!WARNING] +> Do not call `CloseHandle` on this value directly. Use [**AsyncClose**](#asyncclose) instead, so the IOCP loop and the parent server's bookkeeping stay consistent. Closing the handle outside the package leaves pending IOCP completions referencing freed memory. + +Most consumers do not need this field. It is exposed for low-level diagnostics --- for example, passing the handle to `GetNamedPipeInfo` or other Win32 APIs to inspect pipe state, or using it as a unique key to distinguish connections when a parallel dictionary is preferred over [**CustomData**](#customdata). ### IsConnected -{: .no_toc } +{: #isconnected .no_toc } + +**True** while the client is connected; **False** once the underlying pipe has dropped. **Boolean**. + +Syntax: *connection*.**IsConnected** + +The package sets **IsConnected** to **False** as soon as it detects a connection failure --- before the [**ClientDisconnected**](NamedPipeServer#clientdisconnected) event fires on the parent [**NamedPipeServer**](NamedPipeServer). The disconnect event is deferred until every outstanding asynchronous I/O against the connection has returned and the internal outstanding-request counter reaches zero; **IsConnected** transitions to **False** immediately when the error is detected, providing an earlier signal that the pipe has dropped. + +Consumer code reads **IsConnected** to guard against writing to a connection that has already dropped. The package itself checks this field inside the request-completion path: when the outstanding-request counter reaches zero *and* **IsConnected** is **False**, the package removes the connection from the server's client list and fires [**ClientDisconnected**](NamedPipeServer#clientdisconnected). + +> [!NOTE] +> **IsConnected** is a public **Boolean** field, not a property, so consumer code can assign to it. In practice, setting it from outside the package is not useful --- the field is reset to **False** only by the package's internal error-handling path, and writing **True** to it from consumer code has no effect on the underlying pipe state. + +#### Example + +This example checks **IsConnected** before sending a reply, guarding against the case where the client has dropped between the time the message arrived and the time the handler runs. + +```tb +Private Sub server_ClientMessageReceived( _ + Connection As NamedPipeServerConnection, _ + ByRef Cookie As Variant, _ + ByRef Data() As Byte) + + If Not Connection.IsConnected Then Exit Sub ' client has already dropped -**True** between the client connecting and the connection dropping. **Boolean**. Set internally; consumer code typically reads this rather than writes it. Becomes **False** as soon as the underlying pipe drops, even before the [**ClientDisconnected**](NamedPipeServer#clientdisconnected) event fires (the event waits until every outstanding I/O has returned). + Dim reply As New PropertyBag + reply.WriteProperty "ResponseData", "OK" + Connection.AsyncWrite reply.Contents +End Sub +``` ### IsOpening -{: .no_toc } +{: #isopening .no_toc } + +**True** during the brief window between the package creating the connection object and `ConnectNamedPipe` completing. **Boolean**. Read-only in practice. + +Syntax: *connection*.**IsOpening** + +**IsOpening** is set to **True** the moment [**NamedPipeServer**](NamedPipeServer) allocates a new `NamedPipeServerConnection` and issues the asynchronous `ConnectNamedPipe` call. It remains **True** until that call completes through the IOCP loop and the [**ClientConnected**](NamedPipeServer#clientconnected) event fires, at which point the package clears it and sets [**IsConnected**](#isconnected) to **True** instead. -**True** during the brief window between the package creating the connection object and `ConnectNamedPipe` completing. **Boolean**. Used internally by [**NamedPipeServer.Stop**](NamedPipeServer#stop) to avoid a race condition during shutdown; consumer code does not normally need to read it. +The field is used internally by [**NamedPipeServer.Stop**](NamedPipeServer#stop) to detect connections that are mid-open during shutdown: any connection still opening at that point has its I/O cancelled via `CancelIoEx` so that the IOCP loop can drain cleanly without waiting indefinitely for a `ConnectNamedPipe` that will never complete. + +Consumer code does not normally need to read **IsOpening**. The [**ClientConnected**](NamedPipeServer#clientconnected) event is the canonical signal that a connection is ready for use; **IsOpening** being **True** means the connection is not yet in that state. ## Methods ### AsyncClose -{: .no_toc } +{: #asyncclose .no_toc } -Cancels every outstanding I/O against this connection and closes the underlying pipe handle. Eventually triggers a [**ClientDisconnected**](NamedPipeServer#clientdisconnected) event on the parent server once the cancellation completes. Automatically invoked from `Class_Terminate` when the last reference to the connection drops. +Cancels every outstanding asynchronous I/O against this connection and closes the underlying pipe handle. Syntax: *connection*.**AsyncClose** +Internally, **AsyncClose** calls `CancelIoEx` on the pipe handle to abort any pending reads or writes, then calls `CloseHandle` to release it. Once **AsyncClose** returns, no further I/O is possible on the connection. The [**ClientDisconnected**](NamedPipeServer#clientdisconnected) event fires on the parent [**NamedPipeServer**](NamedPipeServer) asynchronously once every outstanding IOCP completion has been processed and the outstanding-request counter reaches zero. + +**AsyncClose** is called automatically from `Class_Terminate` when the last reference to the connection object drops, so letting the variable go out of scope is sufficient when the connection is short-lived and no module-level reference is held. + +> [!IMPORTANT] +> If the connection object is stored in a long-lived container --- a module-level **Collection**, a class field, or a global variable --- `Class_Terminate` does not run until that container is also released. Call **AsyncClose** explicitly before dropping the last reference whenever the lifetime is not guaranteed to be short. Failure to do so keeps the underlying pipe handle open and the IOCP worker thread running. + +#### Example + +This example closes a specific client connection from the server side when a shutdown command is received. + +```tb +Private Sub server_ClientMessageReceived( _ + Connection As NamedPipeServerConnection, _ + ByRef Cookie As Variant, _ + ByRef Data() As Byte) + + Dim incoming As New PropertyBag + incoming.Contents = Data ' deep-copies bytes; safe past the handler + + If incoming.ReadProperty("CommandID") = "SHUTDOWN" Then + Connection.AsyncClose ' cancel I/O and close the pipe handle + End If +End Sub +``` + ### AsyncRead {: .no_toc } -Manually issues an asynchronous read against this connection. +Issues an asynchronous read against this connection. -Syntax: *connection*.**AsyncRead** [ *Cookie* [, *OverlappedStruct* ] ] +Syntax: *connection*.**AsyncRead** [ *Cookie* [**,** *OverlappedStruct* ] ] *Cookie* -: *optional* A **Variant** correlation value, passed back as the *Cookie* parameter of the matching [**ClientMessageReceived**](NamedPipeServer#clientmessagereceived) event. Default **Empty**. +: *optional* A **Variant** correlation value. The value is round-tripped through the IOCP completion and re-emitted as the *Cookie* parameter of the matching [**ClientMessageReceived**](NamedPipeServer#clientmessagereceived) event on the parent server. Default **Empty**. *OverlappedStruct* -: *optional* A **LongPtr** to a pre-allocated `OVERLAPPED_CUSTOM` structure. **Internal use only** --- the IOCP machinery passes this when re-issuing a read after `ERROR_MORE_DATA`. Consumer code should always omit this parameter. +: *optional* A **LongPtr** to a pre-allocated `OVERLAPPED_CUSTOM` structure. **Internal use only** --- the IOCP machinery passes this when re-issuing a read after `ERROR_MORE_DATA`. Consumer code must always omit this parameter. + +**AsyncRead** issues a `ReadFile` call against the underlying pipe handle and returns immediately. When the read completes, the IOCP worker thread packages the received bytes and delivers them as the [**ClientMessageReceived**](NamedPipeServer#clientmessagereceived) event on the parent [**NamedPipeServer**](NamedPipeServer). + +When [**NamedPipeServer.ContinuouslyReadFromPipe**](NamedPipeServer#continuouslyreadfrompipe) is **True** (the default), the package keeps a read pending against every connection automatically --- each [**ClientMessageReceived**](NamedPipeServer#clientmessagereceived) event is followed by another **AsyncRead** issued internally from within the IOCP worker thread. Calling **AsyncRead** explicitly in that mode is redundant and queues an extra read. + +When [**ContinuouslyReadFromPipe**](NamedPipeServer#continuouslyreadfrompipe) is **False**, no read is issued automatically after an event. The event handler must call **AsyncRead** to receive the next message. This back-pressure mode is useful when the consumer cannot process messages as fast as they arrive. + +> [!NOTE] +> **AsyncRead** can be called from multiple threads concurrently. The internal implementation allocates a separate `OVERLAPPED_CUSTOM` structure for every outstanding request; each call is independent of other pending reads on the same connection. + +#### Example + +This example shows the back-pressure pattern: [**ContinuouslyReadFromPipe**](NamedPipeServer#continuouslyreadfrompipe) is set to **False** and the event handler calls **AsyncRead** explicitly to receive the next message after processing the current one. + +```tb +Private WithEvents server As NamedPipeServer + +Private Sub Form_Load() + Set server = New NamedPipeServer + server.PipeName = "MyService" + server.ContinuouslyReadFromPipe = False ' manual read mode + server.Start +End Sub + +Private Sub server_ClientConnected(Connection As NamedPipeServerConnection) + ' issue the first read for each new client + Connection.AsyncRead +End Sub + +Private Sub server_ClientMessageReceived( _ + Connection As NamedPipeServerConnection, _ + ByRef Cookie As Variant, _ + ByRef Data() As Byte) + + Dim incoming As New PropertyBag + incoming.Contents = Data ' deep-copies the bytes; safe to use past the handler -Only needed when the parent server's [**ContinuouslyReadFromPipe**](NamedPipeServer#continuouslyreadfrompipe) is **False**; otherwise the IOCP loop keeps a read pending automatically and explicit calls are redundant. + ' process the message, then issue the next read + ProcessCommand incoming + Connection.AsyncRead +End Sub +``` ### AsyncWrite {: .no_toc } Sends a message back to this specific client. -Syntax: *connection*.**AsyncWrite** *Data*() [, *Cookie* ] +Syntax: *connection*.**AsyncWrite** *Data*() [**,** *Cookie* ] *Data* : *required* A **Byte()** array containing the bytes to send. An uninitialised or zero-length array is a no-op. For typed multi-field payloads the recommended encoding is [**PropertyBag**](../VBRUN/PropertyBag/) --- see [Recommended payload encoding: `PropertyBag`](.#propertybag-carrier) on the package overview. @@ -94,6 +238,9 @@ Syntax: *connection*.**AsyncWrite** *Data*() [, *Cookie* ] Returns immediately; the actual transmission runs through the IOCP loop. The completion fires [**ClientMessageSent**](NamedPipeServer#clientmessagesent) on the parent server. +> [!WARNING] +> The send path copies *Data* into a fixed-size per-completion buffer. A payload larger than [**NamedPipeServer.MessageBufferSize**](NamedPipeServer#messagebuffersize) (default **131072** bytes) overruns that buffer without a bounds check --- likely a crash or heap corruption rather than a clean error. Raise **MessageBufferSize** above the largest expected message before calling [**NamedPipeServer.Start**](NamedPipeServer#start); the value is read once at that point and propagated to every per-connection buffer. + ```tb ' Reply to a request using the PropertyBag convention: Dim reply As New PropertyBag @@ -104,6 +251,28 @@ Connection.AsyncWrite reply.Contents To send the same message to every connected client at once, use [**NamedPipeServer.AsyncBroadcast**](NamedPipeServer#asyncbroadcast). +### New +{: .no_toc } + +Constructs a connection object in the not-yet-connected state and binds it to the parent server's IOCP infrastructure. + +Syntax: **New NamedPipeServerConnection**(*server*, *serverPipeName*, *serverCompletionPortHandle*, *serverMessageWindowHandle*) + +> [!NOTE] +> The constructor signature is package-private. The first parameter type (`INamedPipeServerInternal`) is an internal interface not accessible to consumer code. Do not construct `NamedPipeServerConnection` directly --- obtain instances from [**NamedPipeServer**](NamedPipeServer) events. + +*server* +: *required* An `INamedPipeServerInternal` reference to the owning server. The constructor reads [**MessageBufferSize**](NamedPipeServer#messagebuffersize) from this object at construction time, freezing that value for the lifetime of the connection. + +*serverPipeName* +: *required* The leaf pipe name this connection belongs to. Stored internally and used when creating the Win32 pipe handle during the `ConnectNamedPipe` call. + +*serverCompletionPortHandle* +: *required* A **LongPtr** handle to the server's I/O Completion Port, used when associating the pipe handle and posting I/O completions. + +*serverMessageWindowHandle* +: *required* A **LongPtr** handle to the server's hidden message-only window, used to marshal IOCP-thread events back to the UI thread when [**FreeThreadingEvents**](NamedPipeServer#freethreadingevents) is **False**. + ## See Also - [WinNamedPipesLib package](.) -- overview, IOCP / event-marshalling architecture, cookie pattern, `Data()` lifetime caveat diff --git a/docs/Reference/Built-In/WinNamedPipesLib/index.md b/docs/Reference/Built-In/WinNamedPipesLib/index.md index 15c0516a..37fdb7fa 100644 --- a/docs/Reference/Built-In/WinNamedPipesLib/index.md +++ b/docs/Reference/Built-In/WinNamedPipesLib/index.md @@ -4,6 +4,7 @@ parent: Built-In Packages nav_order: 9 permalink: /tB/Packages/WinNamedPipesLib/ has_toc: false +indexed_from: beta-x-0983 --- # WinNamedPipesLib Package @@ -181,6 +182,16 @@ End Sub ## Classes - [NamedPipeServer](NamedPipeServer) -- the server: publishes a pipe name, hosts an IOCP loop, raises events for the lifecycle of every accepted client + - *Fields:* [ContinuouslyReadFromPipe](NamedPipeServer#continuouslyreadfrompipe) -- whether a read is kept pending automatically after each received message; [FreeThreadingEvents](NamedPipeServer#freethreadingevents) -- whether events fire on the IOCP worker thread instead of the UI thread; [MessageBufferSize](NamedPipeServer#messagebuffersize) -- per-completion read / write buffer size in bytes; [NumThreadsIOCP](NamedPipeServer#numthreadsiocp) -- number of IOCP worker threads created by Start; [PipeName](NamedPipeServer#pipename) -- the leaf name the pipe is published under + - *Events:* [ClientConnected](NamedPipeServer#clientconnected) -- fires when a client's ConnectNamedPipe completes; [ClientDisconnected](NamedPipeServer#clientdisconnected) -- fires when a client has dropped and all outstanding I/O has returned; [ClientMessageReceived](NamedPipeServer#clientmessagereceived) -- fires when a complete message has been read from a client; [ClientMessageSent](NamedPipeServer#clientmessagesent) -- fires when an AsyncWrite or AsyncBroadcast write has completed for a client; [ServerReady](NamedPipeServer#serverready) -- fires once, after Start, when all IOCP worker threads are ready and the first listener is published + - *Methods:* [AsyncBroadcast](NamedPipeServer#asyncbroadcast) -- issues an AsyncWrite against every currently-connected client; [ManualMessageLoopEnter](NamedPipeServer#manualmessageloopenter) -- runs a Win32 message loop on the calling thread until ManualMessageLoopLeave is called; [ManualMessageLoopLeave](NamedPipeServer#manualmessageloopleave) -- posts a quit message to wake the ManualMessageLoopEnter loop from another thread; [New](NamedPipeServer#new) -- constructs the server in the not-yet-started state; [Start](NamedPipeServer#start) -- creates the IOCP port, starts worker threads, and publishes the pipe; [Stop](NamedPipeServer#stop) -- shuts down the server, cancels all I/O, and releases all resources - [NamedPipeServerConnection](NamedPipeServerConnection) -- one server-side per-client connection; the **Connection** parameter of every `NamedPipeServer` event, with its own `AsyncRead` / `AsyncWrite` / `AsyncClose` + - *Fields:* [CustomData](NamedPipeServerConnection#customdata) -- opaque per-connection slot for consumer-defined state; [Handle](NamedPipeServerConnection#handle) -- the underlying Win32 pipe handle for this connection; [IsConnected](NamedPipeServerConnection#isconnected) -- True while the client is connected; [IsOpening](NamedPipeServerConnection#isopening) -- True during the brief window between object creation and ConnectNamedPipe completing + - *Methods:* [AsyncClose](NamedPipeServerConnection#asyncclose) -- cancels all outstanding I/O and closes the pipe handle; [AsyncRead](NamedPipeServerConnection#asyncread) -- issues an asynchronous read against this connection; [AsyncWrite](NamedPipeServerConnection#asyncwrite) -- sends a message to this specific client; [New](NamedPipeServerConnection#new) -- constructs a connection object bound to the parent server's IOCP infrastructure (package-private) - [NamedPipeClientManager](NamedPipeClientManager) -- the client-side coordinator; owns the IOCP loop and the [**Connect**](NamedPipeClientManager#connect) / [**Stop**](NamedPipeClientManager#stop) / [**FindNamedPipes**](NamedPipeClientManager#findnamedpipes) methods + - *Fields:* [ContinuouslyReadFromPipe](NamedPipeClientManager#continuouslyreadfrompipe) -- whether each connection keeps a read pending automatically after every received message; [FreeThreadingEvents](NamedPipeClientManager#freethreadingevents) -- whether events fire on the IOCP worker thread instead of the UI thread; [MessageBufferSize](NamedPipeClientManager#messagebuffersize) -- per-completion read / write buffer size in bytes; [NumThreadsIOCP](NamedPipeClientManager#numthreadsiocp) -- number of IOCP worker threads created on the first Connect call + - *Methods:* [Connect](NamedPipeClientManager#connect) -- opens an asynchronous connection to a named pipe and returns a NamedPipeClientConnection; [FindNamedPipes](NamedPipeClientManager#findnamedpipes) -- enumerates named pipes published on the local machine matching an optional wildcard pattern; [New](NamedPipeClientManager#new) -- constructs the manager and its hidden marshalling window in the not-yet-connected state; [Stop](NamedPipeClientManager#stop) -- cancels all I/O, shuts down worker threads, and releases all resources - [NamedPipeClientConnection](NamedPipeClientConnection) -- one client-side connection; exposes the `Connected` / `Disconnected` / `MessageReceived` / `MessageSent` events and the matching `AsyncRead` / `AsyncWrite` / `AsyncClose` methods + - *Fields:* [CustomData](NamedPipeClientConnection#customdata) -- opaque per-connection slot for consumer-defined state; [Handle](NamedPipeClientConnection#handle) -- the underlying Win32 pipe handle for this connection; [PipeName](NamedPipeClientConnection#pipename) -- the leaf pipe name this connection was opened against + - *Events:* [Connected](NamedPipeClientConnection#connected) -- fires once the asynchronous CreateFileW has succeeded and the pipe is ready; [Disconnected](NamedPipeClientConnection#disconnected) -- fires when the pipe has dropped and all outstanding I/O has returned; [MessageReceived](NamedPipeClientConnection#messagereceived) -- fires when a complete message has been read from the pipe; [MessageSent](NamedPipeClientConnection#messagesent) -- fires when a previously-issued AsyncWrite has completed + - *Methods:* [AsyncClose](NamedPipeClientConnection#asyncclose) -- cancels all outstanding I/O and closes the pipe handle; [AsyncRead](NamedPipeClientConnection#asyncread) -- manually issues an asynchronous read against this connection; [AsyncWrite](NamedPipeClientConnection#asyncwrite) -- sends a message to the server; [New](NamedPipeClientConnection#new) -- constructs a connection object bound to the parent manager's IOCP infrastructure (package-private) From 6a6881556672ae58a4a08aee10edf140aa67030f Mon Sep 17 00:00:00 2001 From: Kuba Sunderland-Ober Date: Thu, 4 Jun 2026 21:38:10 +0200 Subject: [PATCH 8/9] Update the WinServicesLib documentation. --- .../Built-In/WinServicesLib/ITbService.md | 6 +- .../Built-In/WinServicesLib/ServiceCreator.md | 31 ++- .../Built-In/WinServicesLib/ServiceManager.md | 182 ++++++++++++++++-- .../Built-In/WinServicesLib/ServiceState.md | 104 ++++++++-- .../Built-In/WinServicesLib/Services.md | 35 +++- .../Built-In/WinServicesLib/index.md | 45 ++++- 6 files changed, 363 insertions(+), 40 deletions(-) diff --git a/docs/Reference/Built-In/WinServicesLib/ITbService.md b/docs/Reference/Built-In/WinServicesLib/ITbService.md index 902815a0..c7e18a8a 100644 --- a/docs/Reference/Built-In/WinServicesLib/ITbService.md +++ b/docs/Reference/Built-In/WinServicesLib/ITbService.md @@ -12,7 +12,7 @@ The contract every service class in a **WinServicesLib** project implements. Thr - [**EntryPoint**](#entrypoint) -- runs the service's actual work. - [**StartupFailed**](#startupfailed) -- invoked when the SCM handshake fails before [**EntryPoint**](#entrypoint) can run. -- [**ChangeState**](#changestate) -- invoked when the SCM delivers a control code (*Stop*, *Pause*, *Continue*, …). +- [**ChangeState**](#changestate) -- invoked when the SCM delivers a control code (*Stop*, *Pause*, *Continue*, ...). The package's [**ServiceCreator**](ServiceCreator)`(Of T)` factory creates one instance per service start; the dispatcher trampoline holds the instance for the lifetime of the service and routes the three lifecycle subs to it. @@ -46,7 +46,7 @@ Class MyService Sub StartupFailed(ByVal ServiceManager As ServiceManager) _ Implements ITbService.StartupFailed - ' …optional failure-reporting hook + ' ...optional failure-reporting hook End Sub End Class ``` @@ -112,7 +112,7 @@ The body of **EntryPoint** is the service's actual work. The minimum responsibil After the **EntryPoint** sub returns, the service thread exits and the SCM marks the service as stopped. > [!IMPORTANT] -> **EntryPoint** runs on the **service thread**, not the dispatcher thread. The two threads execute concurrently for the lifetime of the service. Shared `Public` flags on the implementing class (`IsStopping`, `IsPaused`, …) coordinate state changes triggered from [**ChangeState**](#changestate). +> **EntryPoint** runs on the **service thread**, not the dispatcher thread. The two threads execute concurrently for the lifetime of the service. Shared `Public` flags on the implementing class (`IsStopping`, `IsPaused`, ...) coordinate state changes triggered from [**ChangeState**](#changestate). ### StartupFailed {: .no_toc } diff --git a/docs/Reference/Built-In/WinServicesLib/ServiceCreator.md b/docs/Reference/Built-In/WinServicesLib/ServiceCreator.md index 9964af05..60178757 100644 --- a/docs/Reference/Built-In/WinServicesLib/ServiceCreator.md +++ b/docs/Reference/Built-In/WinServicesLib/ServiceCreator.md @@ -13,7 +13,7 @@ The generic factory the **WinServicesLib** dispatcher uses to instantiate the us Syntax: **New ServiceCreator(Of** *T* **)** *T* -: *required* A user class that implements [**ITbService**](ITbService). The constraint is *practical* rather than syntactic --- there is no `Where T : ITbService` clause in the source, but the factory's `CreateInstance` returns `New T As ITbService`, which the compiler only accepts when *T* implements [**ITbService**](ITbService). +: *required* A user class that implements [**ITbService**](ITbService). The constraint is practical rather than syntactic --- there is no `Where T : ITbService` clause in the source, but the factory's `CreateInstance` returns `New T As ITbService`, which the compiler only accepts when *T* implements [**ITbService**](ITbService). The class is the value typically assigned to [**ServiceManager.InstanceCreator**](ServiceManager#instancecreator): @@ -42,14 +42,39 @@ Syntax: *creator*.**CreateInstance** **As** [**ITbService**](ITbService) User code rarely calls **CreateInstance** directly; the package's dispatcher trampoline invokes it once per service start. The returned instance is owned by the dispatcher for the lifetime of the service --- it is released when the service stops or the dispatcher exits. -The method has no parameters; if the user's service class needs configuration, it should read it from the [**ServiceManager**](ServiceManager) passed to [**EntryPoint**](ITbService#entrypoint) rather than from constructor arguments. +The method has no parameters. If the user's service class needs configuration, it should read it from the [**ServiceManager**](ServiceManager) passed to [**EntryPoint**](ITbService#entrypoint) rather than from constructor arguments. ## Why a factory rather than a class reference -`ServiceCreator(Of T)` exists because the SCM dispatch model needs *deferred* instantiation. The configuration phase runs in `Sub Main` before the SCM has decided which services to start; constructing the service class eagerly there would create an unnecessary instance for services the SCM may never launch (or launch only much later). The factory defers the `New T` call until the service actually starts. +`ServiceCreator(Of T)` exists because the SCM dispatch model needs deferred instantiation. The configuration phase runs in `Sub Main` before the SCM has decided which services to start; constructing the service class eagerly there would create an unnecessary instance for services the SCM may never launch (or launch only much later). The factory defers the `New T` call until the service actually starts. The same indirection lets the dispatcher pair the [**ITbService**](ITbService) instance with the [**ServiceManager**](ServiceManager) one-to-one --- the trampoline can pass the service-specific [**ServiceManager**](ServiceManager) into [**EntryPoint**](ITbService#entrypoint) without the service class having to know about the manager at construction time. +### Example + +This example shows the complete setup for a single-service EXE. `MyService` implements [**ITbService**](ITbService); a `ServiceCreator(Of MyService)` factory is assigned to `InstanceCreator` during configuration so the dispatcher can call **CreateInstance** when the SCM starts the service. + +```tb +Module Startup + Public Sub Main() + With Services.ConfigureNew + .Name = "MyService" + .Description = "An example twinBASIC service" + .Type = tbServiceTypeOwnProcess + .InstallStartMode = tbServiceStartOnDemand + .InstallCmdLine = """" & App.ModulePath & """ -startService" + .InstanceCreator = New ServiceCreator(Of MyService) + End With + + If InStr(Command, "-startService") > 0 Then + Services.RunServiceDispatcher ' blocks until the SCM signals shutdown + Else + MainForm.Show ' control-panel / install UI + End If + End Sub +End Module +``` + ## See Also - [WinServicesLib package](.) -- overview, lifecycle, two-thread split diff --git a/docs/Reference/Built-In/WinServicesLib/ServiceManager.md b/docs/Reference/Built-In/WinServicesLib/ServiceManager.md index 57f0185e..5940546a 100644 --- a/docs/Reference/Built-In/WinServicesLib/ServiceManager.md +++ b/docs/Reference/Built-In/WinServicesLib/ServiceManager.md @@ -54,28 +54,70 @@ End Sub ### AutoInitializeCOM {: .no_toc } -Whether the dispatcher trampoline calls `CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)` on the service thread before invoking [**ITbService.EntryPoint**](ITbService#entrypoint). **Boolean**, default **True**. +Controls whether COM is initialized on the service thread before [**ITbService.EntryPoint**](ITbService#entrypoint) is called. **Boolean**, default **True**. -Set to **False** if the service needs a different apartment model --- for example, a service that creates an MTA worker pool. The service must then call `CoInitializeEx` itself from its [**EntryPoint**](ITbService#entrypoint) before touching COM-aware objects. +Syntax (Get): *manager*.**AutoInitializeCOM** -### Description -{: .no_toc } +Syntax (Let): *manager*.**AutoInitializeCOM** = *value* + +*value* +: A **Boolean**. When **True** (the default), the dispatcher trampoline calls `CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)` on the service thread immediately before invoking [**EntryPoint**](ITbService#entrypoint), placing the thread in a Single-Threaded Apartment (STA). When **False**, COM is not initialized by the package; the service must call `CoInitializeEx` (or `CoInitialize`) from its own [**EntryPoint**](ITbService#entrypoint) before any COM-aware objects are used. -The human-readable description listed in `services.msc` and `sc.exe query`. **String**, no default. +The default **True** is appropriate for most services: it ensures that in-process COM objects and late-bound automation objects work without extra setup. Set to **False** when a different apartment model is required --- for example, a service that creates a Multi-Threaded Apartment (MTA) so that multiple worker threads can share COM objects directly: + +```tb +Sub EntryPoint(ByVal ServiceManager As ServiceManager) _ + Implements ITbService.EntryPoint + ' AutoInitializeCOM was set to False during configuration, + ' so the package has not initialized COM. Initialize MTA here. + CoInitializeEx vbNullPtr, COINIT_MULTITHREADED + ServiceManager.ReportStatus vbServiceStatusRunning + ' ...MTA-safe work + ServiceManager.ReportStatus vbServiceStatusStopped + CoUninitialize +End Sub +``` -The value is written to the SCM by [**Install**](#install) via `ChangeServiceConfig2W(SERVICE_CONFIG_DESCRIPTION)` and is applied to a fresh service or refreshed on every re-install. The field must be assigned before [**Install**](#install) is called; changing it at run-time has no effect until the next install. +> [!IMPORTANT] +> Set **AutoInitializeCOM** before calling [**Services.RunServiceDispatcher**](Services#runservicedispatcher). Changing the property after the dispatcher has started has no effect on the already-running service thread. ### DependentServices {: .no_toc } A list of service names this service depends on. **Variant()**, no default. -Pass an `Array("OtherSvc1", "OtherSvc2")`. When the SCM is asked to start the service, it auto-starts the listed dependencies first; if any dependency fails to start, the SCM aborts the start of this service. The package packs the array into the double-null-terminated string that `CreateServiceW` expects. +When the SCM is asked to start this service, it auto-starts every listed dependency first. If any dependency fails to start, the SCM aborts the start of this service. The package converts the array into the double-null-terminated string that `CreateServiceW` expects when [**Install**](#install) is called. + +Assign an array of **String** service names using `Array(...)`: ```tb .DependentServices = Array("MSMQ", "LanmanServer") ``` +The value is read at [**Install**](#install) time. Changing it after install requires uninstalling and re-installing the service. + +### Description +{: .no_toc } + +The human-readable description text displayed for the service in `services.msc` and `sc.exe query`. **String**, no default. + +Syntax (Get): *manager*.**Description** + +Syntax (Let): *manager*.**Description** = *value* + +*value* +: A **String** containing the description text to display for this service in the Windows Services control panel and `sc.exe query` output. + +The value is written to the SCM by [**Install**](#install) via `ChangeServiceConfig2W(SERVICE_CONFIG_DESCRIPTION)` and is applied on a fresh install or refreshed on every re-install. Assign this property before calling [**Install**](#install); changing it at run-time has no effect until the next install. + +```tb +With Services.ConfigureNew + .Name = "MyBackgroundSvc" + .Description = "Processes incoming requests and writes results to the event log." + ' ...other configuration +End With +``` + ### InstallCmdLine {: .no_toc } @@ -105,26 +147,50 @@ Typical settings: The driver-only modes ([**tbServiceStartBoot**](Enumerations/ServiceStartConstants#tbServiceStartBoot), [**tbServiceStartDriverSystem**](Enumerations/ServiceStartConstants#tbServiceStartDriverSystem)) are not meaningful for user-mode twinBASIC services. ### InstanceCreator +{: #instancecreator } {: .no_toc } The factory the dispatcher uses to create the [**ITbService**](ITbService) instance for this service when the SCM launches it. [**IServiceCreator**](ServiceCreator), no default. -Assigned `New ServiceCreator(Of MyServiceClass)` where `MyServiceClass` is the user's [**ITbService**](ITbService) implementation: +Syntax (Get): *manager*.**InstanceCreator** + +Syntax (Let/Set): *manager*.**InstanceCreator** = *creator* + +*creator* +: An object expression that evaluates to a [**ServiceCreator(Of T)**](ServiceCreator) instance, where *T* is the user's [**ITbService**](ITbService) implementation class. Both **Let** and **Set** assignment syntax are accepted --- the underlying private interface exposes all three accessors (**Get**, **Let**, **Set**). + +Assign `New ServiceCreator(Of MyServiceClass)` where `MyServiceClass` is the user's [**ITbService**](ITbService) implementation: ```tb .InstanceCreator = New ServiceCreator(Of MyService) ``` -[**RunServiceDispatcher**](Services#runservicedispatcher) calls `InstanceCreator.CreateInstance()` once per service start. **InstanceCreator** is read-write --- the underlying private interface accepts both **Let** and **Set** assignment, so either syntax works. +[**Services.RunServiceDispatcher**](Services#runservicedispatcher) calls `InstanceCreator.CreateInstance()` once per service start to obtain the [**ITbService**](ITbService) instance the dispatcher hands to the service thread. -If only [**Install**](#install) / [**Uninstall**](#uninstall) need to run (e.g. inside a stand-alone installer), **InstanceCreator** can be left **Nothing** --- the dispatcher only needs it when the SCM actually starts the service. +If only [**Install**](#install) / [**Uninstall**](#uninstall) need to run (for example, inside a stand-alone installer), **InstanceCreator** can be left **Nothing** --- the dispatcher only needs it when the SCM actually starts the service. ### Name {: .no_toc } The service's name in the SCM database, used by `services.msc` and `sc.exe`. **String**, no default. -The name is what the SCM stores at `HKLM\SYSTEM\CurrentControlSet\Services\`; it is also the name [**Services.LaunchService**](Services#launchservice), [**Services.ControlService**](Services#controlservice), and [**Services.QueryStateOfService**](Services#querystateofservice) take as their *ServiceName* parameter. The same value is used for the SCM's *DisplayName* --- the package does not currently expose a distinct display name. +Syntax (Get): *manager*.**Name** + +Syntax (Let): *manager*.**Name** = *value* + +*value* +: A **String** identifying the service in the SCM database. Must be unique across all services installed on the system. + +The name is stored at `HKLM\SYSTEM\CurrentControlSet\Services\` when [**Install**](#install) is called. It is also the *ServiceName* argument that [**Services.LaunchService**](Services#launchservice), [**Services.ControlService**](Services#controlservice), and [**Services.QueryStateOfService**](Services#querystateofservice) accept. The same value is used for the SCM's *DisplayName* --- the package does not currently expose a distinct display name. + +**Name** must be assigned before calling [**Install**](#install) or [**Uninstall**](#uninstall). It is also the key the package's dispatcher uses to match an incoming SCM service-thread invocation to its [**ServiceManager**](.) configuration; every configured manager must have a unique **Name** within the EXE. + +```tb +With Services.ConfigureNew + .Name = "MyBackgroundSvc" + ' ...other configuration +End With +``` ### SupportsPausing {: .no_toc } @@ -140,15 +206,38 @@ If the service has not yet reached the started state when **SupportsPausing** is The Win32 service type --- controls whether the service runs in its own process, in a shared process, or is a kernel driver. [**ServiceTypeConstants**](Enumerations/ServiceTypeConstants), default [**tbServiceTypeOwnProcess**](Enumerations/ServiceTypeConstants#tbServiceTypeOwnProcess). -Typical settings: +Syntax (Get): *manager*.**Type** + +Syntax (Let): *manager*.**Type** = *value* -- [**tbServiceTypeOwnProcess**](Enumerations/ServiceTypeConstants#tbServiceTypeOwnProcess) -- one service per EXE. -- [**tbServiceTypeShareProcess**](Enumerations/ServiceTypeConstants#tbServiceTypeShareProcess) -- multiple services hosted in a single EXE; the SCM keeps one process alive that serves all of them. Each [**ServiceManager**](.) still needs its own configuration and [**InstanceCreator**](#instancecreator). +*value* +: A [**ServiceTypeConstants**](Enumerations/ServiceTypeConstants) value. Typical values: + - [**tbServiceTypeOwnProcess**](Enumerations/ServiceTypeConstants#tbServiceTypeOwnProcess) -- one service per EXE. This is the standard choice for a twinBASIC service. + - [**tbServiceTypeShareProcess**](Enumerations/ServiceTypeConstants#tbServiceTypeShareProcess) -- multiple services hosted in a single EXE; the SCM keeps one process alive that serves all of them. Each [**ServiceManager**](.) still needs its own configuration and [**InstanceCreator**](#instancecreator). -The driver-only modes ([**tbServiceTypeSystemDriver**](Enumerations/ServiceTypeConstants#tbServiceTypeSystemDriver), [**tbServiceTypeKernelDriver**](Enumerations/ServiceTypeConstants#tbServiceTypeKernelDriver), …) are not meaningful for user-mode twinBASIC services. +The driver-only modes ([**tbServiceTypeSystemDriver**](Enumerations/ServiceTypeConstants#tbServiceTypeSystemDriver), [**tbServiceTypeKernelDriver**](Enumerations/ServiceTypeConstants#tbServiceTypeKernelDriver), and others in [**ServiceTypeConstants**](Enumerations/ServiceTypeConstants)) are not meaningful for user-mode twinBASIC services. + +The value is captured into the SCM database at [**Install**](#install) time and is also written into every `SERVICE_STATUS` report via `dwServiceType`. Changing it after install requires uninstalling and re-installing the service. ## Methods +### New +{: .no_toc } + +Initializes a new **ServiceManager** instance with default configuration values. + +Syntax: **New ServiceManager** + +**New** sets the following defaults: + +- [**Type**](#type) to [**tbServiceTypeOwnProcess**](Enumerations/ServiceTypeConstants#tbServiceTypeOwnProcess) +- [**InstallStartMode**](#installstartmode) to [**tbServiceStartOnDemand**](Enumerations/ServiceStartConstants#tbServiceStartOnDemand) +- [**InstallCmdLine**](#installcmdline) to the quoted path of the running EXE (`App.ModulePath`) +- [**AutoInitializeCOM**](#autoinitializecom) to **True** + +> [!NOTE] +> Do not call **New ServiceManager** directly. Use [**Services.ConfigureNew**](Services#configurenew), which constructs the instance and registers it in the package's internal collection. A **ServiceManager** created outside that method is invisible to the dispatcher and cannot be used as a service host. + ### Install {: .no_toc } @@ -192,6 +281,45 @@ Syntax: *manager*.**ResyncStatus** Raises run-time error 5 *"Can't update the service state until the service has started"* if called before the service has acquired its SCM status handle (i.e. before the dispatcher trampoline has called `RegisterServiceCtrlHandlerExW`). From inside [**EntryPoint**](ITbService#entrypoint), [**ReportStatus**](#reportstatus) is the right call rather than **ResyncStatus** directly. +### ServiceEntryPoint +{: .no_toc } + +The SCM-invoked entry point that runs on the service thread when the OS starts the service. + +Syntax: *manager*.**ServiceEntryPoint** *dwArgc*, *lpszArgv* + +*dwArgc* +: *required* A **Long** giving the number of argument strings the SCM passed in, including the service name as `argv[0]`. + +*lpszArgv* +: *required* A **LongPtr** pointing to an array of `LPWSTR` pointers. The first pointer is the service name (consumed internally); subsequent pointers become [**LaunchArgs**](#launchargs). + +> [!NOTE] +> **ServiceEntryPoint** is called by the package's dispatcher trampoline via `StartServiceCtrlDispatcherW`'s thread-creation machinery. Consumer code does not call it directly --- the package obtains its address through the private `IServiceManagerInternal.GetEntryPointAddress` interface and passes it to the SCM as a function pointer. The sub is not marked **Public** and is not intended for direct invocation. + +On entry, the sub calls `RegisterServiceCtrlHandlerExW` to obtain the service status handle. It then parses *lpszArgv* into [**LaunchArgs**](#launchargs) (dropping `argv[0]`, the service name), calls `InstanceCreator.CreateInstance()` to produce the [**ITbService**](ITbService) object, and --- if [**AutoInitializeCOM**](#autoinitializecom) is **True** --- initialises COM in STA mode before invoking [**ITbService.EntryPoint**](ITbService#entrypoint). If `RegisterServiceCtrlHandlerExW` returns zero (handle acquisition failed), [**ITbService.StartupFailed**](ITbService#startupfailed) is called instead. + +### ServiceControlHandlerCallback +{: .no_toc } + +Routes an SCM control-code notification to the active service instance. + +Syntax: *manager*.**ServiceControlHandlerCallback** *dwControl*, *dwEventType*, *lpEventData* + +*dwControl* +: *required* A **Long** holding the Win32 control code delivered by the SCM. Corresponds to a [**ServiceControlCodeConstants**](Enumerations/ServiceControlCodeConstants) value. + +*dwEventType* +: *required* A **Long** holding the event-type sub-code for control codes that carry one. **0** for codes that do not. + +*lpEventData* +: *required* A **LongPtr** pointing to an event-specific data structure for control codes that include one. `vbNullPtr` for codes that do not carry a data block. + +> [!NOTE] +> **ServiceControlHandlerCallback** is an internal hook. The Win32 service infrastructure invokes it through the package's `ServiceControlHandlerCallback_Trampoline` helper, which is registered with the SCM via `RegisterServiceCtrlHandlerExW` inside [**ServiceEntryPoint**](#serviceentrypoint). User code never calls this method directly --- implement [**ITbService.ChangeState**](ITbService#changestate) to handle control-code notifications. + +The method runs on the **dispatcher thread** (the main thread of the EXE), not on the service thread where [**ITbService.EntryPoint**](ITbService#entrypoint) runs. It forwards the three raw Win32 parameters to [**ITbService.ChangeState**](ITbService#changestate) on the active service instance. If no service instance is active (`InternalActiveInstance` is **Nothing**), the method returns without taking any action. + ### Uninstall {: .no_toc } @@ -204,10 +332,34 @@ Opens the SCM, opens the service with `SERVICE_DELETE`, calls `DeleteService`. T > [!IMPORTANT] > [**Uninstall**](#uninstall) requires administrator rights. Raises run-time error 5 with a descriptive message if the SCM cannot be opened, the service is not installed, or `DeleteService` fails. +## Types + +### SERVICE_TABLE_ENTRYW +{: #service_table_entryw } + +A Win32 UDT that pairs a service name with its entry-point address. Used internally by [**Services.RunServiceDispatcher**](Services#runservicedispatcher) to build the table that `StartServiceCtrlDispatcherW` consumes. + +```tb +Type SERVICE_TABLE_ENTRYW + Name As String + EntryPoint As LongPtr +End Type +``` + +*Name* +: A **String** holding the service name. Matches the [**Name**](#name) property of the corresponding **ServiceManager**. + +*EntryPoint* +: A **LongPtr** holding the address of the service's entry-point procedure. The package fills this from `AddressOf ServiceEntryPoint` via the private `IServiceManagerInternal.GetEntryPointAddress` implementation; user code never sets this field. + +> [!NOTE] +> **SERVICE_TABLE_ENTRYW** is an internal type. The package constructs and populates the table automatically inside [**Services.RunServiceDispatcher**](Services#runservicedispatcher); user code does not interact with it directly. + ## See Also - [WinServicesLib package](.) -- overview, lifecycle, two-thread split - [Services class](Services) -- the predeclared coordinator that **ConfigureNew** comes from - [ITbService interface](ITbService) -- what **InstanceCreator** must produce - [ServiceCreator(Of T)](ServiceCreator) -- the generic factory typically passed to **InstanceCreator** +- [ServiceTypeConstants enum](Enumerations/ServiceTypeConstants) -- the values **Type** accepts - [ServiceStatusConstants enum](Enumerations/ServiceStatusConstants) -- the values **ReportStatus** accepts diff --git a/docs/Reference/Built-In/WinServicesLib/ServiceState.md b/docs/Reference/Built-In/WinServicesLib/ServiceState.md index 83c4b321..89d44f01 100644 --- a/docs/Reference/Built-In/WinServicesLib/ServiceState.md +++ b/docs/Reference/Built-In/WinServicesLib/ServiceState.md @@ -8,7 +8,7 @@ has_toc: false # ServiceState class {: .no_toc } -A read-only snapshot of an installed service's current state as reported by the SCM. Returned by [**Services.QueryStateOfService**](Services#querystateofservice); not directly user-instantiable. +A read-only snapshot of an installed service's current state as reported by the SCM. Typically obtained via [**Services.QueryStateOfService**](Services#querystateofservice); can also be constructed directly with **New ServiceState**(*ServiceName*). ```tb Dim state As ServiceState @@ -19,13 +19,36 @@ Debug.Print state.CurrentStateText, "PID " & state.ProcessId The snapshot is taken **once at construction time** and never refreshed. To monitor a service over time, call [**Services.QueryStateOfService**](Services#querystateofservice) again at each sampling interval --- typically from a low-frequency Timer. -The constructor opens the SCM with `SC_MANAGER_CONNECT`, opens the service with `SERVICE_QUERY_STATUS`, calls `QueryServiceStatusEx(SC_STATUS_PROCESS_INFO, ...)`, and copies the result into a private buffer. The three failure modes --- SCM open failed, service not installed, status query failed --- all raise run-time error 5 with a descriptive message. Wrap the call in `On Error Resume Next` if the UI needs to distinguish "service exists and is running" from "service is not installed": +* TOC +{:toc} + +## Methods + +### New +{: .no_toc } + +Initializes a **ServiceState** instance by querying the SCM for the named service's current status. + +Syntax: **New ServiceState**(*ServiceName*) + +*ServiceName* +: *required* A **String** naming the service as registered in the SCM database (the same value passed to [**Services.QueryStateOfService**](Services#querystateofservice) or stored in [**ServiceManager.Name**](ServiceManager#name)). + +Opens the SCM with `SC_MANAGER_CONNECT`, opens the named service with `SERVICE_QUERY_STATUS`, and calls `QueryServiceStatusEx(SC_STATUS_PROCESS_INFO, ...)` to populate the internal `SERVICE_STATUS_PROCESS` buffer. All service and SCM handles are closed before the constructor returns. + +Three failure modes raise run-time error **5** with a descriptive message: + +- `"Unable to open the Service manager (OpenSCManagerW failed). Check permissions."` --- the calling process lacks sufficient rights to open the SCM. +- `"Service '' is not installed on this system"` --- no service with the given name exists in the SCM database. +- `"Unable to query the service state"` --- `QueryServiceStatusEx` failed after the service handle was opened. + +Wrap the constructor in `On Error Resume Next` when the caller needs to distinguish "service is running" from "service is not installed": ```tb Private Function GetStateText(ByVal serviceName As String) As String On Error Resume Next Dim state As ServiceState - Set state = Services.QueryStateOfService(serviceName) + Set state = New ServiceState(serviceName) If Err.Number = 0 Then GetStateText = state.CurrentStateText Else @@ -34,9 +57,6 @@ Private Function GetStateText(ByVal serviceName As String) As String End Function ``` -* TOC -{:toc} - ## Properties ### CheckPoint @@ -84,9 +104,16 @@ Any unrecognised state value is rendered as `UNKNOWN STATE ()`. ### ExitCode {: .no_toc } -The SCM-reported `dwWin32ExitCode` value. **Long**. +The Win32 exit code the service reported when it last stopped. **Long**. Read-only. + +Syntax: *state*.**ExitCode** -For a normally-stopped service this is **0** (`NO_ERROR`); for a service that stopped due to an error, this is either a Win32 error code or the sentinel `ERROR_SERVICE_SPECIFIC_ERROR` (1066) --- in which case the real code is in [**ServiceSpecificExitCode**](#servicespecificexitcode). +*state* +: *required* An object expression that evaluates to a **ServiceState** instance, obtained from [**Services.QueryStateOfService**](Services#querystateofservice). + +Returns the `dwWin32ExitCode` field from the `SERVICE_STATUS_PROCESS` structure the SCM fills in. For a service that stopped normally this is **0** (`NO_ERROR`). For a service that stopped due to an error, this is either a standard Win32 error code or the sentinel value `ERROR_SERVICE_SPECIFIC_ERROR` (1066) --- in which case the real vendor-defined code is in [**ServiceSpecificExitCode**](#servicespecificexitcode). + +While the service is in any state other than [**Stopped**](Enumerations/ServiceStatusConstants#vbServiceStatusStopped) the SCM keeps this field at **0**. The value becomes meaningful only after the service thread exits and the SCM records the terminal status. ### Flags {: .no_toc } @@ -100,7 +127,24 @@ Only one bit is currently documented --- `SERVICE_RUNS_IN_SYSTEM_PROCESS` (1), s The OS process ID hosting the service, or **0** if the service is not running. **Long**. -Useful for cross-referencing against Task Manager or `tasklist /svc` output, and as a quick "is the service alive?" check that avoids string-comparing [**CurrentStateText**](#currentstatetext). +Syntax: *object*.**ProcessId** + +*object* +: *required* An object expression that evaluates to a **ServiceState** instance, obtained from [**Services.QueryStateOfService**](Services#querystateofservice). + +The value is the Win32 process identifier (`dwProcessId`) as reported by `QueryServiceStatusEx`. When the service is in the [**Stopped**](Enumerations/ServiceStatusConstants#vbServiceStatusStopped) state the SCM reports **0**, as there is no live process. For a service in [**Running**](Enumerations/ServiceStatusConstants#vbServiceStatusRunning) state the value matches the PID shown in Task Manager or returned by `tasklist /svc`. + +Use **ProcessId** as a quick "is the service alive?" check in preference to string-comparing [**CurrentStateText**](#currentstatetext): + +```tb +Dim state As ServiceState +Set state = Services.QueryStateOfService("MyService") +If state.ProcessId <> 0 Then + Debug.Print "Service is alive; PID " & state.ProcessId +Else + Debug.Print "Service is not running" +End If +``` ### ServiceSpecificExitCode {: .no_toc } @@ -112,20 +156,52 @@ Meaningful only when [**ExitCode**](#exitcode) equals `ERROR_SERVICE_SPECIFIC_ER ### Type {: .no_toc } -The SCM-reported service type. [**ServiceTypeConstants**](Enumerations/ServiceTypeConstants). +The SCM-reported service type. [**ServiceTypeConstants**](Enumerations/ServiceTypeConstants). Read-only. -The value the SCM has on file for the service, typically [**tbServiceTypeOwnProcess**](Enumerations/ServiceTypeConstants#tbServiceTypeOwnProcess) or [**tbServiceTypeShareProcess**](Enumerations/ServiceTypeConstants#tbServiceTypeShareProcess) for twinBASIC services. +Syntax: *state*.**Type** + +*state* +: *required* An object expression that evaluates to a **ServiceState** instance, obtained from [**Services.QueryStateOfService**](Services#querystateofservice). + +Returns the [**ServiceTypeConstants**](Enumerations/ServiceTypeConstants) value the SCM has on file for the service. For twinBASIC services this is typically one of: + +- [**tbServiceTypeOwnProcess**](Enumerations/ServiceTypeConstants#tbServiceTypeOwnProcess) -- the service runs in its own dedicated process. +- [**tbServiceTypeShareProcess**](Enumerations/ServiceTypeConstants#tbServiceTypeShareProcess) -- the service shares its host process with one or more other services from the same EXE. + +The value is read directly from the `dwServiceType` field of the `SERVICE_STATUS_PROCESS` structure returned by `QueryServiceStatusEx`. It reflects whatever was registered in the SCM at install time via [**ServiceManager.Type**](ServiceManager#type). ### WaitHint {: .no_toc } -The SCM-reported `dwWaitHint` value in milliseconds. **Long**. +The estimated upper bound, in milliseconds, of the time the current pending state transition will take. **Long**. Read-only. + +Syntax: *object*.**WaitHint** -Only meaningful while the service is in a *Pending* state --- it is the upper-bound estimate the service has told the SCM the pending transition will take. The SCM uses [**CheckPoint**](#checkpoint) and **WaitHint** together to determine whether a pending service is making progress. +*object* +: *required* An object expression that evaluates to a **ServiceState** instance, obtained from [**Services.QueryStateOfService**](Services#querystateofservice). + +Returns the `dwWaitHint` field from the `SERVICE_STATUS_PROCESS` structure the SCM fills in. The value is the estimate the service last reported through `SetServiceStatus` when it entered the current pending state. It is only meaningful while the service is in a *Pending* state ([**StartPending**](Enumerations/ServiceStatusConstants#vbServiceStatusStartPending), [**StopPending**](Enumerations/ServiceStatusConstants#vbServiceStatusStopPending), [**PausePending**](Enumerations/ServiceStatusConstants#vbServiceStatusPausePending), [**ContinuePending**](Enumerations/ServiceStatusConstants#vbServiceStatusContinuePending)). For services in [**Running**](Enumerations/ServiceStatusConstants#vbServiceStatusRunning) or [**Stopped**](Enumerations/ServiceStatusConstants#vbServiceStatusStopped) states the field is **0** or the last value set before the transition completed and should not be interpreted. + +The SCM uses [**CheckPoint**](#checkpoint) and **WaitHint** together to decide whether a pending service is making progress. If the [**CheckPoint**](#checkpoint) value has not increased within the **WaitHint** interval, the SCM considers the service hung and may report an error. A service that expects a long pending phase should either set **WaitHint** large enough to cover the whole transition, or increment [**CheckPoint**](#checkpoint) at regular sub-intervals to signal continued progress. + +### Example + +This example reads the wait hint and check point for a service currently in a pending state and prints a progress summary. + +```tb +Dim state As ServiceState +Set state = Services.QueryStateOfService("MyService") + +If state.CurrentStateText = "STARTING" Or state.CurrentStateText = "STOPPING" Then + Debug.Print "Pending -- checkpoint: " & state.CheckPoint & _ + ", max wait: " & state.WaitHint & " ms" +End If +``` ## See Also - [WinServicesLib package](.) -- overview, lifecycle -- [Services.QueryStateOfService method](Services#querystateofservice) -- the only way to obtain a **ServiceState** instance +- [Services.QueryStateOfService method](Services#querystateofservice) -- constructs a **ServiceState** from the predeclared coordinator +- [CheckPoint property](#checkpoint) -- the progress counter the SCM reads alongside **WaitHint** - [ServiceStatusConstants enum](Enumerations/ServiceStatusConstants) -- the values **CurrentState** can take - [ServiceTypeConstants enum](Enumerations/ServiceTypeConstants) -- the values **Type** can take diff --git a/docs/Reference/Built-In/WinServicesLib/Services.md b/docs/Reference/Built-In/WinServicesLib/Services.md index 273a1d9d..f7c6e2d7 100644 --- a/docs/Reference/Built-In/WinServicesLib/Services.md +++ b/docs/Reference/Built-In/WinServicesLib/Services.md @@ -69,6 +69,16 @@ The method opens the SCM, requests the minimum required permission for the chose Raises run-time error 5 with a descriptive message if the SCM cannot be opened (typically a permissions issue), the service is not installed, or `ControlServiceExW` fails. +```tb +' Stop a running service from the interactive branch of Sub Main: +Services.ControlService "MyService", vbServiceControlStop + +' Pause and later continue: +Services.ControlService "MyService", vbServiceControlPause +' ... later ... +Services.ControlService "MyService", vbServiceControlContinue +``` + ### GetConfiguredService {: .no_toc } @@ -183,7 +193,7 @@ Syntax: **Services.UninstallAll** > [!IMPORTANT] > **UninstallAll** writes registry entries under `HKEY_LOCAL_MACHINE` and requires administrator rights. Per-service errors abort the bulk operation; services already uninstalled before the failure remain uninstalled. -## Enumerator +## Properties ### _NewEnum {: .no_toc } @@ -192,6 +202,11 @@ Provides `For Each` support across every [**ServiceManager**](ServiceManager) th Syntax: **For Each** *manager* **In Services** +*manager* +: A [**ServiceManager**](ServiceManager) variable that receives each configured service in turn. + +The property is tagged `[Enumerator]` and returns the internal **Collection** holding every [**ServiceManager**](ServiceManager) allocated by [**ConfigureNew**](#configurenew). Enumeration order is insertion order --- services appear in the order they were created. + ```tb Dim manager As ServiceManager For Each manager In Services @@ -199,7 +214,23 @@ For Each manager In Services Next ``` -The enumeration order is insertion order --- services appear in the order they were created with [**ConfigureNew**](#configurenew). +A common use is the interactive branch of `Sub Main`, where the EXE lists or acts on all configured services without needing to know each name individually: + +```tb +' Print the install state of every configured service: +Dim manager As ServiceManager +For Each manager In Services + On Error Resume Next + Dim state As ServiceState + Set state = Services.QueryStateOfService(manager.Name) + If Err.Number = 0 Then + Debug.Print manager.Name & ": " & state.CurrentStateText + Else + Debug.Print manager.Name & ": not installed" + End If + On Error GoTo 0 +Next +``` ## See Also diff --git a/docs/Reference/Built-In/WinServicesLib/index.md b/docs/Reference/Built-In/WinServicesLib/index.md index 0d10ecea..0b098063 100644 --- a/docs/Reference/Built-In/WinServicesLib/index.md +++ b/docs/Reference/Built-In/WinServicesLib/index.md @@ -4,6 +4,9 @@ parent: Built-In Packages nav_order: 10 permalink: /tB/Packages/WinServicesLib/ has_toc: false +indexed_from: beta-x-0983 +exclude_from_docs: + - ServicesConstantsPublic --- # WinServicesLib Package @@ -121,11 +124,47 @@ Calling [**Install**](ServiceManager#install) while running inside the twinBASIC ## Classes and interface -- [Services](Services) -- the predeclared singleton coordinator: [**ConfigureNew**](Services#configurenew), [**RunServiceDispatcher**](Services#runservicedispatcher), the bulk install / uninstall helpers, plus the runtime control methods ([**LaunchService**](Services#launchservice), [**ControlService**](Services#controlservice), [**QueryStateOfService**](Services#querystateofservice)) -- [ServiceManager](ServiceManager) -- one per configured service; holds the fields the SCM cares about (name, description, type, start-mode, command-line, dependencies, ...) plus the [**ReportStatus**](ServiceManager#reportstatus) call the service uses to inform the SCM of state transitions +- [ITbService](ITbService) -- the interface every service class implements: [**EntryPoint**](ITbService#entrypoint), [**StartupFailed**](ITbService#startupfailed), [**ChangeState**](ITbService#changestate) + - [ChangeState](ITbService#changestate) -- invoked on the dispatcher thread when the SCM delivers a control code (*Stop*, *Pause*, *Continue*, ...) + - [EntryPoint](ITbService#entrypoint) -- the service's main routine, invoked on the SCM-spawned service thread once the SCM handshake has completed + - [StartupFailed](ITbService#startupfailed) -- invoked when the SCM handshake fails before **EntryPoint** can run - [ServiceCreator](ServiceCreator) -- the generic [**ServiceCreator**](ServiceCreator)`(Of T)` factory the dispatcher uses to instantiate each service class on demand; *T* must implement [**ITbService**](ITbService) + - [CreateInstance](ServiceCreator#createinstance) -- returns a fresh `New T` cast as [**ITbService**](ITbService) for use by the dispatcher trampoline +- [ServiceManager](ServiceManager) -- one per configured service; holds the fields the SCM cares about (name, description, type, start-mode, command-line, dependencies, ...) plus the [**ReportStatus**](ServiceManager#reportstatus) call the service uses to inform the SCM of state transitions + - [AutoInitializeCOM](ServiceManager#autoinitializecom) -- controls whether COM is initialized in STA mode on the service thread before **EntryPoint** is called; default **True** + - [DependentServices](ServiceManager#dependentservices) -- list of service names the SCM must auto-start before starting this service + - [Description](ServiceManager#description) -- human-readable description text displayed in `services.msc` and `sc.exe query` + - [Install](ServiceManager#install) -- registers this service in the SCM database; requires administrator rights + - [InstallStartMode](ServiceManager#installstartmode) -- the SCM start mode (*OnDemand*, *Auto*, *Disabled*, ...) the service is registered with + - [InstanceCreator](ServiceManager#instancecreator) -- the [**ServiceCreator(Of T)**](ServiceCreator) factory the dispatcher calls to create the **ITbService** instance at service start + - [Name](ServiceManager#name) -- the service's unique name in the SCM database, used by `services.msc` and `sc.exe` + - [New](ServiceManager#new) -- initializes a new **ServiceManager** with default configuration values + - [ReportStatus](ServiceManager#reportstatus) -- informs the SCM of the service's current state; called from inside **EntryPoint** and **ChangeState** + - [ResyncStatus](ServiceManager#resyncstatus) -- re-applies the cached `SERVICE_STATUS` to the SCM via `SetServiceStatus` + - [SERVICE_TABLE_ENTRYW](ServiceManager#service_table_entryw) -- internal Win32 UDT pairing a service name with its entry-point address; used by **RunServiceDispatcher** + - [ServiceEntryPoint](ServiceManager#serviceentrypoint) -- the SCM-invoked entry point that runs on the service thread; called by the package's dispatcher trampoline, not by user code + - [SupportsPausing](ServiceManager#supportspausing) -- whether the service advertises acceptance of *Pause* / *Continue* control codes to the SCM; default **False** + - [Type](ServiceManager#type) -- the Win32 service type (*OwnProcess*, *ShareProcess*, ...); default **tbServiceTypeOwnProcess** + - [Uninstall](ServiceManager#uninstall) -- removes this service from the SCM database; requires administrator rights +- [Services](Services) -- the predeclared singleton coordinator: [**ConfigureNew**](Services#configurenew), [**RunServiceDispatcher**](Services#runservicedispatcher), the bulk install / uninstall helpers, plus the runtime control methods ([**LaunchService**](Services#launchservice), [**ControlService**](Services#controlservice), [**QueryStateOfService**](Services#querystateofservice)) + - [_NewEnum](Services#_newenum) -- `For Each` enumerator across every configured [**ServiceManager**](ServiceManager) in insertion order + - [ConfigureNew](Services#configurenew) -- allocates a fresh **ServiceManager**, registers it internally, and returns it for the caller to populate + - [ControlService](Services#controlservice) -- sends an SCM control code (*Stop*, *Pause*, *Continue*, ...) to a running service by name + - [GetConfiguredService](Services#getconfiguredservice) -- looks up a previously-configured **ServiceManager** by its **Name** + - [InstallAll](Services#installall) -- calls **Install** on every configured **ServiceManager**; requires administrator rights + - [LaunchService](Services#launchservice) -- starts an installed service by name and optionally forwards launch arguments to **ServiceManager.LaunchArgs** + - [QueryStateOfService](Services#querystateofservice) -- returns a fresh **ServiceState** snapshot of an installed service + - [UninstallAll](Services#uninstallall) -- calls **Uninstall** on every configured **ServiceManager**; requires administrator rights - [ServiceState](ServiceState) -- a read-only state snapshot returned by [**Services.QueryStateOfService**](Services#querystateofservice), giving the SCM-reported state and process ID of an installed service -- [ITbService](ITbService) -- the interface every service class implements: [**EntryPoint**](ITbService#entrypoint), [**StartupFailed**](ITbService#startupfailed), [**ChangeState**](ITbService#changestate) + - [CheckPoint](ServiceState#checkpoint) -- the SCM-reported `dwCheckPoint` progress counter; auto-incremented by the package while the service is in a pending state + - [CurrentStateText](ServiceState#currentstatetext) -- human-readable rendering of **CurrentState** (e.g. `RUNNING`, `STOPPING`, `STOPPED`) + - [ExitCode](ServiceState#exitcode) -- the Win32 exit code the service reported when it last stopped + - [Flags](ServiceState#flags) -- the SCM-reported `dwServiceFlags` bitmask (e.g. `SERVICE_RUNS_IN_SYSTEM_PROCESS`) + - [New](ServiceState#new) -- initializes a **ServiceState** by querying the SCM for the named service's current status + - [ProcessId](ServiceState#processid) -- the OS process ID hosting the service, or **0** if not running + - [ServiceSpecificExitCode](ServiceState#servicespecificexitcode) -- vendor-defined exit code, meaningful only when **ExitCode** equals `ERROR_SERVICE_SPECIFIC_ERROR` (1066) + - [Type](ServiceState#type) -- the SCM-reported service type as a [**ServiceTypeConstants**](Enumerations/ServiceTypeConstants) value + - [WaitHint](ServiceState#waithint) -- estimated upper-bound milliseconds for the current pending state transition, as last reported by the service ## Enumerations From 9f406eba25331133e26b26e945167c93e8080daa Mon Sep 17 00:00:00 2001 From: Kuba Sunderland-Ober Date: Thu, 4 Jun 2026 20:57:16 +0200 Subject: [PATCH 9/9] Document the AppGlobalClassObject package. --- .../AppGlobalClassObject/_App/Build.md | 37 +++ .../AppGlobalClassObject/_App/Comments.md | 35 +++ .../AppGlobalClassObject/_App/CompanyName.md | 33 +++ .../AppGlobalClassObject/_App/EXEName.md | 31 +++ .../_App/FileDescription.md | 33 +++ .../AppGlobalClassObject/_App/HelpFile.md | 52 +++++ .../AppGlobalClassObject/_App/IsInIDE.md | 35 +++ .../_App/LastBuildPath.md | 36 +++ .../_App/LegalCopyright.md | 22 ++ .../_App/LegalTrademarks.md | 35 +++ .../AppGlobalClassObject/_App/LogEvent.md | 42 ++++ .../AppGlobalClassObject/_App/LogMode.md | 54 +++++ .../AppGlobalClassObject/_App/LogPath.md | 28 +++ .../AppGlobalClassObject/_App/Major.md | 33 +++ .../AppGlobalClassObject/_App/Minor.md | 32 +++ .../AppGlobalClassObject/_App/ModulePath.md | 37 +++ .../_App/NonModalAllowed.md | 27 +++ .../_App/OleRequestPendingMsgText.md | 45 ++++ .../_App/OleRequestPendingMsgTitle.md | 41 ++++ .../_App/OleRequestPendingTimeout.md | 41 ++++ .../_App/OleServerBusyMsgText.md | 45 ++++ .../_App/OleServerBusyMsgTitle.md | 42 ++++ .../_App/OleServerBusyRaiseError.md | 42 ++++ .../_App/OleServerBusyTimeout.md | 42 ++++ .../AppGlobalClassObject/_App/Path.md | 36 +++ .../AppGlobalClassObject/_App/PrevInstance.md | 39 ++++ .../AppGlobalClassObject/_App/ProductName.md | 33 +++ .../_App/RetainedProject.md | 29 +++ .../AppGlobalClassObject/_App/Revision.md | 32 +++ .../AppGlobalClassObject/_App/StartLogging.md | 42 ++++ .../AppGlobalClassObject/_App/StartMode.md | 28 +++ .../AppGlobalClassObject/_App/TaskVisible.md | 41 ++++ .../AppGlobalClassObject/_App/ThreadID.md | 30 +++ .../AppGlobalClassObject/_App/Title.md | 47 ++++ .../_App/UnattendedApp.md | 28 +++ .../AppGlobalClassObject/_App/_App.md | 215 ++++++++++++++++++ .../AppGlobalClassObject/_App/hInstance.md | 39 ++++ .../Built-In/AppGlobalClassObject/index.md | 59 +++++ 38 files changed, 1598 insertions(+) create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/Build.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/Comments.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/CompanyName.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/EXEName.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/FileDescription.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/HelpFile.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/IsInIDE.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/LastBuildPath.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/LegalCopyright.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/LegalTrademarks.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/LogEvent.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/LogMode.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/LogPath.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/Major.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/Minor.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/ModulePath.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/NonModalAllowed.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/OleRequestPendingMsgText.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/OleRequestPendingMsgTitle.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/OleRequestPendingTimeout.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyMsgText.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyMsgTitle.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyRaiseError.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyTimeout.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/Path.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/PrevInstance.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/ProductName.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/RetainedProject.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/Revision.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/StartLogging.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/StartMode.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/TaskVisible.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/ThreadID.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/Title.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/UnattendedApp.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/_App.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/_App/hInstance.md create mode 100644 docs/Reference/Built-In/AppGlobalClassObject/index.md diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/Build.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/Build.md new file mode 100644 index 00000000..14c8148e --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/Build.md @@ -0,0 +1,37 @@ +--- +title: Build +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/Build +has_toc: false +--- +# Build +{: .no_toc } + +Returns the build number component of the project version, as configured in the project settings. Read-only. + +Syntax: *object*.**Build** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +**Build** returns the fourth component of the four-part version number (*Major*.*Minor*.*Revision*.*Build*) as set in the twinBASIC project settings. Together with [**Major**](Major), [**Minor**](Minor), and [**Revision**](Revision), it allows the running code to inspect its own version at runtime. + +> [!NOTE] +> +> **Build** is a twinBASIC-specific property with no equivalent in VBA or VB6. + +### Example + +This example prints the full version string to the debug console. + +```tb +Debug.Print "Version: " & App.Major & "." & App.Minor & "." & App.Revision & "." & App.Build +``` + +### See Also + +- [Major](Major) property +- [Minor](Minor) property +- [Revision](Revision) property +- [EXEName](EXEName) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/Comments.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/Comments.md new file mode 100644 index 00000000..bf3c1526 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/Comments.md @@ -0,0 +1,35 @@ +--- +title: Comments +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/Comments +has_toc: false +--- +# Comments +{: .no_toc } + +Returns the Comments string from the project's version information. Read-only. + +Syntax: *object*.**Comments** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +**Comments** returns the text entered in the **Comments** field of the project's version information. This field is embedded in the compiled executable's `VS_VERSION_INFO` resource and is typically used to record build notes or other free-form text about the release. When running inside the twinBASIC IDE, the value is read from the current project settings. + +### Example + +This example prints the project's comments string to the debug console. + +```tb +Debug.Print "Comments: " & App.Comments +``` + +### See Also + +- [Title](Title) property +- [FileDescription](FileDescription) property +- [LegalCopyright](LegalCopyright) property +- [LegalTrademarks](LegalTrademarks) property +- [CompanyName](CompanyName) property +- [ProductName](ProductName) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/CompanyName.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/CompanyName.md new file mode 100644 index 00000000..b8d244a8 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/CompanyName.md @@ -0,0 +1,33 @@ +--- +title: CompanyName +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/CompanyName +has_toc: false +--- +# CompanyName +{: .no_toc } + +Returns the company name stored in the project's version information. Read-only. + +Syntax: *object*.**CompanyName** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +The value is taken from the Company Name field in the project's version information, as set in the twinBASIC project settings. When the field has not been filled in, **CompanyName** returns an empty string. + +### Example + +This example shows the company name in a message box. + +```tb +MsgBox "Company: " & App.CompanyName +``` + +### See Also + +- [ProductName](ProductName) property +- [FileDescription](FileDescription) property +- [LegalCopyright](LegalCopyright) property +- [LegalTrademarks](LegalTrademarks) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/EXEName.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/EXEName.md new file mode 100644 index 00000000..a70060e1 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/EXEName.md @@ -0,0 +1,31 @@ +--- +title: EXEName +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/EXEName +has_toc: false +--- +# EXEName +{: .no_toc } + +Returns the name of the running executable, without the path or file extension. Read-only. + +Syntax: *object*.**EXEName** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +For a compiled executable named `MyProject.exe`, **EXEName** returns `"MyProject"`. When running inside the twinBASIC IDE, the value reflects the project name as configured in the project settings. + +### Example + +This example shows the executable name in a message box. + +```tb +MsgBox "Running as: " & App.EXEName +``` + +### See Also + +- [Path](Path) property +- [Title](Title) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/FileDescription.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/FileDescription.md new file mode 100644 index 00000000..20a79a44 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/FileDescription.md @@ -0,0 +1,33 @@ +--- +title: FileDescription +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/FileDescription +has_toc: false +--- +# FileDescription +{: .no_toc } + +Returns the file description string from the project's version information. Read-only. + +Syntax: *object*.**FileDescription** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +**FileDescription** returns the value set in the project's **File Description** version-info field. This is the human-readable description of the executable that appears in Windows Explorer's file properties dialog. When no description has been set in the project settings, the property returns an empty string. + +### Example + +This example displays the file description in a message box. + +```tb +MsgBox "File description: " & App.FileDescription +``` + +### See Also + +- [ProductName](ProductName) property +- [CompanyName](CompanyName) property +- [LegalCopyright](LegalCopyright) property +- [Comments](Comments) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/HelpFile.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/HelpFile.md new file mode 100644 index 00000000..a9ba0c26 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/HelpFile.md @@ -0,0 +1,52 @@ +--- +title: HelpFile +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/HelpFile +has_toc: false +--- +# HelpFile +{: .no_toc } + +Gets or sets the path to the Help file associated with the application. + +## Get + +Returns a **String** containing the path to the application's Help file. + +Syntax: *object*.**HelpFile** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +The value is the path set at design time in the project settings, or any path assigned at run time via the **Let** accessor. Returns an empty string if no Help file has been configured. + +## Let + +Sets the path to the application's Help file. + +Syntax: *object*.**HelpFile** **=** *path* + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +*path* +: A **String** specifying the full or relative path to the Help file. Assign an empty string to clear the setting. + +The assigned path is used by the runtime when a Help request is made, for example when the user presses F1 in a dialog. Setting this property at run time overrides the value configured in the project settings for the duration of the session. + +### Example + +This example assigns a Help file path at startup and then opens it on a specific topic. + +```tb +Sub Main() + App.HelpFile = App.Path & "\MyApp.chm" +End Sub +``` + +### See Also + +- [Path](Path) property +- [Title](Title) property +- [EXEName](EXEName) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/IsInIDE.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/IsInIDE.md new file mode 100644 index 00000000..bc7828c1 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/IsInIDE.md @@ -0,0 +1,35 @@ +--- +title: IsInIDE +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/IsInIDE +has_toc: false +--- +# IsInIDE +{: .no_toc } + +Returns **True** if the code is currently executing inside the twinBASIC IDE, or **False** if it is running as a compiled executable. Read-only. + +Syntax: *object*.**IsInIDE** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +Use **IsInIDE** to branch between IDE-only debug behaviour and production behaviour without requiring a conditional compilation constant. Unlike `#If` directives, **IsInIDE** is evaluated at runtime, so the same compiled binary can detect its own run-time context. + +### Example + +This example skips a lengthy initialisation step when running under the IDE. + +```tb +If App.IsInIDE Then + Debug.Print "Skipping hardware initialisation in IDE." +Else + InitialiseHardware +End If +``` + +### See Also + +- [EXEName](EXEName) property +- [Path](Path) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/LastBuildPath.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/LastBuildPath.md new file mode 100644 index 00000000..eb8a69ac --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/LastBuildPath.md @@ -0,0 +1,36 @@ +--- +title: LastBuildPath +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/LastBuildPath +has_toc: false +--- +# LastBuildPath +{: .no_toc } + +Returns the full path to the output file produced by the most recent build. Read-only. + +Syntax: *object*.**LastBuildPath** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +**LastBuildPath** returns the complete file-system path, including the file name and extension, of the executable or DLL most recently compiled from this project. When no build has been performed in the current IDE session, the property returns an empty string. + +> [!NOTE] +> +> **LastBuildPath** is a twinBASIC-specific property with no equivalent in VBA or VB6. It is only meaningful during IDE-hosted execution; in a compiled executable it returns the path of that executable. + +### Example + +This example prints the last build path to the debug console. + +```tb +Debug.Print "Last build: " & App.LastBuildPath +``` + +### See Also + +- [Path](Path) property +- [ModulePath](ModulePath) property +- [EXEName](EXEName) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/LegalCopyright.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/LegalCopyright.md new file mode 100644 index 00000000..f0698469 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/LegalCopyright.md @@ -0,0 +1,22 @@ +--- +title: LegalCopyright +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/LegalCopyright +has_toc: false +--- +# LegalCopyright +{: .no_toc } + +Returns the legal copyright string from the project's version information. Read-only. + +Syntax: **App**.**LegalCopyright** + +Returns a **String** containing the value set in the **Legal Copyright** field of the project's **Version Information** settings. If no value has been set, returns an empty string. + +### See Also + +- [LegalTrademarks](LegalTrademarks) property +- [FileDescription](FileDescription) property +- [CompanyName](CompanyName) property +- [ProductName](ProductName) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/LegalTrademarks.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/LegalTrademarks.md new file mode 100644 index 00000000..faa853db --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/LegalTrademarks.md @@ -0,0 +1,35 @@ +--- +title: LegalTrademarks +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/LegalTrademarks +has_toc: false +--- +# LegalTrademarks +{: .no_toc } + +Returns the legal trademarks string from the compiled executable's version information. Read-only. + +Syntax: *object*.**LegalTrademarks** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +The value is taken from the **Legal Trademarks** field in the project's version information, set in the twinBASIC project settings. When no value has been specified, an empty string is returned. + +### Example + +This example displays the legal trademarks string in a message box. + +```tb +If Len(App.LegalTrademarks) > 0 Then + MsgBox App.LegalTrademarks +End If +``` + +### See Also + +- [LegalCopyright](LegalCopyright) property +- [CompanyName](CompanyName) property +- [FileDescription](FileDescription) property +- [ProductName](ProductName) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/LogEvent.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/LogEvent.md new file mode 100644 index 00000000..79f0bb98 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/LogEvent.md @@ -0,0 +1,42 @@ +--- +title: LogEvent +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/LogEvent +has_toc: false +--- +# LogEvent +{: .no_toc } + +Writes a message to the log target configured by [StartLogging](StartLogging). + +Syntax: *object*.**LogEvent** *LogBuffer*, *EventType* + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +*LogBuffer* +: *required* A **String** containing the message text to write to the log. + +*EventType* +: *required* A **Variant** specifying the severity of the event. Accepts the `LogEventTypeConstants` values: `vbLogEventTypeInformation` (1), `vbLogEventTypeWarning` (2), or `vbLogEventTypeError` (3). + +**LogEvent** writes *LogBuffer* to the log destination established by a prior call to **StartLogging**. If logging has not been started, or if the **LogMode** is `vbLogOff`, the call has no effect. + +> [!NOTE] +> +> **LogEvent** is currently unimplemented in twinBASIC. The method exists on the **_App** interface for VB6 source compatibility but does not perform any action at runtime. + +### Example + +This example writes an informational entry to the application log. + +```tb +App.StartLogging "C:\Logs\MyApp.log", vbLogToFile +App.LogEvent "Application started.", vbLogEventTypeInformation +``` + +### See Also + +- [StartLogging](StartLogging) method +- [LogMode](LogMode) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/LogMode.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/LogMode.md new file mode 100644 index 00000000..3355b366 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/LogMode.md @@ -0,0 +1,54 @@ +--- +title: LogMode +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/LogMode +has_toc: false +--- +# LogMode +{: .no_toc } + +Returns a **LogModeConstants** value indicating the active logging mode for the application. Read-only. + +Syntax: *object*.**LogMode** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +**LogMode** reflects the logging state most recently set by a call to [**StartLogging**](StartLogging). The possible values are listed below. + +| Constant | Value | Description | +|----------|-------|-------------| +| **vbLogAuto** | 0 | Logging mode is selected automatically. When running inside the IDE, log entries are sent to the debug console; when running as a compiled executable, they are written to a file. | +| **vbLogOff** | 1 | Logging is disabled. No entries are written. | +| **vbLogToFile** | 2 | Log entries are written to a file specified by [**LogPath**](LogPath). | +| **vbLogToNT** | 3 | Log entries are written to the Windows Event Log. | +| **vbLogOverwrite** | 16 | Combined with **vbLogToFile**: overwrite the log file each time the application starts instead of appending. | +| **vbLogThreadID** | 32 | Combined with **vbLogToFile** or **vbLogToNT**: prefix each log entry with the thread ID. | + +> [!NOTE] +> +> In the current twinBASIC release, **LogMode** only reflects **vbLogOff** and **vbLogAuto**. The other constants are defined for compatibility with VB6 but are not yet fully supported. + +### Example + +This example checks the current log mode and prints it to the debug console. + +```tb +Select Case App.LogMode + Case vbLogOff + Debug.Print "Logging is off." + Case vbLogAuto + Debug.Print "Logging is automatic." + Case vbLogToFile + Debug.Print "Logging to file: " & App.LogPath + Case vbLogToNT + Debug.Print "Logging to Windows Event Log." +End Select +``` + +### See Also + +- [StartLogging](StartLogging) method +- [LogPath](LogPath) property +- [IsInIDE](IsInIDE) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/LogPath.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/LogPath.md new file mode 100644 index 00000000..72ce219d --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/LogPath.md @@ -0,0 +1,28 @@ +--- +title: LogPath +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/LogPath +has_toc: false +--- +# LogPath +{: .no_toc } + +Returns the path to the log file or NT event-log source established by [**StartLogging**](StartLogging). Read-only. + +Syntax: *object*.**LogPath** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +**LogPath** reflects the *LogTarget* argument passed to the most recent call to **StartLogging**. Before **StartLogging** has been called, **LogPath** returns an empty string. + +> [!NOTE] +> +> **LogPath** is not yet implemented in twinBASIC. Reading the property always returns an empty string regardless of whether **StartLogging** has been called. + +### See Also + +- [StartLogging](StartLogging) method +- [LogEvent](LogEvent) method +- [LogMode](LogMode) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/Major.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/Major.md new file mode 100644 index 00000000..197f788f --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/Major.md @@ -0,0 +1,33 @@ +--- +title: Major +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/Major +has_toc: false +--- +# Major +{: .no_toc } + +Returns the major version number component of the project version, as configured in the project settings. Read-only. + +Syntax: *object*.**Major** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +**Major** returns the first component of the four-part version number (*Major*.*Minor*.*Revision*.*Build*) as set in the twinBASIC project settings. Together with [**Minor**](Minor), [**Revision**](Revision), and [**Build**](Build), it allows the running code to inspect its own version at runtime. + +### Example + +This example prints the full version string to the debug console. + +```tb +Debug.Print "Version: " & App.Major & "." & App.Minor & "." & App.Revision & "." & App.Build +``` + +### See Also + +- [Minor](Minor) property +- [Revision](Revision) property +- [Build](Build) property +- [EXEName](EXEName) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/Minor.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/Minor.md new file mode 100644 index 00000000..fa4b8512 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/Minor.md @@ -0,0 +1,32 @@ +--- +title: Minor +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/Minor +has_toc: false +--- +# Minor +{: .no_toc } + +Returns the minor version number component of the project version, as configured in the project settings. Read-only. + +Syntax: *object*.**Minor** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +**Minor** returns the second component of the four-part version number (*Major*.*Minor*.*Revision*.*Build*) as set in the twinBASIC project settings. Together with [**Major**](Major), [**Revision**](Revision), and [**Build**](Build), it allows the running code to inspect its own version at runtime. + +### Example + +This example prints the full version string to the debug console. + +```tb +Debug.Print "Version: " & App.Major & "." & App.Minor & "." & App.Revision & "." & App.Build +``` + +### See Also + +- [Major](Major) property +- [Revision](Revision) property +- [Build](Build) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/ModulePath.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/ModulePath.md new file mode 100644 index 00000000..ad0dcac2 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/ModulePath.md @@ -0,0 +1,37 @@ +--- +title: ModulePath +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/ModulePath +has_toc: false +--- +# ModulePath +{: .no_toc } + +Returns the full file-system path of the currently executing module. Read-only. + +Syntax: *object*.**ModulePath** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +**ModulePath** returns the path to the source file or compiled module that is currently executing. When running inside the twinBASIC IDE, this is the path to the `.twin` source file. In a compiled executable, it is the path to the executable or DLL. + +> [!NOTE] +> +> **ModulePath** is a twinBASIC-specific property with no equivalent in VBA or VB6. + +### Example + +This example prints the current module path to the debug console. + +```tb +Debug.Print "Module path: " & App.ModulePath +``` + +### See Also + +- [Path](Path) property +- [LastBuildPath](LastBuildPath) property +- [EXEName](EXEName) property +- [IsInIDE](IsInIDE) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/NonModalAllowed.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/NonModalAllowed.md new file mode 100644 index 00000000..cbf1b801 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/NonModalAllowed.md @@ -0,0 +1,27 @@ +--- +title: NonModalAllowed +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/NonModalAllowed +has_toc: false +--- +# NonModalAllowed +{: .no_toc } + +Returns **True** if the application is permitted to display non-modal forms, or **False** if non-modal forms are not allowed. Read-only. + +Syntax: *object*.**NonModalAllowed** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +In VB6, **NonModalAllowed** returns **False** when the application is running as an ActiveX server in unattended mode, where displaying a non-modal form would be inappropriate. In all other execution contexts it returns **True**. Code that creates non-modal forms should check this property before calling `Show 0`, and fall back to a modal form or skip the display entirely when the property is **False**. + +> [!NOTE] +> +> **NonModalAllowed** is not yet implemented in twinBASIC. Reading the property always returns **False**. + +### See Also + +- [UnattendedApp](UnattendedApp) property +- [StartMode](StartMode) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/OleRequestPendingMsgText.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/OleRequestPendingMsgText.md new file mode 100644 index 00000000..d371d8a5 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/OleRequestPendingMsgText.md @@ -0,0 +1,45 @@ +--- +title: OleRequestPendingMsgText +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/OleRequestPendingMsgText +has_toc: false +--- +# OleRequestPendingMsgText +{: .no_toc } + +Gets or sets the body text of the dialog box displayed when an OLE request has been pending longer than the **OleRequestPendingTimeout** interval. + +## Get + +Returns the current body text of the OLE request-pending dialog box, as a **String**. + +Syntax: *object*.**OleRequestPendingMsgText** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +## Let + +Sets the body text of the OLE request-pending dialog box. + +Syntax: *object*.**OleRequestPendingMsgText** **=** *value* + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +*value* +: A **String** containing the message body to display in the dialog box. Setting this to an empty string restores the default system-provided text. + +When an outbound OLE call to a server application does not complete within the number of milliseconds set by **OleRequestPendingTimeout**, a dialog box appears to inform the user that the server is busy. **OleRequestPendingMsgText** controls the body text of that dialog box. The companion property **OleRequestPendingMsgTitle** controls the title bar text. + +> [!NOTE] +> +> **OleRequestPendingMsgText** is not yet implemented in twinBASIC. Reading the property always returns an empty string, and assignments have no effect. + +### See Also + +- [OleRequestPendingMsgTitle](OleRequestPendingMsgTitle) property +- [OleRequestPendingTimeout](OleRequestPendingTimeout) property +- [OleServerBusyMsgText](OleServerBusyMsgText) property +- [OleServerBusyTimeout](OleServerBusyTimeout) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/OleRequestPendingMsgTitle.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/OleRequestPendingMsgTitle.md new file mode 100644 index 00000000..38a20ce1 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/OleRequestPendingMsgTitle.md @@ -0,0 +1,41 @@ +--- +title: OleRequestPendingMsgTitle +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/OleRequestPendingMsgTitle +has_toc: false +--- +# OleRequestPendingMsgTitle +{: .no_toc } + +Gets or sets the title bar text of the dialog box displayed when an OLE request has been pending longer than the **OleRequestPendingTimeout** interval. + +> [!NOTE] +> +> This property is not yet implemented in twinBASIC. Getting or setting it has no effect. + +## Get + +Returns a **String** containing the current title text for the OLE request-pending dialog box. + +Syntax: *object*.**OleRequestPendingMsgTitle** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +## Let + +Sets the title bar text of the OLE request-pending dialog box. + +Syntax: *object*.**OleRequestPendingMsgTitle** **=** *value* + +*value* +: A **String** specifying the title to display in the dialog box title bar. + +When an outbound OLE call to a server application does not complete within the number of milliseconds set by [OleRequestPendingTimeout](OleRequestPendingTimeout), a dialog box appears to inform the user that the server is busy. **OleRequestPendingMsgTitle** controls the title bar text of that dialog. The body text is controlled by [OleRequestPendingMsgText](OleRequestPendingMsgText). + +### See Also + +- [OleRequestPendingMsgText](OleRequestPendingMsgText) property +- [OleRequestPendingTimeout](OleRequestPendingTimeout) property +- [OleServerBusyMsgTitle](OleServerBusyMsgTitle) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/OleRequestPendingTimeout.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/OleRequestPendingTimeout.md new file mode 100644 index 00000000..81892fd2 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/OleRequestPendingTimeout.md @@ -0,0 +1,41 @@ +--- +title: OleRequestPendingTimeout +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/OleRequestPendingTimeout +has_toc: false +--- +# OleRequestPendingTimeout +{: .no_toc } + +Gets or sets the number of milliseconds that can elapse before a pending OLE request dialog is displayed. + +> [!NOTE] +> +> This property is not yet implemented in twinBASIC. Getting or setting it has no effect. + +## Get + +Returns a **Long** containing the current timeout value, in milliseconds. + +Syntax: *object*.**OleRequestPendingTimeout** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +## Let + +Sets the timeout value, in milliseconds, that can elapse before the OLE request pending dialog is shown to the user. + +Syntax: *object*.**OleRequestPendingTimeout** **=** *value* + +*value* +: A **Long** specifying the timeout in milliseconds. + +When an OLE automation call is made to a server and the server does not respond within the number of milliseconds specified by **OleRequestPendingTimeout**, a dialog box is displayed informing the user that the request is pending. The dialog can be customised using [OleRequestPendingMsgTitle](OleRequestPendingMsgTitle) and [OleRequestPendingMsgText](OleRequestPendingMsgText). + +### See Also + +- [OleRequestPendingMsgTitle](OleRequestPendingMsgTitle) property +- [OleRequestPendingMsgText](OleRequestPendingMsgText) property +- [OleServerBusyTimeout](OleServerBusyTimeout) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyMsgText.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyMsgText.md new file mode 100644 index 00000000..4e3b593f --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyMsgText.md @@ -0,0 +1,45 @@ +--- +title: OleServerBusyMsgText +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/OleServerBusyMsgText +has_toc: false +--- +# OleServerBusyMsgText +{: .no_toc } + +Gets or sets the body text of the dialog box displayed when an OLE server is busy and the **OleServerBusyTimeout** interval has elapsed. + +## Get + +Returns the current body text of the OLE server-busy dialog box, as a **String**. + +Syntax: *object*.**OleServerBusyMsgText** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +## Let + +Sets the body text of the OLE server-busy dialog box. + +Syntax: *object*.**OleServerBusyMsgText** **=** *value* + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +*value* +: A **String** containing the message body to display in the dialog box. Setting this to an empty string restores the default system-provided text. + +When an outbound OLE call to a server application is rejected because the server is busy, and the number of milliseconds set by **OleServerBusyTimeout** has elapsed, a dialog box appears to inform the user. **OleServerBusyMsgText** controls the body text of that dialog box. The companion property **OleServerBusyMsgTitle** controls the title bar text. + +> [!NOTE] +> +> **OleServerBusyMsgText** is not yet implemented in twinBASIC. Reading the property always returns an empty string, and assignments have no effect. + +### See Also + +- [OleServerBusyMsgTitle](OleServerBusyMsgTitle) property +- [OleServerBusyTimeout](OleServerBusyTimeout) property +- [OleServerBusyRaiseError](OleServerBusyRaiseError) property +- [OleRequestPendingMsgText](OleRequestPendingMsgText) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyMsgTitle.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyMsgTitle.md new file mode 100644 index 00000000..73534c8b --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyMsgTitle.md @@ -0,0 +1,42 @@ +--- +title: OleServerBusyMsgTitle +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/OleServerBusyMsgTitle +has_toc: false +--- +# OleServerBusyMsgTitle +{: .no_toc } + +Gets or sets the title of the dialog box displayed when an OLE server is busy. + +> [!NOTE] +> +> This property is not yet implemented in twinBASIC. Getting or setting it has no effect. + +## Get + +Returns a **String** containing the current title text for the OLE server busy dialog. + +Syntax: *object*.**OleServerBusyMsgTitle** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +## Let + +Sets the title text for the dialog box displayed when an OLE server is busy. + +Syntax: *object*.**OleServerBusyMsgTitle** **=** *value* + +*value* +: A **String** specifying the title for the OLE server busy dialog. + +When an OLE automation call is made to a server that is busy and cannot accept the request within the period specified by [OleServerBusyTimeout](OleServerBusyTimeout), a dialog box may be shown to the user. **OleServerBusyMsgTitle** controls the title bar text of that dialog. The body text of the dialog is controlled by [OleServerBusyMsgText](OleServerBusyMsgText). + +### See Also + +- [OleServerBusyMsgText](OleServerBusyMsgText) property +- [OleServerBusyTimeout](OleServerBusyTimeout) property +- [OleServerBusyRaiseError](OleServerBusyRaiseError) property +- [OleRequestPendingMsgTitle](OleRequestPendingMsgTitle) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyRaiseError.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyRaiseError.md new file mode 100644 index 00000000..aa50c28d --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyRaiseError.md @@ -0,0 +1,42 @@ +--- +title: OleServerBusyRaiseError +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/OleServerBusyRaiseError +has_toc: false +--- +# OleServerBusyRaiseError +{: .no_toc } + +Gets or sets whether a runtime error is raised instead of displaying a dialog when an OLE server is busy. + +> [!NOTE] +> +> This property is not yet implemented in twinBASIC. Getting or setting it has no effect. + +## Get + +Returns a **Boolean** indicating whether a runtime error is raised when an OLE server busy condition occurs. + +Syntax: *object*.**OleServerBusyRaiseError** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +## Let + +Sets whether a runtime error is raised when an OLE server busy condition occurs. + +Syntax: *object*.**OleServerBusyRaiseError** **=** *value* + +*value* +: A **Boolean** specifying the error-raising behaviour. When **True**, a runtime error is raised instead of displaying the OLE server busy dialog. When **False** (the default), the dialog is displayed. + +When an OLE automation call is made to a server and the server does not respond within the number of milliseconds specified by [OleServerBusyTimeout](OleServerBusyTimeout), the runtime normally displays a dialog informing the user. Setting **OleServerBusyRaiseError** to **True** suppresses that dialog and instead raises a trappable runtime error, allowing the application to handle the condition programmatically. + +### See Also + +- [OleServerBusyTimeout](OleServerBusyTimeout) property +- [OleServerBusyMsgTitle](OleServerBusyMsgTitle) property +- [OleServerBusyMsgText](OleServerBusyMsgText) property +- [OleRequestPendingTimeout](OleRequestPendingTimeout) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyTimeout.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyTimeout.md new file mode 100644 index 00000000..ddb9e967 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/OleServerBusyTimeout.md @@ -0,0 +1,42 @@ +--- +title: OleServerBusyTimeout +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/OleServerBusyTimeout +has_toc: false +--- +# OleServerBusyTimeout +{: .no_toc } + +Gets or sets the number of milliseconds that can elapse before the OLE server busy dialog is displayed. + +> [!NOTE] +> +> This property is not yet implemented in twinBASIC. Getting or setting it has no effect. + +## Get + +Returns a **Long** containing the current timeout value, in milliseconds. + +Syntax: *object*.**OleServerBusyTimeout** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +## Let + +Sets the timeout value, in milliseconds, that can elapse before the OLE server busy dialog is shown to the user. + +Syntax: *object*.**OleServerBusyTimeout** **=** *value* + +*value* +: A **Long** specifying the timeout in milliseconds. + +When an OLE automation call is made to a server that is busy and cannot accept the request, the application waits for the number of milliseconds specified by **OleServerBusyTimeout** before displaying a dialog box to the user. The title and body text of that dialog are controlled by [OleServerBusyMsgTitle](OleServerBusyMsgTitle) and [OleServerBusyMsgText](OleServerBusyMsgText). Whether a runtime error is raised instead of showing the dialog is controlled by [OleServerBusyRaiseError](OleServerBusyRaiseError). + +### See Also + +- [OleServerBusyMsgTitle](OleServerBusyMsgTitle) property +- [OleServerBusyMsgText](OleServerBusyMsgText) property +- [OleServerBusyRaiseError](OleServerBusyRaiseError) property +- [OleRequestPendingTimeout](OleRequestPendingTimeout) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/Path.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/Path.md new file mode 100644 index 00000000..7be54b25 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/Path.md @@ -0,0 +1,36 @@ +--- +title: Path +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/Path +has_toc: false +--- +# Path +{: .no_toc } + +Returns the directory that contains the running executable, without a trailing path separator. Read-only. + +Syntax: *object*.**Path** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +**Path** returns the parent directory of the executable or DLL as a **String**. The returned string does not include a trailing backslash. For example, if the executable is located at `C:\MyApps\MyProject.exe`, **Path** returns `"C:\MyApps"`. + +When running inside the twinBASIC IDE, **Path** returns the directory containing the `.twinproj` project file. + +### Example + +This example constructs a full path to a data file located in the same directory as the executable. + +```tb +Dim dataFile As String +dataFile = App.Path & "\data.json" +Debug.Print "Data file: " & dataFile +``` + +### See Also + +- [EXEName](EXEName) property +- [ModulePath](ModulePath) property +- [LastBuildPath](LastBuildPath) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/PrevInstance.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/PrevInstance.md new file mode 100644 index 00000000..fa957783 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/PrevInstance.md @@ -0,0 +1,39 @@ +--- +title: PrevInstance +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/PrevInstance +has_toc: false +--- +# PrevInstance +{: .no_toc } + +Returns **True** if another instance of this executable was already running when the current instance started, or **False** if this is the only running instance. Read-only. + +Syntax: *object*.**PrevInstance** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +Use **PrevInstance** to enforce a single-instance application. Check the value during startup --- typically in `Sub Main` or the first form's `Load` event --- and exit if it returns **True**. + +The detection is based on the executable's file name and path, consistent with the Win32 `FindWindow` or mutex-based approaches used in classic VB6 projects. + +### Example + +This example prevents a second instance of the application from running. + +```tb +Sub Main() + If App.PrevInstance Then + MsgBox "Another instance of " & App.EXEName & " is already running.", vbExclamation + End + End If + ' ... rest of startup +End Sub +``` + +### See Also + +- [EXEName](EXEName) property +- [IsInIDE](IsInIDE) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/ProductName.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/ProductName.md new file mode 100644 index 00000000..784f6d6c --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/ProductName.md @@ -0,0 +1,33 @@ +--- +title: ProductName +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/ProductName +has_toc: false +--- +# ProductName +{: .no_toc } + +Returns the product name stored in the project's version information. Read-only. + +Syntax: *object*.**ProductName** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +The value is taken from the Product Name field in the project's version information, as set in the twinBASIC project settings. When the field has not been filled in, **ProductName** returns an empty string. + +### Example + +This example shows the product name in a message box. + +```tb +MsgBox "Product: " & App.ProductName +``` + +### See Also + +- [CompanyName](CompanyName) property +- [FileDescription](FileDescription) property +- [LegalCopyright](LegalCopyright) property +- [LegalTrademarks](LegalTrademarks) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/RetainedProject.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/RetainedProject.md new file mode 100644 index 00000000..5b672764 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/RetainedProject.md @@ -0,0 +1,29 @@ +--- +title: RetainedProject +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/RetainedProject +has_toc: false +--- +# RetainedProject +{: .no_toc } + +Returns **True** if the project is retained in memory after all its externally-created objects have been released. Read-only. + +Syntax: *object*.**RetainedProject** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +**RetainedProject** reflects the **Retained In Memory** setting from the project's component properties. When **True**, the runtime does not unload the project when the last externally-created object goes out of scope; the project stays loaded until the application exits. When **False**, the runtime unloads the project as soon as no external object references remain. + +This property is meaningful only for ActiveX EXE projects acting as out-of-process COM servers. For standard executables and DLLs it returns **False**. + +> [!NOTE] +> +> **RetainedProject** is not yet implemented in twinBASIC. Reading the property always returns **False**. + +### See Also + +- [StartMode](StartMode) property +- [TaskVisible](TaskVisible) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/Revision.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/Revision.md new file mode 100644 index 00000000..f10b5a41 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/Revision.md @@ -0,0 +1,32 @@ +--- +title: Revision +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/Revision +has_toc: false +--- +# Revision +{: .no_toc } + +Returns the revision component of the project version, as configured in the project settings. Read-only. + +Syntax: *object*.**Revision** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +**Revision** returns the third component of the four-part version number (*Major*.*Minor*.*Revision*.*Build*) as set in the twinBASIC project settings. Together with [**Major**](Major), [**Minor**](Minor), and [**Build**](Build), it allows the running code to inspect its own version at runtime. + +### Example + +This example prints the full version string to the debug console. + +```tb +Debug.Print "Version: " & App.Major & "." & App.Minor & "." & App.Revision & "." & App.Build +``` + +### See Also + +- [Major](Major) property +- [Minor](Minor) property +- [Build](Build) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/StartLogging.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/StartLogging.md new file mode 100644 index 00000000..aae8a864 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/StartLogging.md @@ -0,0 +1,42 @@ +--- +title: StartLogging +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/StartLogging +has_toc: false +--- +# StartLogging +{: .no_toc } + +Begins logging application events to the specified target. + +Syntax: *object*.**StartLogging** *LogTarget*, *LogModes* + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +*LogTarget* +: *required* A **String** specifying the log destination. Pass a file path to write to a file, or the Windows event log name (for example, `"NT Event Log"`) to write to the Windows Application event log. + +*LogModes* +: *required* A **Long** composed of **LogModeConstants** flags that controls what events are logged. Pass `vbLogOff` (0) to disable logging. + +**StartLogging** configures the logging destination and mode for subsequent calls to [**LogEvent**](LogEvent). The settings take effect until **StartLogging** is called again or the application ends. + +> [!NOTE] +> +> **StartLogging** is currently unimplemented in twinBASIC. The method exists on the **_App** interface for VB6 source compatibility but does not perform any action at runtime. + +### Example + +This example enables file-based logging and writes an informational entry. + +```tb +App.StartLogging "C:\Logs\MyApp.log", vbLogToFile +App.LogEvent "Application started.", vbLogEventTypeInformation +``` + +### See Also + +- [LogEvent](LogEvent) method +- [LogMode](LogMode) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/StartMode.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/StartMode.md new file mode 100644 index 00000000..409cec39 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/StartMode.md @@ -0,0 +1,28 @@ +--- +title: StartMode +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/StartMode +has_toc: false +--- +# StartMode +{: .no_toc } + +Returns an **Integer** indicating how the application was started. Read-only. + +Syntax: *object*.**StartMode** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +In VB6, **StartMode** returns `0` (**vbSModeStandalone**) when the application was launched as a standalone executable, or `1` (**vbSModeAutomation**) when it was started as an ActiveX Automation server by an external client. Code in ActiveX DLL or EXE projects uses this value to determine whether a visible user interface should be shown. + +> [!NOTE] +> +> **StartMode** is not yet implemented in twinBASIC. Reading the property always returns `0`. + +### See Also + +- [UnattendedApp](UnattendedApp) property +- [NonModalAllowed](NonModalAllowed) property +- [TaskVisible](TaskVisible) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/TaskVisible.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/TaskVisible.md new file mode 100644 index 00000000..dc8083e6 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/TaskVisible.md @@ -0,0 +1,41 @@ +--- +title: TaskVisible +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/TaskVisible +has_toc: false +--- +# TaskVisible +{: .no_toc } + +Gets or sets whether the application appears in the Windows taskbar and the task list. + +> [!NOTE] +> +> This property is not yet implemented in twinBASIC. Getting or setting it has no effect. + +## Get + +Returns a **Boolean** indicating whether the application is visible in the Windows taskbar and task list. + +Syntax: *object*.**TaskVisible** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +## Let + +Sets whether the application appears in the Windows taskbar and task list. + +Syntax: *object*.**TaskVisible** **=** *value* + +*value* +: A **Boolean**. **True** to show the application in the taskbar and task list; **False** to hide it. + +In VB6, setting **TaskVisible** to **False** hides the application from the Windows taskbar and the Alt+Tab task list. This is typically used for out-of-process ActiveX EXE servers that run in the background without a user interface. A server that presents no windows of its own should set **TaskVisible** to **False** so that it does not appear as an idle entry in the taskbar. + +### See Also + +- [StartMode](StartMode) property +- [UnattendedApp](UnattendedApp) property +- [RetainedProject](RetainedProject) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/ThreadID.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/ThreadID.md new file mode 100644 index 00000000..36b570a9 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/ThreadID.md @@ -0,0 +1,30 @@ +--- +title: ThreadID +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/ThreadID +has_toc: false +--- +# ThreadID +{: .no_toc } + +Returns the Win32 thread ID of the main application thread. Read-only. + +Syntax: **App**.**ThreadID** **As Long** + +Returns a **Long** containing the identifier assigned by the operating system to the main thread of the running process. This is the same value that the Win32 API `GetCurrentThreadId` returns when called from the main thread. + +The thread ID is useful when calling Win32 APIs that require a thread identifier, such as `PostThreadMessage`, or when attaching to thread input with `AttachThreadInput`. + +### Example + +This example prints the main thread ID to the debug console. + +```tb +Debug.Print "Main thread ID: " & App.ThreadID +``` + +### See Also + +- [hInstance](hInstance) property +- [IsInIDE](IsInIDE) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/Title.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/Title.md new file mode 100644 index 00000000..79883495 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/Title.md @@ -0,0 +1,47 @@ +--- +title: Title +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/Title +has_toc: false +--- +# Title +{: .no_toc } + +Returns or sets the application title shown in the Windows taskbar and task list. + +## Get + +Syntax: *object*.**Title** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +Returns the current application title as a **String**. The initial value is taken from the project settings at startup. + +## Let + +Syntax: *object*.**Title** **=** *value* + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +*value* +: A **String** specifying the new application title. + +Assigning to **Title** updates the running process's description immediately. The new title appears in the Windows taskbar and in the task list (for example, in Task Manager) without restarting the application. + +### Example + +This example changes the application title to reflect the currently open document. + +```tb +Dim fileName As String +fileName = "Report.xlsx" +App.Title = "MyApp -- " & fileName +``` + +### See Also + +- [EXEName](EXEName) property +- [Path](Path) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/UnattendedApp.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/UnattendedApp.md new file mode 100644 index 00000000..f730dee8 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/UnattendedApp.md @@ -0,0 +1,28 @@ +--- +title: UnattendedApp +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/UnattendedApp +has_toc: false +--- +# UnattendedApp +{: .no_toc } + +Returns **True** if the application is running in unattended mode, where no user-interface interaction is expected. Read-only. + +Syntax: *object*.**UnattendedApp** + +*object* +: *required* An object expression that evaluates to an **_App** object. In practice this is the global **App** object. + +In VB6, **UnattendedApp** returns **True** when the project was compiled as an unattended ActiveX server---one that is configured to run without any visible windows or interactive dialogs. In that mode the application must not display message boxes or modal forms; any attempt to do so either fails silently or raises an error. Code that might otherwise present a dialog should check this property first and substitute a non-interactive path---writing to a log, raising an error, or returning a default value---when the property is **True**. + +> [!NOTE] +> +> **UnattendedApp** is not yet implemented in twinBASIC. Reading the property always returns **False**. + +### See Also + +- [NonModalAllowed](NonModalAllowed) property +- [StartMode](StartMode) property +- [TaskVisible](TaskVisible) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/_App.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/_App.md new file mode 100644 index 00000000..7d3198b7 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/_App.md @@ -0,0 +1,215 @@ +--- +title: _App +parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/ +has_toc: false +--- + +# _App interface +{: .no_toc } + +The interface implemented by the global **App** object, which exposes information about the running executable --- its name, path, version, instance handle, and related metadata. + +**App** is a predeclared global object of type **App** (a `CoClass` that implements **_App**). It is available in every twinBASIC project without any declaration or instantiation. All members are accessed through the `App` global: + +```tb +Debug.Print App.EXEName +Debug.Print App.Major & "." & App.Minor & "." & App.Revision +``` + +* TOC +{:toc} + +## Properties + +### Build +{: .no_toc } + +The build-number component of the project version, as configured in the project settings. **Integer**. Read-only. + +See [**Build**](Build). + +### Comments +{: .no_toc } + +The **Comments** field from the compiled executable's version information. **String**. Read-only. + +See [**Comments**](Comments). + +### CompanyName +{: .no_toc } + +The **Company Name** field from the compiled executable's version information. **String**. Read-only. + +See [**CompanyName**](CompanyName). + +### EXEName +{: .no_toc } + +The name of the running executable, without the path or file extension. **String**. Read-only. + +See [**EXEName**](EXEName). + +### FileDescription +{: .no_toc } + +The **File Description** field from the compiled executable's version information. **String**. Read-only. + +See [**FileDescription**](FileDescription). + +### HelpFile +{: .no_toc } + +The path to the project's help file. **String**. Read/write. + +See [**HelpFile**](HelpFile). + +### hInstance +{: .no_toc } + +The Win32 instance handle (`HINSTANCE`) of the running executable or DLL. **LongPtr**. Read-only. + +See [**hInstance**](hInstance). + +### IsInIDE +{: .no_toc } + +**True** when code is executing inside the twinBASIC IDE; **False** when running as a compiled executable. **Boolean**. Read-only. + +See [**IsInIDE**](IsInIDE). + +### LastBuildPath +{: .no_toc } + +The full path to the output file produced by the most recent build. **String**. Read-only. + +See [**LastBuildPath**](LastBuildPath). + +### LegalCopyright +{: .no_toc } + +The **Legal Copyright** field from the compiled executable's version information. **String**. Read-only. + +See [**LegalCopyright**](LegalCopyright). + +### LegalTrademarks +{: .no_toc } + +The **Legal Trademarks** field from the compiled executable's version information. **String**. Read-only. + +See [**LegalTrademarks**](LegalTrademarks). + +### LogMode +{: .no_toc } + +The current logging mode. A member of **LogModeConstants**. Read-only. + +> [!NOTE] +> Currently only **vbLogOff** and **vbLogAuto** are supported, for IDE-detection purposes. + +### Major +{: .no_toc } + +The major-version component of the project version. **Integer**. Read-only. + +### Minor +{: .no_toc } + +The minor-version component of the project version. **Integer**. Read-only. + +### ModulePath +{: .no_toc } + +The full path to the running executable or DLL, including the file name and extension. **String**. Read-only. + +See [**ModulePath**](ModulePath). + +### Path +{: .no_toc } + +The directory that contains the running executable, without a trailing path separator. **String**. Read-only. + +See [**Path**](Path). + +### PrevInstance +{: .no_toc } + +**True** when another instance of this executable was already running when this instance started. **Boolean**. Read-only. + +### ProductName +{: .no_toc } + +The **Product Name** field from the compiled executable's version information. **String**. Read-only. + +### Revision +{: .no_toc } + +The revision component of the project version. **Integer**. Read-only. + +### ThreadID +{: .no_toc } + +The Win32 thread ID of the main thread. **Long**. Read-only. + +### Title +{: .no_toc } + +The application title, as shown in the Windows taskbar and task list. **String**. Read/write. + +The initial value comes from the project settings. Assigning to **Title** updates the running process's description immediately. + +## Methods + +### LogEvent +{: .no_toc } + +Writes an entry to the application event log. + +> [!NOTE] +> **LogEvent** is currently unimplemented. Calls are accepted but have no effect. + +Syntax: **App**.**LogEvent** *LogBuffer*, *EventType* + +*LogBuffer* +: *required* A **String** containing the message to write. + +*EventType* +: *required* A **Variant** specifying the event severity. + +### StartLogging +{: .no_toc } + +Begins logging application events to the specified target. + +> [!NOTE] +> **StartLogging** is currently unimplemented. Calls are accepted but have no effect. + +Syntax: **App**.**StartLogging** *LogTarget*, *LogModes* + +*LogTarget* +: *required* A **String** specifying the log destination (a file path or the Windows event log). + +*LogModes* +: *required* A **Long** composed of **LogModeConstants** flags that controls what is logged. + +## Remarks + +The following **_App** properties are declared in the interface but are not yet implemented in twinBASIC. Reading or writing them has no effect: + +- **LogPath** +- **NonModalAllowed** +- **OleRequestPendingMsgText** +- **OleRequestPendingMsgTitle** +- **OleRequestPendingTimeout** +- **OleServerBusyMsgText** +- **OleServerBusyMsgTitle** +- **OleServerBusyRaiseError** +- **OleServerBusyTimeout** +- **RetainedProject** +- **StartMode** +- **TaskVisible** +- **UnattendedApp** + +## See Also + +- [AppGlobalClassObject Package](.) -- package overview diff --git a/docs/Reference/Built-In/AppGlobalClassObject/_App/hInstance.md b/docs/Reference/Built-In/AppGlobalClassObject/_App/hInstance.md new file mode 100644 index 00000000..320a55c3 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/_App/hInstance.md @@ -0,0 +1,39 @@ +--- +title: hInstance +parent: _App +grand_parent: AppGlobalClassObject Package +permalink: /tB/Packages/AppGlobalClassObject/_App/hInstance +has_toc: false +--- +# hInstance +{: .no_toc } + +Returns the instance handle of the running executable or DLL. Read-only. + +Syntax: **App**.**hInstance** **As LongPtr** + +Returns a **LongPtr** holding the `HINSTANCE` of the current process module. This is the same value that the Win32 API `GetModuleHandle(NULL)` returns for an EXE, or the `HINSTANCE` passed to `DllMain` for a DLL. Pass it to Win32 API functions that require an instance handle, such as `LoadIcon`, `LoadCursor`, `CreateWindow`, or `RegisterClass`. + +> [!NOTE] +> +> **hInstance** returns a **LongPtr**, which is 32 bits wide in a 32-bit build and 64 bits wide in a 64-bit build. Declare any Win32 API parameter that receives it as **LongPtr** to keep the project portable across both targets. + +### Example + +This example passes the application instance handle to the Win32 `LoadIcon` API. + +```tb +Private Declare PtrSafe Function LoadIcon Lib "user32" Alias "LoadIconA" ( _ + ByVal hInstance As LongPtr, _ + ByVal lpIconName As String) As LongPtr + +Private Sub Form_Load() + Dim hIcon As LongPtr + hIcon = LoadIcon(App.hInstance, "MY_ICON") +End Sub +``` + +### See Also + +- [EXEName](EXEName) property +- [Path](Path) property diff --git a/docs/Reference/Built-In/AppGlobalClassObject/index.md b/docs/Reference/Built-In/AppGlobalClassObject/index.md new file mode 100644 index 00000000..afe5e300 --- /dev/null +++ b/docs/Reference/Built-In/AppGlobalClassObject/index.md @@ -0,0 +1,59 @@ +--- +title: AppGlobalClassObject Package +parent: Built-In Packages +has_toc: false +exclude_from_docs: + - InternalStuff +indexed_from: beta-x-0983 +--- + +# AppGlobalClassObject Package +{: .no_toc } + +The **AppGlobalClassObject** built-in package provides the `App` global object available in every twinBASIC project. + +## Interfaces + +- [_App](_App/_App) -- Interface implemented by the global `App` object, exposing executable metadata, version information, instance handle, and related properties. + +## Properties + +- [Build](_App/Build) -- Returns the build-number component of the project version. Read-only. +- [Comments](_App/Comments) -- Returns the Comments string from the project's version information. Read-only. +- [CompanyName](_App/CompanyName) -- Returns the company name stored in the project's version information. Read-only. +- [EXEName](_App/EXEName) -- Returns the name of the running executable, without path or extension. Read-only. +- [FileDescription](_App/FileDescription) -- Returns the file description string from the project's version information. Read-only. +- [HelpFile](_App/HelpFile) -- Gets or sets the path to the Help file associated with the application. +- [hInstance](_App/hInstance) -- Returns the Win32 instance handle (`HINSTANCE`) of the running executable or DLL. Read-only. +- [IsInIDE](_App/IsInIDE) -- Returns **True** if code is executing inside the twinBASIC IDE, **False** if running as a compiled executable. Read-only. +- [LastBuildPath](_App/LastBuildPath) -- Returns the full path to the output file produced by the most recent build. Read-only. +- [LegalCopyright](_App/LegalCopyright) -- Returns the legal copyright string from the project's version information. Read-only. +- [LegalTrademarks](_App/LegalTrademarks) -- Returns the legal trademarks string from the compiled executable's version information. Read-only. +- [LogMode](_App/LogMode) -- Returns a **LogModeConstants** value indicating the active logging mode. Read-only. +- [LogPath](_App/LogPath) -- Returns the path to the log file established by **StartLogging**. Read-only. +- [Major](_App/Major) -- Returns the major version number component of the project version. Read-only. +- [Minor](_App/Minor) -- Returns the minor version number component of the project version. Read-only. +- [ModulePath](_App/ModulePath) -- Returns the full file-system path of the currently executing module. Read-only. +- [NonModalAllowed](_App/NonModalAllowed) -- Returns **True** if the application is permitted to display non-modal forms. Read-only. +- [OleRequestPendingMsgText](_App/OleRequestPendingMsgText) -- Gets or sets the body text of the dialog displayed when an OLE request has been pending too long. +- [OleRequestPendingMsgTitle](_App/OleRequestPendingMsgTitle) -- Gets or sets the title bar text of the dialog displayed when an OLE request has been pending too long. +- [OleRequestPendingTimeout](_App/OleRequestPendingTimeout) -- Gets or sets the milliseconds that can elapse before a pending OLE request dialog is displayed. +- [OleServerBusyMsgText](_App/OleServerBusyMsgText) -- Gets or sets the body text of the dialog displayed when an OLE server is busy. +- [OleServerBusyMsgTitle](_App/OleServerBusyMsgTitle) -- Gets or sets the title bar text of the dialog displayed when an OLE server is busy. +- [OleServerBusyRaiseError](_App/OleServerBusyRaiseError) -- Gets or sets whether a runtime error is raised instead of displaying a dialog when an OLE server is busy. +- [OleServerBusyTimeout](_App/OleServerBusyTimeout) -- Gets or sets the milliseconds that can elapse before the OLE server busy dialog is displayed. +- [Path](_App/Path) -- Returns the directory containing the running executable, without a trailing path separator. Read-only. +- [PrevInstance](_App/PrevInstance) -- Returns **True** if another instance of this executable was already running when the current instance started. Read-only. +- [ProductName](_App/ProductName) -- Returns the product name stored in the project's version information. Read-only. +- [RetainedProject](_App/RetainedProject) -- Returns **True** if the project is retained in memory after all externally-created objects are released. Read-only. +- [Revision](_App/Revision) -- Returns the revision component of the project version. Read-only. +- [StartMode](_App/StartMode) -- Returns an **Integer** indicating how the application was started. Read-only. +- [TaskVisible](_App/TaskVisible) -- Gets or sets whether the application appears in the Windows taskbar and task list. +- [ThreadID](_App/ThreadID) -- Returns the Win32 thread ID of the main application thread. Read-only. +- [Title](_App/Title) -- Returns or sets the application title shown in the Windows taskbar and task list. +- [UnattendedApp](_App/UnattendedApp) -- Returns **True** if the application is running in unattended mode. Read-only. + +## Methods + +- [LogEvent](_App/LogEvent) -- Writes a message to the log target configured by **StartLogging**. +- [StartLogging](_App/StartLogging) -- Begins logging application events to the specified target.