You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/CustomControls/Defining a CustomControl.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -59,7 +59,7 @@ This method is called when your control is detached from a form. This allows an
59
59
SubPaint(ByValCanvasAsCanvas)
60
60
```
61
61
62
-
This is the most interesting part for a CustomControl. As such, it gets its own section, see [Painting / drawing to your control](/CustomControls/Painting)
62
+
This is the most interesting part for a CustomControl. As such, it gets its own section, see [Painting / drawing to your control](Painting)
63
63
64
64
***
65
65
## Minimum set of properties
@@ -78,7 +78,7 @@ Public Visible As Boolean
78
78
79
79
The form designer and the form engine work with these properties, so it is important to include them in your CustomControl class.
80
80
81
-
Note that the form designer works with pixel values which are not DPI-scaled. So the Left/Top/Width/Height properties of your control do not reflect DPI scaling. For example, if your control has a width of 50 pixels, then at DPI 150%, then the actual drawing width is 75 pixels ( see [Painting / drawing to your control](/CustomControls/Painting)).
81
+
Note that the form designer works with pixel values which are not DPI-scaled. So the Left/Top/Width/Height properties of your control do not reflect DPI scaling. For example, if your control has a width of 50 pixels, then at DPI 150%, then the actual drawing width is 75 pixels ( see [Painting / drawing to your control](Painting)).
82
82
83
83
***
84
84
## Must have a serialization constructor
@@ -88,4 +88,4 @@ CustomControls *must* offer a serialization constructor:
88
88
PublicSubNew(SerializerAsSerializationInfo)
89
89
```
90
90
91
-
The passed in Serializer object offers a `Deserialize()` method that you call in order to load the properties that have been set for your control via the form designer. See [Property Sheet and Object Serialization](/CustomControls/Properties) for further information.
91
+
The passed in Serializer object offers a `Deserialize()` method that you call in order to load the properties that have been set for your control via the form designer. See [Property Sheet and Object Serialization](Properties) for further information.
Copy file name to clipboardExpand all lines: docs/Features/Overview.md
+6-6Lines changed: 6 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -22,7 +22,7 @@ Attributes have two major functions:
22
22
23
23
* they can act as instructions to compiler to influence how code is generated, or
24
24
25
-
* to annotate Forms, Modules, Classes, Types, Enums, Declares, and [procedures](/tB/Gloss/#procedure) i.e. Subs/Functions/Properties.
25
+
* to annotate Forms, Modules, Classes, Types, Enums, Declares, and [procedures](../tB/Gloss#procedure) i.e. Subs/Functions/Properties.
26
26
27
27
Previously in VBx, these attributes, such as procedure description, hidden, default member, and others, were set via hidden text the IDE's editor didn't show you, configured via the Procedure Attributes dialog or some other places. In tB, these are all visible in the code editor. The legacy ones from VBx are supported for compatibility, but new attributes utilize the following syntax:\
28
28
`[Attribute]` or `[Attribute(value)]`
@@ -1402,15 +1402,15 @@ Code can be grouped as a package, and published to an online server. You can hav
1402
1402
1403
1403
For more information, see the following pages:
1404
1404
1405
-
[What is a package](/Packages/What-Is)
1405
+
[What is a package](../Packages/What-Is)
1406
1406
1407
-
[Creating a TWINPACK package](/Packages/Creating-TWINPACK)
1407
+
[Creating a TWINPACK package](../Packages/Creating-TWINPACK)
1408
1408
1409
-
[Importing a package from a TWINPACK file](/Packages/Importing-TWINPACK)
1409
+
[Importing a package from a TWINPACK file](../Packages/Importing-TWINPACK)
1410
1410
1411
-
[Importing a package from TWINSERV](/Packages/Importing-TWINSERV)
1411
+
[Importing a package from TWINSERV](../Packages/Importing-TWINSERV)
1412
1412
1413
-
[Updating a package](/Packages/Updating)
1413
+
[Updating a package](../Packages/Updating)
1414
1414
1415
1415
## View Forms and Packages as JSON
1416
1416
Project forms and packages are stored as JSON format data, and you can view this by right-click in Project Explorer and selecting 'View as JSON'. This is particularly interesting for packages as it exposes the entire code in a much more easily parsed format.
Copy file name to clipboardExpand all lines: docs/Miscellaneous/FAQs.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -60,7 +60,7 @@ Yes, see the [twinBASIC Roadmap](https://github.com/twinbasic/twinbasic/issues/3
60
60
61
61
**Many!** It has 64bit compilation (using VBA7x64 compatible syntax), generics, overloading, multithreading (API-only right now, built in syntax coming soon), inheritance, ability to define interfaces and coclasses in your project using BASIC-style syntax, Unicode support in all controls and the editor (.twin files only), support for modern image formats, numerous enhancements to *Implements*, ability to create standard DLLs and kernel mode drivers, ability to set UDT packing alignment, and dozens of others, all available *right now*, with many more planned in the future.
62
62
63
-
For a full list of all the new features available right now, see the Wiki article [Overview of features new to twinBASIC](/Features).
63
+
For a full list of all the new features available right now, see the Wiki article [Overview of features new to twinBASIC](Features).
Copy file name to clipboardExpand all lines: docs/Reference/Attributes.md
+38-38Lines changed: 38 additions & 38 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -9,7 +9,7 @@ permalink: /tB/Core/Attributes
9
9
Attributes have two major functions:
10
10
11
11
- they can act as instructions to compiler to influence how code is generated, or
12
-
- to annotate Forms, Modules, Classes, Types, Enums, Declares, and [procedures](/tB/Gloss/#procedure) i.e. Subs/Functions/Properties.
12
+
- to annotate Forms, Modules, Classes, Types, Enums, Declares, and [procedures](../Gloss#procedure) i.e. Subs/Functions/Properties.
13
13
14
14
Previously in VBx, these attributes, such as the procedure description, hidden, default member, and others, were set via hidden text the IDE's editor didn't show you, configured via the Procedure Attributes dialog or some other places. In tB, these are all visible in the code editor. The legacy ones from VBx are supported for compatibility, but new attributes utilize the following syntax:
15
15
`[Attribute]` or `[Attribute(value)]`
@@ -24,7 +24,7 @@ The available attributes are listed below in alphabetic order. Not every attribu
24
24
25
25
Syntax: **[AppObject]**
26
26
27
-
Applicable to: [**CoClass**](/tB/Core/CoClass)
27
+
Applicable to: [**CoClass**](CoClass)
28
28
29
29
Indicates the class is part of the global namespace. You should not include this attribute without a full understanding of the meaning.
30
30
@@ -34,7 +34,7 @@ Indicates the class is part of the global namespace. You should not include this
34
34
35
35
Syntax: **ArrayBoundsChecks( True**\|**False)**
36
36
37
-
Applicable to: [**Class**](/tB/Core/Class), [**Module**](/tB/Core/Module), [procedure](/tB/Gloss/#procedure)
37
+
Applicable to: [**Class**](Class), [**Module**](Module), [procedure](../Gloss#procedure)
38
38
39
39
Disables array element access bounds checking. Used on performance-critical routines. The default value is **True**.
40
40
@@ -44,7 +44,7 @@ Disables array element access bounds checking. Used on performance-critical rout
44
44
45
45
Syntax: **[CoClassCustomConstructor("** fully qualified path to factory method **")]**
46
46
47
-
Applicable to: [**CoClass**](/tB/Core/CoClass)
47
+
Applicable to: [**CoClass**](CoClass)
48
48
49
49
Allows custom logic for creating and returning a new instance of the coclass' implementation.
50
50
@@ -59,15 +59,15 @@ Public CoClass Foo
59
59
EndCoClass
60
60
```
61
61
62
-
For an overview of coclasses in tB, see [Defining coclasses](/Features/Overview/#defining-coclasses).
62
+
For an overview of coclasses in tB, see [Defining coclasses](../../Features/Overview#defining-coclasses).
In addition to interfaces, twinBASIC also allows defining coclasses -- creatable classes that implement one or more defined interfaces. Like interfaces, these too must be in .twin files and not legacy .bas/.cls files, and must appear prior to the `Class` or `Module` statement. The generic form is:
73
73
@@ -81,51 +81,51 @@ CoClass <name>
81
81
EndCoClass
82
82
```
83
83
84
-
The methods are [procedures](/tB/Gloss/#procedure).
84
+
The methods are [procedures](../Gloss#procedure).
85
85
86
-
For an overview of coclasses in tB, see [Defining coclasses](/Features/Overview#defining-coclasses).
86
+
For an overview of coclasses in tB, see [Defining coclasses](../../Features/Overview#defining-coclasses).
87
87
88
88
## ComCreatable(Bool)
89
89
90
90
{: #comcreatable }
91
91
92
92
Syntax: **[ComCreatable(True**\|**False)]**
93
93
94
-
Applicable to: [**CoClass**](/tB/Core/CoClass)
94
+
Applicable to: [**CoClass**](CoClass)
95
95
96
-
Indicates that this coclass can be created with the [**New**](/tB/Core/New) keyword. This attribute is is **True** by default.
96
+
Indicates that this coclass can be created with the [**New**](New) keyword. This attribute is is **True** by default.
97
97
98
98
## ComExtensible(Bool)
99
99
100
100
{: #comextensible }
101
101
102
102
Syntax: **[ComExtensible(True**\|**False)]**
103
103
104
-
Applicable to: [**Interface**](/tB/Core/Interface), [procedure in an Interface](/tB/Gloss/#procedure)
104
+
Applicable to: [**Interface**](Interface), [procedure in an Interface](../Gloss#procedure)
105
105
106
106
Specifies whether new members added at runtime can be called by name through an interface implementing **IDispatch**. This attribute is set to **False** by default.
107
107
108
108
## ComImport
109
109
110
110
Syntax: **[ComImport]**
111
111
112
-
Applicable to: [**Interface**](/tB/Core/Interface)
112
+
Applicable to: [**Interface**](Interface)
113
113
114
114
Specifies that an interface is an import from an external COM library, for instance, the Windows shell.
115
115
116
116
## CompileIf(Bool)
117
117
118
118
Syntax: **[CompileIf(** condition **)]**
119
119
120
-
Applicable to: [procedure definitions](/tB/Gloss/#procedure)
120
+
Applicable to: [procedure definitions](../Gloss#procedure)
121
121
122
122
Controls the conditional compilation of a procedure definition. Has no default value.
123
123
124
124
## ConstantFoldable
125
125
126
126
Syntax: **[ConstantFoldable]**
127
127
128
-
Applicable to: [**Function**](/tB/Core/Function)
128
+
Applicable to: [**Function**](Function)
129
129
130
130
Specify this attribute for functions where when called with non-variable input, will be computed at compile time, rather than runtime. For example, a function to converted string literals to ANSI. The result would never change, so the resulting ANSI string is stored, rather than recomputing every run. Such functions are also called *pure functions*, because their output only depends on the arguments, and not on the state of the program.
131
131
@@ -135,15 +135,15 @@ Specify this attribute for functions where when called with non-variable input,
135
135
136
136
Syntax: **[Debuggable(True**\|**False)]**
137
137
138
-
Applicable to: [**Module**](/tB/Core/Module), [procedure in a Class or Module](/tB/Gloss/#procedure)
138
+
Applicable to: [**Module**](Module), [procedure in a Class or Module](../Gloss#procedure)
139
139
140
140
When false, turns of breakpoints and stepping for the method or module. The default value is **True**.
141
141
142
142
## DebugOnly
143
143
144
144
Syntax: **[DebugOnly]**
145
145
146
-
Applicable to: [procedure definitions](/tB/Gloss/#procedure)
146
+
Applicable to: [procedure definitions](../Gloss#procedure)
147
147
148
148
Excludes calls to this procedure from the Build. They are only available when running from the IDE, i.e. debugging.
149
149
@@ -152,7 +152,7 @@ Excludes calls to this procedure from the Build. They are only available when ru
Applicable to: [**Interface**](/tB/Core/Interface)
249
+
Applicable to: [**Interface**](Interface)
250
250
251
-
twinBASIC supports defining COM interfaces using BASIC syntax, rather than needing an type library with IDL and C++. These are only supported in .twin files, not in legacy .bas or .cls files. They must appear *before* the [**Class**](/tB/Core/Class) or [**Module**](/tB/Core/Module) statement, and will always have a project-wide scope. the The generic form for is as follows:
251
+
twinBASIC supports defining COM interfaces using BASIC syntax, rather than needing an type library with IDL and C++. These are only supported in .twin files, not in legacy .bas or .cls files. They must appear *before* the [**Class**](Class) or [**Module**](Module) statement, and will always have a project-wide scope. the The generic form for is as follows:
Applicable to: Method in an [Interface](/tB/Core/Interface), [API Declarations](/tB/Core/Declare).
340
+
Applicable to: Method in an [Interface](Interface), [API Declarations](Declare).
341
341
342
342
Default value: **False** in an Interface, **True** in an API Declare.
343
343
@@ -360,7 +360,7 @@ Public Declare PtrSafe Function SHGetDesktopFolder Lib "shell32" () As IShellFol
360
360
361
361
Syntax: **[Restricted]**
362
362
363
-
Applicable to: [**Interface**](/tB/Core/Interface)
363
+
Applicable to: [**Interface**](Interface)
364
364
365
365
Restricts the interface methods from being called in most contexts.
366
366
@@ -372,7 +372,7 @@ This is attribute has the same function as the [**restricted** MIDL attribute][M
372
372
373
373
Syntax: **[RunAfterBuild]**
374
374
375
-
Applicable to: [**Function**](/tB/Core/Function), [**Sub**](/tB/Core/Sub)
375
+
Applicable to: [**Function**](Function), [**Sub**](Sub)
376
376
377
377
Specifies a function that runs after your exe is built. Tthere's `App.LastBuildPath` to know where it is if you're e.g. signing the executable.
378
378
@@ -382,7 +382,7 @@ Specifies a function that runs after your exe is built. Tthere's `App.LastBuildP
382
382
383
383
Syntax: **[SetDllDirectory( True**\|**False)]**
384
384
385
-
Applicable to: [**Declare** (API declaration)](/tB/Core/Declare), [**Module**](/tB/Core/Module)
385
+
Applicable to: [**Declare** (API declaration)](Declare), [**Module**](Module)
386
386
387
387
Allows an explicitly loaded DLL to load its own dependencies from it's load path. Also has the effect of allowing searching the app path for the DLLs in the base app's declare statements. It can be used per-declare or within a module.
388
388
@@ -392,15 +392,15 @@ Allows an explicitly loaded DLL to load its own dependencies from it's load path
392
392
393
393
Syntax: **[TypeHint(** an enum type **)]**
394
394
395
-
Applicable to: [procedure](/tB/Gloss/#procedure) parameters
395
+
Applicable to: [procedure](../Gloss#procedure) parameters
396
396
397
397
Allows populating Intellisense with an enum for types other than **Long**.
398
398
399
399
## Unimplemented
400
400
401
401
Syntax: **[Unimplemented]**
402
402
403
-
Applicable to: [procedure](/tB/Gloss/#procedure) definitions
403
+
Applicable to: [procedure](../Gloss#procedure) definitions
404
404
405
405
Makes the compiler issue a warning about the procedure being unimplemented wherever it's called. You can upgrade it to an error too.
0 commit comments