Introduction

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Introduction

PureBasic is an "high-level" programming language based on established "BASIC" rules. It is mostly compatible with any other "BASIC" compiler, whether it's for the Amiga or PC format. Learning PureBasic is very easy! PureBasic has been created for beginners and experts alike. Compilation time is extremely fast. This software has been developed for the Windows operating system. We have put a lot of effort into its realization to produce a fast, reliable and system-friendly language.

The syntax is easy and the possibilities are huge with the "advanced" functions that have been added to this language like pointers, structures, procedures, dynamic linked lists and much more. For the experienced coder, there are no problems gaining access to any of the legal OS structures or Windows API objects.

PureBasic is a portable programming language which currently works on AmigaOS, Linux, MacOS X and Windows computer systems. This means that the same code can be compiled natively for the OS and use the full power of each. There are no bottlenecks like a virtual machine or a code translator, the generated code produces an optimized executable.

The main features of PureBasic

- x86, x64, 680x0 and PowerPC support
- Built-in arrays, dynamic linked lists, complex structures, pointers and variable definitions
- Supported types: Byte (8 bits), Word (16 bits), Long (32 bits), Quad (64 bits), Float (32 bits), Double (64 bits) and Characters
- User defined types (structures)
- Built-in string types (characters), including ascii and unicode
- Powerful macro support
- Constants, binary and hexadecimal numbers supported
- Expression reducer by grouping constants and numeric numbers together
- Standard arithmetic support in respect of sign priority and parenthesis: +, -, /, *, and, or, <<, >>
- Extremely fast compilation
- Procedure support for structured programming with local and global variables
- All Standard BASIC keywords: If-Else-EndIf, Repeat-Until, etc
- Specialized libraries to manipulate BMP pictures, windows, gadgets, DirectX, etc
- Specialized libraries are very optimized for maximum speed and compactness
- The Win32 API is fully supported as if they were BASIC keywords
- Inline Assembler
- Precompiled structures with constants files for extra-fast compilation
- Configurable CLI compiler
- Very high productivity, comprehensive keywords, online help
- System friendly, easy to install and easy to use


Terms And Conditions

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Terms And Conditions

This program is provided "AS IS". Fantaisie Software are NOT responsible for any damage (or damages) attributed to PureBasic. You are warned that you use PureBasic at your own risk. No warranties are implied or given by Fantaisie Software or any representative.

The demo version of this program may be freely distributed provided all contents, of the original archive, remain intact. You may not modify, or change, the contents of the original archive without express written consent from Fantaisie Software.

PureBasic has an user-based license. This means you can install it on every computer you need but you can't share it between two or more people.

All components, libraries, and binaries are copyrighted by Fantaisie Software. The PureBasic license explicitly forbids the creation of DLLs whose primary function is to serve as a 'wrapper' for PureBasic functions.

Fantaisie Software reserves all rights to this program and all original archives and contents.

PureBasic uses the OGRE OpenSource 3D-Engine and its licence can be consulted here.
The full sources of the PureBasic-customized OGRE engine can be downloaded at http://www.purebasic.com/OgreSources.zip.

PureBasic uses the OnError library, written and (c) 2003 by Siegfried Rings and Sebastian Lackner.

PureBasic uses the Scintilla editing component and its related license can be consulted here.

The PureBasic XML library uses the expat XML parser. Its license can be viewed here.

The PureBasic RegularExpression library uses the PCRE library. Its license can be viewed here.


System requirements

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

System requirements

PureBasic will run on any Windows-based system (which includes: Windows 95/98/Me, Windows NT/2000 and Windows XP), AmigaOS classic (3.0 or above), Linux (kernel 2.2 or above) and MacOS X (10.2 (Jaguar) or above).

If there are any problems, please contact us.

Linux

Required packages to use PureBasic:

- sdl 1.2 devel (For games)
- gtk 1.2+ devel or/and gtk 2+ (For GUI programs)
- libstdc++ devel
- gcc correctly installed

- iodbc and iodbc-devel to be able to use the Database commands (see www.iodbc.org)

- libgtkembedmoz.so shoud be installed to have the WebGadget() working (comes with the Mozilla/Firefox package).

- xine and xine-devel for the Movie commands
PureBasic has been succesfully tested on the following configurations (it doesn't mean it only works on these):

- Redhat 7.0, 7.2, 7.3, 8.0 and 9.0
- Mandrake 6.1, 8.0, 10.0 and 10.1
- Suse 7.3, 8.0, 9.0, 10.2
- Debian
- Ubuntu

MacOS X

You need to install the Apple developer tools to be able to use PureBasic. The tools can be found either on one of the install CDs or on the Apple web site: http://developer.apple.com/


Installation

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Installation

To install PureBasic, just click on the install wizard, follow the steps, and then click on the PureBasic icon (found on the desktop or in the start-menu) to launch PureBasic.

To use the command line compiler, open a standard command line window (CMD) and look in the "Compilers\" subdirectory for PBCompiler.exe. It's a good idea to consider adding the "PureBasic\Compilers\" directory to the PATH environment variable to make the compiler accessible from any directory.

Important note: to avoid conflicts with existing PureBasic installations (maybe even with user-libraries), please install a new PureBasic version always in its own new folder. See also the chapter Using several PureBasic versions.


Getting Started

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Getting Started

The PureBasic IDE allows you to create and edit your PureBasic source codes, as well as run them, debug them and create the final executable. It has both an interface to the PureBasic Compiler, as well to the PureBasic Debugger.

The IDE main window contains of 3 major parts:

The code editing area (below the toolbar)
Here all the source codes are displayed. You can switch between them with the tabs located right above it.

The tools panel (on the right side by default)
Here you have several tools to make coding easier and increase productivity. The tools displayed here can be configured, and it can even be completely removed. See Customizing the IDE for more information.

The error log (located below the editing area)
In this area, the compiler errors and debugger messages are logged. It can be hidden/shown for each source code separately.

Other then that, there is the main menu and the toolbar. The toolbar simply provides shortcuts to menu features. It can be fully customized. To find out what each button does, move your mouse over it and wait until a small Tooltip appears. It shows the corresponding menu command. The menu commands are explained in the other sections.


Working with source files

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Working with source files

The file menu allows you to do basic file operations like opening and saving source codes.

You can edit multiple source code files at the same time. You can switch between them using the panel located under the Toolbar. Also the shortcut keys Ctrl+Tab and Ctrl+Shift+Tab can be used to jump to the next or previous open source file, respectively.

Contents of the "File" menu:

New
Create a new empty source code file.

Open
Open an existing source code file for editing.

Any text file will be loaded into the source-editing field. You can also load binary files with the Open menu. These will be displayed in the internal File Viewer.

Save
Saves the currently active source to disk. If the file isn't saved yet, you will be prompted for a filename. Otherwise the code will be saved in the file it was saved in before.

Save As...
Save the currently active source to a different location than it was saved before. This prompts you for a new filename and leaves the old file (if any) untouched.

Save All
Saves all currently opened sources.

Reload
Reloads the currently active source code from disk. This discards any changes made that were not yet saved.

Close
Closes the currently active source code. If it was the only open code, the IDE will display a new empty file.

Close All
Closes all currently opened sources.

File format
In this submenu you can select the text encoding as well as the newline format which should be used when the currently active source code is saved to disk. The IDE can handle files in Ascii or UTF-8. The newline formats it can handle are Windows (CRLF), Linux/Unix (LF) and MacOSX (CR). The defaults for newly created source codes can be set in the preferences.

Sort Sources
When many files are open at the same time, you see the list of them on the panel under the Toolbar. This menu command can be used to change the order of the open source codes without the need to close/reopen any of them.

It will open a list of the open source code, where you can select one and move it up/down. The further up in the list a file is located, the further left it will be in the panel of open files.

Preferences
Here you can change all the settings that control the look & behaviour of the IDE. For a detailed description of that see Customizing the IDE.

Recent Files
Here you can see a list of the last accessed files. Selecting a file in this submenu will open it again.

Quit
This of course closes the IDE. You will be asked to save any non-saved source codes.


Editing features

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Editing features

The PureBasic IDE acts like any other Text Editor when it comes to the basic editing features. The cursor keys as well as Page Up/Page Down, Home and End keys can be used to navigate through the code. Ctrl+Home navigates to the beginning of the file and Ctrl+End to the End.

The default shortcuts Ctrl+C (copy), Ctrl+X (cut) and Ctrl+V (paste) can be used for editing. The "Insert" key controls whether text is inserted or overwritten. The Delete key does a forward delete. Holding down the Shift key and using the arrow keys selects text.

Furthermore, the IDE has many extra editing features specific to programming or PureBasic.

Indentation:

When you press enter, the next line will have the same indentation (number of space/tab at the beginning of the line) as the previous one had.

Tab characters:

By default, the IDE does not insert a real tab when pressing the Tab key, as many programmers see it as a bad thing to use real tabs in source code.

It instead inserts two spaces. This behaviour can be changed in the Preferences. See Customizing the IDE for more information.

Special Tab behaviour:

When the Tab key is pressed while nothing or only a few characters are selected, the Tab key acts as mentioned above (inserting a number of spaces, or a real tab if configured that way).

However when one or more full lines are selected, the reaction is different. In that case at the beginning of each selected line, it will insert spaces or a tab (depending on the configuration). This increases the indentation of the whole selected block.

Marking several lines of text and pressing Shift+Tab reverses this behaviour. It removes spaces/tabs at the start of each line in order to reduce the indentation of the whole block.

Double-clicking on source text:

Double-clicking on a word selects the whole word as usual. However in some cases, double-clicking has a special meaning:

When double-clicking on the name of a procedure that is defined in the current source while holding down the Ctrl Key, the cursor automatically jumps to the declaration of this procedure.

When double-clicking on an IncludeFile or XincludeFile statement, the IDE will try to open that file. (This is only possible if the included file is written as a literal string, and not through for example a constant.)

In the same way, if you double-click on an IncludeBinary statement, the IDE will try to display that file in the internal file viewer.

Marking of matching Braces and Keywords:

When the cursor is on an opening or closing brace the IDE will hilight the other brace that matches it. If a matching brace could not be found (which is a syntax error in PureBasic) the IDE will hilight the current brace in red. This same concept is applied to keywords. If the cursor is on a Keyword such as "If", the IDE will underline this keyword and all keywords that belong to it such as "Else" or "EndIf". If there is a mismatch in the keywords it will be underlined in red. The "Goto matching Keyword" menu entry described below can be used to quickly move between the matching keywords.

The brace and keyword matching can be configured in the Preferences.

Command help in the status bar:

While typing, the IDE will show the needed parameters for any PureBasic function whose parameters you are currently typing. This makes it easy to see any more parameters you still have to add to this function. This also works for procedures you have declared yourself, but only if you did so in the same source file, and not in an included file for example.

Folding options:

When special folding keywords are encountered (Procedure / EndProcedure by default. More can be added), the IDE marks the region between these keywords on the left side next to the line numbers with a [-] at the starting point, followed by a vertical line to the end point.

By clicking on the [-], you can hide ("fold") that section of source code to keep a better overview of larger source files. The [-] will turn into a [+]. By clicking again, the code will again be shown ("unfolded") again.

Note: Even though the state of these folded code lines is remembered when you save/reopen the file, the actual created code file always contains all lines. This only affects the display of the code in the IDE, not the code itself.

Another default fold keyword is ";{" and ";}". Since ";" marks a comment in PB, these will be totally ignored by the compiler. However, they provide the possibility to place custom fold points that do not correspond to a specific PB keyword.

Auto complete:

So that you do not have to remember the exact name of every command, there is the Auto complete feature to make things easier.

After you have typed the beginning of a command, a list of possible matches to the word start you have just typed will be displayed. A list of options is also displayed when you typed a structured variable or interface followed by a "\".

You can then select one of these words with the up/down keys and insert it at the point you are by pressing the Tab key. You can also continue typing while the list is open. It will select the first match that is still possible after what you typed, and close automatically when either you have just typed an exact match or if there are no more possible matches in the list.

Escape closes the auto complete list at any time. It also closes if you click with the mouse anywhere within the IDE.

Note: You can configure what is displayed in the Auto complete list, as well as turning off the automatic popup (requiring a keyboard shortcut such as Ctrl+Space to open list) in the Preferences. See the Auto complete section of Customizing the IDE for more information.

Tools Panel on the side:

Many tools to make navigating/editing the source code easier can be added to the Tools Panel on the side of the editor window. For an overview of them and how to configure them, see Buildin Tools.

The Edit Menu:

Following is an explanation of the Items in the Edit menu. Note that many of the Edit menu items are also accessible by right clicking on the source code, which opens a popup menu.

Undo
Undoes the last done action in the code editing area. There is an undo buffer, so several actions can be undone.

Redo
Redo the last action undone by the undo function.

Cut
Copy the selected part of the source code to the clipboard and remove it from the code.

Copy
Copy the selected text to the Clipboard without deleting it from the code.

Paste
Insert the content of the Clipboard at the current position in the code. If any text is selected before this, it will be removed and replaced with the content of the Clipboard.

Insert comments
Inserts a comment (";") before every line of the selected code block. This makes commenting large blocks of code easier than putting the ; before each line manually.

Remove comments
Removes the comment characters at the beginning of each selected line. This reverts the "Insert comments" command, but also works on comments that were set manually.

Select all Selects the whole source code.

Goto
This lets you jump to a specific line in your source code.

Goto matching Keyword
If the cursor is currently on a keyword such as "If" this menu option jumps directly to the keyword that matches it (in this case "EndIf").

Goto recent line
The IDE keeps track of the lines you view. For example if you switch to a different line with the above Goto function, or with the Procedure Browser tool. With this menu option you can jump back to the previous position. 20 such past cursor positions are remembered.

Note that this only records greater jumps in the code. Not if you just move up/down a few lines with the cursor keys.

Toggle current fold
This opens/closes the fold point in which the cursor is currently located.

Toggle all Folds
This opens/closes all fold points in the current source. Very useful to for example hide all procedures in the code. Or to quickly see the whole code again when some of the code is folded.

Add/Remove Marker
Markers act like Bookmarks in the source code. There presence is indicated by a little arrow next to the line numbers. You can later jump to these markers with the "Jump to marker" command.

The "Add/Remove Marker" sets or removes a marker from the current line you are editing.

Note: You can also set/remove markers by holding down the Ctrl Key and clicking on the border that holds the markers. (not the Linenumber part of it)

Jump to Marker
This makes the cursor jump to the next marker position further down the code from the current cursor position. If there is no marker after the cursor position, it jumps to the first on in the source code. So by pressing the "Jump to Marker" shortcut (F2 by default) several times, you can jump to all the markers in the code.

Clear Markers This removes all markers from the current source code.

Find/Replace

The find/replace dialog enables you to search for specific words in your code, and also to replace them with something else.

The "Find Next" button starts the search. The search can be continued after a match is found with the Find Next menu command. (F3 by default).

You can make the search more specific by enabling one of the checkboxes:
Case Sensitive : Only text that matches the exact case of the search word will be found.
Whole Words only : Search for the given word as a whole word. Do not display results where the search word is part of another word.
Don't search in Comments : Any match that is found inside a comment is ignored.
Don't search in Strings : Any match that is found inside a literal string (in " ") is ignored.
Search inside Selection only : Searches only the selected region of code. This is really useful only together with the "Replace All" button, in which case it will replace any found match, but only inside the selected region.

By enabling the "Replace with" checkbox, you go into replace mode. "Find Next" will still only search, but with each click on the "Replace" button, the next match of the search word will be replaced by whatever is inside the "Replace with" box.

By clicking on "Replace All", all matches from the current position downwards will be replaced (unless "Search inside Selection only" is set).

Find Next
This continues the search for the next match of the last search started by the Find/Replace dialog.

Find in Files

The Find in Files Dialog lets you carry out a search inside many files in a specific directory.

You have to specify a search keyword, as well as a base directory ("root directory") in which to search. You can customize the searched files by specifying extension filters. Any number of filters can be given separated by ",". (*.* or an empty extension field searches all files). As with "Find/Replace", there are checkboxes to make the search more specific.

The "Include sub-directories" checkbox makes it search (recursively) inside any subdirectory of the given root directory too.

When starting the search, a separate window will be opened displaying the search results, giving the file, line number as well as the matched line of each result.

Double-clicking on an entry in the result window opens that file in the IDE and jumps to the selected result line.


Compiling your programs

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Compiling your programs

Compiling is simple. Just select "Compile/Run" (F5 by default) and your program will be compiled and executed for a testing run.

To customise the compiling process, you can open the "Compiler options" dialog. The settings made there are associated with the current source file or the current project, and also remembered when they are closed. The place where this information is saved can be configured. By default, it is saved at the end of the source code as a comment. (invisible in the IDE)

In case of an error that prevents the compiler from completing the compilation, it aborts and displays an error message. This message is also logged in the error log, and the line that caused the error is marked.

A number of functions from older versions of PureBasic that have been removed from the package still exist for a while as a compatibility wrapper to allow older codes to be tested/ported more easily. If such a function is used in the code, the compiler will issue a warning. A window will be opened displaying all warnings that were issued during compilation. Doubleclicking on a warning will display the file/line that caused the warning. Note that such compatibility wrappers will not remain indefinitely but will be removed in a future update, so it is recommended to fix issues that cause a compiler warning instead of relying on such deprecated functions.

The compiler menu

Compile/Run
This compiles the current source code with the compiler options that were set for it and executes it. The executable file is stored in a temporary location, but it will be executed with the current path set to the directory of the source code. (so loading a file from the same directory as the source code will work)

The source code need not be saved for this. (but any included files must be saved.)

The "Compile/Run" option respects the debugger setting (on or off) from the compiler options or debugger menu. (they are the same)

Run
This executes the last compiled source code once again. Whether or not the debugger is enabled depends on the setting of the last compilation.

Compile with Debugger
This is the same as "Compile/Run" except that it ignores the debugger setting and enabled the debugger for this compilation. This is useful when you usually have the debugger off, but want to have it on for just this one compilation.

Compile without Debugger
Same as "Compile with Debugger" except that it forces the debugger to be off for this compilation.

Restart Compiler (not present on all OS)
This causes the compiler to restart. It also causes the compiler to reload all the libraries and resident files, and with that, the list of known PureBasic functions, Structures, Interfaces and Constants is updated too. This function is useful when you have added a new User Library to the PB directory, but do not want to restart the whole IDE. It is especially useful for library developers to test their library.

Compiler Options
This opens the compiler options dialog, that lets you set the options for the compilation of this source file.

Set default Target
When a project is open, this submenu shows all compile targets and allows to quickly switch the current default target. The default target is the one which is compiled/executed with the "Compile/Run" menu entry.

Build Target
When a project is open, this submenu shows all compile targets and allows to directly compile one of them.

Build all Targets
When a project is open, this menu entry compiles all targets that have this option enabled in the compiler options. A window is opened to show the build progress.

Compiler options for non-project files

Main source file
By enabling this option, you can define another file that will be the one sent to the compiler instead of this one. The use of this is that when you are editing a file that does not run by itself, but is included into another file, you can tell the compiler to use that other file to start the compilation.

Note: When using this option, you MUST save your source before compiling, as only files that are written to disk will be used in this case. Most of the compiler settings will be taken from the main source file, so when setting this, they are disabled. Only some settings like the debugger setting will be used from the current source.

Use Icon (Windows and MacOS X only)
Here you can set an icon that will be displayed when viewing the created executable in the explorer. It is also displayed in the title bar of your programs windows and the Taskbar.

Enable inline ASM support
This enables the inline asm parser. See the Inline x86 ASM section of the help file for more information on this option.

Create unicode executable
This tells the compiler to create a unicode executable. The string management, as well as all PB functions will work with unicode strings. To write unicode text in the sourcefiles, it is recommended to set the text encoding of the sourcefile to UTF8 (see below), as then unicode text can be directly entered in the IDE without problem.

To debug unicode programs, it is best to select the Standalone Debugger from the Preferences, as the debugger that is integrated into the IDE can currently not display unicode strings. (it converts them to ascii before displaying them). The standalone Debugger however can handle this.

Create threadsafe executable
This tells the compiler to use a special version of certain commands to make them safe to be used in threads. See the Thread library for more information.

This also enables the Debugger to display correct information if threads are used. Without this option, the debugger might output wrong line numbers when threads are involved for example.

Enable XP Skin support (Windows only)
Includes support for skinned windows on Windows XP or Windows Vista

Request Administrator mode for Windows Vista (Windows only)
The created executable will always be started with administrator rights on Windows Vista. (it will not launch if the administrator password is not entered). This option should be set for programs that need to access restricted folders or restricted areas of the registry to get full access.
If this option is turned on, the standalone debugger will automatically selected when debugging, so the program can be tested in administrator mode.

Note: This option has no effect when the program is run on other versions of Windows.

Request User mode for Windows Vista (Windows only)
This option disables the "Virtualisation" feature for this executable on Windows Vista. Virtualisation caused file and registry access to be redirected to a special user folder if the user does not have the needed rights to do the operation. (this is done for compatibility with older programs)
Note that this redirection is done without notifying the user which can lead to some confusion if he tries to find saved files on the filesystem. Because of this, it is recommended to disable this feature if the program complies with the Windows Vista file/registry access rules.

Note: This option has no effect when the program is run on other versions of Windows. It cannot be combined with the "Administrator mode" option above.

Enable OnError lines support (Windows only)
Includes line numbers information with the executable for the OnError-Library.

Library Subsystem
Here you can select a different PB subsystem for compilation. Currently the following subsystems are supported:

Windows
nt4 : uses DirectX3 only for any library that uses DirectX in order to be compatible to Windows NT 4.
opengl : uses OpenGL for the 3D libraries.

Linux
gtk1 : uses Gtk1.2 instead of Gtk2 for the compilation. (requires the gtk1.2-dev package)
Note that this subsystem is no longer maintained and some features may be missing.

MacOSX
There are currently no official subsystems for MacOSX.

Executable format
This allows you to specify the created executable format:
Windows : a normal windows executable.
Console : an executable with a default console. This one still can create windows and such, but it always has a console open. When executed from a command prompt, this executable type uses the command terminal as its console and writes there, whereas the "Windows" executable would create a separate Console window when using OpenConsole(). This setting must be used to create a Console application that can have its input/output redirected with pipes.
Shared DLL : create a windows dll. See Building a dll for more info.
Note: When you do "Compile/Run" with a dll source code, it is executed as a normal executable. A dll is only created when you use "create executable".

Cpu Optimisation (next to Executable format)
This setting allows to include Cpu optimised PB functions in your executable:
All CPU : The generic functions are included that run on all CPUs.
Dynamic CPU : The generic functions as well as any available CPU specific function are included. The function to execute is decided at runtime. This creates a bigger executable, but it will run as fast as possible on all CPUs.
All other options : Include only the functions for a specific CPU. The executable will not run on any Cpu that does not support this feature.

Note: No PB functions actually support this feature for now (it is ignored for them). However, some User Libraries include such optimisations.

Linker options file
A textfile can be specified here with further commandline options that should be passed to the linker when creating the executable. The file should contain one option per line.

Source text encoding
This option chooses the text encoding used to save the sourcefile. (also when compiling the source) UTF8 should be used whenever a unicode program is written, as in this case unicode characters can be directly entered in the IDE. It can however also be used when compiling in ascii mode. This makes switching between ascii and unicode mode easier.

When UTF8 encoding is selected, the IDE will place a BOM (Byte Order Mark) at the beginning of the file, so the PureBasic Compiler and other programs can correctly identify it as a UTF8 file.

Source Newline format
This does not effect the compiler, but it sets in which newline-format the source code will be saved the next time. The setting of this field is determined when loading the file. (or uses the default value for new sources). Changing it means that the next time the source is saved, it will be in a different newline-format.

In order to develop one source for many platforms, the PureBasic IDE supports different newline-formats. However, other programs may not, so it is always a good idea to leave this at the OS default if not needed otherwise.

Compile/Run

This section contains options that affect how the executable is run from the IDE for testing. Except for the tools option, they have no effect when the "Create executable" menu is used.

Enable Debugger
This sets the debugger state (on/off) for this source code, or if the main file option is used, for that file too. This can also be set from the debugger menu.

Use selected Debugger
This allows to choose a different debugger type for this file only. If this option is disabled, the default debugger is used which can be specified in the preferences.

Use Warning mode
This allows to choose a different warning mode for this file only. If this option is disabled, the default setting is used which can be specified in the preferences. The available options are:
Ignore Warnings: Warnings will be ignored without displaying anything.
Display Warnings: Warnings will be displayed in the error log and the source code line will be marked, but the program continues to run.
Treat Warnings as Errors: A warning will be treated like an error.

Executable Commandline
The string given here will be passed as the commandline to the program when running it from the IDE.

Current directory
The directory specified here will be set as the current directory for the program when running it from the IDE.

Create temporary executable in the source directory
With this option turned on, the temporary executable file for running the program from the IDE will be placed inside the source directory. This can be useful if the program depends on files inside the source directory for testing. With this option turned off, the executable is created in the systems temporary directory.

Execute tools
Here external tools can be enabled on a per-source basis. The "Global settings" column shows if the tool is enabled or disabled in the tools configuration. A tool will only be executed for the source if it is both enabled globally and for this source.

Note: For a tool to be listed here, it must have the "Enable Tool on a per-source basis" option checked in the tools configuration and be executed by a trigger that is associated with a source file. (ie not by menu or editor startup for example)

Constants

In this section, a set of special editor constants as well as custom constants can be defined which will be predefined when compiling this source.

#PB_Editor_CompileCount
If enabled, this constant holds the number of times that the code was compiled (both with "Compile/Run" and "Create Executable") from the IDE. The counter can be manually edited in the input field.

#PB_Editor_BuildCount
If enabled, this constant holds the number of times that the code was compiled with "Create Executable" only. The counter can be manually edited in the input field.

#PB_Editor_CreateExecutable
If enabled, this constants holds a value of 1 if the code is compiled with the "Create Executable" menu or 0 if "Compile/Run" was used.

Custom constants
Here, custom constants can be defined and then easily switched on/off through checkboxes. Constant definitions should be added as they would be written within the sourcecode. This provides a way to enable/disable certain features in a program by defining a constant here and then checking in the source for it to enable/disable the features with CompilerIf/CompilerEndIf.

Inside the definition of these constants, environment variables can be used by specifying them in a "bash" like style with a "$" in front. The environment variable will be replaced in the constant definition before compiling the source. This allows to pass certain options of the system that the code is compiled on to the program in the form of constants.

Example: #Creator="$USERNAME"
Here, the $USERNAME will be replaced by the username of the logged in user on Windows systems. If an environment variable does not exist, it will be replaced by an empty string.

Note: To test within the sourcecode if a constant is defined or not, the Defined() compiler function can be used.

Version Information

By enabling this, a resource is included in the executable with information about your program. It can be viewed by right-clicking on the executable in the windows explorer and selecting "Properties". Also it can be read by other programs such as setup tools.

Fields marked with a * are required if you want to include the version info. (if not all required fields are set, the information may not display correctly on some versions of Windows.

The first two fields MUST be composed of 4 numbers separated by commas. All other fields may be any string. In the 3 empty boxes, you can define your own fields to include in the Version info block.

In all the string fields, you may include special tokens that are replaced when compiling:
%OS : replaced with the version of Windows used to compile the program
%SOURCE : replaced with the filename (no path) of the source file.
%EXECUTABLE : replaced with the name of the created executable (this only works when "create executable" is used, not with "Compile/Run".
%COMPILECOUNT : replaced with the value for the #PB_Editor_CompileCount constant.
%BUILDCOUNT : replaced with the value for the #PB_Editor_BuildCount constant.

Furthermore, you can use any token listed with the FormatDate() command. These tokens will be replaced with their respective meaning in FormatDate() used with the date of the compilation (i.e. %yy gives the year of the compilation)

Meaning of the lower 3 fields:

File OS
Specifies the OS that this Program is compiled for. (using VOS_DOS or VOS_WINDOWS16 makes not much sense. They are only included to have the full list)

File Type
Type of the executable. (here VFT_UNKNOWN, VFT_APP or VFT_DLL only really make sense for PB programs)

Language
Specifies the language in which this version info is written.

Resources

Here you can include as many Resource scripts (*.rc files) as you want. They will be compiled and included with the executable. You can use any resource editor (for example the PellesC IDE) to create such scripts.

Note: Since Resources are a specific to the Windows platform only, PB does not include a Library to manage them and they are not further documented here. See documentation on the Windows API and resources for more information.

Compiler options for projects

The compiler options for projects allow the definition of multiple compile targets. Each target is basically a set of compiler options with a designated source file and output executable. The left side of the compiler options window is extended with the list of the defined compile targets. The toolbar on top of it allows to create, delete, copy, edit or move targets in the list.

The default target is the one which will be compiled when the "Compile/Run" menu entry is selected. It can be quickly switched with the "Set as default target" checkbox or from the compiler menu. The "Enable in 'Build all Targets'" option specifies wether or not the selected target will be built when the 'Build all Targets' menu entry is used.

The right side of the compiler options is almost the same as in the non-project mode and reflects the settings for the compile target that is currently selected on the left. The only difference are the "Input source file" and "Output executable" fields on the first tab. These fields have to be specified for all compile targets. Other than that, the compiler options are identical to the options described above.

In project mode, the information about the compile target is stored in the project file and not in the individual source files. Information that belongs to the file (such as the folding state) are still saved for the individual source files in the location specified by the Preferences.

The Build progress window

When the 'Build all Targets' menu entry is selected on an open project, all targets that have the corresponding option set in the compiler options will be compiled in the order they are defined in the compiler options. The progress window shows the current compile progress as well as the status of each target. When the process is finished, the build log can be copied to the clipboard or saved to disk.


Using the debugger

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Using the debugger

PureBasic provides a powerful debugger that helps you find mistakes and bugs in your source code. It lets you control the program execution, watch your variables, arrays or linkedlists or display debug output of your programs. It also provides advanced features for assembly programmer to examine and modify the CPU registers or view the program stack, or the Memory of your program. It also provides the possibility to monitor the Cpu and memory usage of your program through the integrated CPU monitor.

To enable the debugger for your program, you can select "Use Debugger" from the debugger menu, or set it in your programs Compiler options. By using the "Compile with Debugger" command from the Compiler menu, you can enable the debugger for just one compilation.

You can directly use debugger commands in your source, such as CallDebugger, Debug, DebugLevel, DisableDebugger and EnableDebugger.

The PureBasic debugger comes in 3 forms:

A Debugger integrated directly with the IDE, for an easy to use, quick way to debug your programs directly from the programming environment. This debugger also provides the most features.

A separate, standalone debugger, that is useful for some special purposes (for example, when the same program must be executed and debugged several times at once) or to be used with third party code Editors. It provides most of the features of the integrated IDE debugger, but because it is separate from the IDE, some of the efficiency of the direct access from the IDE is lost.
The standalone Debugger is currently not available for MacOSX.

A console only debugger. This debuggers primary use is for testing non-graphical environment like on linux systems without an X server, or to remotely develop through ssh.

The type of debugger that is used can be selected in the preferences.

All this debugging functionality however comes at a price. Running a program in debug mode is significantly slower in its execution that running it without the debugger. This should be no problem however, since this is for testing only anyway.
If you need to use the debugger, but have some parts in you program that require the full execution speed, you can disable the debugger in just that section with the DisableDebugger / EnableDebugger keywords.

The Debugger integrated into the IDE

You can access all the debugger features while the program is running from the debugger menu, or the corresponding toolbar buttons or shortcuts.

While you are debugging your program, all the source files that belong to that program (also included files) will be locked to read-only until the program has finished. This helps to ensure that the code that is marked as the currently executed one is has not actually been modified already without a recompilation.

Note that a program can be run only one time at once in IDE debugger mode. If you try to executed it again, you are given the option to execute it with the standalone Debugger.

Tip:
The debugger menu is also added to the system-menu of the Main IDE window (the menu you get when clicking the PB icon in the left/top of the window). This allows you to access the debugger menu also from the Taskbar, by right-clicking on the Taskbar-Icon of the IDE.

Program Control

There are functions for basic control of the running program. You can halt the execution to examine variables and the code position or let the code execute line by line to follow the program flow. While the program is halted, the line that is currently being executed is marked in your source code. (with very light-blue background color in the default colors.)

The state of the program can be viewed in the IDE status bar, and in the Error log area.

Menu commands for program control:

Stop
Halts the Program and displays the current line.

Continue
Continues the program execution until another stop condition is met.

Kill Program
This forces the program to end, and closes all associated debugger windows.

Step
This executes one line of source code and then stops the execution again.

Step <n>
This will execute a number of steps that you can specify and then stop the execution again.

Step Over
This will execute the current line in the source and then stop again, just like the normal 'Step'. The difference is that if the current line contains calls to procedures, the execution will not stop inside these procedures like it does with the normal 'Step', but it will execute the whole procedure and stop after it returned. This allows to quickly skip procedures in step mode.

Step Out
This will execute the remaining code inside the current procedure and stop again after the procedure has returned. If the current line is not in any procedure, a normal 'Step' will be done.

Breakpoints

Breakpoints are another way to control the execution of your program. With the Breakpoint menu command, you mark the currently selected line as a breakpoint (or remove any breakpoint that exists in that line).

When the execution of the code reaches that line, it will stop at this point. Note that if you select a non-executable line (such as an empty line or a Structure definition), it will halt the execution on the next executable line after that.

After the execution of your program has stopped at a breakpoint, you can use any of the Program control commands to continue/end the execution.

Breakpoints can be set and removed dynamically, while your program is running, or while you are editing your source code. With the "Clear Breakpoints" command, you can clear all breakpoints in a source file.

Note: You can also set/remove Breakpoints by holding down the Alt Key and clicking on the border that contains the Breakpoint marks.

Examining variables during runtime

The value of a variable can be very quickly viewed while the program is running by placing the mouse cursor over a variable in the sourcecode and waiting for a brief moment. If the variable is currently in scope and can be displayed, its value will be shown as a tooltip on the mouse location.

More complex expressions (for example array fields) can be viewed by selecting them with the mouse and placing the mouse cursor over the selection.

The debugger tools also offer a number of ways to examine the content of variables, arrays or linkedlists.

Errors in the Program

If the debugger encounters an error in your program, it will halt the execution, mark the line that contains the error (red background in the default colors) and display the error message in the error log and the status bar.

At this point, you can still examine the variables of your program, the callstack or the memory, however other features like the Register display or stack trace are not available after an error.

If the error is determined to be fatal (like an invalid memory access, or division by 0), you are not allowed to continue the execution from this point. If the error was reported by a PureBasic library, you are allowed to try to continue, but in many cases, this may lead to further errors, as simply continuing just ignores the displayed error.

After an error (even fatal ones), you have to use the "Kill Program" command to end the program and continue editing the source code. The reason why the program is not automatically ended is that this would not allow to use the other debugger features (like variable display) to find the cause of the error.

Note: you can configure the debugger to automatically kill the program on any error. See Customizing the IDE for that.

Debugger warnings

In some cases the debugger cannot be sure whether a given parameter is actually an error in the program or was specified like that on purpose. In such a case, the debugger issues a warning. By default, a warning will be displayed with file and line number in the error log and the line will be marked (orange in the default colors). This way the warnings do not go unnoticed, but they do not interrupt the program flow. There is also the option of either ignoring all warnings or treating all warnings like errors (stopping the program). The handling of debugger warnings can be customized globally in the Preferences or for the current compiled program in the Compiler options.

The Error log

The error log is used to keep track of the compiler errors, as well as the messages from the debugging. Messages are always logged for the file they concern, so when an error happens in an included file, this file will be displayed, and a message logged for it.

The "Error log" submenu of the Debugger menu provides functions for that:

Show error log
Shows / hides the log for the current source.

Clear log
Clears the log for this file.

Copy log
Copies the contents of the error log to the clipboard.

Clear Error marks
After you have killed the program, any error mark in the source file will remain. This is to help you identify the line that caused the problem and solve it. The "Clear error Marks" command can be used to remove these marks.

You can also configure the IDE to automatically clean the error marks when the program ends. See Configuring the IDE for that.

The Standalone Debugger

The standalone debugger is very similar to the one in the IDE, and will be explained here only briefly:

On the Debugger window, you have control buttons to carry out the basic program control, as described above. The "Step" button carries out as many steps as are set in the edit field next to it. Closing the Debugger with "Quit" or the close button will also kill the debugged program.

The Error log area can be hidden by the up arrow button on the right side in order to make the debugger window smaller.

The code view is used to display the currently executed code line as well as any errors or breakpoints. Use the combo box above it to select the included file to view. The "Set Breakpoint", "Remove Breakpoint" and "Clear Breakpoints" can be used to manage breakpoints in the currently displayed source file. The code view also provides the mouse-over feature from the integrated debugger to quickly view the content of a variable.

The debugger tools can be accessed from the buttons below the code area. Their usage is the same as with the integrated IDE debugger. The CPU monitor is not available for the standalone debugger.

Note: The Standalone Debugger has no configuration of its own. It will use the debugger settings and coloring options from the IDE. So if you use a third-party Editor and the standalone debugger, you should run the IDE at least once to customize the Debugger settings.

Executing the standalone debugger from the commandline:

To execute a program compiled on the commandline with enabled debugger (-d or /DEBUGGER switch), call the debugger like this:

pbdebugger <executable file> <executable commandline>

If you execute a debugger-enabled executable from the commandline directly, it will only use the commandline debugger.

The commandline debugger:

The commandline debugger is not a part of the IDE and therefore not explained in detail here.

While the program is running, hit Ctrl+C in the console to open a debugger console prompt. In this prompt type "help" to get an overview of all available commands. Type "help <commandname>" for a more detailed description of the command.

Debugging threaded programs:

To use the debugger with a program that creates threads, the 'Create threadsafe executable' Option must be set in the Compiler options, as otherwise the information displayed by the debugger concerning line numbers, errors, local variables and such could be wrong due to the multiple threads.

The following features and limitations should be considered when debugging a threaded program:

While the program is running, the variable viewer, callstack display or assembly debugger will display information on the main thread only. When the program is stopped, they display information on the thread they were stopped in. So to examine local variables or the callstack of a thread, the execution must be halted within that thread (by putting a breakpoint or a CallDebugger statement there). The various 'Step' options always apply to the thread where the execution was last stopped in.
If an error occours, the execution is halted within that thread, so any information displayed by the variable viewer or callstack display is of the thread that caused the error.
The watchlist only watches local variables of the main thread, not those of any additional running threads.

While the execution is stopped within one thread, the execution of all other threads is suspended as well.


Included debugging tools

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Included debugging tools

These tools provide many features to inspect your program while it is running. They can not be used while you are editing the source code. These tools (except for the CPU monitor) are available in both the integrated Debugger and the standalone debugger. The console debugger provides many of these features too, but through a debugger console.

Some of the tools include the viewing of variables. Here is an explanation of the common fields of all these variable displays:

Scope
The scope of a variable is the area in which it is valid. It can be global, local, shared, static or threaded, depending on how it is used in your source code. 'byref' ("by reference", i.e. using the address) is used to indicate an Array or LinkedList that was passed as parameter to a procedure.

Variable type
The variable type is indicated through a colored icon:
Byte
Ascii
Character
Word
Unicode
Long
Integer
Quad
Float
Double
String
Fixed length string

A Structure is either marked as a dot [image], or with an arrow [image]. If marked with an arrow, it can be expanded by double-clicking on it to view the members of this structure. A down arrow marks an expanded structure. A Structure marked with a dot cannot be expanded (usually because it is just a structure pointer).

The Debug output window

In this window, the output of the Debug statement will be displayed. The Debug statement is a quick and simply way to print messages for debugging purposes.

The debug window will automatically open at the first output is produced by your program. If you then close it, it will not automatically open on subsequent messages, however they will still be logged. You can copy this output to the clipboard or save it to a file. There is also a button to clear the messages from the window.

The entry field at the bottom of the window allows an expression to be entered, which will be evaluated and the result printed in the output box. This allows to quickly check the state of variables or array fields without the need to look them up in one of the debugger tools. The evaluation is started by pressing Enter or clicking on the "Display" button. If the expression cannot be evaluated for some reason, an errormessage is displayed in the statusbar.

The expression can be any valid PB expression (not including logical ones or containing PB keywords). It can contain variables, arrays, linked lists, constants and also some commands from the Math, Memory and String libraries.

The Watchlist

The watchlist can be used to track changes in variables of your program in real time, while the program is running. It can only display single variables (no full structures), however, these variables can be a part of structures.

To add a variable, select its procedure (if it is a local variable) or select "--- Main ---" if it is a global variable or part of an array or linked list. Then type the variable name, as you would access it in your source code into the Variable field and press Add.

  Examples:
  MyVariable$                      - add a normal string variable
  Array(1, 5)                      - add an array field
  Structure\subfield[5]\value      – add a variable inside a structure
  MyLinkedList()\structuresubfield – add a variable inside a structured linkedlist
You can also add new watched variables from the VariableViewer, by right-clicking on them and selecting "add to watchlist"

In the list you will see the values of the watched variables. If the value is displayed as "---", it means that this variable is not valid at the current point in the source code. (for example if you watch a local variable, or a linked list element and the list has no current element)

The watched variables are remembered between the debugging sessions, and even saved with the compiler options, so you do not need to re-populate this list all the time.

The Variable Viewer

The Variable viewer allows to examine the program's variables, arrays, linked lists and maps. The individual tabs show global and threaded items in the top part and local, shared and static items in the bottom part.

The "Update" Button can be used to get the most recent data from the program. If the program is halted or in step mode, the content is updated on each step automatically. By right-clicking on any variable or Array/Linked list field, you can copy that variable, or add it to the watchlist for realtime-tracking of its value.

On Windows, the content of the Variable viewer can be sorted by name, scope or variable value by clicking on the header of the appropriate column.

The "Variables" Tab, shows the variables of the program.

The "Arrays" tab shows a list of all arrays in the program and the dimensions in which they are currently defined. (-1 means that Dim was not called yet) By right-clicking on an array, the content of the array can be viewed in the "View Array/List/Map" tab.

The "Linked Lists" tab shows a list of all Linked Lists, the number of elements they currently hold ( "-" indicates that NewList was not called yet), as well as the index of the current element of the list. ( "-" indicates that there is no current element) By right-clicking on a list, the content of the list can be viewed in the "View Array/List/Map" tab.

The "Maps" tab shows a list of all maps, the number of elements they currently hold ( "-" indicates that NewMap was not called yet), as well as the key of the current element of the map. ( "-" indicates that there is no current element) By right-clicking on a map, the content of the map can be viewed in the "View Array/List/Map" tab.

The "View Array/List/Map" tab can be used to view individual entries of an array, a linked list or a map. To do so enter the name of the array, map or list (just the name, no type or "(" ), select what kind of items to display and press "Display". Note that the content of the display is not automatically updated when the program is in step mode.

"Display all items" simply displays everything. "Display Non-zero items only" will only display those items that do not hold the value 0 or an empty string. This makes viewing large arrays/lists with only few valid items in them simpler. A structure is considered "zero" if all of its items either hold the value 0 or an empty string.

"Display Range" allows the selection of a specific range to display by its index. The range can be given for each Array dimension individually, separated by commas. If one dimension is not specified at all, all of its items will be displayed. Here are a few examples for valid range input:
  "1-2, 2-5, 2" : first index between 1 and 2, a second index between 2 and 5 and a third index of 2.
  "1, 2-5"      : first index of 1 and a second index between 2 and 5.
  "1, , 5"      : first index of 1, any second index and a third index of 5.
For map display, the "Display Range" option can be used to filter the keys to be displayed. It has to contain a mask for the key string of the map elements (no quotation marks). A "?" matches one character, a "*" matches any number of characters. Here are a few examples for valid mask input:
  "hat" : matches only the item with "hat" as key.
  "?at" : matches items with "hat", "bat" etc as key.
  "h*t" : matches items with keys that start with "h" and end with "t" and anything inbetween.

The Profiler

The profiler tool can count how often each line in the sourcecode is executed. This collected data can be used to identify which portions of the code are used most often and where improvements make most sense. It also helps to identify problems where a piece of the code is executed too often as a result of an error.

Recording the data
The recording of the data can be controlled by the Start, Stop and Reset (to set all counts to 0) buttons in the profiler window. The Update button can be used to update the graph while the program is running. Each time the program is halted or in step mode, the data is updated automatically. By default, the profiler is recording data from the start of the program. This can be changed in the Preferences.

Examining the data
The recorded data is displayed as a graph, with the vertical axis showing the source line number and the horizontal axis showing how often the lines were executed. If the running program consists of more than one source file, a list of source files is presented below the graph. To display the graph for a file either select it, or check its checkbox. Multiple files can be shown in the graph at once to better compare them. Right-clicking on one of the filenames allows to change the color used to display that file in the graph.

Mouse modes in the graph
Right-clicking inside the graph brings up a popupmenu which allows to zoom in or out or to show the source line that was clicked on in the IDE or code display of the debugger. The action taken by a left-click can be controlled by the buttons on the left side:

Left-clicking and dragging allows to scroll the graph display.
Left-clicking and dragging allows to select an area which will be zoomed in.
While this button is activated, moving the mouse on the graph displays a crosshair to better identify the line and call count under the mouse.
Zoom in
Zoom out
Zoom out so all lines can be viewed

The Callstack viewer

The callstack viewer shows which nested procedure calls led to the current position in the code. Each entry in the list means one procedure that is currently open. It shows the line and file from which it was called, and the arguments that were used to call the procedure. By clicking on the Variables button for each procedure, you can look at the variables of that instance of the procedure.

This allows to easily trace, from which part of the code, a procedure was called. The callstack view does only automatically update when you stop the program, or use Step to execute single lines. While the program is running, you have to use the Update button to update the view for the current code position.

The "Statistics" tab shows the number of times each procedure in the code was called. You can reset the count for all procedures with "Reset all", or for the currently marked entry with the "Reset" button. Like with the callstack, the updates are not automatic while the program is not stopped. Use the Update button for that.

The Memory Viewer

The memory viewer lets you view a memory area in your program. The range to view can be entered into the range fields as any valid PB expression. (This can be a normal decimal value, a hex number preceeded by the '$' character or any other valid expression, including variables or pointers from the code). If the content of the second range field starts with a "+" sign, the content is interpreted as relative to the first field.

Example: "*Buffer + 10" to "+30" will display the 30 bytes of memory starting at the location 10 bytes after what *Buffer points to.

If the memory area is valid for viewing, it will be displayed in the area below. If parts of the area are not valid for reading, you will get an error message. The type of display can be changed with the combo box in the lower left corner. The following view modes are available:

Hex View
The memory will be displayed like in any hex viewer, giving the memory location in hex display on the left, followed by the hexadecimal byte values, and then the string representation in the right column.

Byte/Character/Word/Long/Quad/Float/Double table
The memory area will be shown as a table of the specified variable type. Whether or not this table is single-column or multi-column can be set in the Preferences. (see Configuring the IDE)

String view
This displays the memory area as a string, with any non-string characters displayed in [] (for example "[NULL]" for the 0 byte.) A linebreak is added after newline characters and [NULL] to improve the readability of the output. The memory area can be interpreted as an Ascii, Unicode or Utf8 string.

You can also export the viewed memory area from the memory viewer:

Copy (Text): Copies the displayed area as text to the clipboard.
Save (Text): Saves the displayed area as text to a file.
Save (Raw): Saves the memory area as raw binary to a file.

The Library Viewer

The Library Viewer provides information about the objects that were created by certain libraries. It allows to quickly check which images are currently loaded in the program, or which gadgets are created.

Once the program is started, the combobox on top of the window can be used to select the library to view. The list below will then show all objects of the library that currently exist in the executable along with some additional information on each object. The "Update" button will update this list of objects. Selecting an object in the list will display more detailed information about it in the text area on the left, and if supported by the library also a visual display of the object on the right. (for Images, Sprites, ...)

If the combobox displays "No Information", this means that your executable has used no library that supports this feature.

Currently, the Library Viewer is supported by the following libraries:
Thread
Gadget
Window
File
Image
Sprite
Sprite3D
XML

The Assembly Debugger

The asm debugger is provided for advanced programmers to examine and change the CPU register content and to examine the programs stack for debugging of inline asm code.

The Processor Register view is only available while the program execution is halted. By changing any of the register values and clicking "Set", you can modify the value in that register.

The Stack trace shows the content of the programs stack given in relation to the ESP register. If the current stack position is not aligned at a 4 byte boundary, there can be no information given about the content of the stack. In this case the stack is shown as a hex display.

If the stack pointer is properly aligned, the stack contents are displayed with comments about the meaning of the contained values. (detailing the pushed registers and other values on a PB procedure call.)

The stack trace is updated automatically when you stop the execution or step though the program, unless you specify otherwise in the Preferences. If you disable the automatic update, there will be an "Update" button displayed to do so manually.

Note: The Assembly debugger is currently not available on MacOSX.


Using the buildin Tools

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Using the buildin Tools

The PureBasic IDE comes with many building tools, to make programming tasks easier and increase your productivity. Many of them can be configured to be either accessible from the Menu as separate windows, or to be permanently displayed in the Panel on the side of the editing area.

For information on how to configure these tools and where they are displayed, see Configuring the IDE.

Tools for the Side Panel Area

Procedure Browser

This tool displays a list of all procedures and macros declared in the current source code. By double-clicking on an entry in that list, the cursor automatically jumps to that procedure.

Macros will be marked in the list by a "+" sign before the name.

You can also place special comment marks in your code, that will be displayed in the list too. They look like this: ";- <description>". The ; starts a comment, the ‘-‘ that follows it immediately defines such a mark.

The description will be shown in the Procedure list, and clicking on it will jump to the line of this mark. Such a comment mark can be distinguished from a Procedure by the "> " that is displayed before it in the procedure list.

The list of procedures can be sorted, and it can display the procedure/macro arguments in the list. For these options, see Configuring the IDE.

Project Panel

This tool displays a tree of all files in the current project. A double-click on a file opens it in the IDE. This allows fast access to all files in the project. A right-click on a file opens a context menu which provides more options:

Open - Open the file in the IDE.
Open in FileViewer - Open the file in the FileViewer of the IDE.
Open in Explorer - Open the file in the operating systems file manager.
Add File to Project - Add a new file to the project.
Remove File from Project - Remove the selected file(s) from the project.
Refresh AutoComplete data - Rescan the file for AutoComplete items.
Explorer

The Explorer tool displays an explorer, from which you can select files and open them quickly with a double-click. Text files will be loaded into the edit area and binary files will be displayed in the internal File Viewer.

Variable Viewer

The variable viewer can display variables, Arrays, Linked Lists, Constants, Structures and Interfaces defined in your source code, or any currently opened file. You can configure what exactly it should display in the preferences.
Note: The displaying of variables is somewhat limited for now. It can only detect variables that were explicitly declared by Define, Global, Shared, Protected or Static.

Code Templates

The templates tool allows you to manage a list of small code parts, that you can quickly insert into your source code with a double-click. It allows you to manage the codes in different directories, and put a comment to each code. This tool is perfect to manage small, often used code parts.

Color Picker

The color picker helps you to find the perfect color value for whatever task you need. You can select a color from the area at the bottom and then modify its brightness with the slider above. The two little arrow buttons can be use to reset either selection to the center.

Additionally you can select the color with the sliders on the top. Note that modifying the sliders does not change the selection in the color area, but the other way around it works.

The "Insert Color" button inserts the color value as hex into the source code (i.e. "$FF00FF"). The "Insert RGB" button inserts it in the form of the Rgb() function. (i.e. "RGB(255, 0, 255)"). The "Decimal values" button determines whether the values next to the sliders on top are displayed as hex or decimal.

The "Save color" button saves the color in the history next to the field showing the current color. The color will be added at the top-left field, and all others are moved by one spot. Clicking on any of these saved color values sets them as the current color again.

Ascii Table

The Ascii table tool displays a table showing all the Ascii characters, together with their index in decimal and hex, as well as the corresponding html notation. By double-clicking on any line, this character will be inserted into the source code. With the buttons on the bottom, you can select which column of the table to insert on a double-click.

Other buildin tools

Structure Viewer

The structure viewer allows you to view all the Structures, Interfaces and constants, that are predefined in PureBasic. Double-clicking on a Structure or Interface shows the declaration. On top of the list you can select a filter to display only entries that start with a given character.

The "Back" button navigates back through the viewed entries.
"Insert name" inserts just the name of the selected entry.
"Insert copy" inserts a copy of the declaration of that entry.
"Insert" lets you enter a variable name and then inserts a definition of that variable and the selected entry and all elements of it.

File Viewer

The internal file viewer allows you do display certain types of files. Text files, images and web pages (windows only). Any unknown file type will be displayed in a hex-viewer. The "Open" button opens a new file, the "X button" closes it and the arrows can be used to navigate through the open files.
Also any binary file that you attempt to open from the Explorer tool, or by double-clicking on an IncludeBinary keyword will be displayed in this file viewer.

Other entries in the Tools menu

Visual Designer

The PureBasic Visual Designer can be used to design the user interface for you application. It is not a tool of the IDE, but a separate program. It also has its own help file. See the "VisualDesigner.chm" file in your PureBasic directory for more information.


Using external tools

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Using external tools

The PureBasic IDE allows you to configure external programs to be called directly from the IDE, through the Menu, Shortcuts, the Toolbar, or on special "triggers". The use of this is to make any other program you use while programming easily accessible.

You can also write your own little tools in PureBasic that will perform special actions on the source code you are currently viewing to automate common tasks. Furthermore, you can configure external file viewers to replace the internal File Viewer of the IDE for either specific file types or all files.

With the "Config tools" command in the Tools menu, you can configure such external tools. The list you will see displays all the configured tools in the order they appear in the Tools menu (if not hidden). You can add and remove tools here, or change the order by clicking "Move Up"/"Move Down " after selecting an item.

Any tool can be quickly enabled or disabled from the "Config tools" window with the checkbox before each tool entry. A checked checkbox means the tool is enabled, an unchecked one means it is currently disabled.

Configuring a tool

The basic things you need to set is the commandline of the program to run, and a name for it in the Tools list/Menu. Everything else is optional.

Commandline
Select the program name to execute here.

Arguments
Place commandline arguments that will be passed to the program here. You can place fixed options, as well as special tokens that will be replaced when running the program:

%PATH : will be replaced with the path of the current source code. Remains empty if the source was not saved.
%FILE : filename of the current source code. Remains empty if it has not yet been saved. If you configure the tool to replace the file viewer, this token represents the file that is to be opened.
%TEMPFILE : When this option is given, the current source code is saved in a temporary file, and the filename is inserted here. You may modify or delete the file at will.
%COMPILEFILE : This token is only valid for the compilation triggers (see below). This is replaced with the temporary file that is sent to the compiler for compilation. By modifying this file, you can actually change what will be compiled.
%EXECUTABLE : This will be replaced by the name of the executable that was created in with the last "Create Executable". For the "After Compile/Run" trigger, this will be replaces with the name of the temporary executable file created by the compiler.
%CURSOR : this will be replaced by the current cursor position. In the form of LINExCOLUMN.
%SELECTION : this will be replaced by the current selection in the form of LINESTARTxCOLUMNSTARTxLINEENDxCOLUMNEND. This can be used together with %TEMPFILE, if you want your tool to do some action based on the selected area of text.
%WORD : contains the word currently under the cursor.

Note: for any filename or path tokens, it is generally a good idea to place them in "" (i.e. "%TEMPFILE") to ensure that also paths with spaces in them are passed correctly to the tool. These tokens and a description can also be viewed by clicking the "Info" button next to the Arguments field.

Working Directory
Select a directory in which to execute this tool. By specifying no directory here, the tool will be executed in the directory of the currently open source code.

Name
Select a name for the tool. This name will be displayed in the tools list, and if the tool is not hidden from the menu, also in the Tools menu.

Event to trigger the tool

Here you can select when the tool should be executed. Any number of tools can have the same trigger, they will all be executed when the trigger event happens. The order of their execution depends on the order they appear in the tools list.

Menu Or Shortcut
The tool will not be executed automatically. It will be run by a shortcut or from the Menu. Note: to execute a tool from the Toolbar, you have to add a button for it in the Toolbar configuration in the Preferences (see Configuring the IDE for more).

With this trigger set, the "Shortcut" option below becomes valid and lets you specify a shortcut that will execute this tool.

Editor Startup
The tool will be executed right after the IDE has been fully started.

Editor End
The tool will be executed right before the IDE ends. Note that all open sources have already been closed at this time.

Before Compile/Run
The tool will be executed right before the compiler is called to compile a source code. Using the %COMPILEFILE token, you can get the code to be compiled and modify it. This makes it possible to write a small pre-processor for the source code. Note that you should enable the "Wait until tool quits" option if you want your modifications to be given to the compiler.

After Compile/Run
The tool will be executed right after the compilation is finished, but before the executable is executed for testing. Using the %EXECUTABLE token, you can get access to the file that has just been created. Note that you can modify the file, but not delete it, as that results in an error message when the IDE tries to execute the file.

Run compiled Program
The tool will be executed when the user selects the "Run" command from the compiler menu. The tool is executed before the executable is started. The %EXECUTABLE token is valid here too.

Before create Executable
The same as for the "Before Compile/Run" trigger applies here too, only that the triggering event is when the user creates the final executable.

After create Executable
The tool is executed after the compilation to create the final executable is complete. You can use the %EXECUTABLE token to get the name of the created file and perform any further action on it.

Sourcecode loaded
The tool is executed after a source code has been loaded into the IDE. The %FILE and %PATH tokens are always valid here, as the file was just loaded from the disk.

Sourcecode saved
The tool will be executed after a source code in the IDE has been saved successfully. The %FILE and %PATH tokens are always valid here, as the file has just been saved to disk.

Sourcecode closed
The tool will be executed whenever a source file is about to be closed. At this point the file is still there, so you can still get its content with the %TEMPFILE token. %FILE will be empty if the file was never saved.

File Viewer – All Files
The tool will completely replace the internal file viewer. If an attempt is made in the IDE to open a file that cannot be loaded into the edit area, the IDE will first try the tools that have a trigger set for the specific file type, and if none is found, the file will be directed to this tool. Use the %FILE token to get the filename of the file to be opened.

Note: Only one tool can have this trigger. Any other tools with this trigger will be ignored.

File Viewer – Unknown file
This tool basically replaces the hex viewer, which is usually used to display unknown file types. It will be executed, when the file extension is unknown to the IDE, and if no other external tool is configured to handle the file. (If a tool is set with the "File Viewer – All Files" trigger, than this tool will never be called.)

Note: Only one tool can have this trigger set.

File Viewer – Special file
This configures the tool to handle specific file extensions. It has a higher priority than the "File Viewer – All files" or "File Viewer – Unknown file" triggers and also higher than the internal file viewer itself. Specify the extensions that the tool should handle in the edit box on the right. Multiple extensions can be given.

A common use for this trigger is for example to configure a program like Acrobat Reader to handle the "pdf" extension, which enables you to easily open pdf files from the Explorer, the File Viewer, or by double-clicking on an Includebinary statement in the source.

Other options on the right side

Wait until tool quits
The IDE will be locked for no input and cease all its actions until you tool has finished running. This option is required if you want to modify a source code and reload it afterwards, or have it passed on to the compiler for the compilation triggers.

Run hidden
Runs the program in invisible mode. Do not use this option for any program that might expect user input, as there will be no way to close it in that case.

Hide editor
This is only possible with the "wait until tool quits" option set. Hides the editor while the tool is running.

Reload Source after the tool has quit
This is only possible with the "wait until tool quits" option set, and when either the %FILE or %TEMPFILE tokens are used in the Arguments list.

After your program has quit, the IDE will reload the source code back into the editor. You can select whether it should replace the old code or be opened in a new code view.

Hide Tool from the Main menu
Hides the tool from the Tools menu. This is useful for tools that should only be executed by a special trigger, but not from the menu.

Enable Tool on a per-source basis
Tools with this option set will be listed in the "Execute tools" liste in the compiler options, and only executed for sources where it is enabled there. Note that when disabling the tool with the checkbox here in the "Config tools" window, it will be globally disabled and not run for any sourcecode, even if enabled there.

This option is only available for the following triggers:
- Before Compile/Run
- After Compile/Run
- Run compiled Program
- Before create Executable
- After create Executable
- Sourcecode loaded
- Sourcecode saved
- Sourcecode closed

Supported File extensions
Only for the "File Viewer – Special file" trigger. Enter the list of handled extensions here.

Tips for writing your own code processing tools

The IDE provides additional information for the tools in the form of environment variables. They can be easily read inside the tool with the commands of the Process library.

This is a list of provided variables. Note that those that provide information about the active source are not present for tools executed on IDE startup or end.
  PB_TOOL_IDE         - Full path and filename of the IDE
  PB_TOOL_Compiler    - Full path and filename of the Compiler
  PB_TOOL_Preferences - Full path and filename of the IDE's Preference file
  PB_TOOL_Language    - Language currently used in the IDE
  PB_TOOL_FileList    - A list of all open files in the IDE, separated by Chr(10)

  PB_TOOL_Debugger    - These variables provide the settings from the Compiler Options
  PB_TOOL_InlineASM     window for the current source. They are set to "1" if the option
  PB_TOOL_Unicode       is enabled, and "0" if not.
  PB_TOOL_Thread
  PB_TOOL_XPSkin
  PB_TOOL_OnError

  PB_TOOL_SubSystem   - content of the "Subsystem" field in the compiler options
  PB_TOOL_Executable  - same as the %COMPILEFILE token for the commandline
  PB_TOOL_Cursor      - same as the %CURSOR token for the commandline
  PB_TOOL_Selection   - same as the %SELECTION token for the commandline
  PB_TOOL_Word        - same as the %WORD token for the commandline

  PB_TOOL_MainWindow  - OS handle to the main IDE window
  PB_TOOL_Scintilla   - OS handle to the Scintilla editing component of the current source

When the %TEMPFILE or %COMPILEFILE tokens are used, the IDE appends the compiler options as a comment to the end of the created temporary file, even if the user did choose to not save the options there when saving a source code.

This enables your tool to read the compiler settings for this file, and take them into account for the actions your carries out.


Getting Help

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Getting Help

The PureBasic IDE provides ways to access the PureBasic helpfile, as well as other files and documentation you want to view while programming.

Quick access to the reference guide

By pressing the help shortcut (F1 by default) or selecting the "Help..." command from the Help menu while the mouse cursor is over a PureBasic keyword or function, the help will be opened directly at the description of that keyword or function.

If the word at the cursor position has no help entry, the main reference page will be displayed.

Quick access to Windows API help

There are two ways to get the same quick access as for the PureBasic functions (by pressing F1 with the cursor on the function) also for functions of the Windows API. To enable this feature you have to download additional help files for these functions:

Microsoft Platform SDK

The Microsoft Platform SDK provides the most complete and up to date programming reference available for the windows platform. It provides information on all api functions, as well as overviews and introductions to the different technologies used when programming for the windows platform. It is however quite big (up to 400MB depending on the selected components).

For the IDE help, you can either install the "February 2003" or the "Windows Server 2003 SP1" edition of the SDK.

It can be downloaded from here:
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/

Note that the SDK can also be ordered on CD from this page. Also if you are the owner of any development products from Microsoft (such as Visual Studio), there might be a copy of the SDK included on one of the CDs that came with it.

The win32.hlp helpfile

There is a much smaller alternative to the complete SDK by microsoft (7.5 MB download). This help is quite old (written for Windows95 in fact), so it does not provide any information on new APIs and technologies introduced since then.

However, it provides good information about commonly used APIs, that is still valid today, as these mostly did not change. This download is recommended if you only need occasional help for API functions, but do not want to download the full SDK.

It can be downloaded from here:
http://www.purebasic.com/download/WindowsHelp.zip

To use it from the PureBasic IDE, just create a "Help" subdirectory in your purebasic folder and copy the "win32.hlp" file into it.

Accessing external helpfiles from the IDE

If you have other helpfiles you wish to be able to access from the IDE, then create a "Help" subdirectory in your purebasic folder and copy them to it. These files will appear in the "External Help" submenu of the Help menu, and in the popupmenu you get when right-clicking in the editing area. Chm and Hlp files will be displayed in the MS help viewer. The IDE will open the helpfiles in the internal fileviewer. So files like text files can be viewed directly like this. For other types, you can use the Config Tools menu to configure an external tool to handle the type of helpfile you use. The help will then be displayed in that tool.

For example, if you have pdf helpfiles, configure an external tool to handle pdf files and put the files in the Help subdirectory of PureBasic. Now if you click the file in the "external help" menu, it will be opened in that external tool.


Customizing the IDE

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Customizing the IDE

The PureBasic IDE provides many options to customize or disable some of its features in order to become the perfect tool for you.

These options are accessible from the Preferences command in the File menu, and the meaning of each setting is described here.

Any changes made will only take effect once you click the "OK" button or "Apply".

General

Options that affect the general behaviour of the IDE.

Run only one Instance
If set, prevents the IDE from being opened more than once. Clicking on a PB file in the explorer will open it in the already existing IDE instance instead of opening a new one.

Disable Splash screen
Disables the splash screen that is displayed on start-up.

Memorize Window positions
Remembers the position of all IDE windows when you close them. If you prefer to have all windows open at a specific location and size, enable this option, move all windows to the perfect position, then restart the IDE (to save all options) and then disable this option to always open all windows in the last saved position.

Show window contents while moving the Splitter
Enable this only if you have a fast computer. Otherwise moving the Splitter bar to the Error Log or Tools Panel may flicker a lot.

Auto-Reload last open sources
On IDE start-up, opens all the sources that were open when the IDE was closed the last time.

Display full Source Path in Title bar
If set, the IDE title bar will show the full path to the currently edited file. If not, only the filename is shown.

Recent Files list
This setting specifies how many entries are shown in the "Recent Files" submenu of the File menu.

Search History size
This setting specifies how many recent search words are remembered for "Find/Replace" and "Find in Files"

Visual Designer
This setting allows to set a different visual designer program when selecting the Menu command or toolbar icon.

General - Language

This allows you to change the language of the IDE. The combo box show the available languages, and you can view some informations about the language file. (for example who translated it and its last time of update.)

General - Shortcuts

Here you can fully customize all the shortcut commands of the IDE. Select an entry from the list, select the shortcut field, enter the new key combination and click "Set" to change the entry.

Note that Tab & Shift+Tab are reserved for block-indentation and unindentation and cannot be changed. Furthermore some key combination might have a special meaning for the OS and should therefore not be used.

General - Themes

This section shows the available icon themes for the IDE and allows to select the theme to use. The IDE comes with two themes by default.

More themes can be easily added by creating a zip-file containing the images (in png format) and a "Theme.prefs" file to describe the theme. The zip-file has to be copied to the "Themes" folder in the PureBasic installation directory to be recognized by the IDE. The "SilkTheme.zip" file can be used as an example to create a new theme.

Display Icons in the Menu
Allows to hide/show the images in the IDE menus.

Show main Toolbar
Allows to hide/show the main toolbar in order to gain space for the editing area.

General - Toolbar

This allows to fully customize the main Toolbar. By selecting an entry and using the Buttons in the "Position" section, you can change the order. The "Item Settings" section can be used to modify the entry or add a new one. (new ones are always added at the end of the list)

Types of items:
Separator : a vertical separator line.
Space : an empty space, the size of one toolbar icon.
Standard Icon : allows you to select a OS standard icon from the combo box on the right.
IDE Icon : allows you to select one of the IDE's own icons in the combo box on the right.
Icon File : allows you to specify your own icon file to use in the edit box on the right. (PNG files are supported on all platforms, Windows additionaly supports icon files.)

If you do not select a separator or space, you can specify an action to carry out when the button is pressed:
Menu Item : carries out the menu command specified in the combo box on the right.
Run tool : executes the external tool specified in the combo box on the right.

The "Default Sets" section contains two standard toolbar sets which you can select, and later modify.

Editor

Settings that affect the management of the source codes.

Auto-save before Compile/Run
Saves the current source code before each compile/run. Note that any open include files are never automatically saved.

Auto-save before Create Executable
Saves the current source before creating an executable file.

Save all sources with Auto-save
Saves all sources instead of just the current one with one of the Auto-save options.

Memorize cursor position
Saves the current cursor position, as well as the state of all folding marks with the compiler options for the source file.

Memorize Marker positions
Saves all the Markers with the options for the source file.

Always hide the error log
The error log can be shown/hidden on a per-source basis. This option provides a global setting to ignore the per-source setting and never display the error log. It also removes the corresponding menu entries from the IDE menu.

Save settings to
This option allows to specify where the compiler options of a source file are saved:

The end of the Source file
Saves the settings as a special comment block at the end of each source file.

The file <filename>.pb.cfg
Creates a .pb.cfg file for each saved source code that contains this information.

A common file project.cfg for every directory
Creates a file called project.cfg in each directory where PB files are saved. This one file will contain the options for all files in that directory.

Don't save anything
No options are saved. When reopening a source file, the defaults will always be used.

Tab Length
Allows to specify how many spaces are inserted each time you press the Tab key.

Use real Tab (Ascii 9)
If set, the tab key inserts a real tab character instead of spaces. If not set, there are spaces inserted when Tab is pressed.

Note that if real tab is used, the "Tab Length" option specifies the size of one displayed tab character.

Source Directory
Specifies the default directory used in the Open and Save dialogs if no other files are currently open (if another file is open, its path will be used as default).

Set this to the path were you usually save the source codes.

Editor - Defaults

This page allows you to set the default compiler options that will be used when you create a new source code with the IDE.

For an explanation of the meaning of each field, see the Compiler Options.

Editor - Fonts/Margins

Use "Select Font" to change the font used to display the source code. To ensure a good view of the source code, it should be a fixed-size font, and possibly even one where bold characters have the same size as non-bold ones.

Enable Syntax coloring
Enable/Disable the coloring of the source code. Disabling it makes the IDE a little bit faster.

Enable bolding of keywords
If your font does not display bold characters in the same size as non-bold ones, you should disable this option. If disabled, the keywords will not be shown as bold.

Enable case correction
If enabled, the case of PureBasic keywords, PureBasic Functions as well as predefined constants will automatically be corrected while you type.

Enable marking of matching Braces
If enabled, the brace matching the one under the cursor will be hilighted.

Enable marking of matching Keywords
If enabled, the keyword(s) matching the one under the cursor will be underlined.

Display line numbers
Shows or hides the line number column on the left.

Enable Markers
Enables or disables the ‘Marker' feature of the Edit menu.

Enable Source Line folding
Enables or disables the the folding feature. Disabling both folding and Markers will remove the symbol column at the left of the source code.

Editor - Colors

Here you can change the color settings for the syntax coloring, as well as he debugger marks. Default color schemes can be selected from the box on the bottom, and also modified after they have been set. Individual color settings can be disabled by use of the checkboxes.

Note: The 'Accessibility' color scheme has (apart from high-contrast colors) a special setting to always use the system color for the selection in the code editor. This helps screen-reader applications to better detect the selected text.

Editor - Colors - Custom Keywords

In this section, a list of custom keywords can be defined. These keywords can have a special color assigned to them in the coloring options and the IDE will apply case-correction to them if this feature is enabled. This allows for applying a special color to special keywords by preprocessor tools or macro sets, or to simply have some PB keywords colored differently.

Note that these keywords take precedence above all other coloring in the IDE, so this allows to change the color or case correction even for PureBasic keywords.

The keywords can be either entered directly in the preferences or specified in a textfile with one keyword per line. (or both)

Editor - Folding

Here you can set the keywords in the source code that start/end a foldable section of code. You can add any number of words that will mark such a sections.

Words that are found inside comments are ignored, unless the defined keyword includes the comment symbol at the start. (like the default ";{" keyword)

A keyword may not include spaces.

Editor - Auto complete

Display the full Auto complete list
Always displays all keywords in the list, but selects the closest match.

Display all words that start with the first character
Displays only those words that start with the same character as you typed. The closest mach is selected.

Display only words that start with the typed word
Does not display any words that do not start with what you typed. If no words match, the list is not displayed at all.

Box width / Box height
Here you can define the size of the auto complete list (in pixel). Note that these are maximum values. The displayed box may become smaller if there are only a few items to display.

Add opening Brackets to Functions/Arrays/Lists
Will automatically add a "(" after any function/Array/Linked list inserted by auto complete. Functions with no parameters or Linked lists get a "()" added.

Add a Space after PB Keywords followed by an expression
When inserting PB keywords that cannot appear alone, a space is automatically added after them.

Add matching ‘End' keyword if Tab/Enter is pressed twice
If you press Tab or Enter twice, it will insert the corresponding end keyword (for example "EndSelect" to "Select" or "EndIf " to "If") to the keyword you have just inserted. The end keyword will be inserted after the cursor, so you can continue typing after the first keyword that was inserted.

Automatically popup AutoComplete for Structure items
Displays the list automatically whenever a structured variable or interface is entered and the "\" character is typed after it to show the list of possible structure fields. If disabled, the list can still be displayed by pressing the keyboard shortcut to open the AutoComplete window (usually Ctrl+Space, this can be modified in the Shortcuts section of the Preferences).

Automatically popup AutoComplete outside of Structures
Displays the list automatically when the current word is not a structure after a certain amound of characters has been typed, and a possible match in the list is found. If disabled, the list can still be displayed by pressing the assigned keyboard shortcut.

Disable automatic Popup inside Strings / Comments
Disables the above auto popup feature inside of strings or comments.

Characters needed before opening the list
Here you can specify how many characters the word must have minimum before the list is automatically displayed.

Editor - Auto complete - Displayed items

This shows a list of possible items that can be included with the possible matches in the AutoComplete list.

Sourcecode Items
Items defined in the active source code, or other open sources (see below).

Predefined Items
Items that are predefined by PureBasic, such as the PureBasic keywords, functions or predefined constants.

Add Items from: the current source only
Sourcecode items are only added from the active source code.

Add Items from: the current project (if any)
Sourcecode items are added from the current project if there is one. The other source codes in the project do not have to be currently open in the IDE for this.

Add Items from: the current project or all files (if none)
Sourcecode items are added from the current project. If the current source code does not belong to the open project then the items from all open source codes will be added.

Add Items from: all open files
Sourcecode items are added from all currently open source codes.

Debugger

Settings for the internal Debugger, or the Standalone Debugger. The commandline debugger is configured from the commandline only.

Debugger Type
Select the type of debugger you want to use when compiling from the IDE here.

Choose Warning level
Select the action that should be taken if the debugger issues a warning. The available options are:
Ignore Warnings: Warnings will be ignored without displaying anything.
Display Warnings: Warnings will be displayed in the error log and the source code line will be marked, but the program continues to run.
Treat Warnings as Errors: A warning will be treated like an error.
See Using the debugger for more information on debugger warnings and errors.

Memorize debugger window positions
The same as the "Memorize Window positions" for in the General section, but for all Debugger windows.

Keep all debugger windows on top
All debugger windows will be kept on top of all other windows, even from other applications.

Bring Debugger windows to front when one is focused
With this option set, focusing one window that belongs to the debugger of a file, all windows that belong to the same debugging session will be brought to the top.

Display Timestamp in error log
Includes the time of the event in the error log.

Stop execution at program start
Each program will be started in an already halted mode, giving you the opportunity to start moving step by step, right from the start of the program.

Stop execution before program end
Stops the program execution right before the executable would unload. This gives you a last chance to use the debugging tools to examine Variables or Memory before the program ends.

Kill Program after an Error
If a program encounters an error, it will be directly ended and all debugger windows closed. This gives the opportunity to directly modify the code again without an explicit "Kill Program", but there is no chance to examine the program after an error.

Keep Error marks after program end
Does not remove the lines marked with errors when the program ends. This gives the opportunity to still see where an error occurred while editing the code again.

The marks can be manually removed with the "Clear error marks" command in the "Error log" submenu of the debugger menu.

Clear error log on each run
Clears the log window when you execute a program. This ensures that the log does not grow too big. (This option is also available with the commandline debugger selected.)

Timeout for Debugger startup
Specifies the time in milliseconds how long the debugger will wait for a program to start up before giving up. This timeout prevents the debugger from locking up indefinately if the executable cannot start for some reason.

Debugger - Individual Settings

This allows to set options for the individual debugger tools. The "Display Hex values" options switch between displaying Byte, Long and Word as decimal or hexadecimal values.

Debug Output – Add Timestamp
Adds a timestamp to the output displayed from the Debug command.

Debug Output - Display debug output in the error log
With this option enabled, a Debug command in the code will not open the Debug Output window, but instead show the output in the error log.

Debug Output – Use custom font
A custom font can be selected here for the debug output window. This allows to specify a smaller font for much output or a proportional one if this is desired.

Profiler - Start Profiler on program startup
Determines wether the profiler tool should start recording data when the program starts.

Asm Debugger – Update Stack trace automatically
Updates the stack trace automatically on each step/stop you do. If disabled, a manual update button will be displayed in the Asm window.

Memory Viewer – Array view in one column only
If the memory area is displayed in array view, this option selects whether it should be multi-column (with 16 bytes displayed in each column) or with only one column.

Debugger - Default Windows

The debugger tools you select on this page will automatically be opened each time you run a program with enabled debugger.

Tools Panel

This allows to configure the internal tools that can be displayed in the side panel. Each tool that is in the "Displayed Tools" list is displayed in the Panel on the side of the edit area. Each tool that is not listed there is accessible from the Tools menu as a separate window.
Put only those tools in the side panel that you use very frequently, and put the most frequently used first, as it will be the active one once you open the IDE.

By selecting a tool in either of the lists, you get more configuration options for that tool (if there are any) in the "Configuration" section below.

Here is an explanation of those tools that have special options:

Explorer
You can select between a Tree or List display of the file system. You can also set whether the last displayed directory should be remembered, or if the Source Path should be the default directory when the IDE is started.

Color Picker
You can change the number of saved color buttons that will be displayed in the Colorpicker.

Procedure Browser
"Sort Procedures by Name" : sorts the list alphabetically (by default they are listed as they appear in the code).
"Group Markers" : groups the ";-" markers together.
"Display Procedure Arguments" : Displays the full declaration of each procedure in the list.

Variable Viewer
The "Display Elements from all open sources" option determines whether the list should only include items from this code, or from all open codes.

Furthermore you can select the type of items displayed in the Variable viewer.

Tools panel - Options

Here you can customize the appearance of the Tools Panel a bit more. You can select the side on which it will be displayed, a Font for its text, as well as a foreground and background color for the displayed tools. The font and color options can be disabled to use the OS defaults instead.

Do not use colors/fonts for tools in external windows
If set, the color/font options only apply to the Tools displayed in the Panel, those that you open from the Tools menu will have the default colors.

Automatically hide the Panel
To save space, the Panel will be hidden if the mouse is not over it. Moving the mouse to the side of the IDE will show it again.

Milliseconds delay before hiding the Panel
Sets a timeout in ms, after which the Panel is hidden if you leave it with the mouse.

Import/Export

This section allows you to export the layout settings of the IDE in a platform independent format, which allows you to import them again into the PureBasic IDE on another Operating System, or to share your options with other PB users.

To export your settings, select what types of settings you want to include, select a filename and press the "Save" button.

To import settings, select the filename and press "Open". You will then see the options that are included in this file as enabled checkboxes. After selecting what you want to import, click the "Import Settings" button.

For the new settings to take effect, you have to first click the apply button.

Note: You can import the style files from the jaPBe Editor, but only the color settings will be imported.


Commandline options for the IDE

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Commandline options for the IDE

The PureBasic IDE allows you to modify the paths and files being used from the commandline. This allows you to create several shortcuts that start the IDE with different configurations for different users, or for different projects.

Possible commandline options are:

  /P <Preferences file>    loads/saves all the configuration to/from the given file.
  /T <Templates file>      loads/saves the code templates from/to the given file.
  /A <tools file>          loads/saves the configuration of the external tool from/to this file.
  /S <Source path>         overwrites the "Source path" setting from the preferences
  /E <Explorer path>       starts the Explorer tool with the given path
  /L <Line number>         moves the cursor to the given line number in the last opened file
  /NOEXT                   disables the registering of the .pb extension in the registry.
  /LOCAL                   puts all preferences in the PureBasic directory instead of the user profile location.
  /PORTABLE                the same as /LOCAL and /NOEXT combined
The default files for /P /T and /A are saved in the %APPDATA%\PureBasic\ directory on the system.

The /NOEXT command is useful when you have several different PB versions at once (for testing of beta versions for example), but want the .pb extension to be associated with only one of them. The /PORTABLE command can be used to keep all configuration inside the local directory to easily copy PureBasic to different computers (or run it from USB sticks for example).

Example:
  PureBasic.exe Example.pb /PORTABLE

You can also put filenames of source files to load on the commandline. You can even specify wildcards for them. (so with "*.pb" you can load a whole directory.)


Pure Basic Reference Manual

Интегрированная среда разработки IDE

Getting started
Working with files
Editing features
Managing projects
Compiling your programs
Using the debugger
Using the debugging Tools
Buildin Tools
External Tools
Getting help
Customizing the IDE
IDE Commandline options

Общие Темы

+Using the visual designer
?Using the command line compiler
+General Syntax Rules
?Variables, Types and Operators

Основные Ключевые слова

+Break : Continue
+For : Next
+ForEach : Next
+Gosub : Return
+If : Else : EndIf
+Repeat : Until
+Select : EndSelect
+While : Wend
+Другие команды

Массивы, Списки, Карты и Структуры

+Define
+Dim : ReDim
+Enumeration : EndEnumeration
+Interface : EndInterface
+NewList
+NewMap
+Structure : EndStructure
+With : EndWith

Поддержка процедур

+Global
+Procedure : EndProcedure
+Protected
+Shared
+Static

Расширенные Ключевые слова

+Import : EndImport
+Macro : EndMacro
+Prototype
+Pseudotype
+Threaded

Различные Темы

+PureBasic objects overview
+Handles and Numbers
+Pointers and Memory access
+Data
+Debugger Commands
+'Include' Functions
+Compiler Directives
+Compiler Functions
+Inlined x86 ASM
+Building a DLL
+Unicode
+Использование разных версий РВ одновременно

Дополнительная Информация

?Системы счисления (Taблица)
+ASCII-Коды и их соответствия
+Mатематические формулы
+Таблица цветов
+Номера портов (для интернета)
Полезные ссылки

Общие Библиотеки

+2D Drawing
+AudioCD
+Cipher
+Clipboard
+Console
+Database
+Date
+Desktop
+Drag & Drop
+File
+FileSystem
+Ftp
+Font
+Gadget
+Help
+Http
+Image
+ImagePlugin
+Library
+Linked List
+Mail
+Map
+Math
+Memory
+Menu
+Misc
+Movie
+Network
+OnError
+Packer
+Preference
+Printer
+Process
+Regular Expression
+Requester
+Scintilla
+Serial Port
+Sort
+StatusBar
+String
+SysTray
+Thread
+Toolbar
+Window
+XML

Библиотеки для игр 2D

+Joystick
+Keyboard
+Module
+Mouse
+Palette
+Sprite & Screen
+Sprite3D
+Sound
+SoundPlugin

Библиотеки для игр 3D

Engine3D
+Billboard
+Camera
Entity
Gadget 3D
Light
Material
Mesh
Node
Particle
Sound 3D
Terrain
Texture
Window 3D

Дополнительно устанавливаемые библиотеки

+XP_Menu_Lib

Индекс команд


PureBasic - Index

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

PureBasic - Index

A - B - C - D - E - F - G - H - I - J - K - L - M - N - O - P - R - S - T - U - V - W - X - Y - Z

A
ACos
AESDecoder
AESEncoder
ASin
ATan
Abs
Add3DArchive
AddBillboard
AddCipherBuffer
AddDate
AddElement
AddGadgetColumn
AddGadgetItem
AddGadgetItem3D
AddKeyboardShortcut
AddMailAttachment
AddMailAttachmentData
AddMailRecipient
AddMapElement
AddMaterialLayer
AddPackFile
AddPackMemory
AddStatusBarField
AddSysTrayIcon
AddWindowTimer
AllocateMemory
Alpha
AlphaBlend
AmbientColor
AnimateEntity
AntialiasingMode
Asc
AttachNodeObject
AudioCDLength
AudioCDName
AudioCDStatus
AudioCDTrackLength
AudioCDTrackSeconds
AudioCDTracks
AvailableProgramOutput
AvailableScreenMemory
AvailableSerialPortInput
AvailableSerialPortOutput
B
BackColor
Base64Decoder
Base64Encoder
BillboardGroupID
BillboardGroupLocate
BillboardGroupMaterial
BillboardGroupX
BillboardGroupY
BillboardGroupZ
BillboardHeight
BillboardLocate
BillboardWidth
BillboardX
BillboardY
BillboardZ
Bin
Blue
Box
BoxedGradient
ButtonGadget
ButtonGadget3D
ButtonImageGadget
C
CRC32FileFingerprint
CRC32Fingerprint
CalendarGadget
CallCFunction
CallCFunctionFast
CallFunction
CallFunctionFast
CameraBackColor
CameraFOV
CameraID
CameraLocate
CameraLookAt
CameraProjectionMode
CameraProjectionX
CameraProjectionY
CameraRange
CameraRenderMode
CameraX
CameraY
CameraZ
CatchImage
CatchModule
CatchSound
CatchSprite
CatchXML
ChangeAlphaIntensity
ChangeCurrentElement
ChangeGamma
ChangeSysTrayIcon
CheckBoxGadget
CheckBoxGadget3D
CheckEntityCollision
CheckFTPConnection
CheckFilename
ChildXMLNode
Chr
Circle
CircularGradient
ClearBillboards
ClearClipboard
ClearConsole
ClearGadgetItems
ClearGadgetItems3D
ClearList
ClearMap
ClearScreen
ClipSprite
CloseConsole
CloseDatabase
CloseFTP
CloseFile
CloseGadgetList
CloseGadgetList3D
CloseHelp
CloseLibrary
CloseNetworkConnection
CloseNetworkServer
ClosePack
ClosePreferences
CloseProgram
CloseScreen
CloseSerialPort
CloseSubMenu
CloseWindow
CloseWindow3D
ColorRequester
ComboBoxGadget
ComboBoxGadget3D
CompareMemory
CompareMemoryString
ConicalGradient
ConnectionID
ConsoleColor
ConsoleCursor
ConsoleError
ConsoleLocate
ConsoleTitle
ContainerGadget
ContainerGadget3D
CopyDirectory
CopyEntity
CopyFile
CopyImage
CopyLight
CopyMaterial
CopyMemory
CopyMemoryString
CopyMesh
CopySprite
CopyXMLNode
Cos
CountBillboards
CountGadgetItems
CountGadgetItems3D
CountLibraryFunctions
CountMaterialLayers
CountProgramParameters
CountRenderedTriangles
CountString
CreateBillboardGroup
CreateCamera
CreateDirectory
CreateEntity
CreateFTPDirectory
CreateFile
CreateImage
CreateImageMenu
CreateLight
CreateMail
CreateMaterial
CreateMenu
CreateMesh
CreateMutex
CreateNetworkServer
CreateNode
CreatePack
CreatePalette
CreateParticleEmitter
CreatePopupImageMenu
CreatePopupMenu
CreatePreferences
CreateRegularExpression
CreateSemaphore
CreateSprite
CreateSprite3D
CreateStatusBar
CreateTerrain
CreateTexture
CreateThread
CreateToolBar
CreateWater
CreateXML
CreateXMLNode
CustomFilterCallback
CustomGradient
D
DESFingerprint
DatabaseColumnName
DatabaseColumnSize
DatabaseColumnType
DatabaseColumns
DatabaseDriverDescription
DatabaseDriverName
DatabaseError
DatabaseID
DatabaseQuery
DatabaseUpdate
Date
DateGadget
Day
DayOfWeek
DayOfYear
DefaultPrinter
Delay
DeleteDirectory
DeleteElement
DeleteFTPDirectory
DeleteFTPFile
DeleteFile
DeleteMapElement
DeleteXMLNode
DesktopDepth
DesktopFrequency
DesktopHeight
DesktopMouseX
DesktopMouseY
DesktopName
DesktopWidth
DesktopX
DesktopY
DetachNodeObject
DirectoryEntryAttributes
DirectoryEntryDate
DirectoryEntryName
DirectoryEntrySize
DirectoryEntryType
DisableGadget
DisableGadget3D
DisableMaterialLighting
DisableMenuItem
DisableToolBarButton
DisableWindow
DisableWindow3D
DisplayAlphaSprite
DisplayPalette
DisplayPopupMenu
DisplayRGBFilter
DisplayShadowSprite
DisplaySolidSprite
DisplaySprite
DisplaySprite3D
DisplayTranslucentSprite
DisplayTransparentSprite
DragFiles
DragImage
DragOSFormats
DragPrivate
DragText
DrawAlphaImage
DrawImage
DrawRotatedText
DrawText
DrawingBuffer
DrawingBufferPitch
DrawingBufferPixelFormat
DrawingFont
DrawingMode
E
EditorGadget
EditorGadget3D
EjectAudioCD
ElapsedMilliseconds
Ellipse
EllipticalGradient
EnableGadgetDrop
EnableGraphicalConsole
EnableWindowDrop
EnableWorldCollisions
EnableWorldPhysics
Engine3DFrameRate
EntityAnimationLength
EntityID
EntityLocate
EntityLookAt
EntityMaterial
EntityPhysicBody
EntityRenderMode
EntityX
EntityY
EntityZ
EnvironmentVariableName
EnvironmentVariableValue
Eof
ErrorAddress
ErrorCode
ErrorFile
ErrorLine
ErrorMessage
ErrorRegister
ErrorTargetAddress
EventClient
EventDropAction
EventDropBuffer
EventDropFiles
EventDropImage
EventDropPrivate
EventDropSize
EventDropText
EventDropType
EventDropX
EventDropY
EventGadget
EventGadget3D
EventMenu
EventServer
EventTimer
EventType
EventType3D
EventWindow
EventWindow3D
ExamineAssembly
ExamineDatabaseDrivers
ExamineDesktops
ExamineDirectory
ExamineEnvironmentVariables
ExamineFTPDirectory
ExamineIPAddresses
ExamineJoystick
ExamineKeyboard
ExamineLibraryFunctions
ExamineMD5Fingerprint
ExamineMouse
ExaminePreferenceGroups
ExaminePreferenceKeys
ExamineSHA1Fingerprint
ExamineScreenModes
ExamineWorldCollisions
ExamineXMLAttributes
ExplorerComboGadget
ExplorerListGadget
ExplorerTreeGadget
ExportXML
ExportXMLSize
ExtractRegularExpression
F
FTPDirectoryEntryAttributes
FTPDirectoryEntryDate
FTPDirectoryEntryName
FTPDirectoryEntryRaw
FTPDirectoryEntrySize
FTPDirectoryEntryType
FTPProgress
FileBuffersSize
FileID
FileSeek
FileSize
FillArea
FillMemory
FindMapElement
FindString
FinishCipher
FinishDatabaseQuery
FinishDirectory
FinishFTPDirectory
FinishFingerprint
FirstDatabaseRow
FirstElement
FirstWorldCollisionEntity
FlipBuffers
FlushFileBuffers
Fog
FontID
FontRequester
FormatDate
FormatXML
Frame3DGadget
Frame3DGadget3D
FreeBillboardGroup
FreeCamera
FreeEntity
FreeFont
FreeGadget
FreeGadget3D
FreeImage
FreeLight
FreeMail
FreeMaterial
FreeMemory
FreeMenu
FreeMesh
FreeModule
FreeMovie
FreeMutex
FreeNode
FreePalette
FreeParticleEmitter
FreeRegularExpression
FreeSemaphore
FreeSound
FreeSound3D
FreeSprite
FreeSprite3D
FreeStatusBar
FreeTexture
FreeToolBar
FreeXML
FrontColor
G
GadgetHeight
GadgetHeight3D
GadgetID
GadgetID3D
GadgetItemID
GadgetToolTip
GadgetToolTip3D
GadgetType
GadgetType3D
GadgetWidth
GadgetWidth3D
GadgetX
GadgetX3D
GadgetY
GadgetY3D
GetActiveGadget
GetActiveGadget3D
GetActiveWindow
GetActiveWindow3D
GetClientIP
GetClientPort
GetClipboardImage
GetClipboardText
GetCurrentDirectory
GetDatabaseBlob
GetDatabaseDouble
GetDatabaseFloat
GetDatabaseLong
GetDatabaseQuad
GetDatabaseString
GetEntityAnimationTime
GetEntityFriction
GetEntityMass
GetEnvironmentVariable
GetExtensionPart
GetFTPDirectory
GetFileAttributes
GetFileDate
GetFilePart
GetFunction
GetFunctionEntry
GetGadgetAttribute
GetGadgetAttribute3D
GetGadgetColor
GetGadgetData
GetGadgetData3D
GetGadgetFont
GetGadgetItemAttribute
GetGadgetItemColor
GetGadgetItemData
GetGadgetItemData3D
GetGadgetItemState
GetGadgetItemState3D
GetGadgetItemText
GetGadgetItemText3D
GetGadgetState
GetGadgetState3D
GetGadgetText
GetGadgetText3D
GetHTTPHeader
GetHomeDirectory
GetMailAttribute
GetMailBody
GetMenuItemState
GetMenuItemText
GetMenuTitleText
GetModulePosition
GetModuleRow
GetPaletteColor
GetPathPart
GetSerialPortStatus
GetTemporaryDirectory
GetToolBarButtonState
GetURLPart
GetWindowColor
GetWindowState
GetWindowTitle
GetWindowTitle3D
GetXMLAttribute
GetXMLEncoding
GetXMLNodeName
GetXMLNodeOffset
GetXMLNodeText
GetXMLStandalone
GrabDrawingImage
GrabImage
GrabSprite
GradientColor
Green
H
Hex
HideBillboardGroup
HideEntity
HideGadget
HideGadget3D
HideLight
HideMenu
HideParticleEmitter
HideWindow
HideWindow3D
HostName
Hour
HyperLinkGadget
I
IPAddressField
IPAddressGadget
IPString
ImageDepth
ImageGadget
ImageGadget3D
ImageHeight
ImageID
ImageOutput
ImageWidth
InitAudioCD
InitEngine3D
InitJoystick
InitKeyboard
InitMouse
InitMovie
InitNetwork
InitPalette
InitScintilla
InitSound
InitSprite
InitSprite3D
Inkey
Input
InputEvent3D
InputRequester
InsertElement
InsertString
InstructionAddress
InstructionString
Int
IntQ
IsBillboardGroup
IsCamera
IsDatabase
IsDirectory
IsEntity
IsFile
IsFingerprint
IsFont
IsFtp
IsGadget
IsGadget3D
IsImage
IsLibrary
IsLight
IsMail
IsMaterial
IsMenu
IsMesh
IsModule
IsMovie
IsNode
IsPalette
IsParticleEmitter
IsProgram
IsRegularExpression
IsScreenActive
IsSerialPort
IsSound
IsSound3D
IsSprite
IsSprite3D
IsStatusBar
IsSysTrayIcon
IsTexture
IsThread
IsToolBar
IsWindow
IsWindow3D
IsXML
J
JoystickAxisX
JoystickAxisY
JoystickButton
K
KeyboardInkey
KeyboardMode
KeyboardPushed
KeyboardReleased
KillProgram
KillThread
L
LCase
LSet
LTrim
LastElement
Left
Len
LibraryFunctionAddress
LibraryFunctionName
LibraryID
LightColor
LightLocate
LightSpecularColor
Line
LineXY
LinearGradient
ListIconGadget
ListIndex
ListSize
ListViewGadget
ListViewGadget3D
LoadFont
LoadImage
LoadMesh
LoadModule
LoadMovie
LoadPalette
LoadSound
LoadSound3D
LoadSprite
LoadTexture
LoadWorld
LoadXML
Loc
LockMutex
Lof
Log
Log10
M
MD5FileFingerprint
MD5Fingerprint
MDIGadget
MailProgress
MainXMLNode
MakeIPAddress
MapKey
MapSize
MatchRegularExpression
MaterialAmbientColor
MaterialBlendingMode
MaterialDiffuseColor
MaterialFilteringMode
MaterialID
MaterialShadingMode
MaterialSpecularColor
MemorySize
MemoryStringLength
MenuBar
MenuHeight
MenuID
MenuItem
MenuTitle
MeshID
MessageRequester
Mid
Minute
ModuleVolume
Month
MouseButton
MouseDeltaX
MouseDeltaY
MouseLocate
MousePick
MouseWheel
MouseX
MouseY
MoveBillboard
MoveBillboardGroup
MoveCamera
MoveEntity
MoveLight
MoveMemory
MoveNode
MoveParticleEmitter
MoveXMLNode
MovieAudio
MovieHeight
MovieInfo
MovieLength
MovieSeek
MovieStatus
MovieWidth
N
NetworkClientEvent
NetworkServerEvent
NewPrinterPage
NextDatabaseDriver
NextDatabaseRow
NextDirectoryEntry
NextElement
NextEnvironmentVariable
NextFTPDirectoryEntry
NextFingerprint
NextIPAddress
NextInstruction
NextLibraryFunction
NextMapElement
NextPackFile
NextPreferenceGroup
NextPreferenceKey
NextScreenMode
NextSelectedFilename
NextWorldCollision
NextXMLAttribute
NextXMLNode
NodeID
NodeLocate
NodeLookAt
NodeX
NodeY
NodeZ
O
OSVersion
OnErrorCall
OnErrorDefault
OnErrorExit
OnErrorGoto
OpenConsole
OpenDatabase
OpenDatabaseRequester
OpenFTP
OpenFile
OpenFileRequester
OpenGadgetList
OpenGadgetList3D
OpenHelp
OpenLibrary
OpenNetworkConnection
OpenPack
OpenPreferences
OpenScreen
OpenSerialPort
OpenSubMenu
OpenWindow
OpenWindow3D
OpenWindowedScreen
OptionGadget
OptionGadget3D
OutputDepth
OutputHeight
OutputWidth
P
PackFileSize
PackMemory
PackerCallback
PanelGadget
PanelGadget3D
ParentXMLNode
Parse3DScripts
ParseDate
ParticleColorFader
ParticleColorRange
ParticleEmissionRate
ParticleEmitterDirection
ParticleEmitterID
ParticleEmitterLocate
ParticleEmitterX
ParticleEmitterY
ParticleEmitterZ
ParticleMaterial
ParticleSize
ParticleTimeToLive
ParticleVelocity
PathRequester
PauseAudioCD
PauseMovie
PauseThread
PeekA
PeekB
PeekC
PeekD
PeekF
PeekI
PeekL
PeekQ
PeekS
PeekU
PeekW
PickX
PickY
PickZ
PlayAudioCD
PlayModule
PlayMovie
PlaySound
PlaySound3D
Plot
Point
PointPick
PokeA
PokeB
PokeC
PokeD
PokeF
PokeI
PokeL
PokeQ
PokeS
PokeU
PokeW
Pow
PreferenceComment
PreferenceGroup
PreferenceGroupName
PreferenceKeyName
PreferenceKeyValue
PreviousDatabaseRow
PreviousElement
PreviousXMLNode
Print
PrintN
PrintRequester
PrinterOutput
PrinterPageHeight
PrinterPageWidth
ProgramExitCode
ProgramFilename
ProgramID
ProgramParameter
ProgramRunning
ProgressBarGadget
ProgressBarGadget3D
R
RGB
RGBA
RSet
RTrim
RaiseError
Random
RandomSeed
RawKey
ReAllocateMemory
ReadAsciiCharacter
ReadByte
ReadCharacter
ReadConsoleData
ReadData
ReadDouble
ReadFile
ReadFloat
ReadInteger
ReadLong
ReadPreferenceDouble
ReadPreferenceFloat
ReadPreferenceInteger
ReadPreferenceLong
ReadPreferenceQuad
ReadPreferenceString
ReadProgramData
ReadProgramError
ReadProgramString
ReadQuad
ReadSerialPortData
ReadString
ReadStringFormat
ReadUnicodeCharacter
ReadWord
ReceiveFTPFile
ReceiveHTTPFile
ReceiveNetworkData
ReceiveNetworkFile
Red
RegularExpressionError
ReleaseMouse
RemoveBillboard
RemoveEnvironmentVariable
RemoveGadgetColumn
RemoveGadgetItem
RemoveGadgetItem3D
RemoveKeyboardShortcut
RemoveMailRecipient
RemoveMaterialLayer
RemovePreferenceGroup
RemovePreferenceKey
RemoveString
RemoveSysTrayIcon
RemoveWindowTimer
RemoveXMLAttribute
RenameFTPFile
RenameFile
RenderMovieFrame
RenderWorld
ReplaceRegularExpression
ReplaceString
ResetGradientColors
ResetList
ResetMap
ResizeBillboard
ResizeEntity
ResizeGadget
ResizeGadget3D
ResizeImage
ResizeMovie
ResizeParticleEmitter
ResizeWindow
ResizeWindow3D
ResolveXMLAttributeName
ResolveXMLNodeName
ResumeAudioCD
ResumeMovie
ResumeThread
ReverseString
Right
RootXMLNode
RotateBillboardGroup
RotateCamera
RotateEntity
RotateMaterial
RotateNode
RotateSprite3D
Round
RunProgram
S
SHA1FileFingerprint
SHA1Fingerprint
SaveFileRequester
SaveImage
SaveSprite
SaveXML
ScaleEntity
ScintillaGadget
ScintillaSendMessage
ScreenID
ScreenModeDepth
ScreenModeHeight
ScreenModeRefreshRate
ScreenModeWidth
ScreenOutput
ScrollAreaGadget
ScrollAreaGadget3D
ScrollBarGadget
ScrollBarGadget3D
ScrollMaterial
Second
SecondWorldCollisionEntity
SelectElement
SelectedFilePattern
SelectedFontColor
SelectedFontName
SelectedFontSize
SelectedFontStyle
SendFTPFile
SendMail
SendNetworkData
SendNetworkFile
SendNetworkString
SerialPortError
SerialPortID
SerialPortTimeouts
ServerID
SetActiveGadget
SetActiveGadget3D
SetActiveWindow
SetActiveWindow3D
SetClipboardImage
SetClipboardText
SetCurrentDirectory
SetDatabaseBlob
SetDragCallback
SetDropCallback
SetEntityAnimationTime
SetEntityFriction
SetEntityMass
SetEnvironmentVariable
SetFTPDirectory
SetFileAttributes
SetFileDate
SetFrameRate
SetGUITheme3D
SetGadgetAttribute
SetGadgetAttribute3D
SetGadgetColor
SetGadgetData
SetGadgetData3D
SetGadgetFont
SetGadgetItemAttribute
SetGadgetItemColor
SetGadgetItemData
SetGadgetItemData3D
SetGadgetItemState
SetGadgetItemState3D
SetGadgetItemText
SetGadgetItemText3D
SetGadgetState
SetGadgetState3D
SetGadgetText
SetGadgetText3D
SetMailAttribute
SetMailBody
SetMenuItemState
SetMenuItemText
SetMenuTitleText
SetMeshData
SetModulePosition
SetPaletteColor
SetSerialPortStatus
SetToolBarButtonState
SetURLPart
SetWindowCallback
SetWindowColor
SetWindowState
SetWindowTitle
SetWindowTitle3D
SetXMLAttribute
SetXMLEncoding
SetXMLNodeName
SetXMLNodeOffset
SetXMLNodeText
SetXMLStandalone
ShortcutGadget
ShowGUI
SignalSemaphore
Sin
SkyBox
SkyDome
SmartWindowRefresh
SortArray
SortList
SortStructuredArray
SortStructuredList
SoundCone3D
SoundFrequency
SoundID3D
SoundPan
SoundRange3D
SoundVolume
SoundVolume3D
Space
SpinGadget
SpinGadget3D
SplitterGadget
Sprite3DBlendingMode
Sprite3DQuality
SpriteCollision
SpriteDepth
SpriteHeight
SpriteID
SpriteOutput
SpritePixelCollision
SpriteWidth
Sqr
Start3D
StartAESCipher
StartDrawing
StartPrinting
StartSpecialFX
StatusBarHeight
StatusBarID
StatusBarImage
StatusBarProgress
StatusBarText
StickyWindow
Stop3D
StopAudioCD
StopDrawing
StopModule
StopMovie
StopPrinting
StopSound
StopSound3D
StopSpecialFX
Str
StrD
StrF
StrU
StringByteLength
StringField
StringGadget
StringGadget3D
Sun
SwapElements
SysTrayIconToolTip
T
Tan
TerrainHeight
TextGadget
TextGadget3D
TextHeight
TextWidth
TextureHeight
TextureID
TextureWidth
ThreadID
ThreadPriority
ToolBarHeight
ToolBarID
ToolBarImageButton
ToolBarSeparator
ToolBarStandardButton
ToolBarToolTip
TrackBarGadget
TransformSprite3D
TransparentSpriteColor
TreeGadget
Trim
TruncateFile
TryLockMutex
TrySemaphore
U
UCase
URLDecoder
URLEncoder
UnlockMutex
UnpackMemory
UseAudioCD
UseBuffer
UseFLACSoundDecoder
UseGadgetList
UseJPEG2000ImageDecoder
UseJPEG2000ImageEncoder
UseJPEGImageDecoder
UseJPEGImageEncoder
UseODBCDatabase
UseOGGSoundDecoder
UsePNGImageDecoder
UsePNGImageEncoder
UsePostgreSQLDatabase
UseSQLiteDatabase
UseTGAImageDecoder
UseTIFFImageDecoder
V
Val
ValD
ValF
W
WaitProgram
WaitSemaphore
WaitThread
WaitWindowEvent
WebGadget
WebGadgetPath
WindowBounds
WindowEvent
WindowEvent3D
WindowHeight
WindowHeight3D
WindowID
WindowID3D
WindowMouseX
WindowMouseY
WindowOutput
WindowWidth
WindowWidth3D
WindowX
WindowX3D
WindowY
WindowY3D
WorldDebug
WorldGravity
WorldShadows
WriteAsciiCharacter
WriteByte
WriteCharacter
WriteConsoleData
WriteData
WriteDouble
WriteFloat
WriteInteger
WriteLong
WritePreferenceDouble
WritePreferenceFloat
WritePreferenceInteger
WritePreferenceLong
WritePreferenceQuad
WritePreferenceString
WriteProgramData
WriteProgramString
WriteProgramStringN
WriteQuad
WriteSerialPortData
WriteSerialPortString
WriteString
WriteStringFormat
WriteStringN
WriteUnicodeCharacter
WriteWord
X
XMLAttributeName
XMLAttributeValue
XMLChildCount
XMLError
XMLErrorLine
XMLErrorPosition
XMLNodeFromID
XMLNodeFromPath
XMLNodePath
XMLNodeType
XMLStatus
Y
Year
Z
ZoomSprite3D


Overview about PureBasic Constants

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Обзор постоянных (констант) PureBasic

PB Constant | ... is used by following PB Commands *
#PB_2DDrawing_AlphaBlend DrawAlphaImage
DrawingMode
#PB_2DDrawing_AlphaChannel | DrawingMode
#PB_2DDrawing_AlphaClip | DrawingMode
#PB_2DDrawing_CustomFilter DrawingMode
CustomFilterCallback
#PB_2DDrawing_Default | DrawingMode
#PB_2DDrawing_Gradient DrawingMode
GradientColor
ResetGradientColors
LinearGradient
CircularGradient
EllipticalGradient
BoxedGradient
ConicalGradient
CustomGradient
#PB_2DDrawing_Outlined | DrawingMode
#PB_2DDrawing_Transparent | DrawingMode
#PB_2DDrawing_XOr | DrawingMode
#PB_3DArchive_FileSystem | Add3DArchive
#PB_3DArchive_Zip | Add3DArchive
#PB_Absolute | RotateSprite3D
#PB_AntialiasingMode_None | AntialiasingMode
#PB_AntialiasingMode_x2 | AntialiasingMode
#PB_AntialiasingMode_x4 | AntialiasingMode
#PB_AntialiasingMode_x6 | AntialiasingMode
#PB_Any GrabDrawingImage
CreateBillboardGroup
CreateCamera
ExamineMD5Fingerprint
ExamineSHA1Fingerprint
GetClipboardImage
OpenDatabase
OpenDatabaseRequester
EventDropImage
CopyEntity
CreateEntity
CreateFile
OpenFile
ReadFile
ExamineDirectory
LoadFont
OpenFTP
Gadget
AddGadgetItem
ButtonImageGadget
ButtonGadget
CalendarGadget
CheckBoxGadget
ComboBoxGadget
ContainerGadget
DateGadget
EditorGadget
ExplorerComboGadget
ExplorerListGadget
ExplorerTreeGadget
Frame3DGadget
HyperLinkGadget
ImageGadget
IPAddressGadget
ListIconGadget
ListViewGadget
MDIGadget
OptionGadget
PanelGadget
ProgressBarGadget
ScrollBarGadget
ScrollAreaGadget
ShortcutGadget
SpinGadget
SplitterGadget
StringGadget
TextGadget
TrackBarGadget
TreeGadget
WebGadget
ButtonGadget3D
CheckBoxGadget3D
ComboBoxGadget3D
ContainerGadget3D
EditorGadget3D
Frame3DGadget3D
ImageGadget3D
ListViewGadget3D
OptionGadget3D
PanelGadget3D
ProgressBarGadget3D
ScrollBarGadget3D
ScrollAreaGadget3D
SpinGadget3D
StringGadget3D
TextGadget3D
CatchImage
CopyImage
CreateImage
GrabImage
LoadImage
OpenLibrary
CopyLight
CreateLight
CreateMail
CopyMaterial
CreateMaterial
CreateMenu
CreateImageMenu
CreatePopupMenu
CreatePopupImageMenu
CreateMesh
CopyMesh
LoadMesh
CatchModule
LoadModule
LoadMovie
CreateNetworkServer
CreateNode
CreatePalette
LoadPalette
CreateParticleEmitter
CreateRegularExpression
ScintillaGadget
OpenSerialPort
CatchSound
LoadSound
LoadSound3D
CatchSprite
CopySprite
CreateSprite
GrabSprite
LoadSprite
CreateSprite3D
CreateStatusBar
AddSysTrayIcon
CreateTexture
LoadTexture
CreateToolBar
OpenWindow
OpenWindow3D
CreateXML
LoadXML
CatchXML
Handles
Purebasic_objects
#PB_Array | Compilerfunctions
#PB_Ascii ReadString
ReadStringFormat
WriteString
WriteStringFormat
WriteStringN
CompareMemoryString
MemoryStringLength
PeekS
PokeS
Bin
Hex
StringByteLength
StrU
CreateXML
LoadXML
CatchXML
GetXMLEncoding
SetXMLEncoding
#PB_Button3D_Toggle | ButtonGadget3D
#PB_Button_Default | ButtonGadget
#PB_Button_Image | ButtonImageGadget
#PB_Button_Left | ButtonGadget
#PB_Button_MultiLine | ButtonGadget
#PB_Button_PressedImage | ButtonImageGadget
#PB_Button_Right | ButtonGadget
#PB_Button_Toggle ButtonImageGadget
ButtonGadget
#PB_Byte FillMemory
Bin
Hex
StrU
#PB_Calendar_Bold GetGadgetItemState
SetGadgetItemState
#PB_Calendar_Borderless | CalendarGadget
#PB_Calendar_Maximum | CalendarGadget
#PB_Calendar_Minimum | CalendarGadget
#PB_Calendar_Normal GetGadgetItemState
SetGadgetItemState
#PB_Camera_Orthographic | CameraProjectionMode
#PB_Camera_Perspective | CameraProjectionMode
#PB_Camera_Plot | CameraRenderMode
#PB_Camera_Textured | CameraRenderMode
#PB_Camera_Wireframe | CameraRenderMode
#PB_CheckBox_Center | CheckBoxGadget
#PB_CheckBox_Checked GetGadgetState
SetGadgetState
#PB_CheckBox_Inbetween GetGadgetState
SetGadgetState
#PB_CheckBox_Right | CheckBoxGadget
#PB_CheckBox_ThreeState CheckBoxGadget
GetGadgetState
SetGadgetState
#PB_CheckBox_Unchecked GetGadgetState
SetGadgetState
#PB_Cipher_CBC AESEncoder
AESDecoder
StartAESCipher
#PB_Cipher_Decode | StartAESCipher
#PB_Cipher_ECB AESEncoder
AESDecoder
StartAESCipher
#PB_Cipher_Encode | StartAESCipher
#PB_ComboBox3D_Editable | ComboBoxGadget3D
#PB_ComboBox_Editable | ComboBoxGadget
#PB_ComboBox_LowerCase | ComboBoxGadget
#PB_ComboBox_UpperCase | ComboBoxGadget
#PB_Compiler_Date | Compilerdirectives
#PB_Compiler_Debugger | Compilerdirectives
#PB_Compiler_EnumerationValue | Enumerations
#PB_Compiler_File | Compilerdirectives
#PB_Compiler_FilePath | Compilerdirectives
#PB_Compiler_Home | Compilerdirectives
#PB_Compiler_Line | Compilerdirectives
#PB_Compiler_OS | Compilerdirectives
#PB_Compiler_Procedure | Compilerdirectives
#PB_Compiler_Processor | Compilerdirectives
#PB_Compiler_Thread | Compilerdirectives
#PB_Compiler_Unicode | Compilerdirectives
#PB_Compiler_Version | Compilerdirectives
#PB_Constant | Compilerfunctions
#PB_Container_BorderLess | ContainerGadget
#PB_Container_Double | ContainerGadget
#PB_Container_Flat | ContainerGadget
#PB_Container_Raised | ContainerGadget
#PB_Container_Single | ContainerGadget
#PB_Database_Blob | DatabaseColumnType
#PB_Database_Double | DatabaseColumnType
#PB_Database_Float | DatabaseColumnType
#PB_Database_Long | DatabaseColumnType
#PB_Database_ODBC | OpenDatabase
#PB_Database_PostgreSQL | OpenDatabase
#PB_Database_Quad | DatabaseColumnType
#PB_Database_SQLite | OpenDatabase
#PB_Database_String | DatabaseColumnType
#PB_Date_Accessed DirectoryEntryDate
GetFileDate
SetFileDate
#PB_Date_CheckBox GetGadgetState
SetGadgetState
#PB_Date_Created DirectoryEntryDate
GetFileDate
SetFileDate
#PB_Date_Day | AddDate
#PB_Date_Hour | AddDate
#PB_Date_Maximum | DateGadget
#PB_Date_Minimum | DateGadget
#PB_Date_Minute | AddDate
#PB_Date_Modified DirectoryEntryDate
GetFileDate
SetFileDate
#PB_Date_Month | AddDate
#PB_Date_Second | AddDate
#PB_Date_UpDown | DateGadget
#PB_Date_Week | AddDate
#PB_Date_Year | AddDate
#PB_Default DrawingFont
FileBuffersSize
GetGadgetFont
SetGadgetFont
ClipSprite
TransparentSpriteColor
UseBuffer
#PB_DirectoryEntry_Directory | DirectoryEntryType
#PB_DirectoryEntry_File | DirectoryEntryType
#PB_Drag_Copy DragText
DragImage
DragFiles
DragPrivate
DragOSFormats
EnableGadgetDrop
EnableWindowDrop
EventDropAction
SetDragCallback
SetDropCallback
#PB_Drag_Enter | SetDropCallback
#PB_Drag_Finish | SetDropCallback
#PB_Drag_Leave | SetDropCallback
#PB_Drag_Link DragText
DragImage
DragFiles
DragPrivate
DragOSFormats
EnableGadgetDrop
EnableWindowDrop
EventDropAction
SetDragCallback
SetDropCallback
#PB_Drag_Move DragText
DragImage
DragFiles
DragPrivate
DragOSFormats
EnableGadgetDrop
EnableWindowDrop
EventDropAction
SetDragCallback
SetDropCallback
#PB_Drag_None DragText
DragImage
DragFiles
DragPrivate
DragOSFormats
EnableGadgetDrop
EnableWindowDrop
SetDragCallback
SetDropCallback
#PB_Drag_Update | SetDropCallback
#PB_Drop_Files EnableGadgetDrop
EnableWindowDrop
EventDropType
EventDropFiles
SetDropCallback
#PB_Drop_Image EnableGadgetDrop
EnableWindowDrop
EventDropType
EventDropImage
SetDropCallback
#PB_Drop_Private DragPrivate
EnableGadgetDrop
EnableWindowDrop
EventDropType
EventDropPrivate
SetDropCallback
#PB_Drop_Text EnableGadgetDrop
EnableWindowDrop
EventDropType
EventDropText
SetDropCallback
#PB_Editor3D_ReadOnly | EditorGadget3D
#PB_Editor_ReadOnly | EditorGadget
#PB_Engine3D_Average | Engine3DFrameRate
#PB_Engine3D_Current | Engine3DFrameRate
#PB_Engine3D_Maximum | Engine3DFrameRate
#PB_Engine3D_Minimum | Engine3DFrameRate
#PB_Engine3D_Reset | Engine3DFrameRate
#PB_Entity_AbsoluteBodyMove | EntityPhysicBody
#PB_Entity_BoxBody | EntityPhysicBody
#PB_Entity_CastShadow WorldShadows
EntityRenderMode
#PB_Entity_None | EntityPhysicBody
#PB_Entity_SphereBody | EntityPhysicBody
#PB_Entity_StaticBody | EntityPhysicBody
#PB_Event3D_ActivateWindow | WindowEvent3D
#PB_Event3D_CloseWindow | WindowEvent3D
#PB_Event3D_Gadget EventGadget3D
EventType3D
WindowEvent3D
#PB_Event3D_MoveWindow | WindowEvent3D
#PB_Event3D_SizeWindow | WindowEvent3D
#PB_EventType3D_Change StringGadget3D
EventType3D
#PB_EventType3D_Focus StringGadget3D
EventType3D
#PB_EventType3D_LostFocus StringGadget3D
EventType3D
#PB_EventType_Change AddGadgetColumn
ExplorerListGadget
ExplorerTreeGadget
ListIconGadget
SpinGadget
StringGadget
TreeGadget
EventType
#PB_EventType_DownloadEnd | WebGadget
#PB_EventType_DownloadProgress | WebGadget
#PB_EventType_DownloadStart | WebGadget
#PB_EventType_DragStart DragText
DragImage
DragFiles
DragPrivate
DragOSFormats
ExplorerListGadget
ExplorerTreeGadget
ImageGadget
ListIconGadget
TreeGadget
EventType
#PB_EventType_Focus StringGadget
EventType
#PB_EventType_LeftClick ExplorerListGadget
ExplorerTreeGadget
ImageGadget
ListIconGadget
ListViewGadget
TreeGadget
EventType
#PB_EventType_LeftDoubleClick ExplorerListGadget
ExplorerTreeGadget
ImageGadget
ListIconGadget
ListViewGadget
TreeGadget
EventType
#PB_EventType_LostFocus StringGadget
EventType
#PB_EventType_PopupMenu | WebGadget
#PB_EventType_PopupWindow | WebGadget
#PB_EventType_RightClick ExplorerListGadget
ExplorerTreeGadget
ImageGadget
ListIconGadget
TreeGadget
EventType
#PB_EventType_RightDoubleClick ExplorerListGadget
ExplorerTreeGadget
ImageGadget
ListIconGadget
TreeGadget
EventType
#PB_EventType_StatusChange | WebGadget
#PB_EventType_TitleChange | WebGadget
#PB_Event_ActivateWindow | WindowEvent
#PB_Event_CloseWindow MDIGadget
WindowEvent
#PB_Event_Gadget EventGadget
EventType
WindowEvent
#PB_Event_GadgetDrop DragPrivate
EnableGadgetDrop
EventDropAction
EventDropType
EventDropText
EventDropImage
EventDropFiles
EventDropPrivate
EventDropBuffer
EventDropSize
EventDropX
EventDropY
WindowEvent
#PB_Event_MaximizeWindow | WindowEvent
#PB_Event_Menu EventMenu
WindowEvent
#PB_Event_MinimizeWindow | WindowEvent
#PB_Event_MoveWindow | WindowEvent
#PB_Event_Repaint WindowEvent
WindowOutput
#PB_Event_RestoreWindow | WindowEvent
#PB_Event_SizeWindow MDIGadget
WindowEvent
#PB_Event_SysTray AddSysTrayIcon
EventType
WindowEvent
#PB_Event_Timer AddWindowTimer
EventTimer
WindowEvent
#PB_Event_WindowDrop DragPrivate
EnableWindowDrop
EventDropAction
EventDropType
EventDropText
EventDropImage
EventDropFiles
EventDropPrivate
EventDropBuffer
EventDropSize
EventDropX
EventDropY
WindowEvent
#PB_Explorer_Accessed | AddGadgetColumn
#PB_Explorer_AlwaysShowSelection ExplorerListGadget
ExplorerTreeGadget
#PB_Explorer_Attributes | AddGadgetColumn
#PB_Explorer_AutoSort ExplorerListGadget
ExplorerTreeGadget
#PB_Explorer_BorderLess ExplorerListGadget
ExplorerTreeGadget
#PB_Explorer_ColumnWidth ExplorerListGadget
GetGadgetItemAttribute
SetGadgetItemAttribute
#PB_Explorer_Created | AddGadgetColumn
#PB_Explorer_Directory GetGadgetState
GetGadgetItemState
#PB_Explorer_DisplayMode | ExplorerListGadget
#PB_Explorer_DrivesOnly | ExplorerComboGadget
#PB_Explorer_Editable | ExplorerComboGadget
#PB_Explorer_File GetGadgetState
GetGadgetItemState
#PB_Explorer_FullRowSelect | ExplorerListGadget
#PB_Explorer_GridLines | ExplorerListGadget
#PB_Explorer_HeaderDragDrop | ExplorerListGadget
#PB_Explorer_LargeIcon | ExplorerListGadget
#PB_Explorer_List | ExplorerListGadget
#PB_Explorer_Modified | AddGadgetColumn
#PB_Explorer_MultiSelect | ExplorerListGadget
#PB_Explorer_Name | AddGadgetColumn
#PB_Explorer_NoButtons | ExplorerTreeGadget
#PB_Explorer_NoDirectoryChange | ExplorerListGadget
#PB_Explorer_NoDriveRequester ExplorerListGadget
ExplorerTreeGadget
#PB_Explorer_NoFiles ExplorerListGadget
ExplorerTreeGadget
#PB_Explorer_NoFolders | ExplorerListGadget
#PB_Explorer_NoLines | ExplorerTreeGadget
#PB_Explorer_NoMyDocuments ExplorerComboGadget
ExplorerListGadget
ExplorerTreeGadget
#PB_Explorer_NoParentFolder | ExplorerListGadget
#PB_Explorer_NoSort | ExplorerListGadget
#PB_Explorer_Report | ExplorerListGadget
#PB_Explorer_Selected | GetGadgetItemState
#PB_Explorer_Size | AddGadgetColumn
#PB_Explorer_SmallIcon | ExplorerListGadget
#PB_Explorer_Type | AddGadgetColumn
#PB_FTP_Directory | FTPDirectoryEntryType
#PB_FTP_Error | FTPProgress
#PB_FTP_ExecuteAll | FTPDirectoryEntryAttributes
#PB_FTP_ExecuteGroup | FTPDirectoryEntryAttributes
#PB_FTP_ExecuteUser | FTPDirectoryEntryAttributes
#PB_FTP_File | FTPDirectoryEntryType
#PB_FTP_Finished | FTPProgress
#PB_FTP_ReadAll | FTPDirectoryEntryAttributes
#PB_FTP_ReadGroup | FTPDirectoryEntryAttributes
#PB_FTP_ReadUser | FTPDirectoryEntryAttributes
#PB_FTP_Started | FTPProgress
#PB_FTP_WriteAll | FTPDirectoryEntryAttributes
#PB_FTP_WriteGroup | FTPDirectoryEntryAttributes
#PB_FTP_WriteUser | FTPDirectoryEntryAttributes
#PB_FileSystem_Archive DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_Compressed DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_ExecAll DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_ExecGroup DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_ExecUser DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_Force CopyDirectory
DeleteDirectory
#PB_FileSystem_Hidden DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_Link DirectoryEntryAttributes
GetFileAttributes
#PB_FileSystem_Normal DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_ReadAll DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_ReadGroup DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_ReadOnly DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_ReadUser DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_Recursive CopyDirectory
DeleteDirectory
#PB_FileSystem_System DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_WriteAll DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_WriteGroup DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FileSystem_WriteUser DirectoryEntryAttributes
GetFileAttributes
SetFileAttributes
#PB_FontRequester_Effects | FontRequester
#PB_Font_Bold LoadFont
SelectedFontStyle
#PB_Font_HighQuality | LoadFont
#PB_Font_Italic LoadFont
SelectedFontStyle
#PB_Font_StrikeOut | LoadFont
#PB_Font_Underline | LoadFont
#PB_Frame3D_Double | Frame3DGadget
#PB_Frame3D_Flat | Frame3DGadget
#PB_Frame3D_Single | Frame3DGadget
#PB_Function | Compilerfunctions
#PB_GadgetType3D_Button | GadgetType3D
#PB_GadgetType3D_CheckBox | GadgetType3D
#PB_GadgetType3D_ComboBox | GadgetType3D
#PB_GadgetType3D_Container | GadgetType3D
#PB_GadgetType3D_Editor | GadgetType3D
#PB_GadgetType3D_Frame3D | GadgetType3D
#PB_GadgetType3D_Image | GadgetType3D
#PB_GadgetType3D_ListView | GadgetType3D
#PB_GadgetType3D_Option | GadgetType3D
#PB_GadgetType3D_Panel | GadgetType3D
#PB_GadgetType3D_ProgressBar | GadgetType3D
#PB_GadgetType3D_ScrollArea | GadgetType3D
#PB_GadgetType3D_ScrollBar | GadgetType3D
#PB_GadgetType3D_Spin | GadgetType3D
#PB_GadgetType3D_String | GadgetType3D
#PB_GadgetType3D_Text | GadgetType3D
#PB_GadgetType3D_Unknown | GadgetType3D
#PB_GadgetType_Button | GadgetType
#PB_GadgetType_ButtonImage | GadgetType
#PB_GadgetType_Calendar | GadgetType
#PB_GadgetType_CheckBox | GadgetType
#PB_GadgetType_ComboBox | GadgetType
#PB_GadgetType_Container | GadgetType
#PB_GadgetType_Date | GadgetType
#PB_GadgetType_Editor | GadgetType
#PB_GadgetType_ExplorerCombo | GadgetType
#PB_GadgetType_ExplorerList | GadgetType
#PB_GadgetType_ExplorerTree | GadgetType
#PB_GadgetType_Frame3D | GadgetType
#PB_GadgetType_HyperLink | GadgetType
#PB_GadgetType_IPAddress | GadgetType
#PB_GadgetType_Image | GadgetType
#PB_GadgetType_ListIcon | GadgetType
#PB_GadgetType_ListView | GadgetType
#PB_GadgetType_MDI | GadgetType
#PB_GadgetType_Option | GadgetType
#PB_GadgetType_Panel | GadgetType
#PB_GadgetType_ProgressBar | GadgetType
#PB_GadgetType_Scintilla | GadgetType
#PB_GadgetType_ScrollArea | GadgetType
#PB_GadgetType_ScrollBar | GadgetType
#PB_GadgetType_Spin | GadgetType
#PB_GadgetType_Splitter | GadgetType
#PB_GadgetType_String | GadgetType
#PB_GadgetType_Text | GadgetType
#PB_GadgetType_TrackBar | GadgetType
#PB_GadgetType_Tree | GadgetType
#PB_GadgetType_Unknown | GadgetType
#PB_GadgetType_Web | GadgetType
#PB_Gadget_BackColor CalendarGadget
ContainerGadget
DateGadget
EditorGadget
ExplorerListGadget
ExplorerTreeGadget
GetGadgetColor
GetGadgetItemColor
ListIconGadget
ListViewGadget
MDIGadget
ProgressBarGadget
ScrollAreaGadget
SetGadgetColor
SetGadgetItemColor
SpinGadget
StringGadget
TextGadget
#PB_Gadget_FrontColor CalendarGadget
DateGadget
EditorGadget
ExplorerListGadget
ExplorerTreeGadget
GetGadgetColor
GetGadgetItemColor
HyperLinkGadget
ListIconGadget
ListViewGadget
ProgressBarGadget
SetGadgetColor
SetGadgetItemColor
SpinGadget
StringGadget
TextGadget
#PB_Gadget_GrayTextColor CalendarGadget
DateGadget
GetGadgetColor
SetGadgetColor
#PB_Gadget_LineColor ExplorerListGadget
ExplorerTreeGadget
GetGadgetColor
ListIconGadget
SetGadgetColor
#PB_Gadget_TitleBackColor CalendarGadget
DateGadget
GetGadgetColor
SetGadgetColor
#PB_Gadget_TitleFrontColor CalendarGadget
DateGadget
GetGadgetColor
SetGadgetColor
#PB_Hyperlink_Underline | HyperLinkGadget
#PB_Ignore ResizeGadget
ResizeGadget3D
AddStatusBarField
StatusBarProgress
OpenWindow
ResizeWindow
WindowBounds
OpenWindow3D
ResizeWindow3D
#PB_Image3D_Border | ImageGadget3D
#PB_ImagePlugin_BMP SaveImage
SaveSprite
#PB_ImagePlugin_JPEG SaveImage
SaveSprite
#PB_ImagePlugin_JPEG2000 SaveImage
SaveSprite
#PB_ImagePlugin_PNG SaveImage
SaveSprite
#PB_Image_Border | ImageGadget
#PB_Image_DisplayFormat GetClipboardImage
EventDropImage
#PB_Image_Raw | ResizeImage
#PB_Image_Smooth | ResizeImage
#PB_Input_Eof | Input
#PB_Interface | Compilerfunctions
#PB_Key_0 | KeyboardPushed
#PB_Key_1 | KeyboardPushed
#PB_Key_2 | KeyboardPushed
#PB_Key_3 | KeyboardPushed
#PB_Key_4 | KeyboardPushed
#PB_Key_5 | KeyboardPushed
#PB_Key_6 | KeyboardPushed
#PB_Key_7 | KeyboardPushed
#PB_Key_8 | KeyboardPushed
#PB_Key_9 | KeyboardPushed
#PB_Key_A | KeyboardPushed
#PB_Key_Add | KeyboardPushed
#PB_Key_All | KeyboardPushed
#PB_Key_Apostrophe | KeyboardPushed
#PB_Key_B | KeyboardPushed
#PB_Key_Back | KeyboardPushed
#PB_Key_BackSlash | KeyboardPushed
#PB_Key_C | KeyboardPushed
#PB_Key_Capital | KeyboardPushed
#PB_Key_Comma | KeyboardPushed
#PB_Key_D | KeyboardPushed
#PB_Key_Decimal | KeyboardPushed
#PB_Key_Delete | KeyboardPushed
#PB_Key_Divide | KeyboardPushed
#PB_Key_Down | KeyboardPushed
#PB_Key_E | KeyboardPushed
#PB_Key_End | KeyboardPushed
#PB_Key_Equals | KeyboardPushed
#PB_Key_Escape | KeyboardPushed
#PB_Key_F | KeyboardPushed
#PB_Key_F1 | KeyboardPushed
#PB_Key_F10 | KeyboardPushed
#PB_Key_F11 | KeyboardPushed
#PB_Key_F12 | KeyboardPushed
#PB_Key_F2 | KeyboardPushed
#PB_Key_F3 | KeyboardPushed
#PB_Key_F4 | KeyboardPushed
#PB_Key_F5 | KeyboardPushed
#PB_Key_F6 | KeyboardPushed
#PB_Key_F7 | KeyboardPushed
#PB_Key_F8 | KeyboardPushed
#PB_Key_F9 | KeyboardPushed
#PB_Key_G | KeyboardPushed
#PB_Key_Grave | KeyboardPushed
#PB_Key_H | KeyboardPushed
#PB_Key_Home | KeyboardPushed
#PB_Key_I | KeyboardPushed
#PB_Key_Insert | KeyboardPushed
#PB_Key_J | KeyboardPushed
#PB_Key_K | KeyboardPushed
#PB_Key_L | KeyboardPushed
#PB_Key_Left | KeyboardPushed
#PB_Key_LeftAlt | KeyboardPushed
#PB_Key_LeftBracket | KeyboardPushed
#PB_Key_LeftControl | KeyboardPushed
#PB_Key_LeftShift | KeyboardPushed
#PB_Key_M | KeyboardPushed
#PB_Key_Minus | KeyboardPushed
#PB_Key_Multiply | KeyboardPushed
#PB_Key_N | KeyboardPushed
#PB_Key_NumLock | KeyboardPushed
#PB_Key_O | KeyboardPushed
#PB_Key_P | KeyboardPushed
#PB_Key_Pad0 | KeyboardPushed
#PB_Key_Pad1 | KeyboardPushed
#PB_Key_Pad2 | KeyboardPushed
#PB_Key_Pad3 | KeyboardPushed
#PB_Key_Pad4 | KeyboardPushed
#PB_Key_Pad5 | KeyboardPushed
#PB_Key_Pad6 | KeyboardPushed
#PB_Key_Pad7 | KeyboardPushed
#PB_Key_Pad8 | KeyboardPushed
#PB_Key_Pad9 | KeyboardPushed
#PB_Key_PadComma | KeyboardPushed
#PB_Key_PadEnter | KeyboardPushed
#PB_Key_PageDown | KeyboardPushed
#PB_Key_PageUp | KeyboardPushed
#PB_Key_Pause | KeyboardPushed
#PB_Key_Period | KeyboardPushed
#PB_Key_Q | KeyboardPushed
#PB_Key_R | KeyboardPushed
#PB_Key_Return | KeyboardPushed
#PB_Key_Right | KeyboardPushed
#PB_Key_RightAlt | KeyboardPushed
#PB_Key_RightBracket | KeyboardPushed
#PB_Key_RightControl | KeyboardPushed
#PB_Key_RightShift | KeyboardPushed
#PB_Key_S | KeyboardPushed
#PB_Key_Scroll | KeyboardPushed
#PB_Key_SemiColon | KeyboardPushed
#PB_Key_Slash | KeyboardPushed
#PB_Key_Space | KeyboardPushed
#PB_Key_Subtract | KeyboardPushed
#PB_Key_T | KeyboardPushed
#PB_Key_Tab | KeyboardPushed
#PB_Key_U | KeyboardPushed
#PB_Key_Up | KeyboardPushed
#PB_Key_V | KeyboardPushed
#PB_Key_W | KeyboardPushed
#PB_Key_X | KeyboardPushed
#PB_Key_Y | KeyboardPushed
#PB_Key_Z | KeyboardPushed
#PB_Keyboard_AllowSystemKeys | KeyboardMode
#PB_Keyboard_International | KeyboardMode
#PB_Keyboard_Qwerty | KeyboardMode
#PB_LinkedList | Compilerfunctions
#PB_ListIcon_AlwaysShowSelection | ListIconGadget
#PB_ListIcon_CheckBoxes GetGadgetItemState
ListIconGadget
SetGadgetItemState
#PB_ListIcon_Checked GetGadgetItemState
SetGadgetItemState
#PB_ListIcon_ColumnWidth GetGadgetItemAttribute
ListIconGadget
SetGadgetItemAttribute
#PB_ListIcon_DisplayMode | ListIconGadget
#PB_ListIcon_FullRowSelect | ListIconGadget
#PB_ListIcon_GridLines | ListIconGadget
#PB_ListIcon_HeaderDragDrop | ListIconGadget
#PB_ListIcon_LargeIcon | ListIconGadget
#PB_ListIcon_List | ListIconGadget
#PB_ListIcon_MultiSelect | ListIconGadget
#PB_ListIcon_Report | ListIconGadget
#PB_ListIcon_Selected GetGadgetItemState
SetGadgetItemState
#PB_ListIcon_SmallIcon | ListIconGadget
#PB_ListView_ClickSelect | ListViewGadget
#PB_ListView_Multiselect | ListViewGadget
#PB_Long FillMemory
Bin
Hex
StrU
#PB_MDI_Arrange | SetGadgetState
#PB_MDI_AutoSize | MDIGadget
#PB_MDI_BorderLess | MDIGadget
#PB_MDI_Cascade | SetGadgetState
#PB_MDI_Image | MDIGadget
#PB_MDI_Next | SetGadgetState
#PB_MDI_NoScrollBars | MDIGadget
#PB_MDI_Previous | SetGadgetState
#PB_MDI_TileHorizontally | SetGadgetState
#PB_MDI_TileImage | MDIGadget
#PB_MDI_TileVertically | SetGadgetState
#PB_Mail_Bcc AddMailRecipient
RemoveMailRecipient
#PB_Mail_Cc AddMailRecipient
RemoveMailRecipient
#PB_Mail_Connected | MailProgress
#PB_Mail_Custom GetMailAttribute
SetMailAttribute
#PB_Mail_Date GetMailAttribute
SetMailAttribute
#PB_Mail_Error | MailProgress
#PB_Mail_Finished | MailProgress
#PB_Mail_From GetMailAttribute
SetMailAttribute
#PB_Mail_Subject GetMailAttribute
SetMailAttribute
#PB_Mail_To AddMailRecipient
RemoveMailRecipient
#PB_Mail_XMailer GetMailAttribute
SetMailAttribute
#PB_Map | Compilerfunctions
#PB_Map_ElementCheck | AddMapElement
#PB_Map_NoElementCheck | AddMapElement
#PB_Material_Add AddMaterialLayer
MaterialBlendingMode
#PB_Material_AlphaBlend AddMaterialLayer
MaterialBlendingMode
#PB_Material_AmbientColors | MaterialAmbientColor
#PB_Material_Animated ScrollMaterial
RotateMaterial
#PB_Material_Bilinear | MaterialFilteringMode
#PB_Material_Color | MaterialBlendingMode
#PB_Material_Fixed ScrollMaterial
RotateMaterial
#PB_Material_Flat | MaterialShadingMode
#PB_Material_Gouraud | MaterialShadingMode
#PB_Material_Modulate | AddMaterialLayer
#PB_Material_None Parse3DScripts
CreateEntity
MaterialFilteringMode
#PB_Material_Phong | MaterialShadingMode
#PB_Material_Replace | AddMaterialLayer
#PB_Material_Trilinear | MaterialFilteringMode
#PB_Menu_About | MenuItem
#PB_Menu_ModernLook CreateImageMenu
CreatePopupImageMenu
#PB_Menu_Preferences | MenuItem
#PB_Menu_Quit | MenuItem
#PB_Mesh_Color | SetMeshData
#PB_Mesh_Face | SetMeshData
#PB_Mesh_Normal | SetMeshData
#PB_Mesh_UVCoordinate | SetMeshData
#PB_Mesh_Vertex | SetMeshData
#PB_MessageRequester_Cancel | MessageRequester
#PB_MessageRequester_No | MessageRequester
#PB_MessageRequester_Ok | MessageRequester
#PB_MessageRequester_Yes | MessageRequester
#PB_MessageRequester_YesNo | MessageRequester
#PB_MessageRequester_YesNoCancel | MessageRequester
#PB_MouseButton_Left | MouseButton
#PB_MouseButton_Middle | MouseButton
#PB_MouseButton_Right | MouseButton
#PB_Movie_Rendered PlayMovie
RenderMovieFrame
#PB_NetworkEvent_Connect | NetworkServerEvent
#PB_NetworkEvent_Data NetworkClientEvent
NetworkServerEvent
SendNetworkString
#PB_NetworkEvent_Disconnect CloseNetworkConnection
NetworkServerEvent
#PB_NetworkEvent_File NetworkClientEvent
NetworkServerEvent
#PB_Network_TCP CreateNetworkServer
OpenNetworkConnection
#PB_Network_UDP CreateNetworkServer
OpenNetworkConnection
#PB_Node_BillboardGroup AttachNodeObject
DetachNodeObject
#PB_Node_Camera AttachNodeObject
DetachNodeObject
#PB_Node_Entity AttachNodeObject
DetachNodeObject
#PB_Node_Node AttachNodeObject
DetachNodeObject
#PB_Node_ParticleEmitter AttachNodeObject
DetachNodeObject
#PB_Node_Sound3D AttachNodeObject
DetachNodeObject
#PB_OSFunction | Compilerfunctions
#PB_OS_AmigaOS | Compilerdirectives
#PB_OS_Linux | Compilerdirectives
#PB_OS_MacOS | Compilerdirectives
#PB_OS_Windows | Compilerdirectives
#PB_OS_Windows_2000 | OSVersion
#PB_OS_Windows_7 | OSVersion
#PB_OS_Windows_95 | OSVersion
#PB_OS_Windows_98 | OSVersion
#PB_OS_Windows_Future | OSVersion
#PB_OS_Windows_ME | OSVersion
#PB_OS_Windows_NT3_51 | OSVersion
#PB_OS_Windows_NT_4 | OSVersion
#PB_OS_Windows_Server_2003 | OSVersion
#PB_OS_Windows_Server_2008 | OSVersion
#PB_OS_Windows_Vista | OSVersion
#PB_OS_Windows_XP | OSVersion
#PB_OnError_Breakpoint ErrorCode
RaiseError
#PB_OnError_DivideByZero | ErrorCode
#PB_OnError_EAX | ErrorRegister
#PB_OnError_EBP | ErrorRegister
#PB_OnError_EBX | ErrorRegister
#PB_OnError_ECX | ErrorRegister
#PB_OnError_EDI | ErrorRegister
#PB_OnError_EDX | ErrorRegister
#PB_OnError_ESI | ErrorRegister
#PB_OnError_ESP | ErrorRegister
#PB_OnError_Flags | ErrorRegister
#PB_OnError_Floatingpoint ErrorCode
RaiseError
#PB_OnError_IllegalInstruction ErrorCode
RaiseError
#PB_OnError_InvalidMemory ErrorCode
ErrorTargetAddress
RaiseError
#PB_OnError_PriviledgedInstruction ErrorCode
RaiseError
#PB_OnError_R15 | ErrorRegister
#PB_OnError_R8 | ErrorRegister
#PB_OnError_R9 | ErrorRegister
#PB_OnError_RAX | ErrorRegister
#PB_OnError_RBP | ErrorRegister
#PB_OnError_RBX | ErrorRegister
#PB_OnError_RCX | ErrorRegister
#PB_OnError_RDI | ErrorRegister
#PB_OnError_RDX | ErrorRegister
#PB_OnError_RSI | ErrorRegister
#PB_OnError_RSP | ErrorRegister
#PB_OnError_cr | ErrorRegister
#PB_OnError_ctx | ErrorRegister
#PB_OnError_lr | ErrorRegister
#PB_OnError_r0 | ErrorRegister
#PB_OnError_r1 | ErrorRegister
#PB_OnError_r2 | ErrorRegister
#PB_OnError_r31 | ErrorRegister
#PB_OnError_xer | ErrorRegister
#PB_Panel3D_ItemHeight | PanelGadget3D
#PB_Panel3D_ItemWidth | PanelGadget3D
#PB_Panel3D_TabHeight | PanelGadget3D
#PB_Panel_ItemHeight | PanelGadget
#PB_Panel_ItemWidth | PanelGadget
#PB_Panel_TabHeight | PanelGadget
#PB_PixelFormat_15Bits | DrawingBufferPixelFormat
#PB_PixelFormat_16Bits | DrawingBufferPixelFormat
#PB_PixelFormat_24Bits_BGR | DrawingBufferPixelFormat
#PB_PixelFormat_24Bits_RGB | DrawingBufferPixelFormat
#PB_PixelFormat_32Bits_BGR | DrawingBufferPixelFormat
#PB_PixelFormat_32Bits_RGB | DrawingBufferPixelFormat
#PB_PixelFormat_8Bits | DrawingBufferPixelFormat
#PB_PixelFormat_ReversedY | DrawingBufferPixelFormat
#PB_Procedure | Compilerfunctions
#PB_Processor_PowerPC | Compilerdirectives
#PB_Processor_mc68000 | Compilerdirectives
#PB_Processor_x64 | Compilerdirectives
#PB_Processor_x86 | Compilerdirectives
#PB_Program_Connect | RunProgram
#PB_Program_Eof CloseProgram
WriteProgramData
#PB_Program_Error ReadProgramError
RunProgram
#PB_Program_Hide | RunProgram
#PB_Program_Open | RunProgram
#PB_Program_Read AvailableProgramOutput
ReadProgramData
ReadProgramString
RunProgram
#PB_Program_Wait | RunProgram
#PB_Program_Write CloseProgram
RunProgram
WriteProgramData
WriteProgramString
WriteProgramStringN
#PB_ProgressBar3D_Maximum | ProgressBarGadget3D
#PB_ProgressBar3D_Minimum | ProgressBarGadget3D
#PB_ProgressBar_Maximum | ProgressBarGadget
#PB_ProgressBar_Minimum | ProgressBarGadget
#PB_ProgressBar_Smooth | ProgressBarGadget
#PB_ProgressBar_Vertical | ProgressBarGadget
#PB_Quad Bin
Hex
StrU
#PB_RegularExpression_AnyNewLine | CreateRegularExpression
#PB_RegularExpression_DotAll | CreateRegularExpression
#PB_RegularExpression_Extended | CreateRegularExpression
#PB_RegularExpression_MultiLine | CreateRegularExpression
#PB_Relative | RotateSprite3D
#PB_Requester_MultiSelection | OpenFileRequester
#PB_Round_Down | Round
#PB_Round_Nearest | Round
#PB_Round_Up | Round
#PB_Screen_NoSynchronization OpenScreen
OpenWindowedScreen
#PB_Screen_SmartSynchronization OpenScreen
OpenWindowedScreen
#PB_Screen_WaitSynchronization OpenScreen
OpenWindowedScreen
#PB_ScrollArea3D_InnerHeight | ScrollAreaGadget3D
#PB_ScrollArea3D_InnerWidth | ScrollAreaGadget3D
#PB_ScrollArea3D_X | ScrollAreaGadget3D
#PB_ScrollArea3D_Y | ScrollAreaGadget3D
#PB_ScrollArea_BorderLess | ScrollAreaGadget
#PB_ScrollArea_Center | ScrollAreaGadget
#PB_ScrollArea_Flat | ScrollAreaGadget
#PB_ScrollArea_InnerHeight | ScrollAreaGadget
#PB_ScrollArea_InnerWidth | ScrollAreaGadget
#PB_ScrollArea_Raised | ScrollAreaGadget
#PB_ScrollArea_Single | ScrollAreaGadget
#PB_ScrollArea_X | ScrollAreaGadget
#PB_ScrollArea_Y | ScrollAreaGadget
#PB_ScrollBar3D_Maximum | ScrollBarGadget3D
#PB_ScrollBar3D_Minimum | ScrollBarGadget3D
#PB_ScrollBar3D_PageLength | ScrollBarGadget3D
#PB_ScrollBar3D_Vertical | ScrollBarGadget3D
#PB_ScrollBar_Maximum | ScrollBarGadget
#PB_ScrollBar_Minimum | ScrollBarGadget
#PB_ScrollBar_PageLength | ScrollBarGadget
#PB_ScrollBar_Vertical | ScrollBarGadget
#PB_SerialPort_Break | SerialPortError
#PB_SerialPort_CTS | GetSerialPortStatus
#PB_SerialPort_DCD | GetSerialPortStatus
#PB_SerialPort_DSR | GetSerialPortStatus
#PB_SerialPort_DTR | SetSerialPortStatus
#PB_SerialPort_EOFSent | SerialPortError
#PB_SerialPort_EvenParity | OpenSerialPort
#PB_SerialPort_Frame | SerialPortError
#PB_SerialPort_IOE | SerialPortError
#PB_SerialPort_MarkParity | OpenSerialPort
#PB_SerialPort_NoHandshake | OpenSerialPort
#PB_SerialPort_NoParity | OpenSerialPort
#PB_SerialPort_OddParity | OpenSerialPort
#PB_SerialPort_OverRun | SerialPortError
#PB_SerialPort_RI | GetSerialPortStatus
#PB_SerialPort_RTS | SetSerialPortStatus
#PB_SerialPort_RtsCtsHandshake | OpenSerialPort
#PB_SerialPort_RtsHandshake | OpenSerialPort
#PB_SerialPort_RxOver | SerialPortError
#PB_SerialPort_RxParity | SerialPortError
#PB_SerialPort_SpaceParity | OpenSerialPort
#PB_SerialPort_TXD | SetSerialPortStatus
#PB_SerialPort_TxFull | SerialPortError
#PB_SerialPort_WaitingCTS | SerialPortError
#PB_SerialPort_WaitingDSR | SerialPortError
#PB_SerialPort_WaitingRLSD | SerialPortError
#PB_SerialPort_XoffCharacter GetSerialPortStatus
SetSerialPortStatus
#PB_SerialPort_XoffReceived | SerialPortError
#PB_SerialPort_XoffSent | SerialPortError
#PB_SerialPort_XonCharacter GetSerialPortStatus
SetSerialPortStatus
#PB_SerialPort_XonXoffHandshake | OpenSerialPort
#PB_Shadow_Additive | WorldShadows
#PB_Shadow_Modulative | WorldShadows
#PB_Shadow_None | WorldShadows
#PB_Shadow_TextureAdditive | WorldShadows
#PB_Shortcut_0 | AddKeyboardShortcut
#PB_Shortcut_1 | AddKeyboardShortcut
#PB_Shortcut_2 | AddKeyboardShortcut
#PB_Shortcut_3 | AddKeyboardShortcut
#PB_Shortcut_4 | AddKeyboardShortcut
#PB_Shortcut_5 | AddKeyboardShortcut
#PB_Shortcut_6 | AddKeyboardShortcut
#PB_Shortcut_7 | AddKeyboardShortcut
#PB_Shortcut_8 | AddKeyboardShortcut
#PB_Shortcut_9 | AddKeyboardShortcut
#PB_Shortcut_A | AddKeyboardShortcut
#PB_Shortcut_Add | AddKeyboardShortcut
#PB_Shortcut_All | RemoveKeyboardShortcut
#PB_Shortcut_Alt | AddKeyboardShortcut
#PB_Shortcut_Apps | AddKeyboardShortcut
#PB_Shortcut_B | AddKeyboardShortcut
#PB_Shortcut_Back | AddKeyboardShortcut
#PB_Shortcut_C | AddKeyboardShortcut
#PB_Shortcut_Capital | AddKeyboardShortcut
#PB_Shortcut_Clear | AddKeyboardShortcut
#PB_Shortcut_Command | AddKeyboardShortcut
#PB_Shortcut_Control | AddKeyboardShortcut
#PB_Shortcut_D | AddKeyboardShortcut
#PB_Shortcut_Decimal | AddKeyboardShortcut
#PB_Shortcut_Delete | AddKeyboardShortcut
#PB_Shortcut_Divide | AddKeyboardShortcut
#PB_Shortcut_Down | AddKeyboardShortcut
#PB_Shortcut_E | AddKeyboardShortcut
#PB_Shortcut_End | AddKeyboardShortcut
#PB_Shortcut_Escape | AddKeyboardShortcut
#PB_Shortcut_Execute | AddKeyboardShortcut
#PB_Shortcut_F | AddKeyboardShortcut
#PB_Shortcut_F1 | AddKeyboardShortcut
#PB_Shortcut_F10 | AddKeyboardShortcut
#PB_Shortcut_F11 | AddKeyboardShortcut
#PB_Shortcut_F12 | AddKeyboardShortcut
#PB_Shortcut_F13 | AddKeyboardShortcut
#PB_Shortcut_F14 | AddKeyboardShortcut
#PB_Shortcut_F15 | AddKeyboardShortcut
#PB_Shortcut_F16 | AddKeyboardShortcut
#PB_Shortcut_F17 | AddKeyboardShortcut
#PB_Shortcut_F18 | AddKeyboardShortcut
#PB_Shortcut_F19 | AddKeyboardShortcut
#PB_Shortcut_F2 | AddKeyboardShortcut
#PB_Shortcut_F20 | AddKeyboardShortcut
#PB_Shortcut_F21 | AddKeyboardShortcut
#PB_Shortcut_F22 | AddKeyboardShortcut
#PB_Shortcut_F23 | AddKeyboardShortcut
#PB_Shortcut_F24 | AddKeyboardShortcut
#PB_Shortcut_F3 | AddKeyboardShortcut
#PB_Shortcut_F4 | AddKeyboardShortcut
#PB_Shortcut_F5 | AddKeyboardShortcut
#PB_Shortcut_F6 | AddKeyboardShortcut
#PB_Shortcut_F7 | AddKeyboardShortcut
#PB_Shortcut_F8 | AddKeyboardShortcut
#PB_Shortcut_F9 | AddKeyboardShortcut
#PB_Shortcut_G | AddKeyboardShortcut
#PB_Shortcut_H | AddKeyboardShortcut
#PB_Shortcut_Help | AddKeyboardShortcut
#PB_Shortcut_Home | AddKeyboardShortcut
#PB_Shortcut_I | AddKeyboardShortcut
#PB_Shortcut_Insert | AddKeyboardShortcut
#PB_Shortcut_J | AddKeyboardShortcut
#PB_Shortcut_K | AddKeyboardShortcut
#PB_Shortcut_L | AddKeyboardShortcut
#PB_Shortcut_Left | AddKeyboardShortcut
#PB_Shortcut_LeftWindows | AddKeyboardShortcut
#PB_Shortcut_M | AddKeyboardShortcut
#PB_Shortcut_Menu | AddKeyboardShortcut
#PB_Shortcut_Multiply | AddKeyboardShortcut
#PB_Shortcut_N | AddKeyboardShortcut
#PB_Shortcut_Next | AddKeyboardShortcut
#PB_Shortcut_Numlock | AddKeyboardShortcut
#PB_Shortcut_O | AddKeyboardShortcut
#PB_Shortcut_P | AddKeyboardShortcut
#PB_Shortcut_Pad0 | AddKeyboardShortcut
#PB_Shortcut_Pad1 | AddKeyboardShortcut
#PB_Shortcut_Pad2 | AddKeyboardShortcut
#PB_Shortcut_Pad3 | AddKeyboardShortcut
#PB_Shortcut_Pad4 | AddKeyboardShortcut
#PB_Shortcut_Pad5 | AddKeyboardShortcut
#PB_Shortcut_Pad6 | AddKeyboardShortcut
#PB_Shortcut_Pad7 | AddKeyboardShortcut
#PB_Shortcut_Pad8 | AddKeyboardShortcut
#PB_Shortcut_Pad9 | AddKeyboardShortcut
#PB_Shortcut_Pause | AddKeyboardShortcut
#PB_Shortcut_Print | AddKeyboardShortcut
#PB_Shortcut_Prior | AddKeyboardShortcut
#PB_Shortcut_Q | AddKeyboardShortcut
#PB_Shortcut_R | AddKeyboardShortcut
#PB_Shortcut_Return | AddKeyboardShortcut
#PB_Shortcut_Right | AddKeyboardShortcut
#PB_Shortcut_RightWindows | AddKeyboardShortcut
#PB_Shortcut_S | AddKeyboardShortcut
#PB_Shortcut_Scroll | AddKeyboardShortcut
#PB_Shortcut_Select | AddKeyboardShortcut
#PB_Shortcut_Separator | AddKeyboardShortcut
#PB_Shortcut_Shift | AddKeyboardShortcut
#PB_Shortcut_Snapshot | AddKeyboardShortcut
#PB_Shortcut_Space | AddKeyboardShortcut
#PB_Shortcut_Subtract | AddKeyboardShortcut
#PB_Shortcut_T | AddKeyboardShortcut
#PB_Shortcut_Tab | AddKeyboardShortcut
#PB_Shortcut_U | AddKeyboardShortcut
#PB_Shortcut_Up | AddKeyboardShortcut
#PB_Shortcut_V | AddKeyboardShortcut
#PB_Shortcut_W | AddKeyboardShortcut
#PB_Shortcut_X | AddKeyboardShortcut
#PB_Shortcut_Y | AddKeyboardShortcut
#PB_Shortcut_Z | AddKeyboardShortcut
#PB_Sort_Ascending SortArray
SortList
SortStructuredArray
SortStructuredList
#PB_Sort_Ascii SortStructuredArray
SortStructuredList
#PB_Sort_Byte SortStructuredArray
SortStructuredList
#PB_Sort_Character SortStructuredArray
SortStructuredList
#PB_Sort_Descending SortArray
SortList
SortStructuredArray
SortStructuredList
#PB_Sort_Double SortStructuredArray
SortStructuredList
#PB_Sort_Float SortStructuredArray
SortStructuredList
#PB_Sort_Integer SortStructuredArray
SortStructuredList
#PB_Sort_Long SortStructuredArray
SortStructuredList
#PB_Sort_NoCase SortArray
SortList
SortStructuredArray
SortStructuredList
#PB_Sort_Quad SortStructuredArray
SortStructuredList
#PB_Sort_String SortStructuredArray
SortStructuredList
#PB_Sort_Unicode SortStructuredArray
SortStructuredList
#PB_Sort_Word SortStructuredArray
SortStructuredList
#PB_Sound3D_Loop | PlaySound3D
#PB_Sound3D_Streaming | LoadSound3D
#PB_Sound_Loop | PlaySound
#PB_Sound_MultiChannel PlaySound
SoundFrequency
SoundPan
SoundVolume
StopSound
#PB_Sound_Streaming CatchSound
LoadSound
#PB_Spin3D_Maximum | SpinGadget3D
#PB_Spin3D_Minimum | SpinGadget3D
#PB_Spin3D_Numeric | SpinGadget3D
#PB_Spin3D_ReadOnly | SpinGadget3D
#PB_Spin_Maximum | SpinGadget
#PB_Spin_Minimum | SpinGadget
#PB_Spin_Numeric | SpinGadget
#PB_Spin_ReadOnly | SpinGadget
#PB_Splitter_FirstFixed | SplitterGadget
#PB_Splitter_FirstGadget | SplitterGadget
#PB_Splitter_FirstMinimumSize | SplitterGadget
#PB_Splitter_SecondFixed | SplitterGadget
#PB_Splitter_SecondGadget | SplitterGadget
#PB_Splitter_SecondMinimumSize | SplitterGadget
#PB_Splitter_Separator | SplitterGadget
#PB_Splitter_Vertical | SplitterGadget
#PB_Sprite3D_BilinearFiltering | Sprite3DQuality
#PB_Sprite3D_NoFiltering | Sprite3DQuality
#PB_Sprite_Alpha CatchSprite
CopySprite
CreateSprite
DisplayAlphaSprite
DisplayShadowSprite
DisplaySolidSprite
GrabSprite
LoadSprite
SpriteOutput
#PB_Sprite_AlphaBlending CatchSprite
CopySprite
CreateSprite
LoadSprite
DisplaySprite3D
#PB_Sprite_Memory CatchSprite
CopySprite
CreateSprite
GrabSprite
LoadSprite
StartSpecialFX
#PB_Sprite_Texture CatchSprite
CopySprite
CreateSprite
GrabSprite
LoadSprite
CreateSprite3D
#PB_StatusBar_BorderLess StatusBarImage
StatusBarText
StatusBarProgress
#PB_StatusBar_Center StatusBarImage
StatusBarText
#PB_StatusBar_Raised StatusBarImage
StatusBarText
StatusBarProgress
#PB_StatusBar_Right StatusBarImage
StatusBarText
#PB_String3D_Numeric | StringGadget3D
#PB_String3D_Password | StringGadget3D
#PB_String3D_ReadOnly | StringGadget3D
#PB_String_BorderLess | StringGadget
#PB_String_Equal | CompareMemoryString
#PB_String_Greater | CompareMemoryString
#PB_String_InPlace | ReplaceString
#PB_String_Lower | CompareMemoryString
#PB_String_LowerCase | StringGadget
#PB_String_NoCase CompareMemoryString
RemoveString
ReplaceString
#PB_String_Numeric | StringGadget
#PB_String_Password | StringGadget
#PB_String_ReadOnly | StringGadget
#PB_String_UpperCase | StringGadget
#PB_Structure | Compilerfunctions
#PB_Text_Border | TextGadget
#PB_Text_Center | TextGadget
#PB_Text_Right | TextGadget
#PB_ToolBar_Normal ToolBarImageButton
ToolBarStandardButton
#PB_ToolBar_Toggle ToolBarImageButton
ToolBarStandardButton
#PB_TrackBar_Maximum | TrackBarGadget
#PB_TrackBar_Minimum | TrackBarGadget
#PB_TrackBar_Ticks | TrackBarGadget
#PB_TrackBar_Vertical | TrackBarGadget
#PB_Tree_AlwaysShowSelection | TreeGadget
#PB_Tree_CheckBoxes GetGadgetItemState
TreeGadget
#PB_Tree_Checked GetGadgetItemState
SetGadgetItemState
#PB_Tree_Collapsed GetGadgetItemState
SetGadgetItemState
#PB_Tree_Expanded GetGadgetItemState
SetGadgetItemState
#PB_Tree_NoButtons | TreeGadget
#PB_Tree_NoLines | TreeGadget
#PB_Tree_Selected GetGadgetItemState
SetGadgetItemState
#PB_Tree_SubLevel GetGadgetItemAttribute
TreeGadget
#PB_URL_Parameters GetURLPart
SetURLPart
#PB_URL_Password GetURLPart
SetURLPart
#PB_URL_Path GetURLPart
SetURLPart
#PB_URL_Port GetURLPart
SetURLPart
#PB_URL_Protocol GetURLPart
SetURLPart
#PB_URL_Site GetURLPart
SetURLPart
#PB_URL_User GetURLPart
SetURLPart
#PB_UTF16BE ReadStringFormat
WriteStringFormat
#PB_UTF32 ReadStringFormat
WriteStringFormat
#PB_UTF32BE ReadStringFormat
WriteStringFormat
#PB_UTF8 ReadString
ReadStringFormat
WriteString
WriteStringFormat
WriteStringN
CompareMemoryString
MemoryStringLength
PeekS
PokeS
StringByteLength
CreateXML
LoadXML
CatchXML
GetXMLEncoding
SetXMLEncoding
#PB_Unicode ReadString
ReadStringFormat
WriteString
WriteStringFormat
WriteStringN
CompareMemoryString
MemoryStringLength
PeekS
PokeS
Bin
Hex
StringByteLength
StrU
CreateXML
LoadXML
CatchXML
GetXMLEncoding
SetXMLEncoding
#PB_Variable | Compilerfunctions
#PB_Web_Back | WebGadget
#PB_Web_BlockPopupMenu | WebGadget
#PB_Web_BlockPopups | WebGadget
#PB_Web_Busy | WebGadget
#PB_Web_Forward | WebGadget
#PB_Web_HtmlCode SetGadgetItemText
WebGadget
#PB_Web_Mozilla | WebGadget
#PB_Web_NavigationCallback | WebGadget
#PB_Web_PageTitle | WebGadget
#PB_Web_Progress | WebGadget
#PB_Web_ProgressMax | WebGadget
#PB_Web_Refresh | WebGadget
#PB_Web_ScrollX | WebGadget
#PB_Web_ScrollY | WebGadget
#PB_Web_SelectedText | WebGadget
#PB_Web_StatusMessage | WebGadget
#PB_Web_Stop | WebGadget
#PB_Window3D_BorderLess | OpenWindow3D
#PB_Window3D_Invisible | OpenWindow3D
#PB_Window3D_SizeGadget | OpenWindow3D
#PB_Window_BorderLess | OpenWindow
#PB_Window_Borderless | AddGadgetItem
#PB_Window_Invisible | OpenWindow
#PB_Window_Maximize GetWindowState
OpenWindow
SetWindowState
#PB_Window_MaximizeGadget | OpenWindow
#PB_Window_Minimize GetWindowState
OpenWindow
SetWindowState
#PB_Window_MinimizeGadget | OpenWindow
#PB_Window_NoGadgets UseGadgetList
OpenWindow
#PB_Window_Normal GetWindowState
SetWindowState
#PB_Window_ScreenCentered | OpenWindow
#PB_Window_Screencentered | AddGadgetItem
#PB_Window_SizeGadget | OpenWindow
#PB_Window_SystemMenu | OpenWindow
#PB_Window_TitleBar | OpenWindow
#PB_Window_Tool | OpenWindow
#PB_Window_WindowCentered AddGadgetItem
OpenWindow
#PB_Word FillMemory
Bin
Hex
StrU
#PB_World_DebugBody | WorldDebug
#PB_World_DebugEntity | WorldDebug
#PB_World_DebugNone | WorldDebug
#PB_World_TerrainPick | MousePick
#PB_World_WaterCaustics | CreateWater
#PB_World_WaterFoam | CreateWater
#PB_World_WaterHighQuality | CreateWater
#PB_World_WaterLowQuality | CreateWater
#PB_World_WaterMediumQuality | CreateWater
#PB_World_WaterPick | MousePick
#PB_World_WaterSmooth | CreateWater
#PB_World_WaterSun CreateWater
Sun
#PB_XML_Aborted | XMLStatus
#PB_XML_AsyncEntity | XMLStatus
#PB_XML_AttributeExternalEntityRef | XMLStatus
#PB_XML_BadCharacterRef | XMLStatus
#PB_XML_BinaryEntityRef | XMLStatus
#PB_XML_CData XMLNodeType
GetXMLNodeText
CreateXMLNode
CopyXMLNode
MoveXMLNode
#PB_XML_CantChangeFeatures | XMLStatus
#PB_XML_Comment XMLNodeType
GetXMLNodeText
CreateXMLNode
CopyXMLNode
MoveXMLNode
#PB_XML_CutNewline | FormatXML
#PB_XML_CutSpace | FormatXML
#PB_XML_DTD XML
XMLNodeType
#PB_XML_DublicateAttribute | XMLStatus
#PB_XML_EntityDeclaredInPE | XMLStatus
#PB_XML_ExternalEntityHandling | XMLStatus
#PB_XML_FeatureRequiresDTD | XMLStatus
#PB_XML_Finished | XMLStatus
#PB_XML_IncompletePE | XMLStatus
#PB_XML_IncorrectEncoding | XMLStatus
#PB_XML_Instruction XMLNodeType
GetXMLNodeName
SetXMLNodeName
#PB_XML_InvalidToken | XMLStatus
#PB_XML_JunkAfterDocElement | XMLStatus
#PB_XML_LinuxNewline | FormatXML
#PB_XML_MacNewline | FormatXML
#PB_XML_MisplacedXML | XMLStatus
#PB_XML_NoDeclaration SaveXML
ExportXML
#PB_XML_NoElements | XMLStatus
#PB_XML_NoMemory | XMLStatus
#PB_XML_Normal XMLNodeType
GetXMLNodeText
GetXMLNodeName
SetXMLNodeName
GetXMLAttribute
SetXMLAttribute
RemoveXMLAttribute
ExamineXMLAttributes
CreateXMLNode
CopyXMLNode
MoveXMLNode
#PB_XML_NotStandalone | XMLStatus
#PB_XML_NotSuspended | XMLStatus
#PB_XML_ParamEntityRef | XMLStatus
#PB_XML_PartialCharacter | XMLStatus
#PB_XML_PublicID | XMLStatus
#PB_XML_ReFormat | FormatXML
#PB_XML_ReIndent | FormatXML
#PB_XML_RecursiveEntityRef | XMLStatus
#PB_XML_ReduceNewline | FormatXML
#PB_XML_ReduceSpace | FormatXML
#PB_XML_ReservedNamespaceURI | XMLStatus
#PB_XML_ReservedPrefixXML | XMLStatus
#PB_XML_ReservedPrefixXMLNS | XMLStatus
#PB_XML_Root XMLNodeType
CreateXMLNode
#PB_XML_StandaloneNo GetXMLStandalone
SetXMLStandalone
#PB_XML_StandaloneUnset GetXMLStandalone
SetXMLStandalone
#PB_XML_StandaloneYes GetXMLStandalone
SetXMLStandalone
#PB_XML_StreamEnd | CatchXML
#PB_XML_StreamNext | CatchXML
#PB_XML_StreamStart | CatchXML
#PB_XML_StringFormat SaveXML
ExportXML
#PB_XML_Success | XMLStatus
#PB_XML_Suspended | XMLStatus
#PB_XML_SuspendedPE | XMLStatus
#PB_XML_Syntax | XMLStatus
#PB_XML_TagMismatch | XMLStatus
#PB_XML_TextDeclaration | XMLStatus
#PB_XML_UnboundPrefix | XMLStatus
#PB_XML_UnclosedCDataSection | XMLStatus
#PB_XML_UnclosedToken | XMLStatus
#PB_XML_UndeclaringPrefix | XMLStatus
#PB_XML_UndefinedEntity | XMLStatus
#PB_XML_UnexpectedState | XMLStatus
#PB_XML_UnknownEncoding | XMLStatus
#PB_XML_WindowsNewline | FormatXML
#PB_XML_XMLDeclaration | XMLStatus
#PB_Xml_Normal | MainXMLNode
#PB_Xml_Root | RootXMLNode
* Filtered according to their use in this reference manual.


2DDrawing

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

PureBasic - 2DDrawing

Краткий обзор

Библиотека 2DDrawing содержит все команды, позволяющие рисовать в двух измерениях на предопределенной площади, что бы то ни было окно, экран или даже принтер. Вы сможете начертить таким образом черту, прямоугольник, круг, а также написать текст.

Чертежи всегда должны начинаться вызовом функции StartDrawing() и должны заканчиваться вызовом функции ; StopDrawing().

Краткий перечень команд

BackColor
Box
BoxedGradient
Circle
CircularGradient
ConicalGradient
CustomFilterCallback
CustomGradient
DrawAlphaImage
DrawImage
DrawRotatedText
DrawText
DrawingBuffer
DrawingBufferPitch
DrawingBufferPixelFormat
DrawingFont
DrawingMode
Ellipse
EllipticalGradient
FillArea
FrontColor
GrabDrawingImage
GradientColor
Line
LineXY
LinearGradient
OutputDepth
OutputHeight
OutputWidth
Plot
Point
ResetGradientColors
StartDrawing
StopDrawing
TextHeight
TextWidth

Поддерживаемые ОС

Все


BackColor

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

BackColor()

Синтаксис

BackColor( Color )
Описание
Эта функция устанавливает заданный по умолчанию цвет фона для графических функций и отображения текста. Для установки допустимых значений цвета используйте RGB() или RGBA(). Используется ли прозрачность, зависит от drawing mode.

Таблица с основными цветами находится здесь.


Box

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Box()

Синтаксис

Box(x, y, Width, Height [, Color])
Описание
Рисует закрашенный прямоугольник от угла x,y и размером Width,Height. Режим наполнения определяется DrawingMode(). Текущий вывод устанавливается функцией StartDrawing().

Если параметр 'Color' не задан, то будет использоваться цвет установленный функцией FrontColor(). Для установки допустимых значений цвета используйте RGB() или RGBA().

Пример:

  If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      y = 0
      For x = 0 To 95 Step 10
        Box(x, y, 200-2*x, 200-2*y, RGB(Random(255), Random(255), Random(255)))
        y + 10        ; the same as y = y + 10
      Next x
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


BoxedGradient

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

BoxedGradient()

Синтаксис

BoxedGradient(x, y, Width, Height)
Описание
Рисует прямоугольник от угла x,y и размером Width,Height, залитый градиентом.

По умолчанию градиент начинается цветом background color в центре и заканчивается цветом front color на краях. Дополнительные цвета могут быть добавлены в градиент командой GradientColor().

Примечание: эта команда имеет воздействие только на текущем рисунке ImageOutput(). Градиент рисуется только тогда, когда активируется режим #PB_2DDrawing_Gradient команды DrawingMode().

Пример:

  If OpenWindow(0, 0, 0, 400, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)

      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor($00FFFF)
      FrontColor($FF0000)

      BoxedGradient(0, 0, 200, 200)
      Circle(100, 100, 100)
      BoxedGradient(225, -100, 150, 400)
      Circle(300, 100, 100)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
@newline


Circle

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Circle()

Синтаксис

Circle(x, y, Radius [, Color])
Описание
Рисует заполненный круг, в текущий вывод, по заданным координатам x, y, и указанным радиусом Radius. Текущий вывод устанавливается функцией StartDrawing().

Если параметр 'Color' не задан, то будут использоваться цвета установленные FrontColor(). Для установки допустимых значений цвета используйте RGB() или RGBA().

Пример:

  If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 200, 200, RGB(255, 255, 255))
      For Radius = 100 To 10 Step -10
        Circle(100, 100, Radius, RGB(Random(255), Random(255), Random(255)))
      Next
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


CircularGradient

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CircularGradient()

Синтаксис

CircularGradient(x, y, Radius)
Описание
Заставляет градиент рисунка иметь круговую форму, с координатами центра x, y и радиусом Radius.

По умолчанию градиент начинается цветом background color в центре и заканчивается цветом front color на краю. Дополнительные цвета могут быть добавлены в градиент командой GradientColor().

Примечание: эта команда имеет воздействие только на текущем рисунке ImageOutput(). Градиент рисуется только тогда, когда активируется режим #PB_2DDrawing_Gradient команды DrawingMode().

Пример:

  If OpenWindow(0, 0, 0, 400, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)

      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor($00FFFF)
      FrontColor($FF0000)

      CircularGradient(100, 100, 100)
      Circle(100, 100, 100)
      CircularGradient(350, 100, 75)
      Circle(300, 100, 100)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


ConicalGradient

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

ConicalGradient()

Синтаксис

ConicalGradient(x, y, Angle.f)
Описание
Заставляет градиент рисунка иметь коническую форму, с координатами центра x, y, с указанным углом Angle.f (в градусах)

По умолчанию градиент начинается цветом background color под данным углом и заканчивается цветом front color под тем же углом. Дополнительные цвета могут быть добавлены в градиент командой GradientColor().

Примечание: эта команда имеет воздействие только на текущем рисунке ImageOutput(). Градиент рисуется только тогда, когда активируется режим #PB_2DDrawing_Gradient команды DrawingMode().

Пример:

  If OpenWindow(0, 0, 0, 400, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)

      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor($00FFFF)
      FrontColor($FF0000)

      ConicalGradient(100, 100, 0.0)
      Circle(100, 100, 100)
      ConicalGradient(300, 0, 90.0)
      Circle(300, 100, 100)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


CustomFilterCallback

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CustomFilterCallback()

Синтаксис

CustomFilterCallback(@FilterCallback())
Описание
Определяет процедуру, которая должна вызываться для каждого отображаемого рисунок активируемого режимом #PB_2DDrawing_CustomFilter команды drawing mode.

Параметры

Эта процедура должна иметь следующий вид:
  Procedure CustomCallback(x, y, SourceColor, TargetColor)
    ;
    ; Calculate ResultColor from the given input
    ;
    ProcedureReturn ResultColor
  EndProcedure
Процедура будет вызываться для каждого элемента изображения, объявленного командами Line(), Box() или DrawText(). SourceColor параметр 'цвета' который будет заменён 'цветом' TargetColor. Оба цвета всегда 32-бит с альфа-каналом - независимо от глубины цвета основного рисунка. Возвратный вызов должен вычислить цвет, который должен иметь целевой пиксель после.

Эта процедура будет очень часто вызываться (для каждого элемента изображения), следовательно она должна быть наиболее короткой и наиболее оптимизированной.

Примечание: #PB_2DDrawing_CustomFilter drawing mode работает только с ImageOutput().

Пример:

  Procedure FilterCallback(x, y, SourceColor, TargetColor)
    ; Take only the Red component from the Source, do not modify the others
    ProcedureReturn RGBA(Red(SourceColor), Green(TargetColor), Blue(TargetColor), Alpha(TargetColor))
  EndProcedure

  UseJPEGImageDecoder()

  If OpenWindow(0, 0, 0, 400, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    LoadImage(1, #PB_Compiler_Home + "examples/sources/data/clouds.jpg")

    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      DrawImage(ImageID(1), 0, 0, 400, 200)

      DrawingMode(#PB_2DDrawing_CustomFilter)
      CustomFilterCallback(@FilterCallback())
      Circle(100, 100, 100, $0000FF)
      Circle(300, 100, 100, $000000)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


CustomGradient

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CustomGradient()

Синтаксис

CustomGradient(@GradientCallback())
Описание
Установливает градиент произвольной формы, используя процедуру Callback.

Параметры

Эта процедура должна иметь следующий вид:
  Procedure.f GradientCallback(x, y)
    ;
    ; Return a value between 0.0 and 1.0 to define the gradient for the x/y position.
    ;
    ProcedureReturn 1.0
  EndProcedure
Процедуру вызывают для каждого пикселя, который является частью рисунка. Возвратный вызов должен возвратить значение между 0.0 и 1.0 (не номер цвета), чтобы определить значение градиента в данной позиции.

По умолчанию значение 0.0 представляет текущий цвет background color и значение 1.0 представляет цвет front color. Дополнительные цвета могут быть суммированы к градиенту командой GradientColor().

Эта процедура будет очень часто вызываться (для каждого элемента изображения), следовательно она должна быть наиболее короткой и наиболее оптимизированной.

Примечание:Градиент затрагивает команды рисования ImageOutput(), только когда устанавливается #PB_2DDrawing_Gradient команды DrawingMode().

Пример:

  Procedure.f GradientCallback(x, y)
    ProcedureReturn Sin(x * 0.1) * Sin(y * 0.1) ; will be between 0 and 1
  EndProcedure

  If OpenWindow(0, 0, 0, 400, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)

      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor($00FFFF)
      FrontColor($FF0000)

      CustomGradient(@GradientCallback())
      Circle(100, 100, 100)
      Circle(300, 100, 100)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


DrawAlphaImage

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

DrawAlphaImage()

Синтаксис

DrawAlphaImage(ImageID, x, y [, ConstAlpha])
Описание
Выводит указанное изображение ImageID в позиции x, y на поверхность для рисования. Получить ImageID можно с помощью функции ImageID().

Изображение будет объединено с основой рисунка принимая в расчет его канал альфа (даже если режим drawing mode не равен #PB_2DDrawing_AlphaBlend). "ConstAlpha" может использоваться чтобы контролировать общую прозрачность изображения. Значение может колебаться от 0 (полностью прозрачный) до 255 (полностью непрозрачный). Таким образом,изображения не имеющие в себе альфа-канал можно сделать с прозрачными.

Эта команда не может быть использована для отображения иконки (загруженной из файла. *.ico).


DrawImage

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

DrawImage()

Синтаксис

DrawImage(ImageID, x, y [,Width, Height])
Описание
Выводит указанное изображение ImageID в позиции x, y на поверхность для рисования. 'ImageID' можно получить с помощью ImageID() из библиотеки изображений.

Если заданы параметры 'Width' и 'Height' , то изображение будет уменьшено в режиме реального времени, прежде чем отобразится. Размер оригинального изображения не изменяется.


DrawRotatedText

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

DrawRotatedText()

Синтаксис

DrawRotatedText( x, y, Text$, Angle.f [, Color] )
Описание
Отображает строку Text$ на поверхность для рисования с координатами x, y под углом 'Angle'.

Параметры

x, y считаются от левого верхнего угла экрана, и также являются координатам точки, вокруг которой происходит вращение. Angle.f задает угол в градусах для поворота против часовой стрелки, начиная с нормальной ориентацией текста text orientation. 'Color' может использоваться, чтобы изменить набор цветов FrontColor(). Фон вращаемого текста всегда прозрачен.

Пример:

  If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 200, 200, RGB(255, 255, 255))
      For Angle = 0 To 360 Step 45
        DrawRotatedText(100, 100, "Hello World!", Angle, RGB(0, 0, 0))
      Next Angle
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


DrawText

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

DrawText()

Синтаксис

Result = DrawText( x, y, Text$ [, FrontColor [, BackColor]] )
Описание
Отображает строку Text$ на поверхности для рисования в точке с координатами (х, у). Текущий вывод устанавливается функцией StartDrawing().

DrawingMode() используется для установки прозрачного фона. DrawingFont() используется для установки шрифта. Эта функция использует цвета установленные по умолчанию функциями FrontColor() и BackColor().

Новая позиция текстового курсора x, возвращается в 'Result', чтобы сделать возможным продолжение текста (если необходимо).

'FrontColor' и 'BackColor' - это дополнительные параметры они могут использоваться для того, чтобы изменить набор цветов установленных изначально функциями FrontColor() и BackColor().

RGB() или RGBA() может использоваться, чтобы получить правильный номер цвета.

Пример:

  If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      DrawingMode(#PB_2DDrawing_Transparent)
      Box(0, 0, 200, 200, RGB(255, 255, 255))
      For i = 1 To 30
        DrawText(Random(200), Random(200), "Hello World!", RGB(Random(255), Random(255), Random(255)))
      Next i
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


DrawingBuffer

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

DrawingBuffer()

Синтаксис

MemoryAddress = DrawingBuffer()
Описание
Возвращает адрес видеопамяти. Эта функция работает непосредственно с видеопамятью, что позволяет используя ScreenOutput() или SpriteOutput() очень быстро манипулировать пикселами. ImageOutput() эта команда открывает прямой доступ к пикселям изображения.

Если 'MemoryAddress' равна 0, то память недоступна. Для получения информации о буфере используются функции: DrawingBufferPixelFormat() и DrawingBufferPitch().

Эта функция должна вызываться каждый раз, когда нужно обратится к буферу.

Пример использования смотрите здесь:
DirectScreenDrawing.pb


DrawingBufferPitch

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

DrawingBufferPitch()

Синтаксис

Result = DrawingBufferPitch()
Описание
Возвращает длину линии (в байтах). Примечание: результат может быть больше, чем ширина линии в пикселях, по причинам выравнивания.

DrawingBuffer() должна вызываться перед использованием этой команды.


DrawingBufferPixelFormat

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

DrawingBufferPixelFormat()

Синтаксис

Result = DrawingBufferPixelFormat()
Описание
Возвращает текущий формат пикселя. Может быть сочетанием одного из следующих значений:

  #PB_PixelFormat_8Bits       ; байт за пиксель с палитрой
  #PB_PixelFormat_15Bits      ; 2 байта за пиксель
  #PB_PixelFormat_16Bits      ; 2 2 байта за пиксель
  #PB_PixelFormat_24Bits_RGB  ; 3 байта за пиксель (RRGGBB)
  #PB_PixelFormat_24Bits_BGR  ; 3 байта за пиксель (BBGGRR)
  #PB_PixelFormat_32Bits_RGB  ; 4 байта за пиксель (RRGGBB)
  #PB_PixelFormat_32Bits_BGR  ; 4 байта за пиксель (BBGGRR)
  #PB_PixelFormat_ReversedY   ; изменяется координата Y в памяти (нижняя строка становится первой).

Важно: функция DrawingBuffer() должна быть вызвана, прежде чем использовать эту функцию.

Следующие примеры показывают, как обработать результат:
  If DrawingBufferPixelFormat() = #PB_PixelFormat_32Bits_RGB|#PB_PixelFormat_ReversedY
    ; 32bit RGB with reversed Y coordinate
  EndIf

  If DrawingBufferPixelFormat() = #PB_PixelFormat_32Bits_RGB
    ; 32bit RGB without reversed Y coordinate
  EndIf

  If DrawingBufferPixelFormat() & #PB_PixelFormat_32Bits_RGB
    ; 32bit RGB, with or without reversed Y coordinate
  EndIf


DrawingFont

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

DrawingFont()

Синтаксис

DrawingFont(FontID)
Описание
Устанавливает шрифт FontID для текста выводимого в данный момент. Новый текст будет использовать вновь установленный шрифт.

Параметр FontID можно получить функцией FontID(). Перед использованием шрифт нужно загрузить функцией LoadFont(). Для восстановления системного шрифта нужно установить в параметре FontID константу #PB_Default.


DrawingMode

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

DrawingMode()

Синтаксис

DrawingMode(Mode)
Описание
Изменение режима отображения текста и рисунков.

Режим может быть комбинацией следующих значений:

#PB_2DDrawing_Default
Это стандартный режим рисования, когда рисунок начинается. Отображается текст с фоном и геометрические фигуры с заливкой. Если рисунок поддерживает альфа-канал, он останется без изменений, будет изменяться только цвет компонентов.
#PB_2DDrawing_Transparent
Если этот способ активизирован, тогда основа текста, выводимого DrawText() будет прозрачна.
#PB_2DDrawing_XOr
Активирует режим XOR. Все графические объекты сливаются с актуальным фоновым режимом. Альфа-канал не смешивается.

Примечание: Этот режим не работает с принтером PrinterOutput().
#PB_2DDrawing_Outlined
Если этот способ активизирован, только контуры геометрических фигур будут нарисованы (рисунки не будут залиты цветом). Это относится к командам, таким как Circle, Box и т.д..
Следующие способы работают только с ImageOutput(). Они игнорируются для всех других выводов.

#PB_2DDrawing_AlphaBlend
Операции рисунка, будут объединены с основой, используя канал альфа чтобы управлять прозрачностью каждого элемента изображения. RGBA() может быть использованна чтобы определять цвет, который интегрирует степень прозрачности для команд FrontColor(), Box(), DrawText() и т.д..
#PB_2DDrawing_AlphaClip
Операции рисования будут смешаны с фоном как при #PB_2DDrawing_AlphaBlend, но с разницей, что основа действует как маска. Это означает, что участки вывода, которые прозрачны перед плавным сопряжением, также останутся прозрачными впоследствии. Если у рисунка нет альфа-канала, тогда этот параметр будет действовать как #PB_2DDrawing_AlphaBlend.
#PB_2DDrawing_AlphaChannel
Операция будет изменять только альфа-канал, игнорируя значения цвета. Например, рисунок круга circle с значением цвета RGBA(0, 0, 0, 0) вырежет дырку в рисунке, сделав круг полностью прозрачными. Если текущий рисунок не имеет альфа-канала, тогда рисунок не будет иметь эффекта в этом режиме.
#PB_2DDrawing_Gradient
Этот режим позволяет сделать градиент вместо сплошного цвета. Форма градиента может быть определена командами как LinearGradient(), CircularGradient() и т.д., цвет используемый в градиенте может быть установлен GradientColor(). Цвет параметров, приведенных в других командах будет игнорироваться в этом режиме. Этот режим может быть объединен, с вышеуказанными режимами альфа-канала, чтобы иметь градиенты с полупрозрачными цветами.
#PB_2DDrawing_CustomFilter
В этом режиме цвет каждого пикселя может быть определен в порядке, предусмотренном CustomFilterCallback(). Это позволяет установить произвольные геометрические формы для рисунка.
Чтобы использовать несколько способов одновременно, необходимо использовать оператор '|' (OR). Пример для использования сливания XOR:
  DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)


Ellipse

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Ellipse()

Синтаксис

Ellipse(x, y, RadiusX, RadiusY [, Color])
Описание
Рисует заполненный эллипс по указанным координатам x,y, и указанными радиусами RadiusX и RadiusY. RadiusX и RadiusY не являются центром элипса. Режим заполнения определяется DrawingMode(). Текущий вывод устанавливается функцией StartDrawing().

Если параметр 'Color' не задан, то будут использоваться цвета установленные FrontColor(). Для установки допустимых значений цвета используйте RGB() или RGBA().

Пример:

  If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 200, 200, RGB(255, 255, 255))
      For radius=50 To 10 Step -10
        Ellipse(100, 100, radius*2, radius, RGB(Random(255), Random(255), Random(255)))
      Next radius
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


EllipticalGradient

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

EllipticalGradient()

Синтаксис

EllipticalGradient(x, y, RadiusX, RadiusY)
Описание
Заливает градиентом эллиптической формы, вокруг точки x,y с указанными RadiusX и RadiusY.

По умолчанию, градиент цвета от background color на позиции x,y до цвета front color у контура эллипса. Дополнительные цвета могут быть добавлены в градиент GradientColor().

Примечание: Эта команда имеет силу только на поверхностях типа ImageOutput(). Градиент рисуется только тогда, когда активируется режим #PB_2DDrawing_Gradient команды DrawingMode().

Пример:

  If OpenWindow(0, 0, 0, 400, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)

      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor($00FFFF)
      FrontColor($FF0000)

      EllipticalGradient(100, 100, 150, 50)
      Circle(100, 100, 100)
      EllipticalGradient(300, 100, 50, 150)
      Circle(300, 100, 100)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


FillArea

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

FillArea()

Синтаксис

FillArea(x, y, BorderColor [, Color])
Описание
Заполняет замкнутую область по указанным координатам до пересечения с BorderColor. Это позволяет заполнять поверхность любой формы.

Если параметр Color не будет определен, то будет использоваться набор цвета по умолчанию FrontColor(). Для установки допустимых значений цвета используйте RGB() или RGBA().

Если 'BorderColor' будет иметь значение -1, то область по указанным координатам (x,y) будет заполнена определенным цветом. На 32-разрядных изображениях, альфа-канал игнорируется.

Примечание: Эта команда не работает с принтером PrinterOutput().

Пример:

  If OpenWindow(0, 0, 0, 300, 300, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 300, 300) And StartDrawing(ImageOutput(0))
      Box(0, 0, 300, 300, RGB(255, 255, 255))

      Circle(150, 150, 125 ,$00FF00)
      Circle(150, 150, 120 ,$FF0000)
      LineXY(30, 150, 270, 150, $FFFFFF)
      FillArea(150, 155, -1, $0000FF) ; Replace -1 by $00FF00, and compare the result

      StopDrawing()
      ImageGadget(0, 0, 0, 300, 300, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


FrontColor

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

FrontColor()

Синтаксис

FrontColor(Color)
Описание
Устанавливает цвет по умолчанию для графических функций и отображения текста. RGB() или RGBA() может использоваться, чтобы получить правильный номер цвета. Используется ли альфа-канал, зависит от drawing mode.

Таблица с основными цветами находится здесь.


GrabDrawingImage

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

GrabDrawingImage()

Синтаксис

Result = GrabDrawingImage(#Image, x, y, Width, Height)
Описание
Создаёт новое изображение #Image, начиная с координат x,y и определенных размеров Width, Height. Если #PB_Any будет использоваться как параметр #Image, то номер нового изображения будет отослан в 'Result'.

Любые части указанного участка, которые находятся за пределами рисунка, не будут определенны в созданных изображениях. Аналогичным образом, если вывод WindowOutput(), любая часть окна, которая в настоящее время не видна, не будет определена в получающемся изображении.

Примечание: Эта команда не работает с принтером PrinterOutput().


GradientColor

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

GradientColor()

Синтаксис

GradientColor(Position.f, Color)
Описание
Добавляет данный цвет Color в данной позиции Position.f к спектру градиента рисунка. Позиция должна быть значением с плавающей запятой между 0.0 и 1.0.

По умолчанию, градиент рисунка колеблется от текущего background color в позиции 0.0 к текущему front color в позиции 1.0. Этой командой, могут быть вставлены дополнительные цвета между ними.

Команда ResetGradientColors() может быть использована для возврата к стандартному градиенту.

Следующие команды могут быть использованы для определения формы градиента:
- LinearGradient()
- CircularGradient()
- EllipticalGradient()
- BoxedGradient()
- ConicalGradient()
- CustomGradient()

Примечание: эта команда имеет значение только для ImageOutput(). Градиент влияет на команды DrawingMode(), только когда устанавливается параметр #PB_2DDrawing_Gradient.

Пример:

  If OpenWindow(0, 0, 0, 400, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)

      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor($0000FF)
      GradientColor(0.4, $00FFFF)
      GradientColor(0.6, $FFFF00)
      FrontColor($FF0000)

      LinearGradient(0, 0, 200, 200)
      Circle(100, 100, 100)
      LinearGradient(350, 100, 250, 100)
      Circle(300, 100, 100)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


Line

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Line()

Синтаксис

Line(x, y, Width, Height [, Color] )
Описание
Рисует линию с помощью указанных размеров. Где x,y начало линии, Width,Height конец линии, относительно x,y. Вывод для линии устанавливается StartDrawing().

Если 'Color' не задан, будет установлен цвет заданный FrontColor(). Для установки допустимых значений цвета используйте RGB() или RGBA().

Пример:

  If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 200, 200, RGB(255, 255, 255))
      For Width = 1 To 180 Step 5
        Line(10, 10, Width, 180, RGB(Random(255), Random(255), Random(255)))
      Next Width
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


LineXY

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

LineXY()

Синтаксис

LineXY(x1, y1, x2, y2 [, Color])
Описание
Рисует линию с помощью указанных координат. Где x1,y1 начало линии, x2,y2 конец линии. Вывод для линии устанавливается StartDrawing().

Если 'Color' не задан, будет установлен цвет заданный FrontColor(). Для установки допустимых значений цвета используйте RGB() или RGBA().

Пример:

  If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 200, 200, RGB(255, 255, 255))
      For Angle = 0 To 360 Step 3
        LineXY(100, 100, 100+Cos(Angle)*90, 100+Sin(Angle)*90, RGB(Random(255), Random(255), Random(255)))
      Next Angle
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


LinearGradient

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

LinearGradient()

Синтаксис

LinearGradient(x1, y1, x2, y2)
Описание
Устанавливает градиент для линии с координатами x1, y1, x2, y2.

По умолчанию, градиент цвета от background color с координатами x1, y1 до цвета front color с координатами x2, y2. Дополнительные цвета могут быть добавлены в градиент GradientColor().

Примечание: Эта команда имеет силу только на поверхностях типа ImageOutput(). Градиент рисуется только тогда, когда активируется режим #PB_2DDrawing_Gradient команды DrawingMode().

Пример:

  If OpenWindow(0, 0, 0, 400, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)

      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor($00FFFF)
      FrontColor($FF0000)

      LinearGradient(0, 0, 200, 200)
      Circle(100, 100, 100)
      LinearGradient(350, 100, 250, 100)
      Circle(300, 100, 100)

      StopDrawing()
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


OutputDepth

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

OutputDepth()

Синтаксис

Result = OutputDepth()
Описание
Возвращает глубину цвета (в битах на пиксел) текущего места для рисования.


OutputHeight

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

OutputHeight()

Синтаксис

Result = OutputHeight()
Описание
Возвращает высоту (в пикселях) текущего места для рисования.


OutputWidth

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

OutputWidth()

Синтаксис

Result = OutputWidth()
Описание
Возвращает ширину (в пикселях) текущего места для рисования.


Plot

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Plot()

Синтаксис

Plot(x, y [, Color])
Описание
Рисует точку с координатами координатам x, y. Место для вывода определяется StartDrawing(). Если 'Color' не задан, будет установлен цвет заданный FrontColor(). Для установки допустимых значений цвета используйте RGB() или RGBA().

Координаты x,y должны быть обязательно внутри площади рисунка.

Пример:

  If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      For x = 0 To 199
        For y = 0 To 199
          Plot(x, y, RGB(Random(255), Random(255), Random(255)))
        Next y
      Next x
      StopDrawing()
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


Point

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Point()

Синтаксис

Color = Point(x, y)
Описание
Возвращает цвет точки позиции x,y текущего рисунка. Если у площади рисунка есть канал альфа, тогда результат будет значением RGBA (32 бита), если нет альфа канала будет значение RGB (24 бита). Цвет может быть разложенным при помощи команд Red(), Green(), Blue() и Alpha().

Координаты x,y должны быть обязательно внутри площади рисунка.

Примечание: эта команда не работает с принтером PrinterOutput().


ResetGradientColors

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

ResetGradientColors()

Синтаксис

ResetGradientColors()
Описание
Удаляет все цвета из градиента рисунка и возвращает цвет по умолчанию background color и front color.

GradientColor() команда может использоваться, чтобы суммировать дополнительные цвета к градиенту.

Примечание: эта команда имеет силу только на поверхностях типа ImageOutput(). Градиент рисуется только тогда, когда активируется режим #PB_2DDrawing_Gradient команды DrawingMode().


StartDrawing

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

StartDrawing()

Синтаксис

Result = StartDrawing(OutputID)
Описание
Изменяет текущий вывод рисунка, на указанный вывод OutputID. После установки нового вывода, все функции рисунка предоставляются данному выводу. По окончании рисования нужно вызвать функцию StopDrawing().

'Result' нужно всегда проверять перед началом рисования. Если 'Result' равен 0, то активировать вывод нет возможности, иначе можно начинать рисовать.

Задний фон имеет черный цвет (т.е.: RGB(0,0,0)) и передний фон имеет белый цвет (т.е.: RGB(255,255,255)).

OutputID можно получить следующими функциями:
  WindowOutput()  : Графика будет выполнена непосредственно на Окне
  ScreenOutput()  : Графика будет выполнена непосредственно на Экране (для игр)
  SpriteOutput()  : Графика будет выполнена непосредственно на Спрайте (для игр)
  ImageOutput()   : Графика будет выполнена непосредственно на изображении (см. CreateImage())
  PrinterOutput() : Графика будет выполнена непосредственно на принтере


StopDrawing

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

StopDrawing()

Синтаксис

StopDrawing()
Описание
По окончании всех необходимых операций с гарафикой (начатые StartDrawing()) нужно вызвать эту функцию. Это позволит выполнять другие функции программы.

Типичная последовательность команд выглядит как указано ниже:
  If StartDrawing(WindowOutput(0))
    Box(10,10,20,20)
    Line(30,50,100,100)
    ....
    StopDrawing()
  EndIf


TextHeight

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

TextHeight()

Синтаксис

Height = TextHeight(Text$)
Описание
Возвращает высоту (в пикселях) данной строки Text$, используя текущий шрифт.


TextWidth

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

TextWidth()

Синтаксис

Width = TextWidth(Text$)
Описание
Возвращает длину (в пикселах) строки Text$, в текущем выводе, используя текущий шрифт. Эта функция удобна для получения реальной длины строки, при использовании непропорционального шрифта.


AudioCD

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

PureBasic - AudioCD

Краткий обзор

AudioCD - это хороший способ запустить музыку во время игры или работе на компьютере, не потребляя много системных ресурсов. Эта библиотека содержит все функции, необходимые, чтобы управлять воспроизведением звуковых компакт-дисков в программах PureBasic.

Краткий перечень команд

AudioCDLength
AudioCDName
AudioCDStatus
AudioCDTrackLength
AudioCDTrackSeconds
AudioCDTracks
EjectAudioCD
InitAudioCD
PauseAudioCD
PlayAudioCD
ResumeAudioCD
StopAudioCD
UseAudioCD


AudioCDLength

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

AudioCDLength()

Синтаксис

Result = AudioCDLength()
Описание
Возвращает полную продолжительность всего audioCD в секундах.

Поддерживаемые ОС

Windows, MacOS X


AudioCDName

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

AudioCDName()

Синтаксис

Result = AudioCDName()
Описание
В зависимости от системы возвращает имя audioCD. Например, это могло возвратить audio CD drive. Например, в Windows возвращается 'D:\' если проигрыватель audioCD определёнен в системе под буквой "D".


AudioCDStatus

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

AudioCDStatus()

Синтаксис

Result = AudioCDStatus()
Описание
Возвращает фактическое состояние текущего audioCD. Возвращаемое значение может быть следующим :

-1: audioCD , не готов (пустой или открытый)
0: audioCD остановлен (обнаружен и находится в приводе)
>0: номер звуковой дорожки, которая в настоящее время играет.


AudioCDTrackLength

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

AudioCDTrackLength()

Синтаксис

Result = AudioCDTrackLength(TrackNumber)
Описание
Возвращает продолжительность указанной дорожки в секундах.


AudioCDTrackSeconds

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

AudioCDTrackSeconds()

Синтаксис

Result = AudioCDTrackSeconds()
Описание
Возвратиться число секунд, прошедших от начала воспроизведения текущей дорожки.


AudioCDTracks

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

AudioCDTracks()

Синтаксис

Result = AudioCDTracks()
Описание
Возвращает общее количество дорожек на компакт-диске, доступном для воспроизведения.


EjectAudioCD

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

EjectAudioCD()

Синтаксис

EjectAudioCD(State)
Описание
Открывает или закрывает текущий компакт-диск. Если State = 1, дисковод компакт-диска будет открыт, в противном случае будет закрыт.

Поддерживаемые ОС

Windows, Linux


InitAudioCD

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

InitAudioCD()

Синтаксис

Result = InitAudioCD()
Описание
Инициализирует все необходимые ресурсы, чтобы обработать звуковые функции компакт-диска. Эта функция должна быть вызвана перед любыми другими функциями библиотеки audioCD. Если Result = 0, инициализация потерпела неудачу, или нет доступных компакт-дисков. Иначе Result содержит число компакт-дисков, имеющихся в распоряжении системы.


PauseAudioCD

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

PauseAudioCD()

Синтаксис

PauseAudioCD()
Описание
Приостановить проигрывание audioCD. Воспроизведение может быть продолжено при использовании ResumeAudioCD()


PlayAudioCD

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

PlayAudioCD()

Синтаксис

PlayAudioCD(StartTrack, EndTrack)
Описание
Начинает проигрывание audioCD с дорожки 'StartTrack' и останавливает проигрывание на дорожке 'EndTrack'.Первая дорожка индексируется как 1.


ResumeAudioCD

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

ResumeAudioCD()

Синтаксис

ResumeAudioCD()
Описание
Возобновляет воспроизведение audioCD, ранее приостановленное функцией PauseAudioCD() .


StopAudioCD

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

StopAudioCD()

Синтаксис

StopAudioCD()
Описание
Останавливает воспроизведение audioCD.


UseAudioCD

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

UseAudioCD()

Синтаксис

UseAudioCD(AudioCDDrive)
Описание
Поскольку InitAudioCD() определяет, сколько audioCD доступно в системе, UseAudioCD() используется, чтобы изменить текущий компакт-диск. Таким образом, возможно, запустить несколько компакт-дисков одновременно.


Billboard

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

PureBasic - Billboard

Краткий обзор

Биллборды - трехмерные плоскости (составленные из 2 треугольников), которые всегда стоят перед камерой (camera). Доски объявлений полезны, чтобы быстро отобразить элементы elements, такие как дождь, визуальные помехи, деревья, растительность или любые эффекты основанные на частице. Прежде чем использовать любые функции этой библиотеки нужно вызвать InitEngine3D() .

Billboards are added to billboard groups, which are collections of similarly sized and positioned billboards, so that they may be displayed.

Краткий перечень команд

AddBillboard
BillboardGroupID
BillboardGroupLocate
BillboardGroupMaterial
BillboardGroupX
BillboardGroupY
BillboardGroupZ
BillboardHeight
BillboardLocate
BillboardWidth
BillboardX
BillboardY
BillboardZ
ClearBillboards
CountBillboards
CreateBillboardGroup
FreeBillboardGroup
HideBillboardGroup
IsBillboardGroup
MoveBillboard
MoveBillboardGroup
RemoveBillboard
ResizeBillboard
RotateBillboardGroup


AddBillboard

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

AddBillboard()

Синтаксис

AddBillboard(#Billboard, #BillboardGroup, x, y, z)
Описание
Добавляет биллборд в группу биллбордов в заданную позицию, относительно позиции группы биллбордов. Группа биллбордов должна быть созданна функцией CreateBillboardGroup().

Параметры

#Billboard - Уникальный номер, используемый для идентификации этого биллборда.

#BillboardGroup - Номер группы биллбордов, в которую вы хотите добавть новый биллборд.

x - Координата X относительно позиции X группы биллбордов.

y - Координата Y относительно Y группы биллбордов.

z - Координата Z относительно позиции Z группы биллбордов.

Возвращаемое значение

Эта функция ничего не возвращает.


BillboardGroupID

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

BillboardGroupID()

Синтаксис

BillboardGroupID = BillboardGroupID(#BillboardGroup)
Описание
Возвращает уникальный ID, который идентифицирует заданную '#BillboardGroup' в операционной системе. Эта функция очень необходима, когда необходимо сослаться на группу биллбордов из другой библиотеки.


BillboardGroupLocate

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

BillboardGroupLocate()

Синтаксис

BillboardGroupLocate(#BillboardGroup, x, y, z)
Описание
Транслирует (перемещает) группу биллбордов в новую абсолютную позицию в 3D. Это значит, что после применения этой функции группа биллбордов окажется в позиции с координатами х, y и z. Для того чобы перемещать группу в относительные координаты, используйте функцию MoveBillboardGroup().

Параметры

#BillboardGroup - Номер группы биллбордов, которую необходимо переместить.

x - Новая координата X.

y - Новая координата Y.

z - Новая координата Z.

Возвращаемое значение

Эта функция не возвращает никакое значение.


BillboardGroupMaterial

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

BillboardGroupMaterial()

Синтаксис

BillboardGroupMaterial(#BillboardGroup, MaterialID)
Описание
Назначает материал к выбранной группе биллбордов. Этот материал будет применен ко всем биллбордам в выбранной группе. Группа может иметь только один назначенный материал.

Параметры

#BillboardGroup - Номер группы биллбордов, которому будет назначен новый материал.

MaterialID - ID номер материала. Веррный 'MaterialID' можно легко определить при помощи функции MaterialID().

Возвращаемое значение

Эта функция не возвращает никакие значения.


BillboardGroupX

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

BillboardGroupX()

Синтаксис

Result = BillboardGroupX(#BillboardGroup)
Описание
Определяет абсолютное положение группы биллбордов в 3D пространстве на оси Х.

Параметры

#BillboardGroup - Номер группы, положение которой необходимо узнать.

Возвращаемое значение

Result - Абсолютное положение X группы биллбордов.


BillboardGroupY

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

BillboardGroupY()

Синтаксис

Result = BillboardGroupY(#BillboardGroup)
Описание
Определяет абсолютное положение группы биллбордов в 3D пространстве на оси Y.

Параметры

#BillboardGroup - Номер группы, положение которой необходимо узнать.

Возвращаемое значение

Result - Абсолютное положение Y группы биллбордов.


BillboardGroupZ

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

BillboardGroupZ()

Синтаксис

Result = BillboardGroupZ(#BillboardGroup)
Описание
Определяет абсолютное положение группы биллбордов в 3D пространстве на оси Z.

Параметры

#BillboardGroup - Номер группы биллбордов, положение которой необходимо узнать.

Возвращаемое значение

Result - Абсолютное положение Z группы биллбордов.


BillboardHeight

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

BillboardHeight()

Синтаксис

Result = BillboardHeight(#Billboard, #BillboardGroup)
Описание
Определяет высоту всех биллбордов в группе. Высота измеряется в единицах, используемых в 3D пространстве.

Параметры

#Billboard - Номер биллборда, у которого необходимо узнать высоту.

#BillboardGroup - Номер группы биллбордов, в которой находится биллборд.

Возвращаемое значение

Result - Высота биллборда.


BillboardLocate

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

BillboardLocate()

Синтаксис

BillboardLocate(#Billboard, #BillboardGroup, x, y, z)
Описание
Перемещает биллборд в новое положение вместе с группой биллбордов, в которую он добавлен. Положение изменяется биллборда изменяется вместе с положением группы биллбордов. Используйте функцию MoveBillboard() для того перемещать биллборд относительно его собственных координат.

Параметры

#Billboard - Номер биллборда, который нужно передвинуть.

#BillboardGroup - Номер группы биллбордов, которая содержит выбранный биллборд.

x - Новое положение X биллборда.

y - Новое положение Y биллборда.

z - Новое положение Z биллборда.

Возвращаемое значение

Эта функция не имеет возвращаемых значений.


BillboardWidth

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

BillboardWidth()

Синтаксис

Result = BillboardWidth(#Billboard, #BillboardGroup)
Описание
Определяет ширину биллборда, который добавлен в группу. Ширина измеряется единицами измерения 3D.

Параметры

#Billboard - Номер биллборда, у которого необходимо определить ширину.

#BillboardGroup - Номер группы биллбордов, в которой находится биллборд.

Возвращаемое значение

Result - Ширина биллборда.


BillboardX

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

BillboardX()

Синтаксис

Result = BillboardX(#Billboard, #BillboardGroup)
Описание
Возвращает положение биллборда на оси X относительно положения группы, в котрой он находится.

Параметры

#Billboard - Номер биллборда, положение которого необходимо узнать.

#BillboardGroup - Номер группы биллбордов, которая содержит биллборд.

Возвращаемое значение

Result - Положение X биллборда.


BillboardY

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

BillboardY()

Синтаксис

Result = BillboardY(#Billboard, #BillboardGroup)
Описание
Возвращает положение биллборда на оси Y относительно положения группы, в котрой он находится.

Параметры

#Billboard - Номер биллборда, положение которого необходимо узнать.

#BillboardGroup - Номер группы биллбордов, которая содержит биллборд.

Возвращаемое значение

Result - Положение биллборда Y.


BillboardZ

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

BillboardZ()

Синтаксис

Result = BillboardZ(#Billboard, #BillboardGroup)
Описание
Возвращает положение биллборда на оси Z относительно положения группы, в котрой он находится.

Параметры

#Billboard - Номер биллборда, положение которого необходимо узнать.

#BillboardGroup - Номер группы биллбордов, которая содержит биллборд.

Return value

Result - Положение биллборда Z.


ClearBillboards

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

ClearBillboards()

Синтаксис

ClearBillboards(#BillboardGroup)
Описание
Удаляет и разрушает все биллборды в указанной группе биллбордов.

Параметры

#BillboardGroup - Номер группы биллбордов, которая содержит биллборд.

Возвращаемое значение

Эта функция не возвращает значения.


CountBillboards

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler/ru

CountBillboards()

Синтаксис

Result = CountBillboards(#BillboardGroup)
Описание
Считает количество биллбордов, находящихся в группе.

Параметры

#BillboardGroup - Номер группы биллбордов, в которой необходимо посчитать количество биллбордов.

Return value

Result - Количество биллбордов, которое было добавлено в группу биллбордов.


CreateBillboardGroup

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CreateBillboardGroup()

Синтаксис

Result = CreateBillboardGroup(#BillboardGroup, MaterialID, DefaultBillboardWidth, DefaultBillboardHeight [, x, y, z])
Описание
Создает новую пустую группу биллбордов.Если используется #PB_Any как параметр '#BillboardGroup', функция возвратит номер новой группы.

Выбранный материал будет использован всеми биллбордами в группе. Правильный 'MaterialID' можно легко получить функцией MaterialID(). Обычный размер будущих биллбордов должен быть указан параметрами 'DefaultBillboardWidth' и 'DefaultBillboardHeight'. Размер каждого биллборда может быть настроен отдельно функцией ResizeBillboard(), но важно помнить что может быть сильное падение производительности, если в одной группе будут биллборды разного размера. Параметрами x,y и z задается положение новой группы в 3D пространстве. Если #BillboardGroup уже была создана, то она будет автоматически удалена (со всем добавленными в нее биллбордами), и заменена на новую.

Параметры

#BillboardGroup - Номер группы, который будет ассоциироваться с ней в других функциях этой библиотеки.

MaterialID - ID номер материала, который будет использован для всех биллбордов, добавленных в эту группу функцией AddBillboard(). ID материала можно легко определить функцией MaterialID().

DefaultBillboardWidth - Ширина по умолчанию (в единицах измерения 3D) биллбордов, добавляемых в группу.

DefaultBillboardHeight - Высота по умолчанию (в единицах измерения 3D) биллбордов, добавляемых в группу.

Следующие три параметра необязательны, но они должны быть определены вместе.

x - Абсолютное положение X новой группы биллбордов в 3D.

y - Абсолютное положение Y новой группы биллбордов в 3D.

z - Абсолютное положение Z новой группы биллбордов в 3D.

Возвращаемое значение

Result - Значение, возвращаемое этой функцией может быть использованно для определения, была ли созданна группа или нет. Если значение равно нулю, то группа биллбордов не была создана. Если же значение не равно нулю, то группа была успешно создана.


FreeBillboardGroup

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

FreeBillboardGroup()

Синтаксис

FreeBillboardGroup(#BillboardGroup)
Описание
Удаляет из памяти выбранную группу биллбордов и все биллборды, связанные с ней.

Примечание: все группу биллбордов автоматически удаляются во время завершения программы.

Параметры

#BillboardGroup - Номер группы биллбордов, которую необходимо удалить.

Возваращаемое значение

Эта функция не имеет возвращаемого значения.


HideBillboardGroup

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

HideBillboardGroup()

Синтаксис

HideBillboardGroup(#BillboardGroup, State)
Описание
Изменяет видимость (прячет или показывает) группу биллбордов и все биллборды в группе.

Параметры

#BillboardGroup - Номер группы биллбордов, которую нужно спрятать или показать.

State - Новый режим видимости. Параметр State может быть установлен в 2 значения:
  0: группа биллбордов спрятана
  1: группа биллбордов показана

Возваращаемое значение

Эта функция не имеет возвращаемого значения.


IsBillboardGroup

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

IsBillboardGroup()

Синтаксис

Result = IsBillboardGroup(#BillboardGroup)
Описание
Проверяет #BillboardGroup как корректно созданную группу биллбордов.

Эта функция неубиваема и может быть использованна с любыми значениями. Если результат не равен нулю, то объект быть существует, иначе функция возваращает ноль. Это верный путь для проверки существования группы.


MoveBillboard

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

MoveBillboard()

Синтаксис

MoveBillboard(#Billboard, #BillboardGroup, x, y, z)
Описание
Передвигает биллборд, который находится в группе биллбордов в указанные координаты х,у и z. Это перемещение относительно текущих координат группы. Для того чтобы передвинуть биллборд относительно абсолютных координат, используйте BillboardLocate().

Параметры

#Billboard - Номер биллборда, который необходимо переместить.

#BillboardGroup - Номер группы биллбордов, которая содержит биллборд.

x - Добавляемое к текущей позиции Х значение.

y - Добавляемое к текущей позиции Y значение.

z - Добавляемое к текущей позиции Z значение.

Возвращаемое значение

Эта функция не имеет возвращаемого значения.


MoveBillboardGroup

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

MoveBillboardGroup()

Синтаксис

MoveBillboardGroup(#BillboardGroup, x, y, z)
Описание
Перемещает группу биллбордов в заданные x, y и z координаты. Перемещение будет относительно текущего положения группы биллбордов. Чтобы выбрать абсолютное перемещение, используйте функцию BillboardGroupLocate().

Параметры

#BillboardGroup - Количество биллбордов, которое необходимо переместить.

x - Смещение группы относительно текущей позиции X.

y - Смещение группы относительно текущей позиции Y.

z - Смещение группы относительно текущей позиции Z.

Возвращаемое значение

Эта функция не имеет возвращаемых значений.


RemoveBillboard

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

RemoveBillboard()

Синтаксис

RemoveBillboard(#Billboard, #BillboardGroup)
Описание
Удаляет биллборды из указанной группы.

Параметры

#Billboard - Номер биллборда, который необходимо удалить.

#BillboardGroup - Номер группы, содержащей биллборды.

Возвращаемое значение

Эта функция не имеет возвращаемых значений.


ResizeBillboard

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

ResizeBillboard()

Синтаксис

ResizeBillboard(#Billboard, #BillboardGroup, Width, Height)
Описание
Изменяет размер находящегося в группе биллборда, на указанный.
Примечание: Если вы будете изменять размер биллбордов этой функцией, может быть потеря производительности.

Параметры

#Billboard - Номер биллборда, у которого необходимо поменять размер.

#BillboardGroup - Номер группа, которая содержит биллборд..

Width - Новая ширина биллборда в единицах измерения 3D.

Height - Новая высота биллборда в единицах измерения 3D.

Возвращаемое значение

Эта функция не имеет возвращаемых значений.


RotateBillboardGroup

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

RotateBillboardGroup()

Синтаксис

RotateBillboardGroup(#BillboardGroup, x, y, z [, Mode] )
Описание
Вращает #BillboardGroup согласно указанному x, y, z угловые значения. Все углы указаны в градусах от 0 до 360. Дополнительный параметр 'Mode' может быть одной из следующих констант:
  PB_Absolute: абсолютное вращение (значение по умолчанию).
  PB_Relative: относительное вращение, основанное на предыдущем вращении.


Camera

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

PureBasic - Camera

Краткий обзор

Камеры используются, для отображения 3D-пространства. Ими можно управлять как реальными камерами (перемещать, осуществлять вращение, изменять угол обзора и т.д.). Необходима минимум одна камера render для отображения на дисплее. Много камер с различными позициями и положениями могут использоваться одновременно, которые делают возможными первоклассные эффекты как Splitscreen (полиэкран, для нескольких игроков), зеркала заднего вида и т. д. Прежде чем использовать команды, относящиеся к камерам, должна быть вызвана InitEngine3D() .

Краткий перечень команд

CameraBackColor
CameraFOV
CameraID
CameraLocate
CameraLookAt
CameraProjectionMode
CameraProjectionX
CameraProjectionY
CameraRange
CameraRenderMode
CameraX
CameraY
CameraZ
CreateCamera
FreeCamera
IsCamera
MoveCamera
RotateCamera


CameraBackColor

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CameraBackColor()

Синтаксис

CameraBackColor(#Camera, Color)
Описание
Изменяет основной цвет #Camera. Когда подключается новая камера, она не имеет цвета фона (фоновый режим прозрачен), используется чтобы позволить смешивать двумерный фон и трехмерную сцену.

Параметры

#Camera - номер камеры, цвет фона которой Вы хотели бы изменить. Этот номер, который Вы использовали, когда Вы создавали камеру, используя CreateCamera()

Color - Новый цвет фона фотокамеры. Может использоваться RGB(), чтобы получить правильный номер цвета.

Возвращаемое значение

Эта функция не возвращает значения.


CameraFOV

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CameraFOV()

Синтаксис

CameraFOV(#Camera, Angle)
Описание
Изменяет поле зрения камеры (FOV), который позволяет Вам просматривать больший или меньший участок съёмки. Угол болше 90 °, даст результат широкоугольного объектива (или фотообъектив "рыбий глаз"). Угол меньше 30 °, даст суженный (телескопический) результат. Нормальные значения между 45 ° и 60 °.

Параметры

#Camera - номер камеры, поле зрения которой Вы хотели бы изменить. Этот номер, который Вы использовали, когда Вы создавали камеру, используя CreateCamera()

Angle - новый угол вида камеры в градусах.

Возвращаемое значение

Эта функция не возвращает значения.


CameraID

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CameraID()

Синтаксис

CameraID = CameraID(#Camera)
Описание
Возвращает уникальный номер, который идентифицирует данную '#Camera' в операционной системе. Эта функция полезна, когда другая библиотека нуждается в справочной информации о камере.


CameraLocate

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CameraLocate()

Синтаксис

CameraLocate(#Camera, x, y, z)
Описание
Изменяет абсолютную позицию камеры в пространстве. Изменяется только позиция, все другие значения не меняются. Если Вы хотите выполнить движение относительно текущего положения камеры, используйте функцию MoveCamera().

Параметры

#Camera - номер камеры, позицию которой Вы хотели бы изменить. Это номер, который Вы использовали, когда Вы создавали камеру, используя CreateCamera()

x - Новая позиция камеры X.

y - Новая позиция камеры Y.

z - Новая позиция камеры Z .

Возвращаемое значение

Эта функция не возвращает значения.


CameraLookAt

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CameraLookAt()

Синтаксис

CameraLookAt(#Camera, x, y, z)
Описание
Поворачивает камеру, чтобы она смотрела на указанный пункт (x, y, z). Положение камеры в пространстве не изменяется.

Параметры

#Camera - номер камеры, направление которой Вы хотели бы изменить. Это номер, который Вы использовали, когда Вы создавали камеру, используя CreateCamera()

x - Позиция X, в которую должна указывать камера.

y - Позиция Y, в которую должна указывать камера.

z - Позиция Z, в которую должна указывать камера.

Возвращаемое значение

Эта функция не возвращает значения.


CameraProjectionMode

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CameraProjectionMode()

Синтаксис

CameraProjectionMode(#Camera, Mode)
Описание
Изменяет режим проекции #Camera.

Параметры

#Camera - номер камеры, режим которой Вы хотели бы изменить. Это номер, который Вы использовали, когда Вы создавали камеру, используя CreateCamera()

Mode - значение, определяющее, как должен быть отображен объект. Это должно быть одно из следующих значений:
  #PB_Camera_Perspective : Дает эффект сцены в перспективе
  #PB_Camera_Orthographic: Дает эффект сцены без перспективы (отсутствует 3D эффект)

Возвращаемое значение

Эта функция не возвращает значения.


CameraProjectionX

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CameraProjectionX()

Синтаксис

Result = CameraProjectionX(#Camera, x, y, z)
Описание
Возвращает позицию 'x' (экрана), в пикселях, 3D точки (x, y, z) на указанной #Camera. Если пункт находится вне поля зрения камеры, Result возвращается-1.


CameraProjectionY

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CameraProjectionY()

Синтаксис

Result = CameraProjectionY(#Camera, x, y, z)
Описание
Возвращает позицию 'у' (экрана), в пикселях, 3D точки (x, y, z) на указанной #Camera. Если пункт находится вне поля зрения камеры, Result возвращается-1.


CameraRange

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CameraRange()

Синтаксис

CameraRange(#Camera, Near, Far)
Описание
Изменяет ближний и дальний диапазон камеры.

Параметры

#Camera - номер камеры, диапазон которой Вы хотели бы изменить. Это номер, который Вы использовали, когда Вы создавали камеру, используя CreateCamera()

Near - указывает самое близкое расстояние до камеры, начиная с которого будет возможна съемка.

Far - наибольшее расстояние от камеры, начиная с которого съемка будет невозможна.

Возвращаемое значение

Эта функция не возвращает значения.


CameraRenderMode

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CameraRenderMode()

Синтаксис

CameraRenderMode(#Camera, RenderMode )
Описание
Изменяет режим визуализации камеры. Когда вы создаете новую камеру командой CreateCamera(), по умолчанию устанавливается режим #PB_Camera_Textured.

Параметры

#Camera - номер камеры, режим которой Вы хотели бы изменить. Это номер, который Вы использовали, когда Вы создавали камеру, используя CreateCamera()

RenderMode - значение, определяющее режим визуализации. Это должно быть одно из следующих значений:
  #PB_Camera_Plot     : отображение только точек
  #PB_Camera_Wireframe: отображение только линий
  #PB_Camera_Textured : отображение всех деталей, включая текстуры.

Возвращаемое значение

Эта функция не возвращает значения.


CameraX

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CameraX()

Синтаксис

Result = CameraX(#Camera)
Описание
Используется, чтобы узнать положение камеры в пространстве.

Параметры

#Camera - номер камеры, положение которой Вы хотели бы узнать. Это номер, который Вы использовали, когда Вы создавали камеру, используя CreateCamera()

Возвращаемое значение

Result - позиция X указанной камеры.


CameraY

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CameraY()

Синтаксис

Result = CameraY(#Camera)
Описание
Используется, чтобы узнать положение камеры в пространстве.

Параметры

#Camera - номер камеры, положение которой Вы хотели бы узнать. Это номер, который Вы использовали, когда Вы создавали камеру, используя CreateCamera()

Возвращаемое значение

Result - позиция Y указанной камеры.


CameraZ

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CameraZ()

Синтаксис

Result = CameraZ(#Camera)
Описание
Используется, чтобы узнать положение камеры в пространстве.

Параметры

#Camera - номер камеры, положение которой Вы хотели бы узнать. Это номер, который Вы использовали, когда Вы создавали камеру, используя CreateCamera()

Возвращаемое значение

Result - позиция Z указанной камеры.


CreateCamera

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CreateCamera()

Синтаксис

Result = CreateCamera(#Camera, x, y, Width, Height)
Описание
Создает новую камеру #Camera, с координатами x, y и размерами Width, Height. Обратите внимание, что эти координаты и размеры, это положение и размеры на экране, а не размер и положение камеры в пространстве.
В отличие от других графических функций, эти координаты и измерения указываются в процентах от 0 до 100 (для более точного размещения камер могут быть использованы числа с плавающей запятой). Это может, покажется странным, но 3D-приложения должны работать независимо от разрешения дисплея, поэтому проценты - это хорошая возможность достижения этого. Если камера создается с высотой 50%, то она всегда будет заполнять 50% от высоты экрана, независимо от того, используете ли Вы экран с разрешением 640 * 480 или 1600 * 1200. Если уже была создана камера с тем же числом #Camera, то предыдущая камера автоматически освобождается и заменяется новой.

Камеры могут налезть друг на друга. Возможно, например, создать главную камеру, которая заполняет весь экран, и поместить небольшую камеру внутри, которая показывает другое место. Чтобы достичь этого, важен порядок создания камер: камера, которая будет показываться сверху, должна быть создана последней.

Параметры

#Camera - численное значение, которое Вы хотели бы использовать для идентификации камеры при использовании других команд этой библиотеки.

x - Процентная позиция левого края отображения камеры на дисплее. 0% значит по левому краю дисплея, 100% значит по правому краю дисплея.

y - Процентная позиция верхнего края отображения камеры на дисплее. 0% значит по верхнему краю дисплея, 100% значит по нижнему краю дисплея.

Width - Ширина отображения этой камеры в процентах от ширины дисплея.

Height - Высота отображения этой камеры в процентах от ширины дисплея.

Возвращаемое значение

Возвращает '0', если #Camera не может быть создана.Если #PB_Any используется в качестве параметра '#Camera", номер новой камеры будет возвращен как 'Result'.

Пример:
  CreateCamera(0, 0, 0, 100, 100) ; создает камеру, которая заполняет весь экран

  CreateCamera(0, 0,  0, 100, 50) ; создает камеру №0 на половину экрана
  CreateCamera(1, 0, 50, 100, 50) ; и камеру №1 в другой половине экрана
  CreateCamera(0, 0, 0, 100, 100) ; создает камеру, которая заполняет весь экран
  CreateCamera(1, 25, 0, 50, 10)  ; и камеру с эффектом зеркала заднего вида.
                                  ; Обратите внимание: зеркало заднего вида создается
                                  ; в конце и будет показанна на камере которая заполняет весь экран


FreeCamera

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

FreeCamera()

Синтаксис

FreeCamera(#Camera)
Описание
Выключает камеру #Camera и освобождает всю связанную с ней память. После вызова этой функции камера будет недоступна (с помощью своего номера) другими функциями в этой библиотеке, если вы не создадите её снова.
Примечание: все остальные камеры, автоматически освобождаются, когда завершается программа.
Параметры
#Camera - номер камеры, которую Вы хотели бы выключить. Это номер, который Вы использовали, когда Вы создавали камеру, используя CreateCamera()

Возвращаемое значение

Эта функция не возвращает значения.


IsCamera

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

IsCamera()

Синтаксис

Result = IsCamera(#Camera)
Описание
Проверяет наличие камеры с номером #Camera. Эта функция может быть с любым значением. Если 'Result' не равен нулю, то камера существует и инициализирована, в противном случае она возвращает нуль. Это правильный способ гарантировать, что камера готова к работе.


MoveCamera

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

MoveCamera()

Синтаксис

MoveCamera(#Camera, x,y,z)
Описание
Перемещает камеру на x,y,z относительно текущего положения. Чтобы осуществить абсолютное перемещение, необходимо использовать команду CameraLocate().

Параметры

#Camera - номер камеры, позицию которой Вы хотели бы изменить. Это номер, который Вы использовали, когда Вы создавали камеру, используя CreateCamera()

x - Смещение, которое должно добавиться к текущей позиции камеры X.

y - Смещение, которое должно добавиться к текущей позиции камеры Y.

z - Смещение, которое должно добавиться к текущей позиции камеры Z.

Возвращаемое значение

Эта функция не возвращает значения.


RotateCamera

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

RotateCamera()

Синтаксис

RotateCamera(#Camera, x, y, z [, Mode])
Описание
Поворачивает камеру в соответствии с значениями углов x, y, z. Все углы указаны в градусах, в диапазоне от 0 до 360. Режим "Mode" может иметь одно из следующих значений:
  PB_Absolute: Абсолютное вращение (по умолчанию).
  PB_Relative: относительное вращение, основанное на предыдущем вращении камеры.


Cipher

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

PureBasic - Cipher

Краткий обзор

Cipher библиотека представляет собой набор функций, которые полезны для кодирования, шифрования и расшифровки данных. Например MD5 (Message Digest 5) один из самых популярных алгоритмов шифрования, Linux, BSD и Unix используют их как альтернативный путь для кодирования паролей на диске.

Краткий перечень команд

AESDecoder
AESEncoder
AddCipherBuffer
Base64Decoder
Base64Encoder
CRC32FileFingerprint
CRC32Fingerprint
DESFingerprint
ExamineMD5Fingerprint
ExamineSHA1Fingerprint
FinishCipher
FinishFingerprint
IsFingerprint
MD5FileFingerprint
MD5Fingerprint
NextFingerprint
SHA1FileFingerprint
SHA1Fingerprint
StartAESCipher


AESDecoder

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

AESDecoder()

Синтаксис

Result$ = AESDecoder( *Input, *Output, Size, *Key, Bits, *InitializationVector [, Mode] )
Описание
Декодирует указанный буфер '*Input' используя алгоритм AES в буфер '*Output' buffer. 'Bits' указывает величину использованного для кодирования ключа. Допустимые значения 128, 192 и 256. 'InitializationVector' это 32 случайных байт области данных, используемых для инициализации шифрования, чтобы избежать нарушения в расшифровке (нужен только при использовании режима #PB_Cipher_CBC).

'Mode' необязательный параметр, и может быть одним из следующих значений:
  #PB_Cipher_CBC: Стандартный режим кодирования (Cipher Block Chaining). Нуждается в '*InitializationVector'.
                  Рекомендован как более безопасный чем режим ECB.
  #PB_Cipher_ECB: Альтернативный режим (Electronic CodeBook). Не использует случайные значения
                  (каждый блок зашифрован независимо друг от друга) что делает его менее сильным, чем CBC.
Более подробную информацию о AES и примеры исходного кода, см. AESEncoder().


AESEncoder

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

AESEncoder()

Синтаксис

Result$ = AESEncoder(*Input, *Output, Size, *Key, Bits, *InitializationVector [, Mode])
Описание
Кодирует указанный буфер '*Input' используя алгоритм AES в буфер '*Output' buffer. 'Bits' указывает величину использованного для кодирования ключа. Допустимые значения 128, 192 и 256. 'InitializationVector' это 32 случайных байт области данных, используемых для инициализации шифрования, чтобы избежать нарушения в расшифровке (нужен только при использовании режима #PB_Cipher_CBC).

AES is an industry class cipher algorithm and is good balanced between speed and security. Here is the wikipedia introduction about AES: 'In cryptography, the Advanced Encryption Standard (AES) is an encryption standard adopted by the U.S. government. The standard comprises three block ciphers, AES-128, AES-192 and AES-256, adopted from a larger collection originally published as Rijndael. Each AES cipher has a 128-bit block size, with key sizes of 128, 192 and 256 bits, respectively. The AES ciphers have been analyzed extensively and are now used worldwide.'

PureBasic использует RFC совместимые реализации AES. Более подробную информацию можно найти в RFC 3602: http://www.ietf.org/rfc/rfc3602.txt.

'Mode' необязательный параметр, и может быть одним из следующих значений:
  #PB_Cipher_CBC: Стандартный режим кодирования (Cipher Block Chaining). Нуждается в '*InitializationVector'.
                  Рекомендован как более безопасный чем режим ECB.
  #PB_Cipher_ECB: Альтернативный режим (Electronic CodeBook). Не использует случайные значения
                  (каждый блок зашифрован независимо друг от друга) что делает его менее сильным, чем CBC.

Пример: CBC

  ; Should be compiled in ascii mode
  ;
  String$ = "Hello this is a test for AES"

  *CipheredString   = AllocateMemory(Len(String$))
  *DecipheredString = AllocateMemory(Len(String$))

  If AESEncoder(@String$, *CipheredString, Len(String$), ?Key, 128, ?InitializationVector)
    Debug "Ciphered: "+PeekS(*CipheredString)

    AESDecoder(*CipheredString, *DecipheredString, Len(String$), ?Key, 128, ?InitializationVector)
    Debug "Deciphered: "+PeekS(*DecipheredString)
  EndIf

  DataSection
    Key:
      Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06

    InitializationVector:
      Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
  EndDataSection

Пример: ECB

  ; Should be compiled in ascii mode
  ;
  String$ = "Hello this is a test for AES"

  *CipheredString   = AllocateMemory(Len(String$))
  *DecipheredString = AllocateMemory(Len(String$))

  If AESEncoder(@String$, *CipheredString, Len(String$), ?Key, 128, 0, #PB_Cipher_ECB)
    Debug "Ciphered: "+PeekS(*CipheredString)

    AESDecoder(*CipheredString, *DecipheredString, Len(String$), ?Key, 128, 0, #PB_Cipher_ECB)
    Debug "Deciphered: "+PeekS(*DecipheredString)
  EndIf

  DataSection
    Key:
      Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06
  EndDataSection


AddCipherBuffer

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

AddCipherBuffer()

Синтаксис

AddCipherBuffer(#Cipher, *Input, *Output, Size)
Описание
Добавляет новый буфер '*Input' с указанным 'Size' из которого началось шифрование StartAESCipher() и копирует зашифрованные данные в буфер '*Output'. '*Output' буфер должен быть больше буфера '*Input'.


Base64Decoder

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Base64Decoder()

Синтаксис

Result = Base64Decoder(*InputBuffer, InputSize, *OutputBuffer, OutputSize)
Описание
Декодирует входной буфер, предварительно закодированный в Base64. 'Result' будет содержать длину (в байтах) декодированных данных.

Размер буфера назначения может составлять до 33% меньше, чем размер исходного буфера (с минимальным размером 64 байт). Однако рекомендутся использовать буфер больше примерно на 30%, чтобы избежать переполнения памяти. Base64Encoder() может быть использован для кодирования данных в формат Base64.

Пример:

  test.s = "This is a test string!"
  dec.s = Space(1024)
  enc.s = Space(1024)

  Debug Base64Encoder(@test, StringByteLength(test), @enc, 1024)
  Debug enc

  Debug Base64Decoder(@enc, StringByteLength(enc), @dec, 1024)
  Debug dec


Base64Encoder

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Base64Encoder()

Синтаксис

Result = Base64Encoder(*InputBuffer, InputSize, *OutputBuffer, OutputSize)
Описание
Кодирует указанный буфер, используя алгоритм Base64. Он широко используется в почтовых программах, но может быть полезен для любых других программ, требующих кодирование, основанное на коде ASCII (7 битов, буквы 32 - 127) для бинарных. 'Result' будет содержать длину (в байтах) закодированной строки.

Выходной буфер должен быть на 33 % длиннее чем буфер ввода, с минимальным размером 64 байт. Рекомендовано тем не менее, чтобы он был на 35 % длиннее, чтобы избежать переполнения памяти . Кодированные данныие могут декодироваться посредством Base64Decoder().

Пример:

  test.s = "This is a test string!"
  dec.s = Space(1024)
  enc.s = Space(1024)

  Debug Base64Encoder(@test, StringByteLength(test), @enc, 1024)
  Debug enc

  Debug Base64Decoder(@enc, StringByteLength(enc), @dec, 1024)
  Debug dec


CRC32FileFingerprint

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CRC32FileFingerprint()

Синтаксис

Result = CRC32FileFingerprint(Filename$)
Описание
Возвращает контрольную сумму CRC32 данного файла. Если файл не может быть прочитан, результат - нуль. CRC32 - контрольная сумма файла 32 бита, не предназначенная для хранения пароля, поскольку это легко вскрываемо, а предназначено для быстрой проверки целостности данных. Основное преимущество CRC32 от MD5 или другому алгоритму шифрования - самая высокая скорость.


CRC32Fingerprint

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

CRC32Fingerprint()

Синтаксис

Result = CRC32Fingerprint( *Buffer, Size [, InitialValue] )
Описание
Возвращает контрольную сумму CRC32 указанного буфера памяти. CRC32 - контрольная сумма файла 32 бита, не предназначенная для хранения пароля, поскольку это легко вскрываемо, а предназначено для быстрой проверки целостности данных. Основное преимущество CRC32 от MD5 или другому алгоритму шифрования - самая высокая скорость.

Дополнительный параметр InitialValue может использоваться, чтобы передать контрольную сумму предыдущего буфера. Результатом тогда будет контрольная сумма обоих буферов, как будто это было вычислено от одного непрерывного буфера. Этот способ помогает вычислить контрольную сумму больших данных и может быть разделён на ряд вычислений меньших буферов.

Пример:

  *Buffer = AllocateMemory(200)               ; Prepare a buffer with data
  If *Buffer
    PokeS(*Buffer, "The quick brown fox jumps over the lazy dog.")
    Length = MemoryStringLength(*Buffer)

    CRC32 = CRC32Fingerprint(*Buffer, Length)   ; Calculate the checksum in 1 step
    Debug "CRC32 checksum = " + Str(CRC32)

    Part1 = CRC32Fingerprint(*Buffer, Length/2) ; Calculate the checksum in 2 steps
    CRC32 = CRC32Fingerprint(*Buffer+Length/2, Length/2, Part1)
    Debug "CRC32 checksum = " + Str(CRC32)

    FreeMemory(*Buffer)
  EndIf


Pure Basic Reference Manual

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

DESFingerprint()

Синтаксис

Result$ = DESFingerprint(Password$, Key$)
Описание
Этот алгоритм основан на методе шифрования DES (Data Encryption Standard) для получения строки из 13 символов. Из-за его сильного шифрования его трудно взломать, если не указать правильный пароль.

Password$ может содержать до 8 символов (все остальные символы просто игнорируется). MD5Fingerprint() может использоваться, чтобы кодировать большой буфер памяти. Key$ также известный как параметр 'Salt', хорошо известный пользователям Linux/Unix/BSD. При использовании 2 символов ключа Key$, эта функция возвращает строку 'Salt2', которая будет совместима с любым стандартным паролем Linux (/etc/passwd). Эта функция основана на opensource crypt().

Пример:

  Debug DESFingerprint("Password", "Key007")
  Debug DESFingerprint("NewPass", "Key007")


ExamineMD5Fingerprint

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

ExamineMD5Fingerprint()

Синтаксис

Result = ExamineMD5Fingerprint(#Fingerprint)
Описание
Инициализирует вычисление MD5 (Message Digest 5). В отличие от MD5Fingerprint() позволяет вычислить контрольную сумму больших данных, без необходимости загружать ее полностью в буфер памяти. Смотри MD5Fingerprint() для более подробной информации об алгоритме MD5.

'#Fingerprint' является идентификатором расчета. Если #PB_Any используется как параметр '#Fingerprint' расчет будет возвращен в Result.

NextFingerprint() может быть использована для добавления блоков памяти в расчет и FinishFingerprint() чтобы закончить расчет и чтение MD5 хеш.

Пример:

  *Buffer = AllocateMemory(200)                  ; Prepare a buffer with data
  If *Buffer
    PokeS(*Buffer, "The quick brown fox jumps over the lazy dog.")
    Length = MemoryStringLength(*Buffer)

    If ExamineMD5Fingerprint(1)                  ; start the calculation
      NextFingerprint(1, *Buffer, Length/2)        ; calculate part 1
      NextFingerprint(1, *Buffer+Length/2, Length/2) ; calculate part 2

      MD5$ = FinishFingerprint(1)                ; finish calculation
      Debug "MD5 checksum = " + MD5$

      MD5$ = MD5Fingerprint(*Buffer, Length)       ; compare to a calculation in 1 step
      Debug "MD5 checksum = " + MD5$
    EndIf

    FreeMemory(*Buffer)
  EndIf


ExamineSHA1Fingerprint

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

ExamineSHA1Fingerprint()

Синтаксис

Result = ExamineSHA1Fingerprint(#Fingerprint)
Описание
Инициализирует вычисление SHA1 (Secure Hash Algorithm 1). В отличие от SHA1Fingerprint() позволяет вычислить контрольную сумму больших данных, без необходимости загружать ее полностью в буфер памяти. Смотри SHA1Fingerprint() для более подробной информации об алгоритме SHA1.

'#Fingerprint' является идентификатором расчета. Если #PB_Any используется как параметр '#Fingerprint' расчет будет возвращен в Result.

NextFingerprint() может быть использована для добавления блоков памяти в расчет и FinishFingerprint() чтобы закончить расчет и чтение SHA1 хеш.

Пример:

  *Buffer = AllocateMemory(200)                  ; Prepare a buffer with data
  If *Buffer
    PokeS(*Buffer, "The quick brown fox jumps over the lazy dog.")
    Length = MemoryStringLength(*Buffer)

    If ExamineSHA1Fingerprint(1)                 ; start the calculation
      NextFingerprint(1, *Buffer, Length/2)        ; calculate part 1
      NextFingerprint(1, *Buffer+Length/2, Length/2) ; calculate part 2

      SHA1$ = FinishFingerprint(1)               ; finish calculation
      Debug "SHA1 checksum = " + SHA1$

      SHA1$ = SHA1Fingerprint(*Buffer, Length)     ; compare to a calculation in 1 step
      Debug "SHA1 checksum = " + SHA1$
    EndIf

    FreeMemory(*Buffer)
  EndIf


FinishCipher

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

FinishCipher()

Синтаксис

Result = FinishCipher(#Cipher)
Описание
Завершает ранее запущенное кодирование функцией StartAESCipher().

Примечание: Эта команда должна вызываться по завершению кодирования, даже если в кодировании #Cipher больше не нуждаются, так как эта команда освобождает все предназначенные для кодирования данные.


FinishFingerprint

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

FinishFingerprint()

Синтаксис

Result$ = FinishFingerprint(#Fingerprint)
Описание
Завершает вычисление контрольной суммы, начатой функцией ExamineMD5Fingerprint() или ExamineSHA1Fingerprint() и возвращает контрольную сумму как строку Result$.

Примечание: Эта команда должна вызываться по завершению вычисления контрольной суммы, даже если в контрольной сумме #Fingerprint больше не нуждаются, так как она освобождает все данные, связанные с расчетом.

Смотри ExamineMD5Fingerprint() или ExamineSHA1Fingerprint() для примера кода и подробной информации.


IsFingerprint

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

IsFingerprint()

Синтаксис

Result = IsFingerprint(#Fingerprint)
Описание
Проверяет, является ли действительным указанное #Fingerprint которое создавалось ExamineMD5Fingerprint() или ExamineSHA1Fingerprint().

Эта функция может быть использована с любым значением. Если 'Result' не равен нулю, то объект является действительным, в противном случае она возвращает нуль.


MD5FileFingerprint

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

MD5FileFingerprint()

Синтаксис

Result$ = MD5FileFingerprint(Filename$)
Описание
Возвращает 32 символа MD5 (Message Digest 5) для указанного файла. Если файл не был найден или произошла ошибка, то Result$ будет пуст.

Смотри MD5Fingerprint() для получения дополнительной информации об алгоритме MD5.


MD5Fingerprint

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

MD5Fingerprint()

Синтаксис

Result$ = MD5Fingerprint(*Buffer, Size)
Описание
Возвращает 32 символа MD5 (Message Digest 5). Вот краткое объяснение RFC 1321 на MD5:

'The algorithm takes as input a message of arbitrary length and produces as output a 128-bit "fingerprint" or "message digest" of the input. It is conjectured that it is computationally infeasible to produce two messages having the same message digest, or to produce any message having a given pre-specified target message digest. The MD5 algorithm is intended for digital signature applications.'

Коды MD5 хеш часто используются для шифрования паролей в качестве стандарта, они обеспечивают хорошую безопасность. Дополнительную информацию см. в RFC 1321: http://www.ietf.org/rfc/rfc1321.txt.

MD5FileFingerprint() может использоваться, чтобы вычислить контрольную сумму MD5 файла.
ExamineMD5Fingerprint() может использоваться, чтобы вычислить контрольную сумму MD5 больших данных.

Пример 1 (строка как буфер памяти):
  test.s = "This is a test string!"
  Debug MD5Fingerprint(@test, StringByteLength(test))
Пример 2 (с буфером памяти):
  *Buffer = AllocateMemory(500)
  If *Buffer
    PokeS(*Buffer, "The quick brown fox jumps over the lazy dog.")
    MD5$ = MD5Fingerprint(*Buffer, MemorySize(*Buffer))
    Debug "MD5 Fingerprint = " + MD5$
    FreeMemory(*Buffer)  ; would also be done automatically at the end of the program
  EndIf


NextFingerprint

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

NextFingerprint()

Синтаксис

NextFingerprint(#Fingerprint, *Buffer, Size)
Описание
Добавляет новый буфер памяти в расчет контрольной суммы, который был начат ранее ExamineMD5Fingerprint() или ExamineSHA1Fingerprint(). Контрольная сумма, возвращенная в конце вычисления, будет включать все суммированные буфера, как будто контрольная сумма была вычислена со всеми ими в одном непрерывном буфере памяти.

Смотри ExamineMD5Fingerprint() или ExamineSHA1Fingerprint() для примера кода и подробной информации.


SHA1FileFingerprint

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

SHA1FileFingerprint()

Синтаксис

Result$ = SHA1FileFingerprint(Filename$)
Описание
Возвращает 40-символьный SHA1 (Secure Hash Algorithm 1) для указанного файла. Если файл не был найден или произошла ошибка, то Result$ будет пуст.

Смотри SHA1Fingerprint() для получения дополнительной информации об алгоритме SHA1.


SHA1Fingerprint

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

SHA1Fingerprint()

Синтаксис

Result$ = SHA1Fingerprint(*Buffer, Size)
Описание
Возвращает 40 символов SHA1 (Secure Hash Algorithm 1) хэш-код данного буфера памяти. SHA1 может быть использовано для расчета контрольных сумм, для проверки сообщения, что оно не было изменено (например при загрузке), в отличие от CRC32. Кроме того, практически невозможно изменить содержание таким образом, чтобы дать тот же SHA1 код с исходным содержанием. Вот краткое представление, основанное на RFC 3174 относительно SHA1:

'The SHA-1 is called secure because it is computationally infeasible to find a message which corresponds to a given message digest, or to find two different messages which produce the same message digest. Any change to a message in transit will, with very high probability, result in a different message digest, and the signature will fail to verify.'

Более подробная информация о RFC 3174: http://www.ietf.org/rfc/rfc3174.txt.

SHA1FileFingerprint() может использоваться, чтобы вычислить контрольную сумму SHA1 файла.
ExamineSHA1Fingerprint() может использоваться, чтобы вычислить контрольную сумму SHA1 больших данных.

Пример 1 (с буфером памяти):
  test.s = "This is a test string!"
  Debug SHA1Fingerprint(@test, StringByteLength(test))
Пример 2 (with memory buffer):
  *Buffer = AllocateMemory(500)
  If *Buffer
    PokeS(*Buffer, "The quick brown fox jumps over the lazy dog.")
    SHA1$ = SHA1Fingerprint(*Buffer, MemorySize(*Buffer))
    Debug "SHA1 Fingerprint = " + SHA1$
    FreeMemory(*Buffer)  ; would also be done automatically at the end of the program
  EndIf


StartAESCipher

StartAESCipher()

Синтаксис

Result = StartAESCipher(#Cipher, *Key, Bits, *InitializationVector, Mode)
Описание
Инициализация запуска шифрования AES используя указанный ключ '*Key'. 'Bits' определяет размер используемого ключа для шифрования. Допустимые значения: 128, 192 и 256. The 'InitializationVector' это 32 случайных байт области данных, используемых для инициализации шифрования, чтобы избежать нарушения в расшифровке (нужен только при использовании режима #PB_Cipher_CBC). После завершения шифрования, должна быть названа функция FinishCipher().

Необязательный параметр 'Mode' может быть комбинацией из следующих действий:
  #PB_Cipher_Decode: поток используется, чтобы декодировать данные.
  #PB_Cipher_Encode: поток используется, чтобы закодировать данные.

with

  #PB_Cipher_CBC: Стандартный режим кодировки (Cipher Block Chaining). Нуждается в '*InitializationVector'.
                  Рекомендуемый как более безопасный чем режим ECB.
  #PB_Cipher_ECB: Альтернативный режим (Electronic CodeBook). Не использует случайные значения
                  (каждый блок зашифрован независимо друг от друга) что делает его менее сильным, чем CBC.

Новый буфер для кодирования и декодирования может быть добавлен с помощью функции AddCipherBuffer().

Более подробную информацию о AES и примеры исходного кода, см. AESEncoder().


Clipboard

PureBasic - Clipboard

Краткий обзор

Буффер обмена (клипборд) - стандартный способ обмена информацией или данными между приложениями, запущенными на одной и той же OS. Буффер обмена можно также использовать как временное хранилище для данных, которые при этом могут быть отредактированны в файлах и изменены (оригинальные данные будут сохранены в клипборде). Например, когда вы вырезаете текст в текстовом редакторе, он отправляется в буффер обмена. В дальнейшем, этот текст можно будет вставить в другой текстовый редактор. Благодаря PureBasic ваши программы смогут легко копировать и вставлять текст или картинки через стандартный буффер обмена.

Краткий перечень команд

ClearClipboard
GetClipboardImage
GetClipboardText
SetClipboardImage
SetClipboardText


ClearClipboard

ClearClipboard()

Синтаксис

ClearClipboard()
Описание
Отчищает буффер обмена. Любые скопированные в буффер данные будут полностью удалены и поэтому недоступны.

Параметры

Нет.

Возвращаемое значение

Эта функция не возвращает никакое значение.


GetClipboardImage

GetClipboardImage()

Синтаксис

Result = GetClipboardImage( #Image [, Depth] )
Описание
Создает новую #Image (картинку) из данных картинки, находящихся в буффере обмена (если они там есть). Если используется #PB_Any как параметр '#Image', будет возвращен номер картинки. При неправильной работе функции или других непредвиденных случаях будет возвращено значение 0.

Если параметр 'Depth' был пропущен или установлен #PB_Image_DisplayFormat, значение качества цветопередачи (глубины цвета) будет взято из настроек рабочего стола. Верные значение глубины цвета 'Depth': 1, 2, 4, 8, 16, 24 и 32 бита. Когда используются True-color фомат, и необходимо сохранять изменения без потерь в цветовой палитре, рекомендуется использовать 24-х или 32-х битную глубину цвета. Если же картинка должна просто выводится на экран, параметр #PB_Image_DisplayFormat обеспечит самую быструю производительность.

Созданное изображение может быть удалено функцией FreeImage(). Для работы с картинками есть еще другие функции, например DrawImage() или ImageGadget().


GetClipboardText

GetClipboardText()

Синтаксис

Text$ = GetClipboardText()
Описание
Возвращает текстовую строку, находящуюся в буффере обмена.

Параметры

Нет.

Return value

Text$ - строка, содержащая содержимое буффера обмена, или пустая строка (если в буффере не оказалось текстовых данных).


SetClipboardImage

SetClipboardImage()

Синтаксис

SetClipboardImage(#Image)
Описание
Переносит копию данной #Image (картинки) к буффер обмена. Если в данный момент буффер обмена содержит другую картинку, то она будет переписана на новую.

Изображение можно создать функцией CreateImage() или загрузить при помощи функции LoadImage().

Возвращаемое значение

Эта функция не возвращает значения.

Пример:
  If CreateImage(0,26,20)
    StartDrawing(ImageOutput(0))
      Box(0,0,26,20,RGB(255,255,255))
      Circle(13,10,5,RGB(255,0,0))
    StopDrawing()
    SetClipboardImage(0)
  EndIf

  ; now if you open a graphics application and paste the clipboard contents,
  ; then you will see the Japanese flag ;-)


SetClipboardText

SetClipboardText()

Синтаксис

SetClipboardText(Text$)
Описание
Сохраняет строку в буффер обмена. Если буффер обмена уже содержит какой-либо текст, то старый текст будет перезаписан на новый.

Параметры

Text$ - Текстовая строка, которая будет записана в буфер обмена.

Возвращаемое значение

Эта функция ничего не возвращает.


Console

PureBasic - Console

Краткий обзор

Библиотека необходима для создания приложений, работающих в консольном режиме. Она нужна для создания маленьких программ, которым не нужен пользовательский интерфейс или которые должны быть запущены какой-нибудь функцией. Более того, консольные функции могут пригодиться для отладки программы, например для вывода в консоль какой-нибудь информации, без задержки потока самой программы.

Если ваша программа должна быть "pure" т.е. буквально "чистым" консольным приложением (т.е. без какого либо GUI), то вы должны помнить что для этого нужно выбрать выполняемый формат 'Console' при компиляции.

Для начала нужно вызвать функцию OpenConsole(), а затем можно использовать все остальные консольные функции, например установить графический или текстовый режимы консоли и т.д.

Обратите внимание, что если вы создаете консольные программы с PureBasic, вам нужна Windows 95 или более поздняя версия. Эти программы работают только в среде Windows. Это не настоящие MS-DOS программы!

Краткий перечень команд

ClearConsole
CloseConsole
ConsoleColor
ConsoleCursor
ConsoleError
ConsoleLocate
ConsoleTitle
EnableGraphicalConsole
Inkey
Input
OpenConsole
Print
PrintN
RawKey
ReadConsoleData
WriteConsoleData


ClearConsole

ClearConsole()

Синтаксис

ClearConsole()
Описание
Удаляет все содержимое консоли. Цвет заливки фона можно установить командой ConsoleColor(). Консоль должна быть в графическом режиме, см. EnableGraphicalConsole().

Пример:
  If OpenConsole()
    EnableGraphicalConsole(1)

    PrintN("You will never see me")
    ClearConsole()

    PrintN("Press return to exit")
    Input()
  EndIf

Поддерживаемые ОС

Windows


CloseConsole

CloseConsole()

Синтаксис

CloseConsole()
Описание
Закрывает консоль, открытую функцией OpenConsole(). После того как консоль будет закрыта, у вас не будет возможности использовать какие-либо функции консоли, до тех пор пока вы не откроете консоль снова. Консоль будет автоматически закрыта, когда ваша программа завершится.

Пример:
  For i = 0 To 4
    If OpenConsole()
      PrintN("This is console #"+Str(i))
      PrintN("Press return to close console")
      Input()
      CloseConsole()
    EndIf
  Next


ConsoleColor

ConsoleColor()

Синтаксис

ConsoleColor(CharacterColor, BackgroundColor)
Описание
Изменяет цвета, используемые текстовым дисплеем. Все символы, напечатанные в консоли после вызова этой функции будут другого цвета. Цветной диапазон от 0 до 15, поэтому в консольном режиме доступны 16 цветов.
Параметры:

CharacterColor - Цвет символов.
BackgroundColor - Цвет фона символов.

Оба параметра могут иметь значения от 0 до 15. Каждое значение это определенный цвет:
  0 - Черный (по умолчанию, цвет фона)
  1 - Синий
  2 - Зелёный
  3 - Голубой
  4 - Красный
  5 - Фиолетовый
  6 - Коричневый
  7 - Светло-серый (по умолчанию, цвет символов)
  8 - Темно-серый
  9 - Светло-синий
  10 - Светло-зеленый
  11 - Светло-голубой
  12 - Розовый
  13 - Светло-фиолетовый
  14 - Желтый
  15 - Белый

Пример:
  If OpenConsole()
    For Foreground = 0 To 15
      For Background = 0 To 15
        ConsoleColor(Foreground, Background)
        Print(Right(Hex(Background), 1))
      Next

      PrintN("")
    Next

    ConsoleColor(7, 0)
    PrintN("Press return to exit")
    Input()
  EndIf

Поддерживаемые ОС

Windows


ConsoleCursor

ConsoleCursor()

Синтаксис

ConsoleCursor(Height)
Описание
Изменяет вид курсора, который показывает расположение следующего вводимого символа в консоли. При помощи этой функции можно изменить высоту курсора. По умолчанию в Windows OS курсор представляет собой мелькающую черточку _, поэтому необходимо войти в полноэкранный режим консоли, чтобы увидеть результат работы этой функции.

Консоль должна быть в графическом режиме, см.функцию EnableGraphicalConsole().

Параметры:

Height - Новая высота индикатора курсора. Высота может быть равна нулю (чтобы курсор был невидимым) или в диапазоне от 1 до 10. В общем, доступны три значения:
  1 : Курсор в виде черточки подчеркивания _ (по умолчанию)
  5 : Курсор средней высоты
  10: Курсор максимальной высоты
Пример:
  If OpenConsole()
    EnableGraphicalConsole(1)

    For CursorHeight = 0 To 10
      ConsoleCursor(CursorHeight)
      PrintN("Press return to increase cursor size")
      Input()
    Next

    PrintN("Press return to exit")
    Input()
  EndIf

Поддерживаемые ОС

Windows


ConsoleError

ConsoleError()

Синтаксис

ConsoleError(Message$)
Описание
Записывает строку сообщения (с новой строки) в стандартный выход ошибок в программе. Сообщения можно считать с этого выхода при помощи функции ReadProgramError() или библиотеки Process.


ConsoleLocate

ConsoleLocate()

Синтаксис

ConsoleLocate(x, y)
Описание
Перемещает курсор в заданную позицию(координаты нового символа). Любой текст который вы будете печатать после вызова этой функции, появится в указанных координатах.

Консоль должна быть в графическом режиме, см. функцию EnableGraphicalConsole().

Параметры:

x - Горизонтальное положение на консоли (начинается с 0)
y - Вертикальное положение на консоли (начинается с 0)

Пример:
  If OpenConsole()
    EnableGraphicalConsole(1)

    For i = 0 To 200
      ConsoleLocate(Random(79), Random(24))
      Print("*")
    Next

    ConsoleLocate(30, 10)
    PrintN("Press return to exit")
    Input()
  EndIf

Поддерживаемые ОС

Windows


ConsoleTitle

ConsoleTitle()

Синтаксис

ConsoleTitle(Title$)
Описание
Изменяет заголовок консоли на заданную строку. Заголовок обычно находится на панели заголовка окна консоли (когда вы открываете консоль в графической среде, например на рабочем столе).

Под Windows, заголовок консоли также находится на панели задач и в диспетчере задач.

Пример:
  If OpenConsole()
    ConsoleTitle("The ConsoleTitle example program")
    PrintN("Press return to exit")
    Input()
  EndIf

Поддерживаемые ОС

Windows


EnableGraphicalConsole

EnableGraphicalConsole()

Синтаксис

EnableGraphicalConsole(State)
Описание
Изменяет способ вывода символов в консоли. Если состояние 'State' равно 1, то консоль будет переключена в графический режим, если состояние 'State' равно 0, то консоль будет переключена в текстовый режим.

По умолчанию, консоль работает в текстовом режиме, в котором текст не может быть расположен по желанию, но текст может выводиться и форматироваться корректно.

В графическом режиме работаю функции ClearConsole() или ConsoleLocate(), текст может быть размещен где угодно, например можно сделать консольную игру где вся графика в текстовом режиме (такие игры приемлемы для удаленного доступа по теленет или ssh). Автоматический перенос строки не работает в графическом режиме.

Пример:
  If OpenConsole()
    EnableGraphicalConsole(1)
    ConsoleLocate(7, 8)
    PrintN("Press return to exit")
    Input()
  EndIf

Поддерживаемые ОС

Windows


Inkey

Inkey()

Синтаксис

String$ = Inkey()
Описание
Возвращает строку с символом, если была нажата клавиша во время вызова функции Inkey(). Функция не прерывает (не задерживает) выполнение программы. Если были нажаты специальные клавиши (не ASCII) необходимо вызвать функцию RawKey() после вызова Inkey().

Пример:
  If OpenConsole()
    PrintN("Press Escape to exit")

    Repeat
      KeyPressed$ = Inkey()

      If KeyPressed$ <> ""

        PrintN("You pressed: " + KeyPressed$)
        PrintN("It has a raw code of: "+Str(RawKey()))

      ElseIf RawKey()

        PrintN("You pressed a non ASCII key.")
        PrintN("It has a raw code of: "+Str(RawKey()))

      Else
        Delay(20) ; Don't eat all the CPU time, we're on a multitask OS
      EndIf

    Until KeyPressed$ = Chr(27) ; Wait until escape is pressed
  EndIf

Notes:

Коды ASCII и численные значения могут быть изменены в таблицах кодов, которые настраиваются во время загрузки программного ввода с клавиатуры. Тем не менее, содержимое таблиц должно быть то же самое, и вы можете использовать приведенный выше пример для чтения ASCII символов клавиш в вашей системе.

Таблица кодов ASCII находится здесь.


Input

Input()

Синтаксис

String$ = Input()
Описание
Позволяет программе перехватывать вводимые символы. Эта функция блокирует выполнение программы и ждет нажатия клавиши Enter.

Если консоль работает в графическом режиме (см. функцию EnableGraphicalConsole()), длина строки с вводимыми символами не может быть больше ширины консоли (нажатия клавиш не будут приниматься, если длина строки достигнет края консоли).

Если нажать в текстовом режиме консоли комбинацию Ctrl+D, то будет возвращено значение #PB_Input_Eof (равносильно Chr(4)), или будет записан спецсимвол окончания файла (Eof) в открытый программой файл. Для совместимости с другими консольными приложениями в Windows, #PB_Input_Eof также может быть комбинацией клавиш Ctrl+Z в консоли.

Если же вам необходимо ввести данные не через строку, воспользуйтесь функцией ReadConsoleData() в текстовом режиме консоли.

Пример:
  If OpenConsole()
    Print("Enter your name and press return: ")
    Name$ = Input()

    PrintN("Hello " + Name$ + ", nice to meet you.")
    PrintN("Press return to exit")
    Input()
  EndIf


OpenConsole

OpenConsole()

Синтаксис

Result = OpenConsole()
Описание
Открывает окно консоли. Эта функция должна быть вызвана до вызова других функций из этой библиотеки. Только одна консоль может быть открыта в программе PureBasic.

Если функция возвращает 0, то открыть консоль не удалось и все последующие консольные вызовы будут отменены. Открытая консоль может быть закрыта функцией CloseConsole().

Функцией EnableGraphicalConsole() можно переключаться между графическим и текстовым режимами консоли.

В Microsoft Windows, есть два формата приложений: Win32 и Console. Если вам нужно создать стандартное консольное приложение, такие как 'dir', 'del' и т.д.. вы должны откомпилировать приложение в формате 'Console' (Compiler Option в меню компилятора редактора PureBasic). В Linux и OS X, эта команда не работает, т.к. там нет специального консольного формата 'Console'.

Пример:
  OpenConsole()
  PrintN("Waiting 5 secs before quit...")
  Delay(5000)


Print

Print()

Синтаксис

Print(Text$)
Описание
Выводит текст 'Text$' в консоли. В graphical mode длина строки не может превышать ширину консоли, иначе строка будет сокращена (конец строки будет обрезан).

В graphical mode возможно менять позицию выводимого текста функцией ConsoleLocate(). Чтобы изменить цвет выводимого текста и фона, используйте функцию ConsoleColor().

Курсор будет смещен в конец строки, которая была напечатана. Если вы выводите очень длинную строку, которая не помещается в консоли, часть ее будет перемещена на следующую строку. Если размеры выводимого текста превышают размеры консоли, консоль будет скролировать все содержимое вверх.

Чтобы вывести несимвольные данные в текстовом режиме (для соединений), используйте функцию WriteConsoleData().

Пример:
  If OpenConsole()
    Print("This is quite a long string.")
    Print("You see how this one joins onto the end of the previous one?")
    Print("That is because the cursor moves to the end of the string and not onto a new line.")
    Print("Hopefully the text will also have been wrapped by now.")

    PrintN("")
    PrintN("")
    PrintN("Press return to exit")
    Input()
  EndIf


PrintN

PrintN()

Синтаксис

PrintN(Text$)
Описание
Выводит текст 'Text$' в консоли на новой строке. В graphical mode длина строки не может превышать ширину консоли, иначе строка будет сокращена (конец строки будет обрезан).

В graphical mode возможно менять позицию выводимого текста функцией ConsoleLocate(). Чтобы изменить цвет выводимого текста и фона, используйте функцию ConsoleColor().

Курсор будет перемещен в начало следующей строки. Если вы будете печатать за правый край консоли, часть текста сместится на следующую строку. Если размер содержимого консоли превысит размеры консоли, то окно консоли будет автоматически скролировать все содержимое вверх. Вы можете использовать функцию Print(), если хотите выводить текст после последнего символа.

Выводимые служебные данные в текстовом режиме консоли (для соединений), используйте функцию WriteConsoleData().

Пример:
  If OpenConsole()
    PrintN("This is quite a long string.")
    PrintN("You see how this one does not join onto the end of the previous one?")
    PrintN("That is because the cursor moves to the start of the next line after the end of the string.")

    PrintN("Press return to exit")
    Input()
  EndIf


RawKey

RawKey()

Синтаксис

Result = RawKey()
Описание
Возвращает сканкод символа, определенного вызовом фукции Inkey() Таким способом можно определять нажатия служебных клавиш (не ASCII) (например, стрелки на клавиатуре и т.д.).

Примечание:

Есть клавиши, которые не вводят буквы или цифры как ASCII значения. Например, клавиша escape (27), клавиша return (13), tab клавиша (9) и backspace клавиша (8).Таблицу с кодами ASCII вы найдете здесь.

Пример:
  If OpenConsole()
    PrintN("Press Escape to exit")

    Repeat
      KeyPressed$ = Inkey()

      If KeyPressed$ <> ""

        PrintN("You pressed: " + KeyPressed$)
        PrintN("It has a raw code of: "+Str(RawKey()))

      ElseIf RawKey()

        PrintN("You pressed a non ASCII key.")
        PrintN("It has a raw code of: "+Str(RawKey()))

      Else
        Delay(20) ; Don't eat all the CPU time, we're on a multitask OS
      EndIf

    Until KeyPressed$ = Chr(27) ; Wait until escape is pressed
  EndIf

Поддерживаемые ОС

Windows


ReadConsoleData

ReadConsoleData()

Синтаксис

Result = ReadConsoleData(*Buffer, Size)
Описание
Считывает коды нажатых клавиш из консоли. Эта функция поддерживается только текстовым режимом. Функция может быть использована для чтения данных, которые содержат не построчный текст, или текст файлов которые были направленны в программу через соединение.

Функция считывает 'Size' размер в байтах в специальный буффер, который до этого должен быть создан функцией AllocateMemory.

Эта функция ждет вводимые для чтения данные. Функция возвращает сообщение об ошибке или EOF (конец файла), если вводимые данные отсутствуют.

Возвращаемое значение

Возваращает считанное количество введенных байт. Если возвращается ноль, то значит больше нет вводимых данных (записывается конец файла)

Пример:
  ; This reads a passed image from the console and displays it in a window
  ; Compile this to an exe and run it like "myexe < image.bmp"
  ;
  ; (set "Executable format" To "Console" in the compiler options!)
  ; (works only with Bitmaps and icons unless you use an Image Decoder)
  ;
  OpenConsole()
  TotalSize = 0
  BufferFree = 10000
  *Buffer = AllocateMemory(BufferFree)

  Repeat
    ReadSize = ReadConsoleData(*Buffer+TotalSize, BufferFree) ; read a block of data
    TotalSize + ReadSize
    BufferFree - ReadSize
    If BufferFree < 100  ; resize the buffer if it is not large enough
      BufferFree = 10000
      *Buffer = ReAllocateMemory(*Buffer, TotalSize+10000)
    EndIf
  Until ReadSize = 0 ; once 0 is returned, there is nothing else to read

  If TotalSize > 0 ; display the image if successful
    If CatchImage(0, *Buffer, TotalSize)
      If OpenWindow(0, 0, 0, ImageWidth(0), ImageHeight(0), "Image", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
        ImageGadget(0, 0, 0, ImageWidth(0), ImageHeight(0), ImageID(0))
        Repeat
        Until WaitWindowEvent() = #PB_Event_CloseWindow
        End
      EndIf
    EndIf
  EndIf
  MessageRequester("Error", "Not a valid image.")


WriteConsoleData

WriteConsoleData()

Синтаксис

Result = WriteConsoleData(*Buffer, Size)
Описание
Выводит данные в консоли. Эта функция работает только в текстовом режиме. Необходима для вывода текста который должен быть записан в файл или передан в другую программу.

Функция записывает количество байт 'Size', из буффера *buffer, в консоль. Буффер можно создать и заполнить функциями из библиотеки Memory.

Возвращаемое значение

Возвращает количество считанных байт.


Database

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

PureBasic - Database

Краткий обзор

Библиотека 'database' включает в себя функции для получения доступа и управления различными базами данных, например: SQLite, Oracle, MySQL, Access и другими через ODBC. Доступ, управление и редактирование баз данных происходит при помощи SQL запросов, поэтому для работы с базами данных необходимо знать основы синтаксиса SQL.

Ниже приведены несколько ссылок, где можно найти информацию о синтаксисе SQL:
W3Schools SQL Tutorial
SQLite SQL functions
PostgreSQL manual

Для того, чтоб начать работу с библиотекой 'database' требуется провести инициализацию при помощи функций UseODBCDatabase(), UseSQLiteDatabase(), и/или UsePostgreSQLDatabase().

Примечание: если вы программируете под Windows, то перед тем как использовать ODBC базу данных необходимо указать ODBC "User Data Source"(Источник данных пользователя). Это позволит управлять базами данных через ODBC при помощи библиотеки 'database'. Для получения подробной информации обратитесь к документам справки Windows ODBC.

Краткий перечень команд

CloseDatabase
DatabaseColumnName
DatabaseColumnSize
DatabaseColumnType
DatabaseColumns
DatabaseDriverDescription
DatabaseDriverName
DatabaseError
DatabaseID
DatabaseQuery
DatabaseUpdate
ExamineDatabaseDrivers
FinishDatabaseQuery
FirstDatabaseRow
GetDatabaseBlob
GetDatabaseDouble
GetDatabaseFloat
GetDatabaseLong
GetDatabaseQuad
GetDatabaseString
IsDatabase
NextDatabaseDriver
NextDatabaseRow
OpenDatabase
OpenDatabaseRequester
PreviousDatabaseRow
SetDatabaseBlob
UseODBCDatabase
UsePostgreSQLDatabase
UseSQLiteDatabase


CloseDatabase

CloseDatabase()

Синтаксис

CloseDatabase(#Database)
Описание
Функция закрывает указанную базу данных (также соединения/транзакции если они активны). Дальнейшие операции с этой базой данных будут недоступны.
#Database - номер базы данных

Примечание: все ранее открытые программой базы данных будут автоматически закрыты при ее завершении.


DatabaseColumnName

DatabaseColumnName()

Синтаксис

Text$ = DatabaseColumnName(#Database, Column)
Описание
Результатом функции является строковая переменная, содержащая имя указанной колонки Column.#Database - номер базы данных


DatabaseColumnSize

DatabaseColumnSize()

Синтаксис

Result = DatabaseColumnSize(#Database, Column)
Описание
Определяет размер указанного столбца (поля) Column в базе данных #Database. Это полезно, когда размер столбца может измениться в зависимости от содержимого.


DatabaseColumnType

DatabaseColumnType()

Синтаксис

Result = DatabaseColumnType(#Database, Column)
Описание
Функция возвращает тип указанной колонки базы данных. Если ее результатом является 0, то тип неопределен или функция не может быть выполнена (к примеру, если тип невозможно определить).#Database - номер базы данных; Column - номер колонки БД. Возможные форматы типов данных
  #PB_Database_Long  : Численный тип (тип Long (.l) в PureBasic)
  #PB_Database_String: Строковый тип (тип String (.s) в PureBasic)
  #PB_Database_Float : Численный тип с плавающей запятой (тип Float (.f) в PureBasic)
  #PB_Database_Double: Численный тип double (тип Double (.d) в PureBasic)
  #PB_Database_Quad  : Численный тип quad (тип Quad (.q) в PureBasic)
  #PB_Database_Blob  : формат Blob


DatabaseColumns

DatabaseColumns()

Синтаксис

Result = DatabaseColumns(#Database)
Описание
Возвращаемое значение - количество колонок в базе данных #Database.


DatabaseDriverDescription

DatabaseDriverDescription()

Синтаксис

Text$ = DatabaseDriverDescription()
Описание
Результатом функции является описание текущего драйвера базы данных. Листинг доступных драйверов для управления базами данных можно получить используя функции ExamineDatabaseDrivers() и NextDatabaseDriver().

Функция упоребляется для ODBC баз данных ODBC database.


DatabaseDriverName

DatabaseDriverName()

Синтаксис

Text$ = DatabaseDriverName()
Описание
Результатом функции является строковая переменная, содержащая название текущего драйвера управления базой данных. Листинг доступных драйверов для управления базами данных можно получить используя функции ExamineDatabaseDrivers() и NextDatabaseDriver().

Функция упоребляется для ODBC баз данных ODBC database.


DatabaseError

DatabaseError()

Синтаксис

Error$ = DatabaseError()
Описание
Функция возвращает текстовое описание последней случившейся ошибки при работе с базой данных. Она особенно полезна при вызовах функций: OpenDatabase(), DatabaseQuery() и DatabaseUpdate().

Пример :
  ; First, connect to a database with an employee table
  ;
  If DatabaseQuery(#Database, "SELECT * FROM employee") ; Get all the records in the 'employee' table
    ; ...
    FinishDatabaseQuery(#Database)
  Else
    MessageRequester("Error", "Can't execute the query: "+DatabaseError())
  EndIf


DatabaseID

DatabaseID()

Синтаксис

DatabaseID = DatabaseID(#Database)
Описание
Возвращаемое значение - уникальный системный идентификатор ID указанной БД '#Database' . Функция может быть полезна если какой-либо библиотеке необходима ссылка на эту базу данных.


DatabaseQuery

DatabaseQuery()

Синтаксис

Result = DatabaseQuery(#Database, Request$)
Описание
Выполняет SQL запрос Request$ к БД #Database. Если результат 0, то запрос не может быть выполнен корректно (по причине неправильного SQL-запроса или ошибки SQL), в противном случае запрос был успешно выполнен и при помощи функции NextDatabaseRow() можно получить записи БД (см. пример далее). В случае возникновения ошибки, ее подробности можно получить при помощи функции DatabaseError()).NextDatabaseRow() может использоваться для листинга обнаруженных элементов. Для выполнения запроса, который не возвращает никаких данных следует выполнять функцию DatabaseUpdate(). Как только данные запроса более станут ненужны, ресурсы запроса можно освободить используя FinishDatabaseQuery().

Пример :
  ; First, connect to a database with an employee table
  ;
  If DatabaseQuery(#Database, "SELECT * FROM employee") ; Get all the records in the 'employee' table

    While NextDatabaseRow(#Database) ; Loop for each records
      Debug GetDatabaseString(#Database, 0) ; Display the content of the first field
    Wend

    FinishDatabaseQuery(#Database)
  EndIf


DatabaseUpdate

DatabaseUpdate()

Синтаксис

Result = DatabaseUpdate(#Database, Request$)
Описание
Выполняет SQL запрос Request$ к БД #Database. Эта функция аналогична DatabaseQuery(), но не является зависимой от функции NextDatabaseRow(). Также, при помощи этой функции невозможно выполнять запросы типа 'SELECT'. Основное применение - обновление записей в БД. Если результат 0, то запрос не может быть выполнен корректно (по причине неправильного SQL-запроса или ошибки SQL). В случае возникновения ошибки, ее подробности можно получить при помощи функции DatabaseError()).

Пример :
  ; First, connect to a database with an employee table
  ;
  If DatabaseQuery(#Database, "SELECT * FROM employee") ; Get all the records in the 'employee' table

    While NextDatabaseRow(#Database) ; Loop for each records

      ; Update the 'checked' field for each records, assuming the 'id' field is
      ; the first one in the 'employee' table
      ;
      DatabaseUpdate(#Database, "UPDATE employee SET checked=1 WHERE id="+GetDatabaseString(#Database, 0))
    Wend

    FinishDatabaseQuery(#Database)
  EndIf


ExamineDatabaseDrivers

ExamineDatabaseDrivers()

Синтаксис

Result = ExamineDatabaseDrivers()
Описание
Изучает имеющиеся драйвера баз данных, доступных в системе. Если ODBC не установлен или нет драйверов, она возвращает 0, в противном случае NextDatabaseDriver() может быть использована для вывода списка всех драйверов.

Это ODBC database конкретной команды.


FinishDatabaseQuery

FinishDatabaseQuery()

Синтаксис

FinishDatabaseQuery(#Database)
Описание
Завершает текущий SQL запрос к указанной #Database и освобождает связанные с ней ресурсы. Запросы FirstDatabaseRow() или NextDatabaseRow() не могут больше использоваться.

Пример :
  ; First, connect to a database with an employee table
  ;
  If DatabaseQuery(#Database, "SELECT * FROM employee") ; Get all the records in the 'employee' table

    While NextDatabaseRow(#Database) ; Loop for each records
      Debug GetDatabaseString(#Database, 0) ; Display the content of the first field
    Wend

    FinishDatabaseQuery(#Database)
  EndIf


FirstDatabaseRow

FirstDatabaseRow()

Синтаксис

Result = FirstDatabaseRow(#Database)
Описание
Восстанавливает информацию, относящуюся к первой записи в БД #Database. Если Result = 0, то нет доступных строк. Чтобы обратиться к полям в пределах строки, может использоваться GetDatabaseLong(), GetDatabaseFloat(), GetDatabaseString().


GetDatabaseBlob

GetDatabaseBlob()

Синтаксис

Result = GetDatabaseBlob(#Database, Column)
Описание
Возвращает содержание столбца Column в БД #Database как указатель на ячейку памяти. Параметр 'Column' это число от 0, которое обозначает первое поле. Чтобы определить тип столбца, может быть использова DatabaseColumnType(). Для определения размера столбца, может быть использова DatabaseColumnSize(). Если значение Result нулевое, тогда содержание не может быть загруженным, или его содержание пустое.

Примечание: Эта функция может быть вызвана только один раз для каждой колонки. Поэтому, если этот показатель должен быть использован более одного раза, то данные должны храниться в переменной, так как все последующие вызовы, будут возвращать неправильное значение. Это - ограничение технологии ODBC.


GetDatabaseDouble

GetDatabaseDouble()

Синтаксис

Result.d = GetDatabaseDouble(#Database, Column)
Описание
Возвращает информационное наполнение указанного столбца Column в БД #Database как число двойной точности с плавающей запятой. Параметр 'Column' это число от 0, которое обозначает первое поле. Чтобы определить тип столбца, может быть использова DatabaseColumnType().

Примечание: Эта функция может быть вызвана только один раз для каждой колонки. Поэтому, если этот показатель должен быть использован более одного раза, то данные должны храниться в переменной, так как все последующие вызовы, будут возвращать неправильное значение. Это - ограничение технологии ODBC.


GetDatabaseFloat

GetDatabaseFloat()

Синтаксис

Result.f = GetDatabaseFloat(#Database, Column)
Описание
Возвращает информационное наполнение указанного столбца Column в БД #Database как число с плавающей запятой. Параметр 'Column' это число от 0, которое обозначает первое поле. Чтобы определить тип столбца, может быть использова DatabaseColumnType().

Примечание: Эта функция может быть вызвана только один раз для каждой колонки. Поэтому, если этот показатель должен быть использован более одного раза, то данные должны храниться в переменной, так как все последующие вызовы, будут возвращать неправильное значение. Это - ограничение технологии ODBC.


GetDatabaseLong

GetDatabaseLong()

Синтаксис

Result.l = GetDatabaseLong(#Database, Column)
Описание
Возвращает информационное наполнение указанного столбца Column в БД #Database как стандартный цифровой формат Long. Параметр 'Column' это число от 0, которое обозначает первое поле. Чтобы определить тип столбца, может быть использова DatabaseColumnType().

Примечание: Эта функция может быть вызвана только один раз для каждой колонки. Поэтому, если этот показатель должен быть использован более одного раза, то данные должны храниться в переменной, так как все последующие вызовы, будут возвращать неправильное значение. Это - ограничение технологии ODBC.


GetDatabaseQuad

GetDatabaseQuad()

Синтаксис

Result.q = GetDatabaseQuad(#Database, Column)
Описание
Возвращает информационное наполнение указанного столбца Column в БД #Database как стандартный цифровой формат quad. Параметр 'Column' это число от 0, которое обозначает первое поле. Чтобы определить тип столбца, может быть использова DatabaseColumnType().

Примечание: Эта функция может быть вызвана только один раз для каждой колонки. Поэтому, если этот показатель должен быть использован более одного раза, то данные должны храниться в переменной, так как все последующие вызовы, будут возвращать неправильное значение. Это - ограничение технологии ODBC.


GetDatabaseString

GetDatabaseString()

Синтаксис

Text$ = GetDatabaseString(#Database, Column)
Описание
Возвращает информационное наполнение указанного столбца Column в БД #Database в виде текстовой строки. Параметр 'Column' это число от 0, которое обозначает первое поле. Чтобы определить тип столбца, может быть использова DatabaseColumnType().

Примечание: Эта функция может быть вызвана только один раз для каждой колонки. Поэтому, если этот показатель должен быть использован более одного раза, то данные должны храниться в переменной, так как все последующие вызовы, будут возвращать неправильное значение. Это - ограничение технологии ODBC.


IsDatabase

IsDatabase()

Синтаксис

Result = IsDatabase(#DataBase)
Описание
Проверяет существование БД #Database и её правильную инициализацию. Эта функция может использоваться с любым значением. Если Result не нуль, то БД существует и правильно инициализирована, иначе возвращается нуль. Это - хороший способ проверить, что база данных готова к использованию.


NextDatabaseDriver

NextDatabaseDriver()

Синтаксис

Result = NextDatabaseDriver()
Описание
Восстанавливает информацию о следующем доступном драйвере базы данных. Если Result = 0, доступных драйверов больше нет. Эта функция должна быть вызвана после ExamineDatabaseDrivers(). Чтобы получить информацию о драйвере, используйте DatabaseDriverName() и DatabaseDriverDescription().

Функция упоребляется для ODBC баз данных ODBC database.


NextDatabaseRow

NextDatabaseRow()

Синтаксис

Result = NextDatabaseRow(#Database)
Описание
Получает информацию о следующей строке в базе данных #Database. Если результат равен 0, то нет больше строк (т.е. достигнут конец таблицы). Для доступа к ячейкам внутри строки используйте GetDatabaseLong(), GetDatabaseFloat(), GetDatabaseString().


OpenDatabase

OpenDatabase()

Синтаксис

Result = OpenDatabase( #Database, DatabaseName$, User$, Password$ [, Plugin] )
Описание
Открывает заданную базу данных #Database. Если #PB_Any используется в качестве параметра '#Database', номер новой базы данных, будет возвращен как 'Result'. Если 'Result' = 0, то база данных не была найдена или пользователь / пароль (User$/ Password$), являются неверными (текст сообщения об ошибке, может быть получен DatabaseError()). Password$ может быть пустой строкой, если пароль не требуется. 'Plugin' является необязательным параметром и может принимать одно из следующих значений:
  #PB_Database_ODBC      : база данных будет использовать ODBC (UseODBCDatabase() должен быть вызван).
  #PB_Database_SQLite    : база данных будет использовать SQLite (UseSQLiteDatabase() должен быть вызван).
  #PB_Database_PostgreSQL: база данных будет использовать PostgreSQL (UsePostgreSQLDatabase() должен быть вызван).
Если 'Plugin' не будет определен, то будет использоваться первое зарегистрированное дополнение к программе базы данных.


OpenDatabaseRequester

OpenDatabaseRequester()

Синтаксис

Result = OpenDatabaseRequester(#Database)
Описание
Открывает стандартное диалоговое окно для выбора баз данных ODBC. Если #PB_Any используется в качестве параметра '#Database', номер новой базы данных, будет возвращен как 'Result'. Если 'Result' = 0, то база данных не может быть открыта (текст сообщения об ошибке, может быть получен DatabaseError()).

Функция упоребляется для ODBC баз данных ODBC database.


PreviousDatabaseRow

PreviousDatabaseRow()

Синтаксис

Result = PreviousDatabaseRow(#Database)
Описание
Получает информацию о предыдущей строке в базе данных #Database. Если результат равен 0, то нет больше строк (т.е. достигнуто начало таблицы). Для доступа к ячейкам внутри строки используйте GetDatabaseLong(), GetDatabaseFloat(), GetDatabaseString().

Примечание: Если эта функция возвращает 0, то несмотря на наличие строк, доступных до текущей, то драйвер ODBC не поддерживает извлечение данных в обратном направлении. Это не является обязательным для драйверов ODBC, при работе с этой функцией (в отличие от NextDatabaseRow()). Однако, если эта функция работает, она будет работать на любом компьютере, использующим тот же драйвер.

SQLite databases не поддерживает эту команду.


SetDatabaseBlob

SetDatabaseBlob()

Синтаксис

Result = SetDatabaseBlob(#Database, StatementIndex, *Buffer, BufferLength)
Описание
Устанавливает Blob для следующего применения DatabaseUpdate(). 'StatementIndex' начинается с 0 и указывает, какие неопределенные параметры запроса должны быть выставлены. В синтаксисе SQL неопределенный параметр изменяется в зависимости от базы данных. Смотрите следующие примеры, чтобы увидеть, как это делается.

Пример: SQLite and ODBC

  ; SQLite and ODBC shares the same Синтаксис to insert blob. It is indicated by the '?' character
  ;
  ; The database should be opened and a table PHOTOS with 3 column (BLOB, VARCHAR(255), BLOB)
  ;
  SetDatabaseBlob(0, 0, ?Picture, PictureLength)
  SetDatabaseBlob(0, 1, ?SmallPicture, SmallPictureLength)
  DatabaseUpdate(0, "INSERT INTO PHOTOS (picture, name, small_picture) values (?, 'my description', ?);")

Пример: PostgreSQL

  ; PostgreSQL uses another Синтаксис: $1, $2.. into the statement to indicate the undefined parameter
  ;
  ; The database should be opened and a table PHOTOS with 3 column (BYTEA, VARCHAR(255), BYTEA)
  ;
  SetDatabaseBlob(0, 0, ?Picture, PictureLength)
  SetDatabaseBlob(0, 1, ?SmallPicture, SmallPictureLength)
  DatabaseUpdate(0, "INSERT INTO PHOTOS (picture, name, small_picture) values ($1, 'my description', $2);")
Примечание: PostgreSQL использует BYTEA для хранения больших объектов, поэтому двоичные данных в таких местах занимают большой объём. Хороший способ для хранения бинарных данных является шифрование Base64Encoder() перед вставкой в базу данных.


UseODBCDatabase

UseODBCDatabase()

Синтаксис

Result = UseODBCDatabase()
Описание
Инициализирует среду баз данных ODBC для последующего использования. Он пытается загрузить драйвер ODBC и бронирует необходимые ресурсы. Если Result равен 0, то драйвер ODBC не доступен или не соответствуют требованиям (требуется ODBC 3.0 или выше), значит функции БД должны использоваться.

После вызова UseODBCDatabase (), база данных должна быть открыта при помощи OpenDatabase() или OpenDatabaseRequester(), прежде чем будут использоваться любые другие функции баз данных.

Получить список доступных драйверов, можно путем вызова функции ExamineDatabaseDrivers().


UsePostgreSQLDatabase

UsePostgreSQLDatabase()

Синтаксис

Result = UsePostgreSQLDatabase()
Описание
Инициализирует среду баз данных PostgreSQL для последующего использования. PostgreSQL очень мощный сервер баз данных, который поддерживает очень большие базы данных, и продвинутое управление одновременным доступом. Эффективный и свободный для использования в коммерческих проектах, в отличие от MySQL, который имеет лицензию на использование в не-GPL программах. Нетребуется никаких дополнительных драйверов для установки, все, что необходимо для подключение к серверу PostgreSQL присутствует. Для получения дополнительной информации о PostgreSQL: http://www.postgresql.org.

Подключение к PostgreSQL должно быть установлено с помощью функции OpenDatabase(), прежде чем использовать другие функции, связанные с базами данных. Конкретные команды PostgresSQL могут быть переданы в параметре 'DatabaseName$' функции OpenDatabase():
  - host           : имя хоста для подключения.
  - hostaddr       : цифровой IP адрес хоста для подключения.
  - port           : номер порта на хосте для подключения к серверу.
  - dbname         : имя базы данных. По умолчанию такое же, как имя пользователя.
  - connect_timeout: Максимальное время ожидания для подключения, в течение секундах (целое десятичное число).
                     Не рекомендовано использовать значение меньше 2 секунд.
                     Нулевое значение или его отсутствие указывает на бесконечное ожидание.
Пример:
  UsePostgreSQLDatabase()

  ; You should have a server running on localhost
  ;
  If OpenDatabase(0, "host=localhost port=5432", "postgres", "postgres")
    Debug "Connected to PostgreSQL"
  Else
    Debug "Connection failed: "+DatabaseError()
  EndIf


UseSQLiteDatabase

UseSQLiteDatabase()

Синтаксис

Result = UseSQLiteDatabase()
Описание
Инициализирует среду баз данных SQLite для последующего использования. SQLite управляет базами данных без сервера, используя файл как место хранение. Нетребуется никаких дополнительных драйверов или дополнительных файлов для установки. SQLite широко распространены в промышленности, и считается одним из лучших менеджеров встроенных баз данных. Для получения дополнительной информации о SQLite: http://www.sqlite.org.

Чтобы создать новую базу данных, создайте пустой файл с помощью CreateFile(), после чего может использоваться для создания таблиц и добавления записей.

База данных SQLite должна быть открыта с помощью OpenDatabase() перед использованием любых других функций, базы данных.

Пример:
  UseSQLiteDatabase()

  Filename$ = OpenFileRequester("Choose a file name", "PureBasic.sqlite", "*.sqlite|*.sqlite", 0)

  If CreateFile(0, Filename$)
    Debug "Database file created"
    CloseFile(0)
  EndIf

  If OpenDatabase(0, Filename$, "", "")
    Debug "Connected to PureBasic.sqlite"
    If DatabaseUpdate(0, "CREATE TABLE info (test VARCHAR(255));")
      Debug "Table created"
    EndIf
  EndIf


Date

PureBasic - Date

Краткий обзор

Библиотека Date используется для манипуляций функциями даты и времени с 1970-го года по 2038-й используя методы unix-систем ( то есть вычисляя количество секунд прошедших с 1-го января 1970-го года ).

Краткий перечень команд

AddDate
Date
Day
DayOfWeek
DayOfYear
FormatDate
Hour
Minute
Month
ParseDate
Second
Year


AddDate

AddDate()

Синтаксис

Date = AddDate(Date, Field, Value)
Описание
Функция добавляет значение к дате. 'Field' может быть одним из следующих констант:
  #PB_Date_Year   : добавит значение 'Value' лет к дате
  #PB_Date_Month  : добавит значение 'Value' месяцев к дате
  #PB_Date_Week   : добавит значение 'Value' недель к дате
  #PB_Date_Day    : добавит значение 'Value' дней к дате
  #PB_Date_Hour   : добавит значение 'Value' часов к дате
  #PB_Date_Minute : добавит значение 'Value' минут к дате
  #PB_Date_Second : добавит значение 'Value' секунд к дате
Примечание: при использовании константы #PB_Date_Month будет автоматически округлено значение месяца. А именно, если добавить месяц к дате 31 марта 2009 года, то значение даты будет равным 30 апреля 2009 года, так как в апреле нет 31 дня.

Пример:
  Debug FormatDate("%yyyy/%mm/%dd", AddDate(Date(), #PB_Date_Year, 2)) ; Returns the current date + 2 years


Date

Date()

Синтаксис

Date = Date([Year, Month, Day, Hour, Minute, Second])
Описание
Если параметры не указаны, то функция возвратит текущее значение даты( то есть количество секунд, прошедшее с 01.01.1970 00:00 ). Если же параметры указаны, то будет возвращено количество секунд на определенную параметрами дату. Функция FormatDate() в этом случае может перевести число секунд в более читабельный формат.

Пример:
  Debug Date() / (3600*24*365)  ; will print the number of years since 01/01/1970 and now
  Debug Date(1999, 12, 31, 23, 59, 59)  ; will print '946684799' (number of seconds between 01/01/1970 0:00:00 and 12/31/1999 23:59:59)
Примечание: минимальная дата, которая может использоваться для функции 00:00:00 1 января 1970-го года, максимальная - 03:14:07 19 января 2038-го года.


Day

Day()

Синтаксис

Result = Day(Date)
Описание
Эта функция возвращает день месяца указанной даты Date. Значение может быть от 1 до 31.
  Debug Day(Date(2002, 10, 3, 0, 0, 0))  ; Outputs '3'.


DayOfWeek

DayOfWeek()

Синтаксис

Result = DayOfWeek(Date)
Описание
Результатом функции является день недели указанной даты Date, а именно число от 0 до 6:
  0 : воскресенье
  1 : понедельник
  2 : вторник
  3 : среда
  4 : четверг
  5 : пятница
  6 : суббота

  Debug DayOfWeek(Date(2006, 10, 30, 0, 0, 0))  ; Outputs '1' for Monday.


DayOfYear

DayOfYear()

Синтаксис

Result = DayOfYear(Date)
Описание
Результатом функции является количество дней, прошедшее с начала года (1 января) до указанной в параметре даты. Это число может принимать значения от 1 до 366.
  Debug DayOfYear(Date(2002, 2, 1, 0, 0, 0))  ; Outputs '32'. (31 days for January + 1)


FormatDate

FormatDate()

Синтаксис

Text$ = FormatDate(Mask$, Date)
Описание
Эта функция возвращает строковое значение даты 'Date' в читабельном формате в соответствии маске 'Mask$'. Маска является строкой, которая определяет, в каком виде дата должна быть отформатирована:
  %yyyy: будет замещено годом в виде 4-х цифр.
  %yy: будет замещено годом в виде 2-х цифр.
  %mm: будет замещено значением месяца (2 цифры).
  %dd: будет замещено значением дня (2 цифры).
  %hh: будет замещено значением часов (2 цифры).
  %ii: будет замещено значением минут (2 цифры).
  %ss: будет замещено значением секунд (2 цифры).
Пример:
  Debug FormatDate("Y=%yyyy, M= %mm, D=%dd", Date()) ; Will display the actual date in
                                                     ; the form "Y=2002, M=10, D=03"

  Debug FormatDate("%hh:%ii:%ss", Date())  ; Will display the time using the 00:00:00 format
Примечание: минимальная дата, которая может использоваться для функции 00:00:00 1 января 1970-го года, максимальная - 03:14:07 19 января 2038-го года.


Hour

Hour()

Синтаксис

Result = Hour(Date)
Описание
Функция возвращает значение часа определенной в переменной 'Date' даты. Значение может быть от 0 до 23.
  Debug Hour(Date(1970, 1, 1, 11, 3, 45))  ; Outputs '11'.


Minute

Minute()

Синтаксис

Result = Minute(Date)
Описание
Функция возвращает значение минут определенной в переменной 'Date' даты. Значение может быть от 0 до 59.
  Debug Minute(Date(1970, 1, 1, 11, 3, 45))  ; Outputs '3'.


Month

Month()

Синтаксис

Result = Month(Date)
Описание
Функция возвращает значение месяца определенной в переменной 'Date' даты. Значение может быть от 1 до 12.
  Debug Month(Date(2002, 10, 3, 0, 0, 0))  ; Outputs '10'.


ParseDate

ParseDate()

Синтаксис

Date = ParseDate(Mask$, String$)
Описание
Эта функция используется для конвертирования строкового представления даты 'String$' в численное, в соответствии заданной маске 'Mask$'. Если строка, содержащая дату некорректна, то результатом будет -1. Применением этой функции может быть, к примеру, получение значения даты из лог-файла и выполнения операций с ним:
  %yyyy: будет замещено значением года в виде 4-х цифр.
    %yy: будет замещено значением года в виде 2-х цифр.
    %mm: будет замещено значением месяца (2 цифры).
    %dd: будет замещено значением дня (2 цифры).
    %hh: будет замещено значением часов (2 цифры).
    %ii: будет замещено значением минут (2 цифры).
    %ss: будет замещено значением секунд (2 цифры).
Пример:
  Debug ParseDate("%yy/%mm/%dd", "02/12/01") ; Return the date value of the "02/12/01"

строка 'String$', которая содержит строковое представление даты должна быть правильно форматирована. То есть, между каждым из значений даты (месяцем/днем/секундой и тд.) должно находиться не менее одного разделяющего символа, например косой черты '/'.


Second

Second()

Синтаксис

Result = Second(Date)
Описание
Эта функция возвращает значение секунды указанной даты. Значение может быть от 0 до 59.
  Debug Second(Date(1970, 1, 1, 11, 3, 45))  ; Outputs '45'.


Year

Year()

Синтаксис

Result = Year(Date)
Описание
Эта функция возвращает год указанной даты. Значение может быть от 1970 до 2034.
  Debug Year(Date(2002, 10, 3, 0, 0, 0))  ; Outputs '2002'.


Desktop

PureBasic - Desktop

Краткий обзор

Библиотека 'Desktop' позволяет получать информацию о данных мониторов, подключенных к локальному компьютеру (таких как ширина, высота, положение курсора мыши на экране и других).

Краткий перечень команд

DesktopDepth
DesktopFrequency
DesktopHeight
DesktopMouseX
DesktopMouseY
DesktopName
DesktopWidth
DesktopX
DesktopY
ExamineDesktops


DesktopDepth

DesktopDepth()

Синтаксис

Result = DesktopDepth(#Desktop)
Описание
Результатом функции будет глубина цвета (в бит на пиксель: 1,2,4,8,15,16,24 или 32 бита) указанного монитора #Desktop. Номер первичного монитора всегда будет 0. Перед вызовом этой функции обязателен вызов ExamineDesktops() для получения информации о всех возможных мониторах.
  ExamineDesktops()
  MessageRequester("Display Information", "Current resolution = "+Str(DesktopWidth(0))+"x"+Str(DesktopHeight(0))+"x"+Str(DesktopDepth(0)))


DesktopFrequency

DesktopFrequency()

Синтаксис

Result = DesktopFrequency(#Desktop)
Описание
Результатом функции будет частота (в Hz) указанного монитора #Desktop. Номер первичного монитора всегда будет 0. Перед вызовом этой функции обязателен вызов ExamineDesktops() для получения информации о всех возможных мониторах. Если функция вовращает 0, то используется частота аппаратного обеспечения, заданная по умолчанию.
  ExamineDesktops()
  f = DesktopFrequency(0)
  If f = 0
    MessageRequester("Display Information", "There isn't set any desktop frequency, the standard hardware frequency is used.")
  Else
    MessageRequester("Display Information", "Frequency of desktop: "+Str(f)+" Hz.")
  EndIf


DesktopHeight

DesktopHeight()

Синтаксис

Result = DesktopHeight(#Desktop)
Описание
Результатом функции будет высота (в пикселях) указанного монитора #Desktop. Номер первичного монитора всегда будет 0. Перед вызовом этой функции обязателен вызов ExamineDesktops() для получения информации о всех возможных мониторах.
  ExamineDesktops()
  MessageRequester("Display Information", "Current resolution = "+Str(DesktopWidth(0))+"x"+Str(DesktopHeight(0))+"x"+Str(DesktopDepth(0)))


DesktopMouseX

DesktopMouseX()

Синтаксис

Result = DesktopMouseX()
Описание
Результатом функции будет абсолютное значение х положения курсора мыши на экране.
Пример:
  If OpenWindow(0, 0, 0, 300, 30, "Desktop mouse monitor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget(0, 10, 6, 200, 20, "")

    Repeat
      Event = WindowEvent()

      If Event = 0 ; No events are in queue anymore, so halt the process for a few milliseconds for multitasking
        SetGadgetText(0, "Desktop mouse position: "+Str(DesktopMouseX())+","+Str(DesktopMouseY()))
        Delay(20)
      EndIf

    Until Event = #PB_Event_CloseWindow
  EndIf


DesktopMouseY

DesktopMouseY()

Синтаксис

Result = DesktopMouseY()
Описание
Результатом функции будет абсолютное значение y положения курсора мыши на экране.
Пример:
If OpenWindow(0, 0, 0, 300, 30, "Desktop mouse monitor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget(0, 10, 6, 200, 20, "")

    Repeat
      Event = WindowEvent()

      If Event = 0 ; No events are in queue anymore, so halt the process for a few milliseconds for multitasking
        SetGadgetText(0, "Desktop mouse position: "+Str(DesktopMouseX())+","+Str(DesktopMouseY()))
        Delay(20)
      EndIf

    Until Event = #PB_Event_CloseWindow
  EndIf


DesktopName

DesktopName()

Синтаксис

Result$ = DesktopName(#Desktop)
Описание
Результатом функции является строковое значение имени монитора #Desktop (если оно доступно). Номер первичного монитора всегда будет 0. Перед вызовом этой функции обязателен вызов ExamineDesktops() для получения информации о всех возможных мониторах.
  ExamineDesktops()
  MessageRequester("Display Information", "Primary desktop name = "+DesktopName(0))


DesktopWidth

DesktopWidth()

Синтаксис

Result = DesktopWidth(#Desktop)
Описание
Результатом функции будет ширина (в пикселях) указанного монитора #Desktop. Номер первичного монитора всегда будет 0. Перед вызовом этой функции обязателен вызов ExamineDesktops() для получения информации о всех возможных мониторах.
  ExamineDesktops()
  MessageRequester("Display Information", "Current resolution = "+Str(DesktopWidth(0))+"x"+Str(DesktopHeight(0))+"x"+Str(DesktopDepth(0)))


DesktopX

DesktopX()

Синтаксис

Result = DesktopX(#Desktop)
Описание
Результатом функции будет положение x-координаты левого верхнего угла монитора (в пикселях). Значение номера монитора для первичного всегда будет равно 0. Перед вызовом этой функции обязателен вызов ExamineDesktops() для получения информации о всех возможных мониторах.


DesktopY

DesktopY()

Синтаксис

Result = DesktopY(#Desktop)
Описание
Результатом функции будет положение y-координаты левого верхнего угла монитора (в пикселях). Значение номера монитора для первичного всегда будет равно 0. Перед вызовом этой функции обязателен вызов ExamineDesktops() для получения информации о всех возможных мониторах.


ExamineDesktops

ExamineDesktops()

Синтаксис

Result = ExamineDesktops()
Описание
Эта функция получает информацию обо всех мониторах, задействованых на локальном компьютере. Она обязательно должна предшествовать вызовам функций: DesktopDepth(), DesktopFrequency(), DesktopHeight(), DesktopName() и DesktopWidth(). Если функция выполнена успешно, то результатом ее будет число мониторов, иначе - 0. Обычно, пользователи используют один экран, но бывают случаи подключения нескольких мониторов с разными разрешениями.
  MessageRequester("Desktop Information", "You have "+Str(ExamineDesktops())+" desktops")


DragDrop

PureBasic - DragDrop

Краткий обзор

Drag & Drop (тащить-вставить) сегодня это широко используемая технология, поскольку она обеспечивает простой и очень интуитивный способ перемещать данные между окнами и приложениями. Эта библиотека обладает кросс-платформенной функциональностью, добавляя функциональные возможности gadgets и windows, просто добавив несколько строк кода.

Кроме того, для опытных программистов, она обеспечивает доступ к низкоуровневым функциям API, чтобы максимально использовать возможности операционной системы.

Краткий перечень команд

DragFiles
DragImage
DragOSFormats
DragPrivate
DragText
EnableGadgetDrop
EnableWindowDrop
EventDropAction
EventDropBuffer
EventDropFiles
EventDropImage
EventDropPrivate
EventDropSize
EventDropText
EventDropType
EventDropX
EventDropY
SetDragCallback
SetDropCallback


DragFiles

DragFiles()

Синтаксис

Result = DragFiles(Files$ [, Actions])
Описание
Запуск операции 'Drag & Drop', используя список файлов Files$. Перетаскивание в принципе может быть начато в любое время, однако левая кнопка мыши должна быть нажата, в противном случае операция будет незамедлительно прекращена без особого успеха. Наиболее соответствующий момент чтобы запустить операцию Drag & Drop, когда Gadget сообщил о событии EventType() #PB_EventType_DragStart.

Параметры

Files$ список имен файлов или каталогов, которые надо переместить. Имена файлов должны быть отделены символом Chr(10) (перевод строки). Каждое имя файла должно содержать его полный путь, поскольку целевое приложение не будет знать относительных путей. Имена файлов должны быть именами существующих файлов, чтобы целевое приложение могло получить к ним доступ.

Actions может быть комбинация действий Drag & Drop, которые доступны для этих файлов. Если параметр не указывается, #PB_Drag_Copy будет использовано как значение по умолчанию. Возможные действия: (они могут быть объединены '|')
  #PB_Drag_Copy: файлы будут скопированы
  #PB_Drag_Move: файлы будут перемещены
  #PB_Drag_Link: будет создана ссылка
Пользователь может определить, какие из этих действий должны быть использованы, нажатием клавиш-модификаторов Ctrl или Shift. Доступные действия зависят также от того, какой файл выбран.

Возвращаемое значение

Возвращает одно из вышеупомянутых значений Drag & Drop, чтобы, узнать что было выбрано пользователем, или #PB_Drag_None, если пользователь прервал операцию Drag & Drop.

Обратите внимание, что в отличие от других функций Drag & Drop, ничего не будет ;сделано, когда возвращается #PB_Drag_Move. Поскольку перенесённые данные - только имя файла, а не файл непосредственно.

Пример:

  ; Select some files or folders and drag them to another application
  ;
  If OpenWindow(1, 200, 200, 400, 400, "Drag & Drop", #PB_Window_SystemMenu)
    ExplorerListGadget(1, 10, 10, 380, 380, "*", #PB_Explorer_MultiSelect)

    Repeat
      Event = WaitWindowEvent()

      If Event = #PB_Event_Gadget And EventGadget() = 1 And EventType() = #PB_EventType_DragStart
        Files$ = ""
        For i = 0 To CountGadgetItems(1)-1
          If GetGadgetItemState(1, i) & #PB_Explorer_Selected
            Files$ + GetGadgetText(1) + GetGadgetItemText(1, i) + Chr(10)
          EndIf
        Next i

        DragFiles(Files$)
      EndIf

    Until Event = #PB_Event_CloseWindow
  EndIf


DragImage

DragImage()

Синтаксис

Result = DragImage(ImageID [, Actions])
Описание
Запуск операции 'Drag & Drop', с данным изображением ImageID. Перетаскивание в принципе может быть начато в любое время, однако левая кнопка мыши должна быть нажата, в противном случае операция будет незамедлительно прекращена без особого успеха. Наиболее соответствующий момент чтобы запустить операцию Drag & Drop, когда Gadget сообщил о событии EventType() #PB_EventType_DragStart.

Параметры

ImageID определяет изображение которое надо перенести. Чтобы получить идентификатор для изображения используйте ImageID(), .

Actions может быть комбинация действий Drag & Drop, которые доступны для этих изображений. Если параметр не указывается, #PB_Drag_Copy будет использовано как значение по умолчанию. Возможные действия: (они могут быть объединены '|')
  #PB_Drag_Copy: файлы будут скопированы
  #PB_Drag_Move: файлы будут перемещены
  #PB_Drag_Link: будет создана ссылка
Пользователь может определить, какие из этих действий должны быть использованы, нажатием клавиш-модификаторов Ctrl или Shift. Доступные действия зависят также от того, какое изображение выбрано.
Возвращаемое значение
Возвращает одно из вышеупомянутых значений Drag & Drop, чтобы, узнать что было выбрано пользователем, или #PB_Drag_None, если пользователь прервал операцию Drag & Drop.

Обратите внимание если возвращенное значение #PB_Drag_Move, то Вы должны удалить перемещенное изображение из вашего приложения.

Пример:

  ; Перетащить изображение в приложение, которое может работать с изображениями.
  ;
  If LoadImage(1, #PB_Compiler_Home + "examples/sources/data/PureBasicLogo.bmp")
    If OpenWindow(1, 200, 200, 400, 90, "Drag & Drop", #PB_Window_SystemMenu)
      ImageGadget(1, 10, 10, 380, 70, ImageID(1))

      Repeat
        Event = WaitWindowEvent()
        If Event = #PB_Event_Gadget And EventGadget() = 1 And EventType() = #PB_EventType_DragStart
          DragImage(ImageID(1))
        EndIf
      Until Event = #PB_Event_CloseWindow
    EndIf
  EndIf


DragOSFormats

DragOSFormats()

Синтаксис

Result = DragOSFormats(Formats(), Count [, Actions])
Описание
Запускает операцию Drag & Drop списка пользовательских форматов данных. Типы форматов и порядок, в котором они представлены, зависит от используемой операционной системы. Эта функция предоставляет возможность работы с форматами, которые не поддерживаются PureBasic, при этом используя простые механизмы, предусмотренные этой библиотекой для выполнения операции Drag & Drop.

Перетаскивание в принципе может быть начато в любое время, однако левая кнопка мыши должна быть нажата, в противном случае операция будет незамедлительно прекращена без особого успеха. Наиболее соответствующий момент чтобы запустить операцию Drag & Drop, когда Gadget сообщил о событии EventType() #PB_EventType_DragStart.

Параметры

Formats() должен быть (массив)array из (структуры)structures DragDataFormat содержащий один или несколько форматов для перемещения.
'Count' обозначает количество содержащихся в массиве форматов.
Структура должна иметь следующий вид:
  Structure DragDataFormat
    Format.l    ; The OS specific ID for the format to drag (see below for more information)
   *Buffer      ; The memory buffer containing the data in this format
    Size.l      ; The size of the data in the buffer
  EndStructure
Windows:
'Format' задается CLIPBOARDFORMAT значением. Это может быть любой стандартный формат буфера обмена (он находится в Windows SDK) или формат зарегистрированных RegisterClipboardFormat_ () API.
Linux:
'Format' задает значение типа GdkAtom. Он может быть создан с помощью функции gdk_atom_intern_(). Общепринятое расширение mime (например,"text/html" для HTML-данных). Также часто atom может быть создан с любой строкой, которая понимается целевым приложением.
MacOSX:
На MacOSX, поле 'Format' определяет тип данных буфера обмена. Он обладает четырьмя постоянными буквенно-цифровыми значениями например 'TEXT'. Есть ряд предопределенных типов данных, которые также могут использоваться, если целевая программа понимает их.
Если "перемещаются" несколько форматов, целевое приложение обработает первым, тот формат, который предоставит больше всего информации (следовательно, который представляет наиболее полные данные). Таким образом, каждое приложение будет получать лучшее представление о данных, которые оно понимает.

Actions может быть комбинация действий Drag & Drop, которые доступны для этих изображений. Если параметр не указывается, #PB_Drag_Copy будет использовано как значение по умолчанию. Возможные действия: (они могут быть объединены '|')
  #PB_Drag_Copy: файлы будут скопированы
  #PB_Drag_Move: файлы будут перемещены
  #PB_Drag_Link: будет создана ссылка
Пользователь может определить, какие из этих действий должны быть использованы, нажатием клавиш-модификаторов Ctrl или Shift. Доступные действия зависят также от того, какой фрмат выбран.

Возвращаемое значение

Возвращает одно из вышеупомянутых значений Drag & Drop, чтобы, узнать что было выбрано пользователем, или #PB_Drag_None, если пользователь прервал операцию Drag & Drop.

Обратите внимание если возвращенное значение #PB_Drag_Move, то Вы должны удалить перемещенные данные из вашего приложения.


DragPrivate

DragPrivate()

Синтаксис

Result = DragPrivate(Type [, Actions])
Описание
Запускает внутреннюю операцию Drag & Drop. В отличие от других функций, которые запускают Drag & Drop, эти данные могут быть перемещены только внутри данного приложения (данные, которые перемещают функциями DragText() или DragImage() могут быть также приняты другими приложениями). Эта команда позволяет добавить функциональные возможности Drag & Drop между Gadgets или Windows используя данные, которые не были, бы обработаны другими приложениями.

Перетаскивание в принципе может быть начато в любое время, однако левая кнопка мыши должна быть нажата, в противном случае операция будет незамедлительно прекращена без особого успеха. Наиболее соответствующий момент чтобы запустить операцию Drag & Drop, когда Gadget сообщил о событии EventType() #PB_EventType_DragStart.

Параметры

Type является значением, которое будет определять тип перемещаемых данных. То же значение должно быть указано EnableGadgetDrop() или EnableWindowDrop() для Gadget/Windows которые будут принимать эти данные.
Это позволяет точно определить, что Gadget/Window, примет этот тип данных.

Actions может быть комбинация действий Drag & Drop, которые доступны для этих данных. Если параметр не указывается, #PB_Drag_Copy будет использовано как значение по умолчанию. Возможные действия: (они могут быть объединены '|')
  #PB_Drag_Copy: файлы будут скопированы
  #PB_Drag_Move: файлы будут перемещены
  #PB_Drag_Link: будет создана ссылка
Пользователь может определить, какие из этих действий должны быть использованы, нажатием клавиш-модификаторов Ctrl или Shift. Доступные действия зависят также от того, какой тип данных выбран.

Возвращаемое значение

Возвращает одно из вышеупомянутых значений Drag & Drop, чтобы, узнать что было выбрано пользователем, или #PB_Drag_None, если пользователь прервал операцию Drag & Drop.

Если операция не была прервана, event loop получит #PB_Event_WindowDrop или #PB_Event_GadgetDrop примет событие типа #PB_Drop_Private.


DragText

DragText()

Синтаксис

Result = DragText(Text$ [, Actions])
Описание
Запускает операцию Drag & Drop текстовых данных. Перетаскивание в принципе может быть начато в любое время, однако левая кнопка мыши должна быть нажата, в противном случае операция будет незамедлительно прекращена без особого успеха. Наиболее соответствующий момент чтобы запустить операцию Drag & Drop, когда Gadget сообщил о событии EventType() #PB_EventType_DragStart.

Параметры

Text$ определяет текст который надо переносить.

Actions может быть комбинация действий Drag & Drop, которые доступны для этих изображений. Если параметр не указывается, #PB_Drag_Copy будет использовано как значение по умолчанию. Возможные действия: (они могут быть объединены '|')
  #PB_Drag_Copy: файлы будут скопированы
  #PB_Drag_Move: файлы будут перемещены
  #PB_Drag_Link: будет создана ссылка
Пользователь может определить, какие из этих действий должны быть использованы, нажатием клавиш-модификаторов Ctrl или Shift. Доступные действия зависят также от того, какой текст выбран.

Возвращаемое значение

Возвращает одно из вышеупомянутых значений Drag & Drop, чтобы, узнать что было выбрано пользователем, или #PB_Drag_None, если пользователь прервал операцию Drag & Drop.

Обратите внимание если возвращенное значение #PB_Drag_Move, то Вы должны удалить перемещенный текст из вашего приложения.


EnableGadgetDrop

EnableGadgetDrop()

Синтаксис

EnableGadgetDrop(#Gadget, Format, Actions [, PrivateType])
Описание
Активирует gadget для операций Drag & Drop определенного формата Format. Если пользователь перемещает данные этого Format над гаджетом, курсор мыши покажет, что данные могут быть приняты этим гаджетом.

Когда данные будут помещены на гаджет, программа получит событие #PB_Event_GadgetDrop. EventGadget() укажет целевое устройство, и функции Event этой библиотеки, которые могут использоваться, чтобы обработать полученныеенные данные.

Параметры

#Gadget это номер активируемого гаджета.

Format указывает, какой тип данных сможет быть помещенным на гаджет. Смотри DragOSFormats() для получения дополнительной информации.
  #PB_Drop_Text   : текст
  #PB_Drop_Image  : изображение
  #PB_Drop_Files  : имена файлаов
  #PB_Drop_Private: внутренний формат
Actions может быть комбинация действий Drag & Drop, которые доступны для этих данных. Если параметр не указывается, #PB_Drag_Copy будет использовано как значение по умолчанию. Возможные действия: (они могут быть объединены '|')
  #PB_Drag_None: Формат данных не принимается на этом Gadget
  #PB_Drag_Copy: Данные могут копироваться
  #PB_Drag_Move: Данные могут перемещаться
  #PB_Drag_Link: может быть создана ссылка
PrivateType нужен только если определён формат #PB_Drop_Private. Смотри DragPrivate() для более подробной информации.

Примечание: Гаджет может принять несколько типов данных. Поэтому предпочитаемый формат, должен активироваться последний.


EnableWindowDrop

EnableWindowDrop()

Синтаксис
EnableWindowDrop(#Window, Format, Actions [, PrivateType])
Описание
Активирует window для операций Drag & Drop определенного формата Format. Доступна для перемещения только та часть окна, которая не занята гаджетами. Когда пользователь перемещает данные этого Format над окном, курсор мыши покажет, что данные могут быть приняты этим окном.

Когда данные помещаются в окно, программа получит событие #PB_Event_WindowDrop. EventWindow() укажет целевое устройство, и функции Event этой библиотеки, которые могут использоваться, чтобы обработать полученные данные.

Параметры

#Window это номер активируемого окна.

Format указывает, какой тип данных сможет быть помещен в окно. Смотри DragOSFormats() для получения дополнительной информации.
  #PB_Drop_Text   : текст
  #PB_Drop_Image  : изображение
  #PB_Drop_Files  : имена файлаов
  #PB_Drop_Private: внутренний формат
Actions может быть комбинация действий Drag & Drop, которые доступны для этих данных. Если параметр не указывается, #PB_Drag_Copy будет использовано как значение по умолчанию. Возможные действия: (они могут быть объединены '|')

  #PB_Drag_None: Формат данных, которые не будут приняты этим окном
  #PB_Drag_Copy: данные могут быть скопированы
  #PB_Drag_Move: данные могут быть перемещены
  #PB_Drag_Link: может быть создана ссылка
PrivateType нужен только если определён формат #PB_Drop_Private. Смотри DragPrivate() для более подробной информации.

Примечание: Окно может принять несколько типов данных. Поэтому предпочитаемый формат, должен активироваться последний.


EventDropAction

EventDropAction()

Синтаксис

Result = EventDropAction()
Описание
После получения #PB_Event_GadgetDrop или #PB_Event_WindowDrop от WaitWindowEvent() или WindowEvent(), эта функция возвращает действие, которое должно быть предпринято с данными.

Возвращаемое значение

Возвращает одно из следующих значений:

  #PB_Drag_Copy: данные должны быть скопированы
  #PB_Drag_Move: данные должны быть перемещены (источник отвечает за удаление оригинальных данных)
  #PB_Drag_Link: должна быть создана ссылка


EventDropBuffer

EventDropBuffer()

Синтаксис

*Result = EventDropBuffer()
Описание
После получения #PB_Event_GadgetDrop или #PB_Event_WindowDrop от WaitWindowEvent() или WindowEvent() то речь идет о системном формате, эта функция позволяет обратиться к полученным данным.

Возвращаемое значение

Возвращает адрес памяти, перемещенных данных.

Примечание: Эта область памяти, находится в ведении библиотек и никогда не должна быть уничтожена. Она остается нетронутой до следующего вызова WaitWindowEvent() или WindowEvent(), следовательно, ее содержимое должно быть скопировано, если необходимо сохранить находящиеся там данные.


EventDropFiles

EventDropFiles()

Синтаксис

Result$ = EventDropFiles()
Описание
После получения #PB_Event_GadgetDrop или #PB_Event_WindowDrop от WaitWindowEvent() или WindowEvent() и формат #PB_Drop_Files (возвращаемый от EventDropType()), эта функция возвращает имена полученных файлов.

Возвращаемое значение

Возвращает список файлов или каталогов, и их абсолютный путь. Отдельные имена разделяются символом Chr(10) (перевод строки).


EventDropImage

EventDropImage()

Синтаксис

Result = EventDropImage(#Image [, Depth])
Описание
После получения #PB_Event_GadgetDrop или #PB_Event_WindowDrop от WaitWindowEvent() или WindowEvent() и формат #PB_Drop_Image(возвращаемый от EventDropType()), эта функция позволяет загрузить полученное изображение.

Параметры

#Image это номер вновь созданного изображения. Если используется #PB_Any то, новый номер изображения будет возвращен как 'Result'.

Depth задает глубину цвета для нового изображения. Если он опущен или установлен как #PB_Image_DisplayFormat, то формат изображения будет таким же, как у изображения на рабочем столе (экране). В этом случае, изображение будет отображаться быстрее, но могут быть потери в качестве, например, если изображение 32 бита, в то время как экран в 16 бит. Правильные значения 'Depth' могут быть: 1, 2, 4, 8, 16, 24 и 32 бита. Если изображение будет использоваться только для того, чтобы отобразиться на экране, то #PB_Image_DisplayFormat позволяет повысить производительность.


EventDropPrivate

EventDropPrivate()

Синтаксис

Result = EventDropPrivate()
Описание
После получения #PB_Event_GadgetDrop или #PB_Event_WindowDrop от WaitWindowEvent() или WindowEvent() и формат #PB_Drop_Private (возвращаемый от EventDropType()), эта функция возвращает 'PrivateType' который был получен. Смотри DragPrivate() для получения дополнительной информации.


EventDropSize

EventDropSize()

Синтаксис

Result = EventDropSize()
Описание
После получения #PB_Event_GadgetDrop или #PB_Event_WindowDrop от WaitWindowEvent() или WindowEvent() и системный формат, эта функция отсылает размер полученных данных.

Возвращаемое значение

Возвращает размер буфера памяти в байтах, возвращенного EventDropBuffer().


EventDropText

EventDropText()

Синтаксис

Result$ = EventDropText()
Описание
После получения #PB_Event_GadgetDrop или #PB_Event_WindowDrop от WaitWindowEvent() или WindowEvent() и формат #PB_Drop_Text (возвращаемый от EventDropType()), эта функция возвращает текст, который был получен.


EventDropType

EventDropType()

Синтаксис

Result = EventDropType()
Описание
После получения #PB_Event_GadgetDrop или #PB_Event_WindowDrop от WaitWindowEvent() или WindowEvent(), эта функция возвращает формат полученных данных.

Возвращаемое значение

Возвращает одно из следующих значений, или идентификатор системного формата Смотри DragOSFormats() для получения дополнительной информации.
  #PB_Drop_Text   : был помещен текст.       (используйте EventDropText()  чтобы его загрузить)
  #PB_Drop_Image  : было помещено изображение.   (используйте EventDropImage() чтобы его загрузить)
  #PB_Drop_Files  : были помещены имена файлов. (используйте EventDropFiles() чтобы их загрузить)
  #PB_Drop_Private: были помещены файлы внутреннего формата. (используйте EventDropPrivate() чтобы узнать о типе)
Чтобы управлять системными форматами,должны быть использованны EventDropBuffer() и EventDropSize().


EventDropX

EventDropX()

Синтаксис

Result = EventDropX()
Описание
После получения #PB_Event_GadgetDrop или #PB_Event_WindowDrop от WaitWindowEvent() или WindowEvent(), эта функция возвращает координату X в окне или гаджете, на который были помещены данные.


EventDropY

EventDropY()

Синтаксис

Result = EventDropY()
Описание
После получения #PB_Event_GadgetDrop или #PB_Event_WindowDrop от WaitWindowEvent() или WindowEvent(), эта функция возвращает координату Y в окне или гаджете, на который были помещены данные.


SetDragCallback

SetDragCallback()

Синтаксис

SetDragCallback(@DragCallback())
Описание
Устанавливает функцию обратного вызова, которая будет вызвана автоматически при операции Drag & Drop. Обратный вызов позволяет изменять поведение процесса Drag & Drop, предлагаемых PureBasic, например, путем предоставления пользовательского курсора через API операционной системы. Форма и функции обратного вызова зависит от ОС и описано ниже:

Windows:
  Procedure DragCallback(Action)

    ProcedureReturn #True
  EndProcedure
Функция обратного вызова вызывается в ходе операции перетаскивания. Action определяет действие, которое будет принято, если пользователь отпустили мышь в этой точке. Она может принимать одно из следующих значений:
  #PB_Drag_None: данные не будут приняты
  #PB_Drag_Copy: данные будут скопированы
  #PB_Drag_Move: данные будут перенесены
  #PB_Drag_Link: будет создана ссылка
Функция обратного вызова может предложить специальный курсор или показать изображение. Если она это делает, то должна вернуть #False. #True используется по умолчанию.
Linux:
  Procedure DragCallback(*Context.GdkDragContext, isStart)

  EndProcedure
Функция обратного вызова вызывается только в начале и в конце операции перетаскивания. '*Context' параметр, задаваемый GDK, 'isStart' определяет - это начало или конец операции. Значение, возвращаемое функцией обратного вызова, игнорируются.

Gtk функции такие как gtk_drag_set_icon_pixbuf_() могут быть использованы для того, чтобы отображать различные изображения во время перетаскивания.
MacOSX:
  Procedure DragCallback(DragReference, isStart)

  EndProcedure
Функция обратного вызова вызывается только в начале и в конце операции перетаскивания. 'DragReference' специфический параметр Carbon , который принимает значение формы 'DragRef', 'isStart' определяет - это начало или конец операции. Значение, возвращаемое функцией обратного вызова, игнорируются.

Все функции Carbon Drag Manager можно использовать для влияния на действие операции до ее начала (например, добавление большего количества пунктов), а также получить более подробную информацию об операции после её завершения.


SetDropCallback

SetDropCallback()

Синтаксис

SetDropCallback(@DropCallback())
Описание
Устанавливает функцию обратного вызова, которая будет вызвана автоматически, когда над окном или гаджетом перемещаются данные функцией Drag & Drop (смотри EnableGadgetDrop() / EnableWindowDrop()). Обратный вызов позволяет изменять поведение процесса Drag & Drop, предлагаемых PureBasic, например, путем предоставления дополнительных визуальных эффектов в зависимости от расположения данных.

Функция обратного вызова активируется, когда мышь входит, движется и уходит из области окна или гаджета и позволяет обеспечить дополнительную обратную связь с пользователем, например, выделив окно или гаджет.
Параметры приведены ниже:

  Procedure DropCallback(TargetHandle, State, Format, Action, x, y)

    ProcedureReturn #True
  EndProcedure
Первый параметр указывает OS specific handle для гаджета или окна. В Windows это значение HWND, в Linux указатель GtkWidget и ControlRef или WindowRef значение для MacOSX. Это те же значения, которые возвращаются от GadgetID() или WindowID() для гаджета или окна.

'State' определяет текущее состояние Drag & Drop операции и является одним из следующих значений:
  #PB_Drag_Enter : мышь достигла границ гаджета или окна
  #PB_Drag_Update: мышь движется над гаджетом или окном, или её положение не изменилось
  #PB_Drag_Leave : мышь вышла за граници гаджета или окна (Format, Action, x, y в этом случае 0)
  #PB_Drag_Finish: Drag & Drop завершено
'Format' определяет формат данных и может быть одним из следующих значений, или системным форматом (смотри DragOSFormats() для получения дополнительной информации).
  #PB_Drop_Text   : был помещен текст
  #PB_Drop_Image  : было помещено изображение
  #PB_Drop_Files  : были помещены имена файлов
  #PB_Drop_Private: были помещены файлы внутреннего формата
'Action' определяет действие, которое должно происходить после освобождения мыши на этом месте. Она может быть одним из следующих значений:
  #PB_Drag_None: данные не будут приняты
  #PB_Drag_Copy: данные будут скопированы
  #PB_Drag_Move: данные будут перенесены
  #PB_Drag_Link: будет создана ссылка
При возвращении #True, обратный вызов разрешен в этом месте. При возвращении #False, обратный вызов запрещен (курсор будет изменен на "запрещено"). Если 'State' #PB_Drag_Finish, возвращает #False то действие Drag & Drop будет отменено.


Engine3D

PureBasic - Engine3D

Краткий обзор

PureBasic provides easy access to a very powerful OpenSource 3D Engine called OGRE. This choice has been made because we don't like to reinvent the wheel every time and when we saw the OGRE code quality, we felt that it would make a considerable contribution to the PureBasic 3D library.

OGRE is still under heavy development and will probably become a very advanced engine soon. Its community is growing more and more and many tools are available to make the most of this engine (e.g. Blender, Lightwave and 3DS Max exporters, Terrain manager etc). More information about OGRE is available at OGRE web site. The OGRE license file can be consulted here and PureBasic customized OGRE source files can be downloaded from here.

Note: If you use the 3D engine of PureBasic in your projects and you intent to distribute your executable, you will have to copy the Engine3D.dll from the PureBasic/Compilers directory to your main project directory.

Краткий перечень команд

Add3DArchive
AmbientColor
AntialiasingMode
CheckEntityCollision
CountRenderedTriangles
CreateWater
EnableWorldCollisions
EnableWorldPhysics
Engine3DFrameRate
ExamineWorldCollisions
FirstWorldCollisionEntity
Fog
InitEngine3D
InputEvent3D
LoadWorld
MousePick
NextWorldCollision
Parse3DScripts
PickX
PickY
PickZ
PointPick
RenderWorld
SecondWorldCollisionEntity
SetGUITheme3D
ShowGUI
SkyBox
SkyDome
Sun
WorldDebug
WorldGravity
WorldShadows


Add3DArchive

Add3DArchive()

Синтаксис

Add3DArchive(Path$, Type)
Описание
Add a new absolute or relative path to the current 3D path list. All the 3D functions which need to load data (e.g. texture, mesh, sky, @link""RenderWorld" "world") will use this path.

You may wonder why there is a special way to handle the files for 3D functions? Because it makes the data access more flexible and now, you can access the data using the standard file system or directly via the archive file like a .zip file. It's a very cool feature because you can pack all your data in one big compressed file, and then access the assets as if these were contained a standard directory.

'Type' can be one of the following value:
  #PB_3DArchive_FileSystem : Standard directory
  #PB_3DArchive_Zip        : Compressed zip file
Пример:
  Add3DArchive("MyData.zip", #PB_3DArchive_Zip) ; Add the .zip as a directory in the path
  LoadTexture(0, "MyTexture.jpg")               ; load the MyTexture.jpg from the zip
  LoadTexture(1, "World/Grass.jpg")             ; load the Grass.jpg from the zip, in the World\ path


AmbientColor

AmbientColor()

Синтаксис

AmbientColor(Color)
Описание
Changes the ambient color of the world. RGB() can be used to get a valid Color value.


AntialiasingMode

AntialiasingMode()

Синтаксис

AntialiasingMode(Mode)
Описание
Changes the fullscreen antialising mode. This function has to be called before OpenScreen() to have any effect. 'Mode' can be one of the following constants:
  - #PB_AntialiasingMode_None: No antialiasing (default).
  - #PB_AntialiasingMode_x2  : x2 fullscreen antialiasing (FSAA).
  - #PB_AntialiasingMode_x4  : x4 fullscreen antialiasing (FSAA).
  - #PB_AntialiasingMode_x6  : x6 fullscreen antialiasing (FSAA).
Note: depending of the graphic card, this command can have a severe impact on rendering performance.


CheckEntityCollision

CheckEntityCollision()

Синтаксис

Result = CheckEntityCollision(#Entity, #Entity2)
Описание
Checks if the #Entity has collided with #Entity2. If the 'Result' is 0, the entities have not collided, else they have collided. This function must be called after ExamineWorldCollisions().


CountRenderedTriangles

CountRenderedTriangles()

Синтаксис

Result = CountRenderedTriangles()
Описание
Returns the number of triangles rendered during the last frame.


CreateWater

CreateWater()

Синтаксис

CreateWater(#Camera, x, y, z, Transparency, Flags)
Описание
Creates a water plane at the given position. 'Transparency' adjust the whole water transparency, from 0 (fully opaque) to 255 (transparent). 'Flags' can be a combination of the following constants:
  - #PB_World_WaterMediumQuality: medium quality (default).
  - #PB_World_WaterLowQuality   : low quality, which means less polygons (but faster rendering).
  - #PB_World_WaterHighQuality  : high quality, which means more polygons (but slower rendering).
  - #PB_World_WaterCaustics     : Enable the water caustics effects, which are small patterns created by the light on the water surface.
  - #PB_World_WaterSmooth       : Enable smooth wave transition.
  - #PB_World_WaterFoam         : Enable foam effect, which affect underwater objects when viewed out of the water plane.
  - #PB_World_WaterSun          : Enable sun reflection on water. To control the sun position and color, use Sun().


EnableWorldCollisions

EnableWorldCollisions()

Синтаксис

EnableWorldCollisions(State)
Описание
If 'State' is 0, the collisions are disabled in the world (this is the default behaviour), else the collisions are monitored and can examined later with ExamineWorldCollisions(). Collisions only work if the physics engine is enabled with EnableWorldPhysics().


EnableWorldPhysics

EnableWorldPhysics()

Синтаксис

EnableWorldPhysics(State)
Описание
Enable or disable the physics engine in the world. If 'State' is 0, the physics engine will be disabled (default), else the physics engine is applied to all the entities which have a body set with EntityPhysicBody(). Collisions can be enabled with ExamineWorldCollisions().


Engine3DFrameRate

Engine3DFrameRate()

Синтаксис

Result = Engine3DFrameRate(Type)
Описание
Returns the 3D engine frame rate (i.e. number of frames per second) depending of the specified 'Type'. 'Type' can be one of the following values:
  #PB_Engine3D_Current : Current frame rate
  #PB_Engine3D_Average : Average frame rate achieved since the engine started running
  #PB_Engine3D_Maximum : Best frame rate achieved since the engine started running
  #PB_Engine3D_Minimum : Worst frame rate achieved since the engine started running
  #PB_Engine3D_Reset   : Reset the frame rate statistics (minimum, maximum and average)


ExamineWorldCollisions

ExamineWorldCollisions()

Синтаксис

ExamineWorldCollisions()
Описание
Examines which entities have collided since the last call using this function. To enumerate the collisions, use the NextWorldCollision(). Collisions are only available if the physics engine is enabled with EnableWorldPhysics() and collisions are activated with EnableWorldCollisions(). For a collision to occur, an entity must have a body associated with it using EntityPhysicBody().


FirstWorldCollisionEntity

FirstWorldCollisionEntity()

Синтаксис

Entity = FirstWorldCollisionEntity()
Описание
Return the first #Entity number that has collided. This function must be called after NextWorldCollision()


Fog

Fog()

Синтаксис

Fog(Color, Intensity, StartDistance, EndDistance)
Описание
Creates a fog at the specified distance of the camera. If 'Intensity' is 0, the fog effect is removed. RGB() can be used to get a valid Color value. 'StartDistance' is the distance from the Camera (in World units) where the fog should start. 'EndDistance' is the distance from the Camera where the fog is fully opaque.


InitEngine3D

InitEngine3D()

Синтаксис

Result = InitEngine3D()
Описание
Initializes the 3D environment for later use. You must put this function at the top of your source code if you want to use any of the 3D functions. You should test the result to see if the 3D environment has been correctly initialized. If initialization fails, the program should quit or all 3D function calls should be disabled. This function tries to load the 'Engine3D.dll' and DirectX 7, so if it fails, it's probably because the DLL or DirectX 7+ is not found.


InputEvent3D

InputEvent3D()

Синтаксис

InputEvent3D(MouseX, MouseY, LeftMouseButton, Text$)
Описание
Injects events in the 3D GUI system. To be verstatile enough, the events aren't automatically gets from the main mouse and keyboard, but injected on demand. 'MouseX' and 'MouseY' specify the actual 3D GUI mouse position, in pixels. 'LeftMouseButton' is the left mouse button state (either 0 if unpressed or 1 if pressed). 'Text$' sets the text entered in the GUI system, for example to feed a StringGadget3D() when it has the focus.

Once these events are entered, all the 3D GUI state changes are handled automatically.

Пример:
  ; Here is the classic case to get the events from the mouse and keyboard
  ;
  InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left), KeyboardInkey())


LoadWorld

LoadWorld()

Синтаксис

Result = LoadWorld(Filename$)
Описание
This function loads an entire world. Currently, the Quake3 BSP format is the only one supported but more formats will follow. The Filename$ must be accessible in the 3D path, so the Add3DArchive() function should be used before calling this function. A world can be easily created using third party tools like 'Quark'. A world can contain a sky, building, lights and more. Actually, all Quake 3 maps can be loaded out of the box with full detail. If the 'Result' is 0, the world could not be loaded.

The BSP format is owned by iD Software and can only be used in freeware programs. Commercial software must acquire a license from iD to use this format. The license scheme is beyond PureBasic and Fantaisie Software can't be responsible for the incorrect use of this function.


MousePick

MousePick()

Синтаксис

Result = MousePick(#Camera, x, y)
Описание
Simulates a mouse click and returns which object is under the specified 2D point (x,y - in pixels) on the specified #Camera. The returned value can be:
  -1 : Nothing has been detected
  #PB_World_WaterPick: the click occured on the water.
  #PB_World_TerrainPick: the click occured on a terrain.
  0 and above: the click occured on the #Entity. The entity pick is based on its bounding box, not on its mesh.
To get more information about the picked object position, use PickX(), PickY() and PickZ().


NextWorldCollision

NextWorldCollision()

Синтаксис

Result = NextWorldCollision()
Описание
Checks if another collision is available. If the 'Result' is 0, no more collisions are available. This function should be called after ExamineWorldCollisions(). The following functions can be used to gather information about the collision: CheckEntityCollision(), FirstWorldCollisionEntity() and SecondWorldCollisionEntity().


Parse3DScripts

Parse3DScripts()

Синтаксис
Parse3DScripts()
Описание
Parses all the .materials OGRE scripts found in the paths set with Add3DArchive(). This allows the use of meshes with complex materials scripts directly in PureBasic. When creating the entity the constant #PB_Material_None has to be specified, so all the material information will be taken from the script, if it was correctly loaded.

More information about OGRE material scripts can be found at OGRE online manual.


PickX

PickX()

Синтаксис

Result.f = PickX()
Описание
After MousePick(), it returns the 'x' position of the picked object in world coordinates.
After PointPick(), it returns the 'x' direction of the picked point, between -1 and 1.


PickY

PickY()

Синтаксис

Result.f = PickY()
Описание
After MousePick(), it returns the 'y' position of the picked object in world coordinates.
After PointPick(), it returns the 'y' direction of the picked point, between -1 and 1.


PickZ

PickZ()

Синтаксис

Result.f = PickZ()
Описание
After MousePick(), it returns the 'z' position of the picked object in world coordinates.
After PointPick(), it returns the 'z' direction of the picked point, between -1 and 1.


PointPick

PointPick()

Синтаксис

Result = PointPick(#Camera, x, y)
Описание
Allows to get the direction the specified 2D point (x,y - in pixels) on the specified #Camera. If the pick was not successful, it will returns 0. To get the point direction, use PickX(), PickY() and PickZ().


RenderWorld

RenderWorld()

Синтаксис

RenderWorld()
Описание
Renders the whole world on the screen. This function should be called once all 3D operations are finished and only one time per frame.

Once the RenderWorld() function has been performed, it's possible to use regular 2D functions like DisplaySprite() to display 2D sprites over the 3D world (note: Sprite3D is not supported though).


SecondWorldCollisionEntity

SecondWorldCollisionEntity()

Синтаксис

Entity = SecondWorldCollisionEntity()
Описание
Returns the second #Entity number which had collided. This function must be called after NextWorldCollision().


SetGUITheme3D

SetGUITheme3D()

Синтаксис

SetGUITheme3D(ThemeName$, FontName$)
Описание
As CEGUI support skining, this command allow to select which theme and which font to use for the GUI. The 'ThemeName$' has to be specified without the '.scheme' extension and the 'FontName$' without the '.font' extension. This command has to be called before any other GUI commands to have an effect.

For more informations about skins, visit the CEGUI web site.


ShowGUI

ShowGUI()

Синтаксис

ShowGUI(Transparency, ShowMouse)
Описание
Shows or hides the whole GUI elements, which are composed of 3d windows and 3d gadgets. A transparency level can be specified to fade the GUI at will (valid values are between 0 (hidden) and 255 (shown)). The mouse cursor can also be hidden/shown on demand.


SkyBox

SkyBox()

Синтаксис

Result = SkyBox(TextureName$)
Описание
Loads a 6 face cube and creates an artificial box which is far away from the camera but close to the world. This is a very useful function to easily make a closed world. If 'Result' is 0, the SkyBox could not be created. The textures must be in a path previously declared with the Add3DArchive() function. The TextureName$ is the base of the texture's names, which should be named using the following rule:
  TextureName_BK ; BacK face
  TextureName_FR ; FRont face
  TextureName_DN ; DowN face
  TextureName_UP ; UP face
  TextureName_LF ; LeFt face
  TextureName_RT ; RighT face
See also the SkyDome() function.


SkyDome

SkyDome()

Синтаксис

Result = SkyDome(TextureName$, Curve)
Описание
Creates a new SkyDome which is a curved moving sky displayed using the specified texture. The texture 'TextureName$' must be in a path previously declared with the Add3DArchive() function. The curve value indicates how much the sky should be curved (can be either negative or positive). If 'Result' is 0, the SkyDome could not be created.

See also the SkyBox() function.


Sun

Sun()

Синтаксис

Sun(x, y, z, Color)
Описание
Changes the sun position and color. This affects water created with the #PB_World_WaterSun support. RGB() can be used to get a valid color value.


WorldDebug

WorldDebug()

Синтаксис

Result = WorldDebug(Mode)
Описание
Changes the world debug mode. 'Mode' can be a combination of the following constants:
  - #PB_World_DebugNone  : no debug information (default).
  - #PB_World_DebugEntity: shows the entities bounding boxes.
  - #PB_World_DebugBody  : shows the physics bodies, both static and dynamic.
This can be very useful to help finding issues with collisions or picking for example.


WorldGravity

WorldGravity()

Синтаксис

Result = WorldGravity(Gravity)
Описание
Changes the gravity of the world when the physics engine is enabled with EnableWorldPhysics(). The default gravity is set to -9.806 (which is Earth's gravitational value).


WorldShadows

WorldShadows()

Синтаксис

Result = WorldShadows(Type)
Описание
Sets how shadows will be rendered in the world. The 'Type' parameter can be one of the following values:
  #PB_Shadow_None      : No shadows will be displayed in the world. This can save a lot of CPU
                         power if shadows aren't needed (default)
  #PB_Shadow_Modulative: Modulative shadows will be displayed for entities that have the cast
                         shadow set with EntityRenderMode() and #PB_Entity_CastShadow.
                         This shadow mode is the fastest available, but are not very good-looking as the shadows are not translucent.
  #PB_Shadow_Additive  : Additive shadows will be displayed for the entities which have the cast
                         shadow set with EntityRenderMode() and #PB_Entity_CastShadow.
                         This mode is slower than the modulative mode, but it looks much better as the shadows are translucent.
                         Also if some shadows overlap, the shadows will be added resulting in a more realistic darker result.
  #PB_Shadow_TextureAdditive: Texture additive shadows will be displayed for the entities which have the cast
                         shadow set with EntityRenderMode() and #PB_Entity_CastShadow. This mode
                         is average in speed and quality between modulative and additive shadow, and will work even with water.


Entity

PureBasic - Entity

Краткий обзор

Entities are objects composed of one mesh object and one material which can be freely moved and transformed in realtime.

It's possible to share a mesh or a material between several entities, reducing memory consumption and saving CPU clocks.

InitEngine3D() should be called successfully before using the entity functions.

Краткий перечень команд

AnimateEntity
CopyEntity
CreateEntity
EntityAnimationLength
EntityID
EntityLocate
EntityLookAt
EntityMaterial
EntityPhysicBody
EntityRenderMode
EntityX
EntityY
EntityZ
FreeEntity
GetEntityAnimationTime
GetEntityFriction
GetEntityMass
HideEntity
IsEntity
MoveEntity
ResizeEntity
RotateEntity
ScaleEntity
SetEntityAnimationTime
SetEntityFriction
SetEntityMass


AnimateEntity

AnimateEntity()

Синтаксис

AnimateEntity(#Entity, Name$)
Описание
Changes the current animation with the specified one, and start it. Entity uses the mesh animation (skeletons based, using bones) format.

Note: the "Name$" parameter is case-sensitive, which means than "Walk" will be different than "walk" for example.


CopyEntity

CopyEntity()

Синтаксис

Result = CopyEntity(#Entity, #NewEntity)
Описание
Creates a #NewEntity which is the exact copy of the specified #Entity. If #PB_Any is used as '#NewEntity' parameter, the new entity number will be returned as 'Result'.

If the 'Result' is 0, the entity copy has failed. If #NewEntity was already created, it will be automatically freed and replaced by the new one.


CreateEntity

CreateEntity()

Синтаксис

Result = CreateEntity(#Entity, MeshID, MaterialID, [x, y, z])
Описание
Creates a new #Entity using the specified Mesh and Material. If #PB_Any is used as '#Entity' parameter, the new entity number will be returned as 'Result'.

Valid 'MeshID' and 'MaterialID' can be easily obtained with the MeshID() and MaterialID() functions. #PB_Material_None can be used as 'MaterialID' value, to use the .material script associated to the mesh if the function Parse3DScripts() has been used.

The optionals x,y,z parameters can be specified to set the position of the newly created entity in the world.

If the 'Result' is 0, the #Entity creation has failed. If the #Entity was already created, it is automatically freed and replaced by the new one.


EntityAnimationLength

EntityAnimationLength()

Синтаксис

Length.f = EntityAnimationLength(#Entity)
Описание
Returns the length of the current entity animation.


EntityID

EntityID()

Синтаксис

EntityID = EntityID(#Entity)
Описание
Returns the unique ID which identifies the given '#Entity' in the operating system. This function is very useful when another library needs a entity reference.


EntityLocate

EntityLocate()

Синтаксис

EntityLocate(#Entity, x, y, z)
Описание
Changes the #Entity absolute position in the world.


EntityLookAt

EntityLookAt()

Синтаксис

EntityLookAt(#Entity, x, y, z)
Описание
Changes the #Entity orientation in the world, to point towards the specified x,y,z point.


EntityMaterial

EntityMaterial()

Синтаксис

EntityMaterial(#Entity, MaterialID)
Описание
Assign a material to the specified #Entity. An entity can only have one material assigned at once.

'MaterialID' can be easily retrieved with the MaterialID() function.


EntityPhysicBody

EntityPhysicBody()

Синтаксис

EntityPhysicBody(#Entity, Type [, Flags])
Описание
Changes the type of the body associted with the #Entity.

To have its collisions managed by the physic engine, an entity has to set a body. In fact, only the body is known by the physic engine, which will do all the calculation about the entity, check the mass, friction and if it collides will move back the real entity.

To have any effect, the physic engine needs to be activated with the EnableWorldPhysics(). 'Type' can be one of the following constants:
  #PB_Entity_None       : No body is associated to the entity (default)
  #PB_Entity_StaticBody : The body is a static only, which means than the mesh can't be animated.
                          This mode allows very precise collisions, as it's done against triangles
                          (also known as tri-mesh collision). It's also fast when colliding with
                          a box or sphere entity body type. It's perfect when using a mesh for
                          a ground or static world.
  #PB_Entity_BoxBody    : A 'virtual' box is set around the entity (with the same dimensions)
                          and is used to manage the collision against the other entities.
  #PB_Entity_SphereBody : A 'virtual' sphere is set around the entity and is used to manage the collision
                          against the other entities.
'Flags' can be a combination of the following constants:
  - #PB_Entity_AbsoluteBodyMove: The body can be freely moved by MoveEntity() and EntityLocate().


EntityRenderMode

EntityRenderMode()

Синтаксис

EntityRenderMode(#Entity, Mode)
Описание
Changes the render mode of the specified #Entity.

The 'Mode' parameter can be a combination (using the '|' operator) of the following values:
  #PB_Entity_CastShadow : The entity casts shadow if the WorldShadows() has been activated (default)


EntityX

EntityX()

Синтаксис

Result = EntityX(#Entity)
Описание
Returns the 'x' position of the #Entity in the world.


EntityY

EntityY()

Синтаксис

Result = EntityY(#Entity)
Описание
Returns the 'y' position of the #Entity in the world.


EntityZ

EntityZ()

Синтаксис

Result = EntityZ(#Entity)
Описание
Returns the 'z' position of the #Entity in the world.


FreeEntity

FreeEntity()

Синтаксис

FreeEntity(#Entity)
Описание
Free the specified #Entity created with CreateEntity() before. All its associated memory is released and this object can't be used anymore.

Note: All remaining entities are automatically freed when the program ends.


GetEntityAnimationTime

GetEntityAnimationTime()

Синтаксис

Time.f = GetEntityAnimationTime(#Entity)
Описание
Returns the time position in the specified #Entity animation.

The time can be changed manually by using SetEntityAnimationTime().


GetEntityFriction

GetEntityFriction()

Синтаксис

Friction.f = GetEntityFriction(#Entity)
Описание
Returns the friction value of the specified #Entity.

To have any effect, the physic engine needs to be activated with the EnableWorldPhysics().

The function SetEntityMass() will also affect the entity friction.


GetEntityMass

GetEntityMass()

Синтаксис

Mass.f = GetEntityMass(#Entity)
Описание
Returns the mass of the specified #Entity. To have any effect, the physic engine needs to be activated with the EnableWorldPhysics(). The function WorldGravity() can be used to affect the mass behaviour in the world.


HideEntity

HideEntity()

Синтаксис

HideEntity(#Entity, State)
Описание
Hides or shows the specified #Entity.

'State' can take the following values:
  1: the #Entity is hidden
  0: the #Entity is shown


IsEntity

IsEntity()

Синтаксис

Result = IsEntity(#Entity)
Описание
Tests if the given #Entity is a valid and correctly initialized entity.

This function is bullet-proof and can be used with any value. If the 'Result' is not zero then the object is valid and initialized, else it returns zero. This is the correct way to ensure that an entity is ready to use.


MoveEntity

MoveEntity()

Синтаксис

MoveEntity(#Entity, x, y, z)
Описание
Moves the #Entity in the world according to the specified x,y,z values.

This is a relative move based on the previous entity location. To perform an absolute move in the world, use EntityLocate().


ResizeEntity

ResizeEntity()

Синтаксис

ResizeEntity(#Entity, x, y, z)
Описание
Resizes the #Entity using the specified x,y,z dimensions.


RotateEntity

RotateEntity()

Синтаксис

RotateEntity(#Entity, x, y, z [, Mode])
Описание
Rotates the #Entity according to the specified x,y,z angle values. All angles are in degree, with values ranging from 0 to 360. The optional 'Mode' can be one of the following value:
  PB_Absolute: absolute rotation (default).
  PB_Relative: relative rotation based on the previous entity rotation.


ScaleEntity

ScaleEntity()

Синтаксис

ScaleEntity(#Entity, x, y, z)
Описание
Scales the #Entity according to the specified x,y,z values.

This is a factor based scale which means than the Entity size will be multiply with the given value to obtain the new size. To perform an absolute size of the entity, use ResizeEntity().

Пример:
  ScaleEntity(0, 2, 2, 2) ; Double the size of the entity
  ScaleEntity(0, 1, 1, 1) ; Don't change the size of the entity (multiply by 1 don't change anything
  ScaleEntity(0, 3, 1, 1) ; Make the width of the entity 3 times larger


SetEntityAnimationTime

SetEntityAnimationTime()

Синтаксис

SetEntityAnimationTime(#Entity, Time)
Описание
Changes the time position in the specified #Entity animation.

The time position can be retrieved by using GetEntityAnimationTime().


SetEntityFriction

SetEntityFriction()

Синтаксис

SetEntityFriction(#Entity, Friction)
Описание
Changes the friction of the specified #Entity. It affect how the entity will react when colliding with other entities. If the friction is set to an high value, it willn't slide a lot.

To have any effect, the physic engine needs to be activated with the EnableWorldPhysics().

The function SetEntityMass() will also affect the entity friction.


SetEntityMass

SetEntityMass()

Синтаксис

SetEntityMass(#Entity, Mass)
Описание
Changes the mass of the specified #Entity.

To have any effect, the physic engine needs to be activated with the EnableWorldPhysics().

The function WorldGravity() can be used to affect the mass behaviour in the world.


File

PureBasic - File

Краткий обзор

Файлы основной способ хранения компьютерной информации. Любое число файлов может быть обработано оновременно. Эта библиотека использует функции, оптимизированные для ускорения скорости чтения / записи информации. Все функции могут обработать большие файлы (до 2^64 байтов), если это поддерживается файловой системой.

Для обработки большого количества данных может быть полезно загрузить их в массив array или связанный список linked list, также может использоваться memory block.

Чтобы получить правильные пути к файлу смотрите библиотеки FileSystem и Requester.

Краткий перечень команд

CloseFile
CreateFile
Eof
FileBuffersSize
FileID
FileSeek
FlushFileBuffers
IsFile
Loc
Lof
OpenFile
ReadAsciiCharacter
ReadByte
ReadCharacter
ReadData
ReadDouble
ReadFile
ReadFloat
ReadInteger
ReadLong
ReadQuad
ReadString
ReadStringFormat
ReadUnicodeCharacter
ReadWord
TruncateFile
WriteAsciiCharacter
WriteByte
WriteCharacter
WriteData
WriteDouble
WriteFloat
WriteInteger
WriteLong
WriteQuad
WriteString
WriteStringFormat
WriteStringN
WriteUnicodeCharacter
WriteWord


CloseFile

CloseFile()

Синтаксис

CloseFile(#File)
Описание
Функция закрывает указанный файл. После закрытия файла с ним работать больше нельзя. Закрытие файла гарантирует очистку памяти, и сохранение файла на диске.

Примечание: при выходе из программы все файлы закрываются автоматически.

Примеры смотрите в функциях ReadFile() или CreateFile().


CreateFile

CreateFile()

Синтаксис

Result = CreateFile(#File, Filename$)
Описание
Эта функция создаёт пустой файл (его размер – 0 байт), если файл с таким именем существовал, он будет стерт, так что будьте осторожны! В переменную Result помещаеться результат работы функции, если он больше нуля – файл успешно создан.

Если #PB_Any будет использоваться как параметр '#File', то новый номер будет возвращен как 'Result'.

'Result' должен всегда проверяться, поскольку выполнение операций на несозданном файле вызывает ошибку.

При открытии нового файла с таким же идентификатором предыдущий открытый файл автоматически закрывается.
Пример:
  If CreateFile(0, "Text.txt")         ; we create a new text file...
    For a=1 To 10
      WriteStringN(0, "Line "+Str(a))  ; we write 10 lines (each with 'end of line' character)
    Next
    For a=1 To 10
      WriteString(0, "String"+Str(a))  ; and now we add 10 more strings on the same line (because there is no 'end of line' character)
    Next
    CloseFile(0)                       ; close the previously opened file and store the written data this way
  Else
    MessageRequester("Information","Can't create the file!")
  EndIf


Eof

Eof()

Синтаксис

Result = Eof(#File)
Описание
Эта функция определяет, был ли достигнут конец файла. Функция возвращает не нулевое значение, если конец указанного файла будет достигнут, иначе возвращается 0.

Примеры смотрите в функции ReadFile().


FileBuffersSize

FileBuffersSize()

Синтаксис

FileBuffersSize(#File, Size)
Описание
Эта функция позволяет изменять размер буфера (кэша), который используется для уменьшения частоты обращений к жёсткому диску. По умолчанию, размер буфера равен 4096 байт. Если 'Size' равен нулю 0, то все кеширование заблокировано, все данные немедленно записываются на диск.

Если '#File' будет установлено как #PB_Default, то заданное по умолчанию значение размера буфера будет изменено на указанный размер 'Size': все следующие вызовы OpenFile(), CreateFile() и ReadFile() будут использовать это новое значение.

Примечание: размер буфера должен быть достаточно большим (минимум 1028 байт). Когда используется буфер (кеш), информация записывается на винчестер при переполнении буфера или после закрытия файла. Команда FlushFileBuffers() используется, для записи кэша в любое время.


FileID

FileID()

Синтаксис

Result = FileID(#File)
Описание
Эта функция позволяет узнать системный идентификатор файла, который будет помещён в переменную Result.


FileSeek

FileSeek()

Синтаксис

FileSeek(#File, NewPosition.q)
Описание
Эта функция позволяет установить произвольную позицию 'NewPosition' чтения / записи. Текущую позицию можно узнать с помощью функции Loc. Этот параметр должен указываться в байтах.

  file$ = OpenFileRequester("Select a file","","Text (.txt)|*.txt|All files (*.*)|*.*",0)
  If file$
    If ReadFile(0, file$)
      length = Lof(0)                       ; read length of file
      FileSeek(0, length - 10)              ; set the file pointer 10 chars from end of file
      Debug "Position: " + Str(Loc(0))      ; show actual file pointer position
      *MemoryID = AllocateMemory(10)        ; allocate the needed memory for 10 bytes
      If *MemoryID
        bytes = ReadData(0, *MemoryID, 10)  ; read this last 10 chars in the file
        Debug PeekS(*MemoryID)
      EndIf
      CloseFile(0)
    EndIf
  EndIf


FlushFileBuffers

FlushFileBuffers()

Синтаксис

FlushFileBuffers(#File)
Описание
Эта функция позволяет записать содержимое временного буфера (кэша) в файл. Дополнительную информацию смотрите в FileBuffersSize().


IsFile

IsFile()

Синтаксис

Result = IsFile(#File)
Описание
Эта функция проверяет уникальный идентификатор указанного файла, а так же является ли указанное целое неотрицательное число #File корректным и правильно инициализированным. Функция возвращает не нулевой результат, если есть открытый файл с таким идентификатором. Если файла с таким идентификатором нет, будет возвращён нулевой результат. Если Result не равен 0 то файл инициализирован правильно. Обычно эту функцию используют, чтобы узнать был ли открыт файл.


Loc

Loc()

Синтаксис

Position.q = Loc(#File)
Описание
Эта функция определяет текущее положение указателя чтения / записи. В переменную Position будет помещено текущее положение указателя чтения / записи заданное в байтах относительно начала файла.

Пример смотрите в функуии FileSeek().


Lof

Lof()

Синтаксис

Length.q = Lof(#File)
Описание
Эта функция определяет размер файла в байтах и записывает его в переменную Length.q.

Пример:
  file$ = OpenFileRequester("Select a file","","Text (.txt)|*.txt|All files (*.*)|*.*",0)
  If file$
    If ReadFile(0, file$)
      length = Lof(0)                            ; get the length of opened file
      *MemoryID = AllocateMemory(length)         ; allocate the needed memory
      If *MemoryID
        bytes = ReadData(0, *MemoryID, length)   ; read all data into the memory block
        Debug "Number of bytes read: " + Str(bytes)
      EndIf
      CloseFile(0)
    EndIf
  EndIf


OpenFile

OpenFile()

Синтаксис

Result = OpenFile(#File, Filename$)
Описание
Функция открывает указанный файл или создает его, если он не существует. Позволяет производить чтение / запись открытого или созданного файла. OpenFile() дублирует работу функций ReadFile() и CreateFile(). При открытии существующего файла, указатель помещается в начале файла.

Если #PB_Any будет использоваться как параметр '#File', то новый номер файла возвращается как 'Result'.

Если 'Result' не равен 0, значит файл был открыт, и повторно его открыть нельзя. Result необходимо всегда проверять, поскольку выполнение операций на не открытом файле вызовет сбой программы. Если файл с подобным идентификатором уже существует, он будет автоматически закрыт и открыт текущий.

Если данные добавляются в существующий файл, сначала установите указатель в конец файла. Для этого используйте функции FileSeek() и Lof() которые объявляются после OpenFile():
Пример:
  If OpenFile(0, "Test.txt")    ; opens an existing file or creates one, if it doesn't exist yet
    FileSeek(0, Lof(0))         ; jump to the end of the file (result of Lof() is used)
    WriteStringN(0, "... another line at the end.")
    CloseFile(0)
  EndIf

Примечание: при использовании OpenFile() файл должен иметь атрибуты позволяющие производить чтение запись. Например, если файл расположен на CD-ROM, используйте функцию ReadFile().


ReadAsciiCharacter

ReadAsciiCharacter()

Синтаксис

Number.a = ReadAsciiCharacter(#File)
Описание
Читает символ ASCII (1 байт) из #File.

Для примера того, как читать из файла, смотрите функцию ReadFile() - ReadAsciiCharacter() читает только символ ascii вместо полной строки.


ReadByte

ReadByte()

Синтаксис

Number.b = ReadByte(#File)
Описание
Эта функция читает один байт из файла, который помещается в переменную Number.b.

Для примера того, как читать из файла, смотрите функцию ReadFile() - ReadByte() читает только значение байта вместо законченной строки.


ReadCharacter

ReadCharacter()

Синтаксис

Number.c = ReadCharacter(#File)
Описание
Эта функция читает один символ из файла, который помещается в переменную Number.c
(1 байт в ASCII и 2 байта в unicode).

Для примера того, как читать из файла, смотрите функцию ReadFile() - ReadCharacter() читает только символ вместо полной строки.


ReadData

ReadData()

Синтаксис

Length = ReadData(#File, *MemoryBuffer, LengthToRead)
Описание
Эта функция считывает информацию из файла и помещает её в указанный буфер памяти *MemoryBuffer. 'LengthToRead' указывает количество считываемых байт.

После выполнения функции, переменная 'Length' будет хранить количество байт, которые были действительно прочитаны. Это полезно при проверке на соответствие значения.

Пример смотрите в функции Lof().


ReadDouble

ReadDouble()

Синтаксис

Number.d = ReadDouble(#File)
Описание
Эта функция читает из файла 8 байт и помещает результат в переменную Number.d.

Пример работы функции смотрите в ReadFile().

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


ReadFile

ReadFile()

Синтаксис

Result = ReadFile(#File, Filename$)
Описание
Открывает существующий файл в режиме "только для чтения".

Если #PB_Any будет использоваться как параметр '#File', то новый номер будет возвращен как 'Result'.

Если файл с подобным идентификатором уже существует, он будет автоматически закрыт и открыт текущий.
  If ReadFile(0, "Text.txt")   ; if the file could be read, we continue...
    While Eof(0) = 0           ; loop as long the 'end of file' isn't reached
      Debug ReadString(0)      ; display line by line in the debug window
    Wend
    CloseFile(0)               ; close the previously opened file
  Else
    MessageRequester("Information","Couldn't open the file!")
  EndIf


ReadFloat

ReadFloat()

Синтаксис

Number.f = ReadFloat(#File)
Описание
Эта функция читает из файла 4 байта и помещает их в переменную Number.f

Пример работы функции смотрите в ReadFile().


ReadInteger

ReadInteger()

Синтаксис

Number.i = ReadInteger(#File)
Описание
Эта функция читает из файла 4 байта и помещает их в переменную типа Integer Number.i (считывает 4 байта на 32 битных процессорах, или 8 байт на 64 битных процессорах).

Пример работы функции смотрите в ReadFile().


ReadLong

ReadLong()

Синтаксис

Number.l = ReadLong(#File)
Описание
Эта функция читает из файла 4 байта и помещает в переменную Number.l.

Пример работы функции смотрите в ReadFile().


ReadQuad

ReadQuad()

Синтаксис

Number.q = ReadQuad(#File)
Описание
Эта функция читает из файла 8 байт и помещает в переменную Number.q.

Пример работы функции смотрите в ReadFile().

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


ReadString

ReadString()

Синтаксис

Text$ = ReadString(#File [, Flags])
Описание
Эта функция читает из файла строку текста. По умолчанию, без флагов 'Flags' читает текст в формате ASCII, Если программа откомпилирована в unicode, то читает как UTF8 .

Параметр "Flags" может иметь одно из следующих значений:
  #PB_Ascii  : читает строки как ASCII, даже если программа компилирована в unicode
  #PB_UTF8   : читает строки как UTF8
  #PB_Unicode: читает строки как UTF16.
Пример работы функции смотрите в ReadFile().

Для определения формата данных используйте функцию ReadStringFormat().


ReadStringFormat

ReadStringFormat()

Синтаксис

Result = ReadStringFormat(#File)
Описание
Эта функция определяет формат текста в файле. Если формат определен то указатель чтения/записи файла file pointer будет установлен в конце отметки формата.

'Result' может принять одно из следующих значений:
  #PB_Ascii  : если указателя нет, это обычно означает что текст в формате ASCII.
  #PB_UTF8   : найдена метка формата UTF-8.
  #PB_Unicode: найдена метка формата UTF-16 (с обратным порядком байтов).
  #PB_UTF16BE: найдена метка формата UTF-16.
  #PB_UTF32  : найдена метка формата UTF-32 (с обратным порядком байтов).
  #PB_UTF32BE: найдена метка формата UTF-32.
Константы #PB_Ascii, #PB_UTF8 и #PB_Unicode можно использовать в функции ReadString(). Другие форматы не могут использоваться в функциях PB. Они позволяют сообщить об ошибках при чтении файла.

Метка указывает на кодировку текстового файла. Эта метка помещается в начале файла. Это не является стандартом, а обычно используемая практика. WriteStringFormat() можно использовать для создания таких меток в файле.

Дополнительную информацию см. Wikipedia Article.
Информация по использованию unicode в PureBasic можно прочитать здесь.


ReadUnicodeCharacter

ReadUnicodeCharacter()

Синтаксис

Number.u = ReadUnicodeCharacter(#File)
Описание
Читает символ уникода (2 байта) из #File.

Для примера того, как читать из файла, смотрите функцию ReadFile() - ReadUnicodeCharacter() читает символ уникода вместо строки.


ReadWord

ReadWord()

Синтаксис

Number.w = ReadWord(#File)
Описание
Эта функция читает из файла 2 байта и помещает их в переменную Number.w.

Пример работы функции смотрите в ReadFile().


TruncateFile

TruncateFile()

Синтаксис

TruncateFile(#File)
Описание
Эта функция делит файл на две части, разделяя по текущему положению указателя file position чтения/записи файла. Та часть, что находится после этого указателя будет удалена из файла. Она может использоваться для удаления части информации без необходимости создания нового файла. Если в файл нужно добавить данные, то это можно сделать функциями рассматриваемой библиотеки.


WriteAsciiCharacter

WriteAsciiCharacter()

Синтаксис

WriteAsciiCharacter(#File, Number)
Описание
Записывает символ ASCII (1 байт) в #File. Файл должен быть доступным для записи (следовательно открытый не ReadFile()).

Пример работы функции смотрите в CreateFile().


WriteByte

WriteByte()

Синтаксис

WriteByte(#File, Number)
Описание
Эта функция записывает в файл один байт из переменной Number.b. Файл надо открывать с помощью функций, которые позволяют читать / записывать в файл (не с помощью ReadFile()).

Пример работы функции смотрите в CreateFile().


WriteCharacter

WriteCharacter()

Синтаксис

WriteCharacter(#File, Number)
Описание
Эта функция записывает в файл, код символа из переменной Number.c (1 байт в ASCII, 2 байта в unicode)). Файл надо открывать с помощью функций, которые позволяют читать / записывать в файл (не с помощью ReadFile()).

Пример работы функции смотрите в CreateFile().


WriteData

WriteData()

Синтаксис

WriteData(#File, *MemoryBuffer, Length)
Описание
Эта функция записывает в файл содержимое буфера памяти. Length уточняет количество байт в опреативной памяти которые надо записать

Пример:
  *MemoryID = AllocateMemory(1000)       ; allocating a memory block
  If *MemoryID
    PokeS(*MemoryID, "Store this string in the memory area")   ; we write a string into the memory block
  EndIf
  If CreateFile(0, "Text.txt")           ; we create a new text file...
    WriteData(0, *MemoryID, 10)          ; write the first 10 chars from the memory block into the file
    CloseFile(0)                         ; close the previously opened file and so store the written data
  Else
    Debug "Can't create the file!"
  EndIf


WriteDouble

WriteDouble()

Синтаксис

WriteDouble(#File, Number)
Описание
Эта функция записывает в файл 8 байт из переменной Number.d. Файл надо открывать с помощью функций, которые позволяют читать / записывать в файл (не с помощью ReadFile()).

Пример работы функции смотрите в CreateFile().

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


WriteFloat

WriteFloat()

Синтаксис

WriteFloat(#File, Number)
Описание
Эта функция записывает в файл 4 байта из переменной Number.f. Файл надо открывать с помощью функций, которые позволяют читать / записывать в файл (не с помощью ReadFile()).

Пример работы функции смотрите в CreateFile().


WriteInteger

WriteInteger()

Синтаксис

WriteInteger(#File, Number)
Описание
Эта функция записывает в файл 4 байта из переменной Number (считывает 4 байта на 32 битных процессорах, или 8 байт на 64 битных процессорах). Файл надо открывать с помощью функций, которые позволяют читать / записывать в файл (не с помощью ReadFile()).

Пример работы функции смотрите в CreateFile().


WriteLong

WriteLong()

Синтаксис

WriteLong(#File, Number)
Описание
Эта функция записывает в файл 4 байта из переменной Number.l. Файл надо открывать с помощью функций, которые позволяют читать / записывать в файл (не с помощью ReadFile()).

Пример работы функции смотрите в CreateFile().


WriteQuad

WriteQuad()

Синтаксис

WriteQuad(#File, Number)
Описание
Эта функция записывает в файл 8 байт из переменной Number.q. Файл надо открывать с помощью функций, которые позволяют читать / записывать в файл (не с помощью ReadFile()).

Пример работы функции смотрите в CreateFile().

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


WriteString

WriteString()

Синтаксис

WriteString( #File, Text$ [, Flags] )
Описание
Эта функция записывает в файл строку текста в формате определяемом параметром Flags. Файл надо открывать с помощью функций, которые позволяют читать / записывать в файл (не с помощью ReadFile()). По умолчанию, без флагов записывает текст в формате ASCII. Если программа откомпилирована в unicode, то читает как UTF8.

'Flags' может принимать одно из следующих значений:
  #PB_Ascii  : запись строки в формате ascii
  #PB_UTF8   : запись строки в формате UTF8
  #PB_Unicode: запись строки в формате UTF16
Пример работы функции смотрите в CreateFile().

Для создания метки формата данных используйте функцию WriteStringFormat().


WriteStringFormat

WriteStringFormat()

Синтаксис

WriteStringFormat(#File, Format)
Описание
Эта функция записывает в начало файла специальную отметку, обозначающую кодировку файла. Функция используется только для файлов, хранящих текст.

'Format' может принимать следующие значения:
  #PB_Ascii  : Отметка в файл не записывается и предполагается что используется кодировка Ascii, т. е. простой текст.)
  #PB_UTF8   : Кодировка фала - UTF-8
  #PB_Unicode: Кодировка фала - UTF-16
  #PB_UTF16BE: Кодировка фала - UTF-16
  #PB_UTF32  : Кодировка фала - UTF-32
  #PB_UTF32BE: Кодировка фала - UTF-32
После размещения в файле отметки используемой кодировки #PB_Ascii, #PB_UTF8 и #PB_Unicode, WriteString() и WriteStringN() должны использовать выбраную кодировку.

С помощью отметки указывают кодировку текстового файла. Метка обычно устанавливается в начале текстового файла. Это не является стандартом, просто так чаще всего поступают. Если в файле отсутсвует отметка кодировки, то это вовсе не означает что в файле простой текст формата Ascii. Возможно программа, создавшая файл просто не добавила отметку кодировки. С помощью функции ReadStringFormat() можно получить отметку кодировки из выбранного файла.

Более подробно смотрите здесь Wikipedia Article.
Информация по использованию юникода в PureBasic можно найти здесь here.


WriteStringN

WriteStringN()

Синтаксис

WriteStringN( #File, Text$ [, Flags] )
Описание
Эта функция записывает в файл строку текста, (к концу которой добавляется символ конца строки) в формате определяемом переменной Flags. Файл надо открывать с помощью функций, которые позволяют читать / записывать в файл (не с помощью ReadFile()). По умолчанию, без флагов записывает текст в формате ASCII. Если программа откомпилирована в unicode, то записывает текст в формате UTF8.

'Flags' может принимать одно из следующих значений:
  #PB_Ascii  : запись строки в формате ascii
  #PB_UTF8   : запись строки в формате UTF8
  #PB_Unicode: запись строки в формате UTF16
Пример работы функции смотрите в CreateFile().

Для создания метки формата данных используйте функцию WriteStringFormat().


WriteUnicodeCharacter

WriteUnicodeCharacter()

Синтаксис

WriteUnicodeCharacter(#File, Number)
Описание
Записывает символ уникода (2 байта) в #File. Файл надо открывать с помощью функций, которые позволяют читать / записывать в файл (не с помощью ReadFile()).

Пример работы функции смотрите в CreateFile().


WriteWord

WriteWord()

Синтаксис

WriteWord(#File, Number)
Описание
Эта функция записывает в файл 2 байта из переменной Number.w. Файл надо открывать с помощью функций, которые позволяют читать / записывать в файл (не с помощью ReadFile()).

Пример работы функции смотрите в CreateFile().


FileSystem

PureBasic - FileSystem

Краткий обзор

Файловая система - общее обозначение, библиотека содержит все необходимые функции позволяющие вам манипулировать файлами и каталогами. Например, возможно считывать содержание каталога, создавать новый каталог и т.д..

Если вы хотите посмотреть содержание каталога, начните с команды ExamineDirectory().

В дополнение к этой библиотеке, вы можете манипулировать файлами с помощью команд библиотеки File. Чтобы получить название работающей программы используйте функцию ProgramFilename() библиотеки Process.

Краткий перечень команд

CheckFilename
CopyDirectory
CopyFile
CreateDirectory
DeleteDirectory
DeleteFile
DirectoryEntryAttributes
DirectoryEntryDate
DirectoryEntryName
DirectoryEntrySize
DirectoryEntryType
ExamineDirectory
FileSize
FinishDirectory
GetCurrentDirectory
GetExtensionPart
GetFileAttributes
GetFileDate
GetFilePart
GetHomeDirectory
GetPathPart
GetTemporaryDirectory
IsDirectory
NextDirectoryEntry
RenameFile
SetCurrentDirectory
SetFileAttributes
SetFileDate


CheckFilename

CheckFilename()

Синтаксис

Result = CheckFilename(Filename$)
Описание
Проверяет Filename$ на наличие недопустимых знаков. Например: в Windows запрещается использовать '/' и '\' в названиях файлов. Если 'Filename$' назван правильно, то возвращается 1, при ошибке вернет 0. В 'Filename$' путь не указывается.


CopyDirectory

CopyDirectory()

Синтаксис

Result = CopyDirectory( SourceDirectory$, DestinationDirectory$, Pattern$ [, Mode] )
Описание
Копирует содержание исходного каталога SourceDirectory$ в указанный каталог DestinationDirectory$. Предупреждение, если каталог существует, он будет автоматически переписан. Если Result равен 0, каталог скопировать не удалось.

'Pattern$' содержит существующее расширение или название файла. Например: по заданной маске"*.*" будут скопированы все файлы, а с маской "*.exe" только файлы с расширением .exe. По умолчанию Pattern$ ("") имеет пустое значение, это значит что будут скопированы все файлы.

Необязательный параметр 'Mode' может принимать следующие значения:
  #PB_FileSystem_Recursive: копирует со всеми подкаталогами.
  #PB_FileSystem_Force    : Перезаписывает файлы имеющие защиту "только для чтения" (ReadOnly).
Пример:
  Debug CopyDirectory("D:\Games\MyGame\", "D:\Games\Backup\", "", #PB_FileSystem_Recursive)


CopyFile

CopyFile()

Синтаксис

Result = CopyFile(SourceFilename$, DestinationFilename$)
Описание
Копирует исходный файл SourceFilename$ в указанную директорию DestinationFilename$. Предупреждение, если файл существует, он будет перезаписан.


CreateDirectory

CreateDirectory()

Синтаксис

Result = CreateDirectory(DirectoryName$)
Описание
Создает новую директорию. Если Result возвращает 0, значит директория не создана.


DeleteDirectory

DeleteDirectory()

Синтаксис

Result = DeleteDirectory(Directory$, Pattern$ [, Mode])
Описание
Удаляет указанную директорию Directory$, содержащую указанные файлы. Предуприеждение: используйте аккуратно. При успешном удалении 'Result' не равен '0'.
'Pattern$' должен содержать существующее расширение. Например: по заданной маске"*.*" будут скопированы все файлы, а с маской "*.exe" только файлы с расширением .exe. По умолчанию Pattern$ ("") имеет пустое значение, это значит что будут скопированы все файлы.

Необязательный параметр 'Mode' может принимать следующие значения:
  #PB_FileSystem_Recursive: Удаляет директорию со всеми поддиректориями.
  #PB_FileSystem_Force    : Удаляет файлы имеющие атрибуты "только для чтения" (ReadOnly).


DeleteFile

DeleteFile()

Синтаксис

Result = DeleteFile(Filename$)
Описание
Удаляет указанный файл. Если 'Result' равен 0, значит файл удалить не удалось.


DirectoryEntryAttributes

DirectoryEntryAttributes()

Синтаксис

Attributes = DirectoryEntryAttributes(#Directory)
Описание
Возвращиет атрибуты текущей директории указанной в переменной #Directory. Список директорий создается с помощью функций ExamineDirectory() и NextDirectoryEntry().

В Windows, атрибуты могут иметь следующие значения:
  #PB_FileSystem_Hidden    : Скрытый файл
  #PB_FileSystem_Archive   : Файл был заархивирован и не изменялся с прошлого раза
  #PB_FileSystem_Compressed: Сжатый Файл
  #PB_FileSystem_Normal    : Обычный файл
  #PB_FileSystem_ReadOnly  : Файл находится в режиме только для чтения
  #PB_FileSystem_System    : системный файл
В Linux или MacOSX, атрибуты могут иметь следующие значения:
  #PB_FileSystem_Link      : Файл является символической ссылкой
  #PB_FileSystem_ReadUser  : Разрешение доступа при считывание для владельца
  #PB_FileSystem_WriteUser : Разрешение доступа на запись для владельца
  #PB_FileSystem_ExecUser  : Разрешение доступа на выполнение для владельца
  #PB_FileSystem_ReadGroup : Разрешение доступа при считывании для членов владеющей группы
  #PB_FileSystem_WriteGroup: Разрешение доступа на запись для членов владеющей группы
  #PB_FileSystem_ExecGroup : Разрешение доступа на выполнение для членов владеющей группы
  #PB_FileSystem_ReadAll   : Разрешение доступа при считывании для других пользователей
  #PB_FileSystem_WriteAll  : Разрешение доступа на запись для других пользователей
  #PB_FileSystem_ExecAll   : Разрешение доступа на выполнение для других пользователей
Для проверки установленного атрибута используйте '&' (AND) и значение константы:
  [...]

  FileAttributes = DirectoryEntryAttributes(#Directory)
  If FileAttributes & #PB_FileSystem_Hidden
    Debug "This file is hidden !"
  EndIf


DirectoryEntryDate

DirectoryEntryDate()

Синтаксис

Result = DirectoryEntryDate(#Directory, DateType)
Описание
Возвращает дату текущего элемента, указанного в переменной #Directory. Список директорий перечисляется с помощью функций ExamineDirectory() и NextDirectoryEntry().

Дата отображается в формате который поддерживается библиотекой Date. С помощью функции FormatDate() задается формат отображения даты.

Параметр 'DateType' может содержать следующие константы:
  #PB_Date_Created : возвращает дату создания файла.
  #PB_Date_Accessed: возвращает последнюю дату доступа к файлу.
  #PB_Date_Modified: возвращает последнюю дату модификации файла.


DirectoryEntryName

DirectoryEntryName()

Синтаксис

Filename$ = DirectoryEntryName(#Directory)
Описание
Возвращает имя текущего элемента указанного в #Directory. Для создания списка элементов используйте функции ExamineDirectory() и NextDirectoryEntry().


DirectoryEntrySize

DirectoryEntrySize()

Синтаксис

Size.q = DirectoryEntrySize(#Directory)
Описание
Возвращает размер элемента указанного в #Directory. Для создания списка элементов используйте функции ExamineDirectory() и NextDirectoryEntry().


DirectoryEntryType

DirectoryEntryType()

Синтаксис

Result = DirectoryEntryType(#Directory)
Описание
Возвращает тип текущего элемента указанного в #Directory (файл или директория). Для создания списка элементов используйте функции ExamineDirectory() и NextDirectoryEntry().

'Result' может принимать следующие значения:
  #PB_DirectoryEntry_File     : этот элемент - файл.
  #PB_DirectoryEntry_Directory: этот элемент - каталог.


ExamineDirectory

ExamineDirectory()

Синтаксис

Result = ExamineDirectory(#Directory, DirectoryName$, Pattern$)
Описание
Сканирует указанную директорию, и дает возможность передать значения функциям NextDirectoryEntry(), DirectoryEntryName() и DirectoryEntryType().

Если в качестве параметра '#Directory' поставить #PB_Any то уникальный идентификатор (id) будет возвращен в качестве 'Result'. Если Result равен 0, значит директорию просканировать не удалось.

После окончания сканирования, необходимо вызвать функцию FinishDirectory() для очиски памяти.

'Pattern$' должна содержать существующее расширение. Например: по заданной маске"*.*" или "" будут найдены все файлы, и соответственно все поддиректории. По маске "*.exe" будут найдены файлы с этим расширением, и соответственн все поддиректории в которых находятся найденные файлы. По умолчанию Pattern$ ("") имеет пустое значение, это значит что будут скопированы все файлы.

Примечание: при завершении программы память освобождается автоматически.

Пример:
  Directory$ = "C:\"   ; Lists all entries in the Windows directory (without the contents of sub-directories)
  If ExamineDirectory(0, Directory$, "*.*")
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        Type$ = " [File] "
      Else
        Type$ = " [Sub-Dir] "
      EndIf

      Debug DirectoryEntryName(0) + Type$ + "- Size in byte: " + Str(DirectoryEntrySize(0))
    Wend
    FinishDirectory(0)
  EndIf


FileSize

FileSize()

Синтаксис

Result.q = FileSize(Filename$)
Описание
Возвращает размер указанного файла.

Возможные зачения 'Result':
  -1: Файл не найден.
  -2: Файл является директорией.


FinishDirectory

FinishDirectory()

Синтаксис

FinishDirectory(#Directory)
Описание
Очищает список элементов созданный ExamineDirectory(). Освобождает ресурсы #Directory.

Примечание: при звершении программы, все ресурсы выгружаются автоматически.


GetCurrentDirectory

GetCurrentDirectory()

Синтаксис

Result$ = GetCurrentDirectory()
Описание
Возвращает текущее название директории. Все пути к файлам указываются относительно данной директории, если не указан другой абсолютный путь. Для изименения текущей директории используйте функцию SetCurrentDirectory().


GetExtensionPart

GetExtensionPart()

Синтаксис

Path$ = GetExtensionPart(FullPathName$)
Описание
Извлекает расширение файла из полного пути к файлу. Например, есть полный путь "C:\PureBasic\PB.exe", а это полученный результат "exe".

Для извлечения имени файла или части пути из полного пути, смотрите функции GetFilePart() и GetPathPart().

Полезные функции для работы с файлами смотрите в разделах File и FileSystem.


GetFileAttributes

GetFileAttributes()

Синтаксис

Attributes = GetFileAttributes(Filename$)
Описание
Возвращает атрибуты указанного файла.

В Windows, атрибуты могут иметь следующие значения:
  #PB_FileSystem_Hidden    : Скрытый файл
  #PB_FileSystem_Archive   : Файл был заархивирован и не изменялся с прошлого раза
  #PB_FileSystem_Compressed: Сжатый Файл
  #PB_FileSystem_Normal    : Обычный файл
  #PB_FileSystem_ReadOnly  : Файл находится в режиме только для чтения
  #PB_FileSystem_System    : системный файл

В Linux или MacOSX, атрибуты могут иметь следующие значения:

  #PB_FileSystem_Link      : Файл является символической ссылкой
  #PB_FileSystem_ReadUser  : Разрешение доступа при считывание для владельца
  #PB_FileSystem_WriteUser : Разрешение доступа на запись для владельца
  #PB_FileSystem_ExecUser  : Разрешение доступа на выполнение для владельца
  #PB_FileSystem_ReadGroup : Разрешение доступа при считывании для членов владеющей группы
  #PB_FileSystem_WriteGroup: Разрешение доступа на запись для членов владеющей группы
  #PB_FileSystem_ExecGroup : Разрешение доступа на выполнение для членов владеющей группы
  #PB_FileSystem_ReadAll   : Разрешение доступа при считывании для других пользователей
  #PB_FileSystem_WriteAll  : Разрешение доступа на запись для других пользователей
  #PB_FileSystem_ExecAll   : Разрешение доступа на выполнение для других пользователей
Для проверки установленного атрибута используйте '&' (AND) и значение константы:
  FileAttributes = GetFileAttributes("C:\Text.txt")
  If FileAttributes & #PB_FileSystem_Hidden
    Debug "This file is hidden !"
  EndIf
Если невозможно прочитать атрибуты, возвращается -1.

Пример:
  Value.l = GetFileAttributes("c:\autoexec.bat")

  If Value = -1
    Debug "Error reading file attributes!"
  Else
    If Value & #PB_FileSystem_Hidden     : txt$ + "H" : Else : txt$+"-" : EndIf
    If Value & #PB_FileSystem_Archive    : txt$ + "A" : Else : txt$+"-" : EndIf
    If Value & #PB_FileSystem_Compressed : txt$ + "C" : Else : txt$+"-" : EndIf
    If Value & #PB_FileSystem_Normal     : txt$ + "N" : Else : txt$+"-" : EndIf
    If Value & #PB_FileSystem_ReadOnly   : txt$ + "R" : Else : txt$+"-" : EndIf
    If Value & #PB_FileSystem_System     : txt$ + "S" : Else : txt$+"-" : EndIf
    Debug txt$
  EndIf


GetFileDate

GetFileDate()

Синтаксис

Result = GetFileDate(Filename$, DateType)
Описание
Возвращает дату указанного файла. Дата возвращается в формате используемой библиотекой Date. Формат даты можно указывать с помощью функции FormatDate().

Для 'DateType' параметром может быть одна из следующих констант:
  #PB_Date_Created : возвращает дату создания файла.
  #PB_Date_Accessed: возвращает последнюю дату доступа к файлу.
  #PB_Date_Modified: возвращает последнюю дату модификации файла.


GetFilePart

GetFilePart()

Синтаксис

Filename$ = GetFilePart(FullPathName$)
Описание
Извлекает название и расширение файла из полного пути. Например, если полный путь "C:\PureBasic\PB.exe", результатом будет "PB.exe".

Для получения расширения файла и части пути используйте функции GetExtensionPart() и GetPathPart().

Полезные функции для работы с файлами смотрите в разделах File и FileSystem.


GetHomeDirectory

GetHomeDirectory()

Синтаксис

Result$ = GetHomeDirectory()
Описание
Возвращает название рабочей директории. Это может быть полезным для хранения и загрузки различных пользовательских настроек, плагинов, и.т.д.


GetPathPart

GetPathPart()

Синтаксис

Path$ = GetPathPart(FullPathName$)
Описание
Извлекает часть пути, из полного пути к файлу. Например, Если полный путь "C:\PureBasic\PB.exe", в результате получим "C:\PureBasic\".

Для извлечения расширения и названия файла используйте функции GetExtensionPart() и GetFilePart().

Полезные функции для работы с файлами смотрите в разделах File и FileSystem.


GetTemporaryDirectory

GetTemporaryDirectory()

Синтаксис

Result$ = GetTemporaryDirectory()
Описание
Возвращает путь к временной папке. Все временные файлы используют эту директорию, поскольку эта директория, предоставляет полный доступ к чтению / записи файлов.


IsDirectory

IsDirectory()

Синтаксис

Result = IsDirectory(#Directory)
Описание
Эта функция проверяет уникальный идентификатор указанного объекта, а так же является ли указанное целое неотрицательное число #Directory корректным и правильно инициализированным. Функция возвращает не нулевой результат, если есть открытый каталог с таким идентификатором. Если каталога с таким идентификатором нет, будет возвращён нулевой результат. Если Result не равен 0, то каталог инициализирован правильно. Обычно эту функцию используют, чтобы узнать был ли открыт каталог.


NextDirectoryEntry

NextDirectoryEntry()

Синтаксис

Result = NextDirectoryEntry(#Directory)
Описание
Эту функцию нужно вызывать после ExamineDirectory(). Эта функция шаг за шагом просканирует всю директорию.

С помощью функции DirectoryEntryName() получают имя директории. С помощью функции DirectoryEntryType() выясняем, это файл или директория.

Если весь каталог просканирован, в 'Result' вернется 0, иначе он не будет равен 0.


RenameFile

RenameFile()

Синтаксис

Result = RenameFile(OldFilename$, NewFilename$)
Описание
Переименовывает названия файлов. Если Result равен 0, файл переименовать не удалось.

Функция позволяет переименовывать названия директорий.

Пример:
  RenameFile("C:\Temp\Test.txt", "C:\Temp\TestNew.txt")    ; renaming the Test file in Temp directory
  RenameFile("C:\Temp\", "C:\TempNew\")                    ; renaming the Temp directory itself
Используя два различных каталога (и даже раздела), возможно даже переместить файл.

Пример:
  If RenameFile("C:\test.txt", "D:\temp\test_backup.txt")
    Debug "Moving and renaming successful."    ; Moving and renaming of the file was successful
  Else
    Debug "Moving and renaming failed."        ; Moving and renaming failed, e.g. because of a not found source file
  EndIf


SetCurrentDirectory

SetCurrentDirectory()

Синтаксис

SetCurrentDirectory(Directory$)
Описание
Изменяет текущую корневую папку. Все файлы будут вычислять относительный путь по отношению к новому корневому каталогу. Для получения пути к корневому каталогу используйте функцию GetCurrentDirectory().


SetFileAttributes

SetFileAttributes()

Синтаксис

Result = SetFileAttributes(Filename$, Attributes)
Описание
Устанавливает атрибуты файла указанного в Filename$. Если в 'Result' возвращается 0, атрибуты изменить не удалось. Также эта функция изменяет атрибуты директорий, если имя директории задано как 'FileName$'.

В Windows, 'Attributes' могут иметь следующие значения:
  #PB_FileSystem_Hidden    : Скрытый файл
  #PB_FileSystem_Archive   : Файл был заархивирован и не изменялся с прошлого раза
  #PB_FileSystem_Compressed: Сжатый Файл
  #PB_FileSystem_Normal    : Обычный файл
  #PB_FileSystem_ReadOnly  : Файл находится в режиме только для чтения
  #PB_FileSystem_System    : системный файл

В Linux или MacOSX, атрибуты могут иметь следующие значения:

  #PB_FileSystem_Link      : Файл является символической ссылкой
  #PB_FileSystem_ReadUser  : Разрешение доступа при считывание для владельца
  #PB_FileSystem_WriteUser : Разрешение доступа на запись для владельца
  #PB_FileSystem_ExecUser  : Разрешение доступа на выполнение для владельца
  #PB_FileSystem_ReadGroup : Разрешение доступа при считывании для членов владеющей группы
  #PB_FileSystem_WriteGroup: Разрешение доступа на запись для членов владеющей группы
  #PB_FileSystem_ExecGroup : Разрешение доступа на выполнение для членов владеющей группы
  #PB_FileSystem_ReadAll   : Разрешение доступа при считывании для других пользователей
  #PB_FileSystem_WriteAll  : Разрешение доступа на запись для других пользователей
  #PB_FileSystem_ExecAll   : Разрешение доступа на выполнение для других пользователей
Для того, чтобы объендинить несколько значений используйте операнд '|' (или / OR):
  SetFileAttributes("C:\Text.txt", #PB_FileSystem_Hidden | #PB_FileSystem_ReadOnly)


SetFileDate

SetFileDate()

Синтаксис

SetFileDate(Filename$, DateType, Date)
Описание
Изменяет дату указанного файла. Дата должна быть в формате, используемом библиотекой Date. Формат даты можно указывать с помощью функции ParseDate().

'DateType' параметр может быть одной из следующих констант:
  #PB_Date_Created : изменяет дату создания файла.
  #PB_Date_Accessed: изменяет последнюю дату доступа к файлу.
  #PB_Date_Modified: изменяет последнюю дату модификации файла.


Font

PureBasic - Font

Краткий обзор

Шрифты широко используется в компьютерах, так как это единственный способ сделать текст нужных размеров и форм.

Примечание: Использовании в PureBasic цветных шрифтов пока не представляется возможным. Вы можете добиться этого с помощью функции StartDrawing(),нарисовав символ.

Краткий перечень команд

FontID
FreeFont
IsFont
LoadFont


FontID

FontID()

Синтаксис

FontID = FontID(#Font)
Описание
Возвращает уникальный системный идентификатор #Font.

Результат иногда называют 'Handle'. Читайте главы Handles and Numbers для более подробной информации об указателях.

Также можно использовать результат FontID(), чтобы выбрать один из нескольких загруженных шрифтов
Один из примеров использования FontID() в сочетании с SetGadgetFont():
  If OpenWindow(0, 0, 0, 222, 130, "FontID()", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0, 10, 10, 200, 30, "Click to change the font...")
    Font1 = LoadFont(#PB_Any, "Arial"  ,  8, #PB_Font_Bold)
    Font2 = LoadFont(#PB_Any, "Verdana", 12, #PB_Font_StrikeOut)
    UsedFont = 1
  EndIf

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_Gadget
      If EventGadget() = 0
        If UsedFont = 1
          SetGadgetFont(0, FontID(Font2))
          UsedFont = 2
        Else
          SetGadgetFont(0, FontID(Font1))
          UsedFont = 1
        EndIf
      EndIf
    EndIf
  Until Event = #PB_Event_CloseWindow


FreeFont

FreeFont()

Синтаксис

FreeFont(#Font)
Описание
Освобождает шрифт, ранее инициализированный функцией LoadFont().

Примечание: все остальные шрифты автоматически освобождаются, когда программа завершается.


IsFont

IsFont()

Синтаксис

Result = IsFont(#Font)
Описание
Проверяет номер #Font для инициализации шрифта. Если значение 'Result' не равно нулю, тогда шрифт инициализирован и готов для работы.


LoadFont

LoadFont()

Синтаксис

Result = LoadFont( #Font, Name$, YSize [, Flags] )
Описание
Открывает указанный шрифт #Font.

Если #PB_Any будет использоваться как параметр '#Font',тогда номер нового шрифта возратится в 'Result'.

Если 'Result' равен 0, шрифт не может быть загружен. Если другой шрифт был ранее загружен с тем же самым #Font, то предыдущий шрифт автоматически освобождается.

Параметр 'Flags' является необязательным и может быть комбинацией следующих констант:
  #PB_Font_Bold       : шрифт будет Жирный
  #PB_Font_Italic     : шрифт будет Курсив
  #PB_Font_Underline  : шрифт будет Подчеркнутый
  #PB_Font_StrikeOut  : шрифт будет Зачеркнутый
  #PB_Font_HighQuality: Шрифт будет в высококачественном режиме

Примечание: Только #PB_Font_Bold и #PB_Font_Italic поддерживаются на всех ОС. Остальные только для Windows.

Пример:
   If OpenWindow(0, 0, 0, 270, 160, "Loading font...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If LoadFont(1, "Arial", 24)
      SetGadgetFont(#PB_Default, FontID(1))
      TextGadget(0, 10, 10, 250, 40, "Arial 24")
    EndIf
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

P.S : В Windows шрифт картографа всегда будет пытаться найти шрифт для вас. Так, например, если вы попытаетесь открыть шрифт под названием "Tim Now Ronin", и он не будет найден, то будет подобран ближайший шрифт основанный на таких вещах, как имя, высота шрифта, стиля и т.д. Так что не думайте, что шрифт не будет загружаться, если Вы предоставите неправильное имя или размер.


Ftp

PureBasic - Ftp

Краткий обзор

Ftp (произносится как "протокол передачи файлов") является способом основанном на модели клиент-сервер для обмена файлами. Эта библиотека реализации клиентской части Ftp, которая позволяет подключиться к удаленному серверу и манипулировать файлами (загрузка, передача, переименование и т.д.).

Все команды FTP основаны на network library, поэтому перед их использованием необходимо вызвать InitNetwork().

Краткий перечень команд

CheckFTPConnection
CloseFTP
CreateFTPDirectory
DeleteFTPDirectory
DeleteFTPFile
ExamineFTPDirectory
FTPDirectoryEntryAttributes
FTPDirectoryEntryDate
FTPDirectoryEntryName
FTPDirectoryEntryRaw
FTPDirectoryEntrySize
FTPDirectoryEntryType
FTPProgress
FinishFTPDirectory
GetFTPDirectory
IsFtp
NextFTPDirectoryEntry
OpenFTP
ReceiveFTPFile
RenameFTPFile
SendFTPFile
SetFTPDirectory


CheckFTPConnection

CheckFTPConnection()

Синтаксис

Result = CheckFTPConnection(#Ftp)
Описание
Проверяет, подключен ли указанный #Ftp к серверу. Если 'Result' = 0, подключение было закрыто сервером.


CloseFTP

CloseFTP()

Синтаксис

CloseFTP( #Ftp)
Описание
Закрывает соединение #Ftp открытое ранее OpenFTP().

Примечание: Все остальные FTP соединения автоматически закрываются, когда завершается программа.


CreateFTPDirectory

CreateFTPDirectory()

Синтаксис

Result = CreateFTPDirectory(#Ftp, Directory$)
Описание
Создает новую папку Directory$ на серверe #Ftp. Если 'Result' = 0, то каталог не может быть создан. Новый каталог будет создан в текущем каталоге (см. GetFTPDirectory() и SetFTPDirectory()). Не возможно указывать путь в имени Directory$.


DeleteFTPDirectory

DeleteFTPDirectory()

Синтаксис

Result = DeleteFTPDirectory(#Ftp, Directory$)
Описание
Удаляет папку Directory$ на серверe #Ftp. Каталог должен быть пустым, или команда потерпит неудачу. Если 'Result' = 0, каталог не был удален. Папка должна находиться в текущем каталоге (см. GetFTPDirectory() и SetFTPDirectory()). Не возможно указывать путь в имени Directory$.


DeleteFTPFile

DeleteFTPFile()

Синтаксис

Result = DeleteFTPFile(#Ftp, Filename$)
Описание
Удаляет файл Filename$ на сервере #Ftp. Удаляемый файл должен быть в текущем каталоге (см. GetFTPDirectory() и SetFTPDirectory()). Не возможно указывать путь в имени Filename$. Если 'Result' = 0, файл не был удален.


ExamineFTPDirectory

ExamineFTPDirectory()

Синтаксис

Result = ExamineFTPDirectory(#Ftp)
Описание
Исследует текущий каталог #Ftp и создаёт список, по которому затем могут пройти функции NextFTPDirectoryEntry(), FTPDirectoryEntryName(), FTPDirectoryEntryType(), FTPDirectoryEntryAttributes(), FTPDirectoryEntryDate() и FTPDirectoryEntrySize(). Чтобы изменить текущий каталог, используйте SetFTPDirectory(). Если 'Result' = 0, каталог не может быть исследован.

Примечание: в настоящий момент, поддерживаются только типовые серверы unix. Протокол FTP не определяет, как должен быть возвращен список, таким образом у каждого сервера есть свой собственный способ возвращения директивной информации. К счастью, большинство мировых серверов работает под unix/linux, и использует одинаковый способ возвращения данных. Это значит, что нет гарантии, что листинг функционирует на всех серверах. Эта команда обновляется по требованию, чтобы автоматически обработать больше типов серверов. Если сервер не поддерживается, используйте FTPDirectoryEntryRaw() чтобы загружать необработанную информацию каждого элемента.

Пример:
  InitNetwork()

  If OpenFTP(0, "ftp.free.fr", "anonymous", "")
    If ExamineFTPDirectory(0)
      While NextFTPDirectoryEntry(0)
        Debug FTPDirectoryEntryName(0)
      Wend
    EndIf
  Else
    Debug "Can't connect to ftp.free.fr"
  EndIf


FTPDirectoryEntryAttributes

FTPDirectoryEntryAttributes()

Синтаксис

Attributes = FTPDirectoryEntryAttributes(#Ftp)
Описание
Возвращает атрибуты текущего файла на #Ftp полученного функциями ExamineFTPDirectory() и NextFTPDirectoryEntry().

Атрибут является комбинацией следующих значений:
  #PB_FTP_ReadUser  : Права доступа для пользователей (владеьца)
  #PB_FTP_WriteUser
  #PB_FTP_ExecuteUser
  #PB_FTP_ReadGroup : Права доступа для группы (владеьцев)
  #PB_FTP_WriteGroup
  #PB_FTP_ExecuteGroup
  #PB_FTP_ReadAll   : права доступа для остальных пользователей
  #PB_FTP_WriteAll
  #PB_FTP_ExecuteAll
Чтобы проверить, устанавлен ли атрибут фактически, используйте '&' (бинарный AND) и значение константы атрибута:
  [...]

  FileAttributes = FTPDirectoryEntryAttributes(#Ftp)
  If FileAttributes & #PB_FTP_ReadUser
    Debug "This file has the ReadUser flag"
  EndIf


FTPDirectoryEntryDate

FTPDirectoryEntryDate()

Синтаксис

Result = FTPDirectoryEntryDate(#Ftp)
Описание
Возвращает дату последней записи текущего файла на #Ftp полученного функциями ExamineFTPDirectory() и NextFTPDirectoryEntry().

Дата находится в том же формате, что и Date, так что, можно использовать FormatDate().


FTPDirectoryEntryName

FTPDirectoryEntryName()

Синтаксис

Filename$ = FTPDirectoryEntryName(#Ftp)
Описание
Возвращает имя текущего файла на #Ftp полученного функциями ExamineFTPDirectory() и NextFTPDirectoryEntry().


FTPDirectoryEntryRaw

FTPDirectoryEntryRaw()

Синтаксис

Entry$ = FTPDirectoryEntryRaw(#Ftp)
Описание
Возвращает необработанную строку из текущего файла на #Ftp полученного функциями ExamineFTPDirectory() и NextFTPDirectoryEntry(), посланного сервером FTP. Может быть полезно, когда сервер не поддерживает ExamineFTPDirectory(), информация о содержимом каталога все равно будет получена и проанализирована вручную.

Пример:
  InitNetwork()

  If OpenFTP(0, "ftp.free.fr", "anonymous", "")
    If ExamineFTPDirectory(0)
      While NextFTPDirectoryEntry(0)
        Debug FTPDirectoryEntryRaw(0)
      Wend
    EndIf
  Else
    Debug "Can't connect to ftp.free.fr"
  EndIf


FTPDirectoryEntrySize

FTPDirectoryEntrySize()

Синтаксис

Size = FTPDirectoryEntrySize(#Ftp)
Описание
Возвращает размер текущего файла на #Ftp полученного функциями ExamineFTPDirectory() и NextFTPDirectoryEntry().


FTPDirectoryEntryType

FTPDirectoryEntryType()

Синтаксис

Result = FTPDirectoryEntryType(#Ftp)
Описание
Возвращает тип текущего файла на #Ftp полученного функциями ExamineFTPDirectory() и NextFTPDirectoryEntry().

'Result' может быть одной из следующих констант:
  #PB_FTP_File     : Это файл.
  #PB_FTP_Directory: Это каталог.


FTPProgress

FTPProgress()

Синтаксис

Result = FTPProgress(#Ftp)
Описание
Возвращает продвижение текущей передачи файла, запущеной любой командой ReceiveFTPFile() или SendFTPFile().

'Result' фактическое число байт, которое было получено/послано или может быть одним из следующих значений:
  #PB_FTP_Started : Пересылка файла в фазе инициализации.
  #PB_FTP_Finished: Пересылка файла завершилась правильно.
  #PB_FTP_Error   : Пересылка файла завершилась, но была ошибка.


FinishFTPDirectory

FinishFTPDirectory()

Синтаксис

FinishFTPDirectory(#Ftp)
Описание
Завершает просмотр списка директорий ранее начатый ExamineFTPDirectory(). Это освобождает ресурсы, выделенные в ходе рассмотрения этого каталога.

Примечание: когда программа завершается, все запросы, начатые ExamineFTPDirectory() автоматически прекращаются.


GetFTPDirectory

GetFTPDirectory()

Синтаксис

Result$ = GetFTPDirectory(#Ftp)
Описание
Возвращает текущую директорию #Ftp, относительно корневого каталога FTP. Для изменения текущей директории, используйте SetFTPDirectory()


IsFtp

IsFtp()

Синтаксис

Result = IsFtp(#Ftp)
Описание
Проверяет, является ли номер #Ftp указанный клиентом действительным и правильно инициализированным. Эта функция использоваться с любым значением. Если 'Result' не равен нулю, то объект действительный и правильно инициализирован, в противном случае она возвращает нуль. Это идеальная функция чтобы убедиться, что объект правильно инициализирован.


NextFTPDirectoryEntry

NextFTPDirectoryEntry()

Синтаксис

Result = NextFTPDirectoryEntry(#Ftp)
Описание
Эта функция должна вызываться после ExamineFTPDirectory(). Она идет шаг за шагом по #Ftp и перечисляет его содержимое.

Имя файла доступно с помощью команды FTPDirectoryEntryName(). Чтобы узнать, чем является элемент - файлом или каталогом, используйте FTPDirectoryEntryType().

Когда все файлы будут внесены в список, значение Result будет 0.


OpenFTP

OpenFTP()

Синтаксис

Result = OpenFTP(#Ftp, ServerName$, User$, Password$ [, Passive [, Port]])
Описание
Пытается открыть соединение с указанным сервером FTP. Если #PB_Any используется в качестве параметра '#Ftp', то новый номер FTP, будет возвращен как 'Result'. 'ServerName$' должен быть действительный адрес FTP-сервера. 'User$' и 'Password$' будут использоваться для аутентификации на сервере. Для публичных серверов, 'User$' может быть установлен на "аноним" и 'Password$' будет пусто. По умолчанию соединение будет открыто в пассивном режиме, так как это наиболее совместимый режим (брандмауэр установленный на компьютер, будет жаловаться, если FTP-соединение инициализируется в активном режиме). По умолчанию используется порт 21, а через параметр 'Port' он может быть изменён.

Если подключение с сервером не может быть установлено 'Result' будет 0.

InitNetwork() должно предшествовать использованию этой команды, так как все FTP команды основаны на библиотеке сети.

Пример:
  InitNetwork()

  If OpenFTP(0, "ftp.free.fr", "anonymous", "")
    Debug "Successfully connected"
  Else
    Debug "Can't connect to ftp.free.fr"
  EndIf


ReceiveFTPFile

ReceiveFTPFile()

Синтаксис

Result = ReceiveFTPFile(#Ftp, RemoteFilename$, Filename$ [, Asynchronous])
Описание
Загрузка файла с сервера #Ftp. 'RemoteFilename$' должен находиться в текущем каталоге (см. GetFTPDirectory() и SetFTPDirectory()). 'Filename$' локальный файл, куда будет записан загруженный файл. По умолчанию, загрузка синхронна и блокирует программу, до полной загрузки файла. 'Asynchronous' (необязательный параметр = # True) может начать загрузку в фоновом режиме, и командой FTPProgress() можно следить за его прогрессом. Одновременно в фоновом режиме может быть отправлен или получен только один файл (см. SendFTPFile()).

Если файл был получен не правильно, 'Result' = 0.


RenameFTPFile

RenameFTPFile()

Синтаксис

Result = RenameFTPFile(#Ftp, Filename$, NewFilename$)
Описание
Переименовать файл на сервере #Ftp. Переименованный файл должен быть в текущем каталоге (см. GetFTPDirectory() и SetFTPDirectory()). Не возможно указывать путь в имени Filename$. Если 'Result' = 0, файл не был переименован.


SendFTPFile

SendFTPFile()

Синтаксис

Result = SendFTPFile(#Ftp, Filename$, RemoteFilename$ [, Asynchronous])
Описание
Отправить файл на сервер #Ftp. 'RemoteFilename$' должен быть в текущем каталоге (см. GetFTPDirectory() и SetFTPDirectory()). 'Filename$' локальный файл для отправки. По умолчанию, загрузка синхронна и блокирует программу, до полной загрузки файла. 'Asynchronous' (необязательный параметр = # True) может начать загрузку в фоновом режиме, и командой FTPProgress() можно следить за его прогрессом. Одновременно в фоновом режиме может быть отправлен или получен только один файл (см.ReceiveFTPFile()).

Если файл был отправлен не правильно, 'Result' = 0.


SetFTPDirectory

SetFTPDirectory()

Синтаксис

Result = SetFTPDirectory(#Ftp, Directory$)
Описание
Изменяет текущую директорию #Ftp, относительно текущего каталога. Если каталог не может быть изменен, 'Result' будет равен 0.

Для получения текущей директории, используйте GetFTPDirectory(). Не возможно указывать путь в имени Directory$: чтобы подняться на несколько уровней каталога, эту команду нужно будет вызвать несколько раз.

Пример:
  InitNetwork()

  If OpenFTP(0, "ftp.free.fr", "anonymous", "")

    Debug "Successfully connected"

    If SetFTPDirectory(0, "pub")
      If SetFTPDirectory(0, "linux")
        Debug "Cool, changed to '/pub/linux'"
        Debug GetFTPDirectory(0)
      Else
        Debug "Can't change to '/pub/linux'"
      EndIf
    Else
      Debug "Can't change to 'pub'"
    EndIf

  Else
    Debug "Can't connect to ftp.free.fr"
  EndIf

Поддерживаемые ОС

All


Gadget

PureBasic - Gadget

Краткий обзор

Гаджеты представляет собой общее название для всех компонентов программы GUI: кнопки, флажки, выключатели, панели управления и т.д.. Эта библиотека независима от используемой операционной системы). Она использует компоненты графического интерфейса (GUI) каждой системы.

Перед использованием Gadgets необходимо открыть окно window , также вы можете использовать menus, toolbars и statusbars.

The functions that create a new gadget return the new gadget number (called #Gadget in this library) if #PB_Any was used to create the gadget. If a static number was given to identify the gadget instead of #PB_Any, then the functions return the OS identifier for the created Gadget. These OS identifiers (or also called handles) can be used for other PureBasic functions, as well for WinAPI functions like SendMessage_() etc. Look at the chapter Handles and Numbers in the reference manual for more information.

Краткий обзор всех устройств:
ButtonGadget ButtonImageGadget CalendarGadget
CheckBoxGadget ComboBoxGadget ContainerGadget
DateGadget EditorGadget ExplorerComboGadget
ExplorerListGadget ExplorerTreeGadget Frame3DGadget
HyperLinkGadget IPAddressGadget ImageGadget
ListIconGadget ListViewGadget MDIGadget
OptionGadget PanelGadget ProgressBarGadget
ScrollAreaGadget ScrollBarGadget ShortcutGadget
SpinGadget SplitterGadget StringGadget
TextGadget TrackBarGadget TreeGadget
WebGadget

Краткий перечень команд

AddGadgetColumn
AddGadgetItem
ButtonGadget
ButtonImageGadget
CalendarGadget
CheckBoxGadget
ClearGadgetItems
CloseGadgetList
ComboBoxGadget
ContainerGadget
CountGadgetItems
DateGadget
DisableGadget
EditorGadget
ExplorerComboGadget
ExplorerListGadget
ExplorerTreeGadget
Frame3DGadget
FreeGadget
GadgetHeight
GadgetID
GadgetItemID
GadgetToolTip
GadgetType
GadgetWidth
GadgetX
GadgetY
GetActiveGadget
GetGadgetAttribute
GetGadgetColor
GetGadgetData
GetGadgetFont
GetGadgetItemAttribute
GetGadgetItemColor
GetGadgetItemData
GetGadgetItemState
GetGadgetItemText
GetGadgetState
GetGadgetText
HideGadget
HyperLinkGadget
IPAddressGadget
ImageGadget
IsGadget
ListIconGadget
ListViewGadget
MDIGadget
OpenGadgetList
OptionGadget
PanelGadget
ProgressBarGadget
RemoveGadgetColumn
RemoveGadgetItem
ResizeGadget
ScrollAreaGadget
ScrollBarGadget
SetActiveGadget
SetGadgetAttribute
SetGadgetColor
SetGadgetData
SetGadgetFont
SetGadgetItemAttribute
SetGadgetItemColor
SetGadgetItemData
SetGadgetItemState
SetGadgetItemText
SetGadgetState
SetGadgetText
ShortcutGadget
SpinGadget
SplitterGadget
StringGadget
TextGadget
TrackBarGadget
TreeGadget
UseGadgetList
WebGadget
WebGadgetPath


AddGadgetColumn

AddGadgetColumn()

Синтаксис

AddGadgetColumn(#Gadget, Position, Title$, Width)
Описание
Добавляет столбец к указанному #Gadget. Позиция (Position) определяет индекс столбца где будет вставлен новый элемент. Отсчет начинается с 0, увеличивается с лева на право, и каждому новому столбцу присваивается номер на единицу больше. При добавлении столбца, у всех ранее созданных столбцов которые расположены справа номер увеличивается на единицу. В 'Width' указываем начальную ширину столбца.

Гаджеты могут быть следующих типов:

- ListIconGadget()
- ExplorerListGadget()

Для ExplorerListGadget() эта функция используется при добавлении столбцов. Сначала с помощью функции RemoveGadgetColumn() удаляем указанные столбцы, после этого добавляем новые. Учтите, что столбец 'Name' не должен быть один в гаджете.
Примечание: Для обновления данных в гаджете, после добавления нового столбца используйте функцию SetGadgetText() . Для заполнения каждого пункта столбца используйте SetGadgetItemText() , которая используется после получения события для данного гаджета с помощью константы #PB_EventType_Change.
Добавляя столбец, используйте в Title$ одну из следующих констант. Это позволит создать столбец содержание которого будет автоматически обновляться или присвоить любое название заголовку. Можете создать пустой столбец который можно заполнить с помощью SetGadgetItemText() .
  #PB_Explorer_Name       : отображает имя файла / каталога
  #PB_Explorer_Size       : отображает размер файла в Kb
  #PB_Explorer_Type       : отображает тип файла
  #PB_Explorer_Attributes : отображает атрибуты файла / каталога
  #PB_Explorer_Created    : отображает время создания файла / каталога
  #PB_Explorer_Modified   : отображает время последней модификации  файла / каталога
  #PB_Explorer_Accessed   : Отображает дату последнего доступа к файлу / каталогу
Пример:
  If OpenWindow(0, 0, 0, 400, 150, "ListIcon - Add Columns", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ListIconGadget(0, 10, 10, 380, 100, "Standard Column", 150, #PB_ListIcon_GridLines)
    ButtonGadget(1, 10, 120, 150, 20, "Add new column")
    index = 1     ; "Standard column" has already index 0
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget
        If EventGadget() = 1
          AddGadgetColumn(0, index, "Column "+Str(index), 80)
          index + 1
        EndIf
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


AddGadgetItem

AddGadgetItem()

Синтаксис

Result = AddGadgetItem(#Gadget, Position, Text$ [, ImageID [, Flags]] )
Описание
Добавляет элементы в указанный #Gadget. Идентификатор ImageID() используется для гаджетов которые поддерживают эту функцию (к примеру ListIconGadget() ). 'Result' поддерживается в комбинации с MDIGadget() (симотрите ниже).

Поддерживаются следующие гаджеты:

- ComboBoxGadget()
- EditorGadget()
- ListIconGadget() : поддерживает ImageID. Иконка (icon) должна иметь размер 16x16.
- ListViewGadget()
- MDIGadget() : ImageID может содержать иконку в дочернем окне titlebar. Flags могут определить новые флаги окна.
- PanelGadget() : поддерживает ImageID.
- TreeGadget() : поддерживает ImageID. Иконка (icon) должна иметь размер 16x16. 'Flags' используется для создания подкатегорий.

Позиция определяет индекс, куда нужно вставить новый элемент. Для добавления элемента в начало, используйте 0. Для добавлнения элемента в конеце списка, используйте -1. При добавлении нового элемента, все текущие элементы, расположенные справа от данного элемента, увеличивают свою позицию на единицу.

Для MDIGadget() параметр 'Position' определяет номер #Window для нового дочернего окна MDI. При использовании #PB_Any PB возвращает новое значение автоматически. Параметр 'Flags' определяет вид для вновь создаваемых окон (см. OpenWindow() ). Константы #PB_Window_Borderless, #PB_Window_Screencentered и #PB_Window_WindowCentered не поддерживаются MDI окнами.

В TreeGadget() всегда есть необходимость в применении параметра 'Flags'. Он определяет новый подуровень для пункта. Если подуровень больше чем предшествующий пункт, то новый становится дочерним элементом этого пункта.


ButtonGadget

ButtonGadget()

Синтаксис

Result = ButtonGadget(#Gadget, x, y, Width, Height, ImageID [, Flags] )
Описание
Создает кнопку в текущем GadgetList.
Если в качестве параметра '#Gadget' поставить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Значение #Gadget возвращается с помощью функции EventGadget() .

'Flags' может принимать одно или несколько значений (используйте операто OR или эквивалент '|') составленных из следующих констант:
  #PB_Button_Right     : Выравнивает текст кнопки в право.
  #PB_Button_Left      : Выравнивает текст кнопки слева.
  #PB_Button_Default   : Определяет кнопку, как кнопку по умолчанию.
  #PB_Button_MultiLine : Если текст будет слишком длинным, то он будет отображен на нескольких строках.
  #PB_Button_Toggle    : Создает переключатель: один клик нажимает, другой отпускает.
К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

С помощью следующих функций можно управлять ButtonGadget:

- SetGadgetText() : Изменяет текст ButtonGadget.
- GetGadgetText() : Возвращает текст ButtonGadget.
- SetGadgetState() : Используется вместе с #PB_Button_Toggle для установки определенного состояния кнопки (1 = переключено, 0 = нормально).
- GetGadgetState() : Используется вместе с #PB_Button_Toggle для получения фактического состояния кнопки (1 = переключенное, 0 = нормальное).

Специальный символ Windows:
В параметре 'Text$' вы можете установить специальный символ '&', для подчеркивания определенного символа: "&Button" отобразится как : Button
(Примечание: это работает под Windows XP, если эту функцию не деактивировать в системных настройках.)

Для создания 'быстрых клавиш' (сочетания клавиш) используйте функцию AddKeyboardShortcut() .
Пример:
  ; Показаны в действии некорорые флаги.
  If OpenWindow(0, 0, 0, 222, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0, 10, 10, 200, 20, "Standard Button")
    ButtonGadget(1, 10, 40, 200, 20, "Left Button", #PB_Button_Left)
    ButtonGadget(2, 10, 70, 200, 20, "Right Button", #PB_Button_Right)
    ButtonGadget(3, 10,100, 200, 60, "Multiline Button  (longer text gets automatically wrapped)", #PB_Button_MultiLine)
    ButtonGadget(4, 10,170, 200, 20, "Toggle Button", #PB_Button_Toggle)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


ButtonImageGadget

ButtonImageGadget()

Синтаксис

Result = ButtonImageGadget(#Gadget, x, y, Width, Height, ImageID [, Flags] )
Описание
Создает кнопку в текущем GadgetList.
Если в качестве параметра '#Gadget' поставить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Значение #Gadget возвращается с помощью функции EventGadget() .

Параметр 'Flags' может иметь заначение #PB_Button_Toggle, это позволит создать кнопку-переключатель.

С помощью функции GadgetToolTip() можно создавать всплывающие подсказки.

- GetGadgetState() используется для получения информации о фактическом состоянии кнопки.
- SetGadgetState() используется для установки определенного состояния кнопки.
- GetGadgetAttribute() может иметь следующие значения:
  #PB_Button_Image       : Возвращает идентификатор изображения, отображаемого на кнопке.
  #PB_Button_PressedImage: Возвращает идентификатор изображения, отображаемого при нажатии на кнопку.
- SetGadgetAttribute() может иметь следующие значения:
  #PB_Button_Image       : сменить изображение, отображаемое на кнопке.
  #PB_Button_PressedImage: сменить изображение, отображаемое при нажатии на кнопку.
Для получения уникального идентификатора изображения ImageID используйте функцию ImageID() . Если в ImageID установить 0, то изображения отображаться не будут.

Пример:
  If OpenWindow(0, 0, 0, 120, 100, "ButtonImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If LoadImage(0, "map.bmp")    ; укажите путь к вашему изображению      ButtonImageGadget(0, 10, 10, 100, 83, ImageID(0))
    EndIf
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


CalendarGadget

CalendarGadget()

Синтаксис

Result = CalendarGadget(#Gadget, x, y, Width, Height [, Date [, Flags]] )
Описание
Создает календарь в текущем GadgetList. Этот гаджет отображает ежемесячный календарь, и позволяет пользователю выбрать дату. Формат даты используемые календарем и функциями для него, аналогичен формату билиотеки Date, PB.
Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Значение #Gadget возвращается с помощью функции EventGadget() .

Параметр 'Date' устанавливает определенную дату, если не выбрана по умолчанию текущая.

Вы можете установить #PB_Calendar_Borderless в параметре 'Flags', и клендарь будет создан без рамки.
К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Эти функции можно использовать для данного гаджета:

- SetGadgetState() : Устанавливает текущую дату.
- GetGadgetState() : Получает обображаемую текущую дату.
- SetGadgetItemState() : Отображает определенную дату полужирным шрифтом.
- GetGadgetItemState() : Получает информацию, выделена ли данная дата полужирным шрифтом.
- SetGadgetAttribute() : Имеет следующие атрибуты:
  #PB_Calendar_Minimum: Изменяет минимальную дату, которую пользователь может выбрать
  #PB_Calendar_Maximum: Изменяет максимальную дату, которую пользователь может выбрать.
- GetGadgetAttribute() : Имеет следующие атрибуты:
  #PB_Calendar_Minimum: получает минимальную дату, которую пользователь может выбрать
  #PB_Calendar_Maximum: получает максимальную дату, которую пользователь может выбрать.

Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor() с аргументом 'ColorType':
  #PB_Gadget_BackColor      : цвет фона
  #PB_Gadget_FrontColor     : цвет текста для отображаемого дня
  #PB_Gadget_TitleBackColor : цвет фона месяца
  #PB_Gadget_TitleFrontColor: цвет текста названия месяца
  #PB_Gadget_GrayTextColor  : цвет текста для дней за пределами текущего месяца
Пример:
  If OpenWindow(0, 0, 0, 220, 200, "CalendarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CalendarGadget(0, 10, 10, 200, 180)
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


CheckBoxGadget

CheckBoxGadget()

Синтаксис

Result = CheckBoxGadget(#Gadget, x, y, Width, Height, Text$ [, Flags] )
Описание
Создает checkbox в текущем GadgetList.
Если в качестве параметра '#Gadget' поставить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Значение #Gadget возвращается с помощью функции EventGadget() . 'Text$' - это текст расположенный справа от checkbox.
С помощью функции GadgetToolTip() можно создавать всплывающие подсказки.

- GetGadgetState() используется для получения текущего состояния гаджета (checked или unchecked).
- SetGadgetState() используется для изменения состояния гаджета (checked или unchecked).

'Flags' может иметь одно из следующих значений:
  #PB_CheckBox_Right  : Выравнивает текст справа (только Windows)
  #PB_CheckBox_Center : Выравнивает текст по центру (только Windows)
   #PB_CheckBox_ThreeState: Создаёт переключатель, у которого может быть третье "промежуточное" состояние.

Пример:
  If OpenWindow(0, 0, 0, 270, 130, "CheckBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CheckBoxGadget(0, 10,  10, 250, 20, "CheckBox standard")
    CheckBoxGadget(1, 10,  40, 250, 20, "CheckBox checked") : SetGadgetState(1,1)
    CheckBoxGadget(2, 10,  70, 250, 20, "CheckBox right", #PB_CheckBox_Right)
    CheckBoxGadget(3, 10, 100, 250, 20, "CheckBox center", #PB_CheckBox_Center)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


ClearGadgetItems

ClearGadgetItems()

Синтаксис

ClearGadgetItems(#Gadget)
Описание
Очищает все пункты (информацию) в указанном #Gadget. Гаджеты могут быть следующих типов:

- ComboBoxGadget()
- EditorGadget()
- ListIconGadget()
- ListViewGadget()
- MDIGadget()
- PanelGadget()
- TreeGadget()

Пример:
  If OpenWindow(0, 0, 0, 220, 150, "ClearGadgetItems", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ListViewGadget(0,10,10,200,100)
    For a = 1 To 10 : AddGadgetItem (0, -1, "Item "+Str(a)) : Next    ; add 10 items
    ButtonGadget(1, 10, 120, 150, 20, "Clear Listview contents")
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget
        If EventGadget() = 1
          ClearGadgetItems(0)
        EndIf
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


CloseGadgetList

CloseGadgetList()

Синтаксис

CloseGadgetList()
Описание
Завершает создание текущего списка гаджетов и предоставляет возможность вернуться к предыдущему GadgetList.

Эта функция используется со следующими гаджетами:

- ContainerGadget()
- PanelGadget()
- ScrollAreaGadget()


ComboBoxGadget

ComboBoxGadget()

Синтаксис

Result = ComboBoxGadget(#Gadget, x, y, Width, Height [, Flags] )
Описание
Создает ComboBox гаджет в текущем GadgetList.
Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Значение #Gadget возвращается с помощью функции EventGadget() .

К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Следующие функции можно использовать для данного гаджета:

- AddGadgetItem() : Добавляет пункт.
- GetGadgetItemText() : Возвращает текст пункта гаджета.
- CountGadgetItems() : Подсчитывает пункты в combobox.
- ClearGadgetItems() : Удаляет все пункты.
- RemoveGadgetItem() : Удаляет пункт.
- SetGadgetItemText() : Изменяет текст пункта в гаджете.

- GetGadgetState() : Получает индекс (начиная с 0) текущего элемента.
- GetGadgetText() : Получает содержимое (текст) текущего элемента.
- SetGadgetState() : Изменяет данный элемент.
- SetGadgetText() : Устанавливает отображаемый текст. Если ComboBoxGadget не доступен для редактирования, то текст должен находится в раскрывающемся списке.
- GetGadgetItemData() : Возвращает значение, которое содержит данный пункт.
- SetGadgetItemData() : Загружает значение с указанным пунктом.

'Flags' могут содержать следующие значения (используйте оператор '|'):
  #PB_ComboBox_Editable  : Делает ComboBox доступным для редактирования
  #PB_ComboBox_LowerCase : весь текст, введенный в ComboBox, будет преобразован в строчные буквы.
  #PB_ComboBox_UpperCase : весь текст, введенный в ComboBox, будет преобразован в верхний регистр.
Пример:
  If OpenWindow(0, 0, 0, 270, 140, "ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ComboBoxGadget(0, 10, 10, 250, 21, #PB_ComboBox_Editable)
      AddGadgetItem(0, -1, "ComboBox editable...")

    ComboBoxGadget(1, 10, 40, 250, 21)
      For a = 1 To 5
        AddGadgetItem(1, -1,"ComboBox item " + Str(a))
      Next

    SetGadgetState(1, 2)    ; set (beginning with 0) the third item as active one
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


ContainerGadget

ContainerGadget()

Синтаксис

Result = ContainerGadget(#Gadget, x, y, Width, Height [, Flags] )
Описание
Создает container в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'.

Этот гаджет может содержать в себе другие гаджеты. После создания гаджета, все вновь созданные гаджеты будут находится в контейнере. После создания необходимых гаджетов нужно вызвать функцию CloseGadgetList() , это позволит вернуться к предыдущему GadgetList. Функция OpenGadgetList() позволяет на лету добавлять гаджеты в контейнер.

'Flags' может принимать одно из следующих значений:
  #PB_Container_BorderLess : Без границ (по умолчанию).
  #PB_Container_Flat       : Простой Фрейм.
  #PB_Container_Raised     : Высокий Фрейм.
  #PB_Container_Single     : Углубленный Фрейм.
  #PB_Container_Double     : Вдвойне углубленный.
К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor() . Для изменения фона гаджета примените #PB_Gadget_BackColor.

Пример:
  If OpenWindow(0, 0, 0, 322, 150, "ContainerGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ContainerGadget(0, 8, 8, 306, 133, #PB_Container_Raised)
      ButtonGadget(1, 10, 15, 80, 24, "Button 1")
      ButtonGadget(2, 95, 15, 80, 24, "Button 2")
    CloseGadgetList()
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


CountGadgetItems

CountGadgetItems()

Синтаксис

Result = CountGadgetItems(#Gadget)
Описание
Возвращает число элементов в указанном #Gadget. Если есть элементы, то отсчет начинается с 1.
  Если #Gadget не содержит элементы, то вернется 0.
  Это универсальная функция, она работает с гаджетами которые содержат несколько
  элементов:

-  ComboBoxGadget()
-  EditorGadget()
-  ExplorerListGadget()
-  ListIconGadget()
-  ListViewGadget()
-  MDIGadget()
-
   PanelGadget()
-  TreeGadget()


DateGadget

DateGadget()

Синтаксис

Result = DateGadget(#Gadget, x, y, Width, Height [, Mask$ [, Date [, Flags]]] )
Описание
Создает строковый гаджет в текущем GadgetList, в которое можно вводить дату и/или время. Этот гаджет для своих функций использует тот же формат что и библиотека Date. Таким образом для отображения в нужном формате можно использовать FormatDate() , данные можно получить с помощью GetGadgetState() .
Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Значение #Gadget возвращается с помощью функции EventGadget() .

В дополнительном параметре Mask$ можно определить формат в котором будет выводится дата и/или время.
Для создания маски смотрите FormatDate() . Важное примечание: Гаджет не поддерживает отображение секунд, если в параметре Mask$ указать "%ss", то это будет проигнорировано! Если не определять маску или оставить пустую строку, то маска по умолчанию будет choosen. Маску можно изменять функцией SetGadgetText() . С дополнительным параметром Date можно назначить любую отображаемую стартовую дату. Если этого не определять или определить значение 0, то будет отображена текущая дата. По умолчанию в гаджете есть кнопка для отображения календаря, в котором пользователь может выбрать дату (см. изображение ниже). Это можно изменить, определив #PB_Date_UpDown в параметр Flags. Это заставит гаджет отобразить кнопку up/down, которая позволяет пользователю изменять текущую дату.
Определив #PB_Date_Checkbox в параметре Flags, в гаджете появится возможность установить 'no date' (если checkbox не установлен). Пока checkbox не установлен, GetGadgetState() возвращает 0. Для изменения состояния checkbox, используйте SetGadgetState() с 0 (=checkbox unchecked) или любая допустимая дата (=checkbox checked).

К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Для этого гаджета можно использовать следующие функции:

- SetGadgetState() : Устанавливает текущую дату.
- SetGadgetText() : Изменяет маску ввода гаджета.
- GetGadgetState() : Получает текущую дату отображаемую в гаджете.
- GetGadgetText() : Получает текущую дату как строку, как отображено в гаджете.
- GetGadgetAttribute() : Со следующими атрибутами:
  #PB_Date_Minimum: получает минимальную дату, которую пользователь может выбрать
  #PB_Date_Maximum: получает максимальную дату, которую пользователь может выбрать
- SetGadgetAttribute() : Со следующими атрибутами:
  #PB_Date_Minimum: Изменяет минимальную дату, которую пользователь может выбрать
  #PB_Date_Maximum: Изменяет максимальную дату, которую пользователь может выбрать

Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor() с аргументом 'ColorType', это позволяет изменять цвет календаря (область редактирования не окрашивается):
  #PB_Gadget_BackColor      : цвет фона
  #PB_Gadget_FrontColor     : цвет текста для отображаемого дня
  #PB_Gadget_TitleBackColor : цвет фона месяца
  #PB_Gadget_TitleFrontColor: цвет текста названия месяца
  #PB_Gadget_GrayTextColor  : цвет текста для дней за пределами текущего месяца
Пример:
  If OpenWindow(0, 0, 0, 200, 250, "DateGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    DateGadget(0, 10, 10, 180, 25, "Date: %mm/%dd/%yyyy Time: %hh:%ii")
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


DisableGadget

DisableGadget()

Синтаксис

DisableGadget(#Gadget, State)
Описание
Активирует или дезактивирует гаджеты. Если State = 1, то гаджет заблокирован, если State = 0 то гаджет активируется.

Пример:
  If OpenWindow(0, 0, 0, 250, 105, "Disable/enable buttons...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0, 10, 15, 230, 30, "Disabled Button") : DisableGadget(0, 1)
    ButtonGadget(1, 10, 60, 230, 30, "Enabled Button") : DisableGadget(1, 0)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


EditorGadget

EditorGadget()

Синтаксис

Result = EditorGadget(#Gadget, x, y, Width, Height [, Flags] )
Описание
Создает Editor гаджет в текущем GadgetList. Если в качестве параметра '#Gadget' поставить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Значение #Gadget возвращается с помощью функции EventGadget() .

'Flags' может принимать следующее значение:
  #PB_Editor_ReadOnly: Запрещает редактировать текст в гаджете.
Можно добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Следующие функции модно использовать для работы с гаджетом:

- AddGadgetItem() : Добавляет текстовую строку.
- CountGadgetItems() : Возвращает количество строк в гаджете.
- GetGadgetItemText() : Возвращает количество строк.
- GetGadgetText() : Получаем указанную строку с текстом.
- RemoveGadgetItem() : Удаляет указанную строку в редакторе.
- ClearGadgetItems() : Удаляем текст.
- SetGadgetItemText() : Изменяет текст в заданной строке.
- SetGadgetText() : Изменяет содержимое редактора.
- SetGadgetAttribute() : Имеет следующие атрибуты:
  #PB_Editor_ReadOnly: Установить состояние только для чтения. (редактируемый = 0, 1 = не редактируется)
- GetGadgetAttribute() : Со следующими атрибутами:
  #PB_Editor_ReadOnly: Получить состояние только для чтения. (редактируемый = 0, 1 = не редактируется)

Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor() с аргументом 'ColorType':
  #PB_Gadget_BackColor      : Цвет фона
  #PB_Gadget_FrontColor     : Цвет текста
Пример:
  If OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    EditorGadget(0, 8, 8, 306, 133)
    For a = 0 To 5
      AddGadgetItem(0, a, "Line "+Str(a))
    Next
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


ExplorerComboGadget

ExplorerComboGadget()

Синтаксис

Result = ExplorerComboGadget(#Gadget, x, y, Width, Height, Directory$, [, Flags] )
Описание
Создает ComboBox который позволяет отобразить путь и все его родительские папки, это дает возможность выбрать пользователю одну из них.
Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Вы можете использовать такой же ComboBox, как например OpenFileRequester() , Это может быть хорошим дополнением для ExplorerListGadget() .

Directory$ указывает путь (указывается полный путь), пустая строка отобразит корневую папку. Если установлен флаг #PB_Explorer_DrivesOnly, то Directory$ отобразит только букву диска. Весь путь указанный после буквы диска будет проигнорирован.

'Flags' может иметь следующие значения:
  #PB_Explorer_DrivesOnly   : гаджет будет показывать только записи, чтобы выбрать одну.
  #PB_Explorer_Editable     : гаджет будет редактируемый с методом автозаполнения.
  #PB_Explorer_NoMyDocuments: папка "Мои документы" не будет отображаться в виде отдельного пункта.
Для управления гаджетом можно использовать следующие функции:

- GetGadgetText() : Получает каталог отображаемый в данный момент времени. Дает возможность получить информацию о директории, какую выбрал пользователь, после того как вы получите событие для данного гаджета.
- SetGadgetText() : Изменяет директорию отображаемую в данный момент времени.

Пример:
  If OpenWindow(0, 0, 0, 400, 100, "ExplorerComboGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ExplorerComboGadget(0, 10, 40, 380, 200, "C:\", #PB_Explorer_Editable)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


ExplorerListGadget

ExplorerListGadget()

Синтаксис

Result = ExplorerListGadget(#Gadget, x, y, Width, Height, Directory$, [, Flags] )
Описание
Создает список директорий, так же как это делает Explorer. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Это позволяет пользователю выбрать файл или папку (если это не запретить с помощью флага) и перемещаться по дереву каталога.

Directory$ - отображает инициалы каталога, он может включать один или несколько шаблонов, как здесь указано "C:\*.pb;*.pbi". Если не применять шаблон, то путь должен заканчиваться '\'. Если не указывать путь к директории, то отобразится корень диска. Если не применить фильтр для файлов, то по умолчанию будет установлено значение '*.*'. Таким образом Directory$ пустое значение ("") отобразит корень директории и установит значение '*.*' как шаблон.

'Flags' может принимать следующие значения:
  #PB_Explorer_BorderLess          : Создание гаджетов без границ.
  #PB_Explorer_AlwaysShowSelection : отображает выбор даже тогда, когда гаджет больше не активен.
  #PB_Explorer_MultiSelect         : Включить режим множественного выбора элементов в гаджете.
  #PB_Explorer_GridLines           : отображение линий между строк и столбцов.
  #PB_Explorer_HeaderDragDrop      : порядок столбцов можно изменить с помощью перетаскивания Drag'n'Drop.
  #PB_Explorer_FullRowSelect       : Отбор распространяется на всю линию вместо первого столбца.

  #PB_Explorer_NoFiles             : файлы не будут отображаться.
  #PB_Explorer_NoFolders           : папки не будут отображаться.
  #PB_Explorer_NoParentFolder      : не будет [..] ссылки на родительскую папку.
  #PB_Explorer_NoDirectoryChange   : каталог не может быть изменен пользователем.
  #PB_Explorer_NoDriveRequester    : не будет отображается 'сообщение, вставьте диск в дисковод X:'.
  #PB_Explorer_NoSort              : пользователь не может сортировать содержимое, нажав на заголовок столбца.
  #PB_Explorer_NoMyDocuments       : каталог "Мои документы" не будет отображаться как отдельный элемент.
  #PB_Explorer_AutoSort            : содержание будет автоматически сортироватся по имени.
Можно добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Для управления гаджетом можно использовать следующие функции:

- AddGadgetColumn() : Добавляет новый или пользовательский заполненный столбец к гаджету. Более подробно смотрите в AddGadgetColumn() .
- RemoveGadgetColumn() : Удаляет из гаджета столбец.
- GetGadgetText() : Получает каталог отображаемый в настоящий момент времени.
- SetGadgetText() : Изменяет каталог или текущий шаблон для файлов
- GetGadgetState() : Получает выбранный пункт (-1, если пункт не выбран).
- GetGadgetItemText() : Получает имя пункта (или название столбца, если пункт = -1).
- SetGadgetItemText() : Изменяет название текста пунктов (или заголовка столбца, если пункт = -1), или заполняет пользовательский столбец данными.
- GetGadgetItemState() : Проверяет, является ли пункт каталогом или файлом, если он выбран в данный момент.
- CountGadgetItems() : Подсчитывает количество пунктов в данном каталоге.
- GetGadgetAttribute() / SetGadgetAttribute() : Со следующими атрибутами:
  #PB_Explorer_DisplayMode : Изменение режима отображения части гаджета.  Режим может быть одной из следующих констант:
    - #PB_Explorer_LargeIcon: Режим больших иконок
    - #PB_Explorer_SmallIcon: Режим маленьких иконок
    - #PB_Explorer_List     : Список
    - #PB_Explorer_Report   : Подробности (режим по умолчанию)

- GetGadgetItemAttribute() / SetGadgetItemAttribute() : Со следующими атрибутами:
  #PB_Explorer_ColumnWidth : Возвращает / изменяет ширину столбца.

Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor() , с аргументом 'ColorType':
  #PB_Gadget_FrontColor: Цвет текста
  #PB_Gadget_BackColor : Цвет фона
  #PB_Gadget_LineColor : Цвет сетки, если используется опция #PB_Explorer_GridLines.
ExplorerListGadget() поддерживает следующие события возвращаемые EventType() :
  #PB_EventType_Change           : выбор текущего элемента только что изменили.
  #PB_EventType_LeftClick        : пользователь нажал на пункт левой кнопкой мыши.
  #PB_EventType_RightClick       : пользователь нажал на пункт правой кнопкой мыши.
  #PB_EventType_LeftDoubleClick  : пользователь сделал двойное нажатие пункта левой кнопкой мыши.
  #PB_EventType_RightDoubleClick : пользователь сделал двойное нажатие пункта правой кнопкой мыши.
  #PB_EventType_DragStart        : пользователь попытался начать операцию перетаскивания.
После события #PB_EventType_DragStart, можно использовать библиотеку Drag & Drop library , это позволяет применять Drag & Drop.

Пример:
  If OpenWindow(0, 0, 0, 400, 200, "ExplorerListGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ExplorerListGadget(0, 10, 10, 380, 180, "*.*", #PB_Explorer_MultiSelect)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


ExplorerTreeGadget

ExplorerTreeGadget()

Синтаксис

Result = ExplorerTreeGadget(#Gadget, x, y, Width, Height, Directory$, [, Flags] )
Описание
Создает список директорий, так же как это делает Explorer. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Это позволяет пользователю выбрать файл или папку и перемещаться по дереву каталога.

Directory$ - отображает инициалы каталога. Он может включать один или несколько шаблонов, как здесь указано "C:\*.pb;*.pbi". Если не применять шаблон, то путь должен заканчиваться '\'. Если не указывать путь к директории, то отобразится корень диска. Если не применить фильтр для файлов, то по умолчанию будет установлено значение '*.*'. Таким образом Directory$ пустое значение ("") отобразит корень директории и установит значение '*.*' как шаблон.

'Flags' может иметь следующие значения:
  #PB_Explorer_BorderLess          : Создание гаджетов без границ.
  #PB_Explorer_AlwaysShowSelection : отображает выбор даже тогда, когда гаджет больше не активен.
  #PB_Explorer_NoLines             : Скрыть черточки между каждым узлом.
  #PB_Explorer_NoButtons           : Скрыть '+' на узле кнопок.

  #PB_Explorer_NoFiles             : файлы не будут отображаться.
  #PB_Explorer_NoDriveRequester    : не будет отображается 'сообщение, вставьте диск в дисковод X:'.
  #PB_Explorer_NoMyDocuments       : каталог "Мои документы" не будет отображаться как отдельный элемент.
  #PB_Explorer_AutoSort            : содержание будет автоматически сортироватся по имени.
Можно добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Для управления гаджетом можно использовать следующие функции:

- GetGadgetText() : Получает полный путь к выбранному в данный момент времени файлу или каталогу.
- SetGadgetText() : Делает указанный файл или каталог текущим
- GetGadgetState() : Проверяет, является ли выбранный пункт файлом или каталогом.

Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor() с аргументом 'ColorType':
  #PB_Gadget_FrontColor: Цвет текста
  #PB_Gadget_BackColor : Цвет фона
  #PB_Gadget_LineColor : цвет линии и переключателей, когда они отображаются
ExplorerTreeGadget() поддерживает следующие события возвращаемые EventType() :
  #PB_EventType_Change           : выбор текущего элемента только что изменили.
  #PB_EventType_LeftClick        : пользователь нажал на пункт левой кнопкой мыши.
  #PB_EventType_RightClick       : пользователь нажал на пункт правой кнопкой мыши.
  #PB_EventType_LeftDoubleClick  : пользователь сделал двойное нажатие пункта левой кнопкой мыши.
  #PB_EventType_RightDoubleClick : пользователь сделал двойное нажатие пункта правой кнопкой мыши.
  #PB_EventType_DragStart        : пользователь попытался начать операцию перетаскивания.
После события #PB_EventType_DragStart , можно использовать библиотеку Drag & Drop library , это позволяет применять Drag & Drop.

Пример:
  If OpenWindow(0, 0, 0, 300, 300, "ExplorerTreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ExplorerTreeGadget(0, 10, 10, 280, 280, "*.pb;*.pbi")
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


Frame3DGadget

Frame3DGadget()

Синтаксис

Result = Frame3DGadget(#Gadget, x, y, Width, Height, Text$ [, Flags] )
Описание
Создает Frame3D гаджет в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Этот гаджет выполняет декоративные функции. Параметр Text$ отображается при отсутствии границ, иначе он игнорируется. 'Flags' используется для изменения внешнего вида, и может иметь следующие виды:
  #PB_Frame3D_Single  : Углубленный Фрейм.
  #PB_Frame3D_Double  : Вдвойне углубленный Фрейм.
  #PB_Frame3D_Flat    : Простой Фрейм.
Примечание: Данный гаджет не поддерживает функцию GadgetToolTip() . Гаджет не получает событие events.

Пример:
  If OpenWindow(0, 0, 0, 320, 250, "Frame3DGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    Frame3DGadget(0, 10,  10, 300, 50, "Frame3DGadget Standard")
    Frame3DGadget(1, 10,  70, 300, 50, "", #PB_Frame3D_Single)
    Frame3DGadget(2, 10, 130, 300, 50, "", #PB_Frame3D_Double)
    Frame3DGadget(3, 10, 190, 300, 50, "", #PB_Frame3D_Flat)

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


FreeGadget

FreeGadget()

Синтаксис

FreeGadget(#Gadget)
Описание
Удаляет #Gadget с окна и освобождает память (и освобождает gadgetlist, если гаджет был в container).

Примечание: все остальные гаджеты автоматически освобождают память при выходе из программы.


GadgetHeight

GadgetHeight()

Синтаксис

Result = GadgetHeight(#Gadget)
Описание
Возвращает высоту #Gadget в пикселах.


GadgetID

GadgetID()

Синтаксис

GadgetID = GadgetID(#Gadget)
Описание
Возвращает уникальный системный идентификатор #Gadget.

Это еще называют 'Handle'. Дополнительную информацию симотрите в Handles and Numbers .


GadgetItemID

GadgetItemID()

Синтаксис

Result = GadgetItemID(#Gadget, Item)
Описание
Возвращает хендл OS по данному элементу в гаджете. Это полезно при работе с API функциями.

Эта функция поддерживается только TreeGadget() .

Поддерживаемые ОС

Windows


GadgetToolTip

GadgetToolTip()

Синтаксис

GadgetToolTip(#Gadget, Text$)
Описание
Связывает указанный Text$ с #Gadget. ToolTip создает всплывающую подсказку (обычно желтого цвета).

Поддерживаются следующие гаджеты:

- ButtonGadget()
- ButtonImageGadget()
- CalendarGadget()
- CheckBoxGadget()
- ComboBoxGadget()
- ContainerGadget()
- DateGadget()
- EditorGadget()
- ExplorerListGadget()
- ExplorerTreeGadget()
- HyperLinkGadget()
- ImageGadget()
- IPAddressGadget()
- ListIconGadget()
- ListViewGadget()
- MDIGadget()
- OptionGadget()
- PanelGadget()
- ProgressBarGadget()
- ScrollBarGadget()
- SpinGadget()
- SplitterGadget()
- StringGadget()
- TrackBarGadget()
- TreeGadget()

Пример:
  If OpenWindow(0, 0, 0, 270, 100, "GadgetTooltip", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0, 10, 30, 250, 30, "Button with Tooltip")
    GadgetToolTip(0, "Tooltip for Button")
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


GadgetType

GadgetType()

Синтаксис

Result = GadgetType(#Gadget)
Описание
Возвращает тип гаджета, при помощи уникального номера содержащегося в #Gadget. Это полезно при написании универсальных функций работающих с несколькими типами гаджетов.

Возвращает одно из следующих значений:
  #PB_GadgetType_Button        : ButtonGadget()
  #PB_GadgetType_ButtonImage   : ButtonImageGadget()
  #PB_GadgetType_Calendar      : CalendarGadget()
  #PB_GadgetType_CheckBox      : CheckBoxGadget()
  #PB_GadgetType_ComboBox      : ComboBoxGadget()
  #PB_GadgetType_Container     : ContainerGadget()
  #PB_GadgetType_Date          : DateGadget()
  #PB_GadgetType_Editor        : EditorGadget()
  #PB_GadgetType_ExplorerCombo : ExplorerComboGadget()
  #PB_GadgetType_ExplorerList  : ExplorerListGadget()
  #PB_GadgetType_ExplorerTree  : ExplorerTreeGadget()
  #PB_GadgetType_Frame3D       : Frame3DGadget()
  #PB_GadgetType_HyperLink     : HyperLinkGadget()
  #PB_GadgetType_Image         : ImageGadget()
  #PB_GadgetType_IPAddress     : IPAddressGadget()
  #PB_GadgetType_ListIcon      : ListIconGadget()
  #PB_GadgetType_ListView      : ListViewGadget()
  #PB_GadgetType_MDI           : MDIGadget()
  #PB_GadgetType_Option        : OptionGadget()
  #PB_GadgetType_Panel         : PanelGadget()
  #PB_GadgetType_ProgressBar   : ProgressBarGadget()
  #PB_GadgetType_Scintilla     : ScintillaGadget()
  #PB_GadgetType_ScrollArea    : ScrollAreaGadget()
  #PB_GadgetType_ScrollBar     : ScrollBarGadget()
  #PB_GadgetType_Spin          : SpinGadget()
  #PB_GadgetType_Splitter      : SplitterGadget()
  #PB_GadgetType_String        : StringGadget()
  #PB_GadgetType_Text          : TextGadget()
  #PB_GadgetType_TrackBar      : TrackBarGadget()
  #PB_GadgetType_Tree          : TreeGadget()
  #PB_GadgetType_Web           : WebGadget()
  #PB_GadgetType_Unknown       : Неизвестный Тип. Наиболее вероятно это гаджет не PB.


GadgetWidth

GadgetWidth()

Синтаксис

Result = GadgetWidth(#Gadget)
Описание
Возвращает ширину #Gadget в пикселах.


GadgetX

GadgetX()

Синтаксис

Result = GadgetX(#Gadget)
Описание
Возвращает координату X указанного #Gadget. Координата X возвращается в пикселах, относительно левого верхнего угла гаджета, в котором находится данный гаджет.


GadgetY

GadgetY()

Синтаксис

Result = GadgetY(#Gadget)
Описание
Возвращает координату Y указанного #Gadget. Координата Y возвращается в пикселах, относительно левого верхнего угла гаджета, в котором находится данный гаджет.


GetActiveGadget

GetActiveGadget()

Синтаксис

Result = GetActiveGadget()
Описание
Возвращает номер #Gadget, который имеет фокус в настоящий момент времени. Если фокуса нет, то вернется -1.

Пример:
  If OpenWindow(0, 0, 0, 270, 70, "GetActiveGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StringGadget  (0, 10, 10, 250, 20, "Press escape...")
    StringGadget  (1, 10, 40, 250, 20, "Press escape...")
    AddKeyboardShortcut(0, #PB_Shortcut_Escape, 1)
    SetActiveGadget(0)
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Menu And EventMenu() = 1
        MessageRequester("Test", "Escape pressed in Gadget " + Str(GetActiveGadget()))
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


GetGadgetAttribute

GetGadgetAttribute()

Синтаксис

Value = GetGadgetAttribute(#Gadget, Attribute)
Описание
Получает 'Attribute'
  указанного #Gadget. Данная функция доступна для
  всех гаджетов которые поддерживают атрибуты. Смотрите какие атрибуты
  поддерживаются данным типом гаджета:

-  ButtonImageGadget()
-  CalendarGadget()
-  DateGadget()
-
   EditorGadget()
-  ExplorerListGadget()
-  ListIconGadget()
-  PanelGadget()
-  ProgressBarGadget()
-  ScrollAreaGadget()
-  ScrollBarGadget()
-  SpinGadget()
-  SplitterGadget()
-  TrackBarGadget()
-  WebGadget()


GetGadgetColor

GetGadgetColor()

Синтаксис

Color = GetGadgetColor(#Gadget, ColorType)
Описание
Возвращает цвет определенный 'ColorType' из указанного #Gadget. Эта функция возвращает цвет созданный ранее SetGadgetColor() . Если цвет и ColorType не выбран для #Gadget, функция вернет -1.

Следующие значения поддерживаются параметром ColorType: (не каждый гаджет, поддерживает их все)
  #PB_Gadget_FrontColor     : Цвет текста
  #PB_Gadget_BackColor      : Цвет фона
  #PB_Gadget_LineColor      : Цвет сетки
  #PB_Gadget_TitleFrontColor: Цвет текста в названии (для CalendarGadget())
  #PB_Gadget_TitleBackColor : Цвет фона в названии (для CalendarGadget())
  #PB_Gadget_GrayTextColor  : Цвет неактивного текста (для CalendarGadget())
Эта функция поддерживается следующими гаджетами: (Смотрите описание гаджетов которые поддерживают ColorType.)

- CalendarGadget()
- ContainerGadget()
- DateGadget()
- EditorGadget()
- ExplorerListGadget()
- ExplorerTreeGadget()
- HyperLinkGadget()
- ListViewGadget()
- ListIconGadget()
- MDIGadget()
- ProgressBarGadget()
- ScrollAreaGadget()
- SpinGadget()
- StringGadget()
- TextGadget()
- TreeGadget()


GetGadgetData

GetGadgetData()

Синтаксис

Result = GetGadgetData(#Gadget)
Описание
Возвращает значение 'Data' которое было создано для данного гаджета функцией SetGadgetData() . Это позволяет ассоциировать значение с любым гаджетом.

Эта функция работает со всеми гаджетами PureBasic. Смотрите для примера SetGadgetData() .


GetGadgetFont

GetGadgetFont()

Синтаксис

FontID = GetGadgetFont(#Gadget)
Описание
Получает FontID указанного #Gadget. Если использовать константу #PB_Default в качестве #Gadget, то FontID будет использоваться по умолчанию для вновь создаваемых гаджетов. FontID может использоваться с функцией DrawingFont() или подобными. SetGadgetFont() может использоваться для замены шрифта установленного по умолчанию или изменить его в определенном гаджете.


GetGadgetItemAttribute

GetGadgetItemAttribute()

Синтаксис

Value = GetGadgetItemAttribute(#Gadget, Item, Attribute [, Column] )
Описание
Получает 'Attribute' определенного пункта в указанном #Gadget. Эта функция доступна для всех гаджетов которые поддерживают пункты:

- ExplorerListGadget() :
  #PB_Explorer_ColumnWidth : Возвращает ширину столбца 'Column'. Параметр 'Item' игнорируется.
- ListIconGadget() :
  #PB_ListIcon_ColumnWidth : Возвращает ширину столбца 'Column'. Параметр 'Item' игнорируется.
- TreeGadget() :
  #PB_Tree_SubLevel : Возвращает подуровень данного пункта.
Значение подуровня пункта можно использовать для определения взаимосвязей между пунктами в дереве. Например, первый пункт с подуровнем меньше чем текущий пункт, даже если список отсортировать в обратном порядке то можно выявить родительский элемент текущего пункта.


GetGadgetItemColor

GetGadgetItemColor()

Синтаксис

Color = GetGadgetItemColor(#Gadget, Item, ColorType [, Column] )
Описание
Возвращает цвет определенный 'ColorType' из определенного пункта в указанном #Gadget. Эта функция возвращает цвет который ранее был создан SetGadgetItemColor() . Если цвет не выбран для #Gadget и ColorType, функция вернет -1.

Следующие значения применяются с параметром ColorType:
  #PB_Gadget_FrontColor: Цвет текста
  #PB_Gadget_BackColor : Цвет фона
Эта функция поддерживает следующие гаджеты:

- ListIconGadget()
- TreeGadget()


GetGadgetItemData

GetGadgetItemData()

Синтаксис

Result = GetGadgetItemData(#Gadget, Item)
Описание
Возвращает значение, которое прежде было загружено в
  #Gadget с помощью функции  SetGadgetItemData() . Это позволяет установить взаимосвязи указанных значений и пунктов
  гаджета. Если значение еще не загружено в указанный, то будет возвращен 0.

Эта функция поддерживает следующие гаджеты:
-  ComboBoxGadget()
-  ListIconGadget()
-  ListViewGadget()
-  TreeGadget()

Примеры смотрите в
   SetGadgetItemData() .


GetGadgetItemState

GetGadgetItemState()

Синтаксис

Result = GetGadgetItemState(#Gadget, Item)
Описание
Возвращает состояние пункта указанного #Gadget. Эта функция работает с гаджетами которые оперируют несколькими пунктами:
- CalendarGadget() : константой #PB_Calendar_Bold возвращает дату выделенную жирным шрифтом, в противном случае #PB_Calendar_Normal. 'Item' должен быть date PureBasic.
- ExplorerListGadget() : возвращает комбинации следующих значений:
  #PB_Explorer_File      : Этот пункт является файлом.
  #PB_Explorer_Directory : Этот пункт является каталогом (или диском).
  #PB_Explorer_Selected  : Этот пункт в настоящее время выбран.
- ListViewGadget() : возвращает 1, если пункт выбран, иначе вернет 0.
- ListIconGadget() : возвращает комбинации следующих значений:
  #PB_ListIcon_Selected: Этот пункт в настоящее время выбран.
  #PB_ListIcon_Checked : Этот пункт имеет свою галочку (#PB_ListIcon_CheckBoxes флаг).
- TreeGadget() : возвращает комбинации следующих значений:
  #PB_Tree_Selected  : Элемент выбран.
  #PB_Tree_Expanded  : Элемент развернут.
  #PB_Tree_Collapsed : Элемент закрыт.
  #PB_Tree_Checked   : Элемент отмечен галочкой. (#PB_Tree_CheckBoxes флаг)
Проверка осуществляется, как в этом примере:
  If Result & #PB_Tree_Checked
    ; Item is checked
  EndIf
Ниже приведены примеры с ListIconGadget() , как выможете осуществлять проверку нескольких результатов:
  ; ... here a code snippet from a WaitWindowEvent() - event loop:
  If GetGadgetItemState(#Listicon, n) & #PB_ListIcon_Checked
    ; Item n is checked (no matter if selected)
  EndIf

  If GetGadgetItemState(#Listicon, n) & #PB_ListIcon_Selected
    ; Item n is selected (no matter if checked)
  EndIf

  If GetGadgetItemState(#Listicon, n) = #PB_ListIcon_Checked | #PB_ListIcon_Selected
    ; Item n is checked AND selected
  EndIf

  If GetGadgetItemState(#Listicon, n) & #PB_ListIcon_Checked | #PB_ListIcon_Selected
    ; Item n is checked OR selected OR both
  EndIf


GetGadgetItemText

GetGadgetItemText()

Синтаксис

Result$ = GetGadgetItemText(#Gadget, Item [, Column] )
Описание
Возвращает текст пункта указанного #Gadget. Эта функция работает с гаджетами которые оперируют несколькими пунктами:

- ComboBoxGadget() - 'Item' является индексом пункта в списке ComboBox. 'Column' будет проигнорирован.
- EditorGadget() - 'Item' является текстовой строкой в EditorGadget. 'Column' будет проигнорирован.
- ExplorerListGadget() - возвращает название 'Item', без указания пути. Если 'Item' = -1, то вернется название 'Column'.
- ListIconGadget() - возвращает элемент данного 'Item' и 'Column'. Если 'Item' = -1, то вернется название 'Column' (столбца).
- ListViewGadget() - 'Item' - это индекс элемента из которого вы хотите получить содержимое. 'Column' будет проигнорирован.
- MDIGadget() - 'Item' является индексом дочернего окна из которого вы хотите получить текст заголовка.
- PanelGadget() - 'Item' является индексом панели, из которой вы хотите получить текст заголовка.
- TreeGadget() - 'Item' является индексом элемента из которого вы хотите получить содержимое. 'Column' будет проигнорирован.
- WebGadget() - Получает код html, заголовок страницы, сообщение о статусе или текущем выборе.

Примечание: Все 'Item' стартуют с 0.


GetGadgetState

GetGadgetState()

Синтаксис

Result = GetGadgetState(#Gadget)
Описание
Возвращает текущее состояние гаджета. Эта функция работает почти со всеми гаджетами:

- ButtonImageGadget() : #PB_Button_Toggle возвращает 1, если кнопка нажата, в противном случае 0.
- ButtonGadget() : #PB_Button_Toggle возвращает 1, если кнопка нажата, в противном случае 0.
- CalendarGadget() : возвращает дату выбранную в данный момент времени.
- CheckBoxGadget() : возвращает 1, если отмечено, 0 если нет.
- ComboBoxGadget() : возвращает индекс пункта выбранного в настоящий момент времени, и -1 если пункт не выбран.
- DateGadget() : возвращает дату выбранную в данный момент времени. Если используется #PB_Date_CheckBox was used,и checkbox не отмечен, то возвращается 0.
- ExplorerListGadget() : возвращает индекс первого выбранного пункта в гаджете, и -1 если пункт не был выбран.
- ExplorerTreeGadget() : возвращает тип пункта выбранного в настоящий момент времени (#PB_Explorer_File или #PB_Explorer_Directory).
- ImageGadget() : возвращает ImageID отображаемого в настоящий момент времени.
- IPAddressGadget() : возвращает IP адрес.
- ListIconGadget() : возвращает индекс первого выбранного пункта в гаджете, и -1 если пункт не был выбран.
- ListViewGadget() : возвращает индекс первого выбранного пункта в гаджете, и -1 если пункт не был выбран.
- MDIGadget() : возвращает окна на котором есть фокус в настоящий момент времени, и -1 если нет фокуса.
- OptionGadget() : возвращает 1 если активировано, 0 не активировано.
- PanelGadget() : возвращает индекс текущей закладки панели (первая закладка имеет индекс 0), или -1 если панель не содержит закладок.
- ProgressBarGadget() : возвращает текущее значение ProgressBar.
- ScrollBarGadget() : возвращает текущую позицию.
- SpinGadget() : возвращает текущее значение SpinGadget.
- SplitterGadget() : возвращает текущую позицию splitter, в пикселах.
- TrackBarGadget() : возвращает текущую позицию TrackBar (значение на минимум - максимальное значение).
- TreeGadget() : возвращает индекс пункта выбранного в настоящий момент времени, -1 если пункт не выбран.


GetGadgetText

GetGadgetText()

Синтаксис

String$ = GetGadgetText(#Gadget)
Описание
Возвращает содержимое текста в указанном #Gadget.
Эта функция полезна для:

- ButtonGadget() : возвращает текст ButtonGadget.
- ComboBoxGadget() - возвращает содержимое текущего элемента.
- DateGadget() - возвращает дату которая отображена в настоящий момент времени, в том виде в каком она отображается в гаджете.
- EditorGadget() - возвращает содержимое текстового редактора. Отметьте себе что несколько строк разделены "Chr(13)+Chr(10)".
- ExplorerComboGadget() - возвращает путь к выбранному и отображаемому в настоящий момент времени каталогу (папке).
- ExplorerListGadget() - возвращает отображаемый в настоящий момент времени каталог.
- ExplorerTreeGadget() - возвращает полный путь выбранного в данный момент времени файла или каталога.
- HyperLinkGadget() - возвращает текст HyperLinkGadget.
- ListIconGadget() - возвращает содержимое выбранного в данный момент времени пункта первого столбца.
- ListViewGadget() - возвращает содержимое текущего пункта.
- StringGadget() - возвращает содержимое StringGadget.
- TextGadget() - возвращает содержимое TextGadget.
- TreeGadget() - возвращает текст выбранного в настоящий момент времени пункта в TreeGadget.
- WebGadget() - возвращает URL отображаемого website.


HideGadget

HideGadget()

Синтаксис

HideGadget(#Gadget, State)
Описание
Скрывает или показывает гаджет. Если State = 1, то гаджет будет скрыт, если State = 0 будет отображен.

Пример:
  If OpenWindow(0, 0, 0, 180, 120, "HideGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0, 10, 10, 160, 50, "Button 1")       : button = #True   ; Button is displayed
    ButtonGadget(1, 10, 80, 160, 30, "Hide Button 1")
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget
        If EventGadget() = 1
          If button = #True     ; ButtonGadget is displayed
            HideGadget(0, 1)     ; => hide it
            button = #False
            SetGadgetText(1, "Show Button 1")
          Else                  ; ButtonGadget is hidden
            HideGadget(0, 0)     ; => show it
            button = #True
            SetGadgetText(1, "Hide Button 1")
          EndIf
        EndIf
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


HyperLinkGadget

HyperLinkGadget()

Синтаксис

Result = HyperLinkGadget(#Gadget, x, y, Width, Height, Text$, Color [, Flags] )
Описание
Создает HyperLink в текущем GadgetList. Гаджет hyperlink является текстовой областью которая реагирует на указатеть мыши, изменяя цвет текста и вид курсора. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'.
Содержимое можно менять функцией SetGadgetText() и получать GetGadgetText() .

'Flags' может содержать следующую константу:
  #PB_Hyperlink_Underline: отображает строку текста подчеркнутой без использования подчеркнутого шрифта.
К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .
Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor() , с константой #PB_Gadget_FrontColor для изменения цвета текста. Цветом фона является цвет окна.

Пример:
  If OpenWindow(0, 0, 0, 270, 160, "HyperlinkGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    HyperLinkGadget(0, 10, 10, 250,20,"Red HyperLink", RGB(255,0,0))
    HyperLinkGadget(1, 10, 30, 250,20,"Arial Underlined Green HyperLink", RGB(0,255,0), #PB_HyperLink_Underline)
    SetGadgetFont(1, LoadFont(0, "Arial", 12))
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


IPAddressGadget

IPAddressGadget()

Синтаксис

Result = IPAddressGadget(#Gadget, x, y, Width, Height)
Описание
Создает гаджет IPAddress в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Это позволяет легко вводить полный IPv4 адрес. #Gadget будет номером числа возвращенное функцией EventGadget() .

К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Для этого гаджета можно использовать следующие функции:

- GetGadgetState() : Возвращает текущий IP адрес (используйте IPAddressField() для каждой области).
- SetGadgetState() : Изменяет текущий IP адрес (используйте MakeIPAddress() для создания допустимого IP адреса).
- GetGadgetText() : Возвращает текущий IP адрес в виде текста, в десятичном формате (например "127.0.0.1").
- SetGadgetText() : Используется только для очистки IP адреса, передавая пустую строку.

Пример:
  If OpenWindow(0, 0, 0, 180, 50, "IPAddressGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    IPAddressGadget(0, 10, 15, 160, 20)
    SetGadgetState(0, MakeIPAddress(127, 0, 0, 1))   ; set a valid ip address
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


ImageGadget

ImageGadget()

Синтаксис

Result = ImageGadget(#Gadget, x, y, Width, Height, ImageID [, Flags] )
Описание
Создает Image гаджет в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. ImageID является уникальным идентификатором изображения, его можно получить с помощью ImageID() из библиотеки Image. Если ImageID равно 0, то изображение отображаться не будет. Размер гаджета автоматически изменяется в зависимости от размера изображения.

К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

- SetGadgetState() : Изменяет текущее изображение гаджета. Допустимый ImageID можно получить с помощью функции ImageID() . Если ImageID равно 0, то изображение удалено из гаджета.

Следующие события можно получить функцией EventType() :
  #PB_EventType_LeftClick
  #PB_EventType_RightClick
  #PB_EventType_LeftDoubleClick
  #PB_EventType_RightDoubleClick
  #PB_EventType_DragStart
После события #PB_EventType_DragStart можно использовать библиотеку Drag & Drop library , это позволяет применять Drag & Drop.

'Flags' может иметь следующие параметры:
  #PB_Image_Border : отображает бордюр вокруг изображения.

Пример:
  If OpenWindow(0, 0, 0, 245, 105, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If LoadImage(0, "map.bmp")    ; change 2nd parameter to the path/filename of your image
      ImageGadget(0,  10, 10, 100, 83, ImageID(0))                      ; imagegadget standard
      ImageGadget(1, 130, 10, 100, 83, ImageID(0), #PB_Image_Border)     ; imagegadget with border
    EndIf
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


IsGadget

IsGadget()

Синтаксис

Result = IsGadget(#Gadget)
Описание
Эта функция проверяет уникальный идентификатор указанного #Gadget, а так же является ли указанное целое неотрицательное число корректным и правильно инициализированным. Функция возвращает не нулевой результат, если есть открытый гаджет с таким идентификатором. Если гаджета с таким идентификатором нет, будет возвращён нулевой результат. Обычно эту функцию используют, чтобы узнать готов ли гаджет к работе.


ListIconGadget

ListIconGadget()

Синтаксис

Result = ListIconGadget(#Gadget, x, y, Width, Height, Title$, TitleWidth [, Flags] )
Описание
Создает ListIcon в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. #Gadget будет числом возвращаемое функцией EventGadget() . 'Title$' - это название первого столбца, и 'TitleWidth' начальная ширина (в пикселах). После создания ListIconGadget его список пунктов пуст.

К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Следующие функции можно использовать для работы со списком:

- AddGadgetColumn() : Добавляет столбец к гаджету.
- RemoveGadgetColumn() : Удаляет столбец из гаджета.
- AddGadgetItem() : Добавляет элемент - строку в таблицу (можно добавить иконку размером 16x16).
- RemoveGadgetItem() : Удаляет пункт.
- ClearGadgetItems() : Удаляет все пункты.
- CountGadgetItems() : Возвращает количество пунктов в #Gadget.

- GetGadgetItemColor() : Возвращает цвет текста или фона, указанного пункта.
- SetGadgetItemColor() : Устанавливает цвет текста или фона, указанного пункта.
- GetGadgetItemData() : Возвращает значение которое было загружено пунктом.
- SetGadgetItemData() : Загружает значение в пункт.
- GetGadgetItemState() : Возвращает текущее состояние пункта.
- SetGadgetItemState() : Изменяет текущее состояние указанного элемента.
- GetGadgetItemText() : Возвращает текущий текст указанного элемента. (или заголовок столбца, если item = -1)
- SetGadgetItemText() : Изменяет текущий текст указанного элемента. (или заголовка столбца, если item = -1)
- GetGadgetState() : Возвращает первый выбранный пункт или -1, если пункт не выбран.
- SetGadgetState() : Изменяет выбранный пункт (во всех остальных пунктах выбор будет отменен). Если установить -1, то выбираться пункты боше не будут.
- GetGadgetAttribute() / SetGadgetAttribute() : Со следующими атрибутами:
  #PB_ListIcon_DisplayMode : Изменение режима отображения части гаджета.  Режим может быть одной из следующих констант:
    - #PB_Explorer_LargeIcon: Режим больших иконок
    - #PB_Explorer_SmallIcon: Режим маленьких иконок
    - #PB_Explorer_List     : Список
    - #PB_Explorer_Report   : Подробности (режим по умолчанию)

- GetGadgetItemAttribute() / SetGadgetItemAttribute() : Со следующими атрибутами:
  #PB_ListIcon_ColumnWidth : Возвращает / изменяет ширину столбца 'Column'. Параметр 'Item' игнорируется.

Если нужно добавить в ListIcons несколько столбцов используя AddGadgetItem() , надо использовать формат "первый столбец"+Chr(10)+"второй" как параметр Text$. Смотрите следующие примеры.

'Flags' может содержать одну или несколько констант:
  #PB_ListIcon_CheckBoxes         : отображает флажок в первом столбце.
  #PB_ListIcon_MultiSelect        : активирует режим множественный выбор.
  #PB_ListIcon_GridLines          : отображает разделительные линии между строк и столбцов.
  #PB_ListIcon_FullRowSelect      : выбор охватывает всю строку вместо первой колонки (только для Windows).
  #PB_ListIcon_HeaderDragDrop     : порядок столбцов может быть изменён с помощью drag'n'drop.
  #PB_ListIcon_AlwaysShowSelection: Выбор остается видимым, даже если гаджет не активирован (только для Windows).
Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor() , с аргументом 'ColorType':
  #PB_Gadget_FrontColor: Цвет текста
  #PB_Gadget_BackColor : Цвет фона
  #PB_Gadget_LineColor : Цвет сетки, если используется опция #PB_ListIcon_GridLines flag is used.
Следующие события можно получить функцией EventType() :
  #PB_EventType_LeftClick: был использован щелчок левой кнопкой мыши
  #PB_EventType_LeftDoubleClick :был использован двойной щелчок левой кнопкой мыши
  #PB_EventType_RightClick :был использован щелчок правой кнопкой мыши
  #PB_EventType_RightDoubleClick :был использован двойной щелчок правой кнопкой мыши
  #PB_EventType_Change: данный пункт был изменен
  #PB_EventType_DragStart: пользователь пытается запустить операцию перетаскивания.
После события #PB_EventType_DragStart можно использовать библиотеку Drag & Drop library , это позволяет применять Drag & Drop.

Пример1:
 If OpenWindow(0, 100, 100, 300, 100, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ListIconGadget(0, 5, 5, 290, 90, "Name", 100, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
   AddGadgetColumn(0, 1, "Address", 250)
   AddGadgetItem(0, -1, "Harry Rannit"+Chr(10)+"12 Parliament Way, Battle Street, By the Bay")
   AddGadgetItem(0, -1, "Ginger Brokeit"+Chr(10)+"130 PureBasic Road, BigTown, CodeCity")
   Repeat
     Event = WaitWindowEvent()
   Until Event = #PB_Event_CloseWindow
 EndIf
Пример2:
  ; Shows possible flags of ListIconGadget in action...
  If OpenWindow(0, 0, 0, 640, 300, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ; left column
    TextGadget    (6,  10,  10, 300, 20, "ListIcon Standard", #PB_Text_Center)
    ListIconGadget(0,  10,  25, 300, 70, "Column 1", 100)
    TextGadget    (7,  10, 105, 300, 20, "ListIcon with Checkbox", #PB_Text_Center)
    ListIconGadget(1,  10, 120, 300, 70, "Column 1", 100, #PB_ListIcon_CheckBoxes)  ; ListIcon with checkbox
    TextGadget    (8,  10, 200, 300, 20, "ListIcon with Multi-Selection", #PB_Text_Center)
    ListIconGadget(2,  10, 215, 300, 70, "Column 1", 100, #PB_ListIcon_MultiSelect) ; ListIcon with multi-selection
    ; right column
    TextGadget    (9, 330,  10, 300, 20, "ListIcon with separator lines",#PB_Text_Center)
    ListIconGadget(3, 330,  25, 300, 70, "Column 1", 100, #PB_ListIcon_GridLines)
    TextGadget   (10, 330, 105, 300, 20, "ListIcon with FullRowSelect and AlwaysShowSelection",#PB_Text_Center)
    ListIconGadget(4, 330, 120, 300, 70, "Column 1", 100, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
    TextGadget   (11, 330, 200, 300, 20, "ListIcon Standard with large icons",#PB_Text_Center)
    ListIconGadget(5, 330, 220, 300, 65, "", 200,#PB_ListIcon_GridLines)
    For a = 0 To 4            ; add columns to each of the first 5 listicons
      For b = 2 To 4          ; add 3 more columns to each listicon
        AddGadgetColumn(a, b, "Column " + Str(b), 65)
      Next
      For b = 0 To 2          ; add 4 items to each line of the listicons
        AddGadgetItem(a, b, "Item 1"+Chr(10)+"Item 2"+Chr(10)+"Item 3"+Chr(10)+"Item 4")
      Next
    Next
    ; Here we change the ListIcon display to large icons and show an image
    If LoadImage(0, "map2.bmp")     ; change path/filename to your own 32x32 pixel image
      SetGadgetAttribute(5, #PB_ListIcon_DisplayMode, #PB_ListIcon_LargeIcon)
      AddGadgetItem(5, 1, "Picture 1", ImageID(0))
      AddGadgetItem(5, 2, "Picture 2", ImageID(0))
    EndIf
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


ListViewGadget

ListViewGadget()

Синтаксис

Result = ListViewGadget(#Gadget, x, y, Width, Height [, Flags] )
Описание
Создает ListView в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. #Gadget #Gadget будет числом возвращаемое функцией EventGadget() . После создания ListView его список пуст.

'Flags' может содержать одну из нескольких констант:
  #PB_ListView_Multiselect: Позволяет выбирать несколько элементов
  #PB_ListView_ClickSelect: Позволяет выбирать несколько элементов. Щелчок на элементе отмечает или снимает выделение
К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Следующие функции можно использовать для работы с данным гаджетом:

- AddGadgetItem() : Добавляет пункт.
- RemoveGadgetItem() : Удаляет пункт.
- ClearGadgetItems() : Удаляет все пункты.
- CountGadgetItems() : Возвращает количество пунктов в #Gadget имеющихся в настоящий момент времени.

- GetGadgetItemData() : Получает значение данного пункта.
- GetGadgetItemState() : Возвращает не нулевое значение, если пункт выбран, иначе вернет 0.
- GetGadgetItemText() : Получает название данного пункта.
- GetGadgetState() : Получает индекс выбранного элемента или -1, если элемент не выбран.
- GetGadgetText() : Получает текст выделенного пункта.
- SetGadgetItemData() : Сохраняет значение в данном пункте.
- SetGadgetItemState() : Выделяет или снимает выделение с данного пункта.
- SetGadgetItemText() : Устанавливает текст данного пункта.
- SetGadgetState() : Изменяет выбранный пункт. Если -1, то выбор будет снят.
- SetGadgetText() : Выбирает пункт с указанным текстом (текст должет совпадать).
Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor() , с аргументом 'ColorType':
  #PB_Gadget_FrontColor: Цвет текста
  #PB_Gadget_BackColor : Цвет фона
Следующие события поддерживаются функцией EventType() :
  #PB_EventType_LeftClick
  #PB_EventType_LeftDoubleClick
Пример:
  If OpenWindow(0, 0, 0, 270, 140, "ListViewGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ListViewGadget(0, 10, 10, 250, 120)
    For a = 1 To 12
      AddGadgetItem (0, -1, "Item " + Str(a) + " of the Listview") ; define listview content
    Next
    SetGadgetState(0, 9) ; set (beginning with 0) the tenth item as the active one
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


MDIGadget

MDIGadget()

Синтаксис

Result = MDIGadget(#Gadget, x, y, Width, Height, SubMenu, MenuItem [, Flags] )
Описание
Создает клиетскую область в которой можно отобразить дочернее окно. Это окно является подвижным и размеры указанные указанные пользователем. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) гаджета будет возвращен в качестве 'Result'.

MDIGadget() всегда подключается к Menu окна (см. CreateMenu() ). Следовательно MDIGadget() можно разместить в окне к которому подключено меню. Гаджет позволяет выбирать дочернее окно через субменю окна. В параметре 'SubMenu', нужно определить индекс субменю (созданный MenuTitle() ), куда эти элементы будут присоединены (первое субменю имеет индекс 0). Гаджет добавит seperator в конце этого меню, затем добавляет один пункт для каждого дочернего окна отображаемого в настоящий момент времени.

Гаджет потребует идентификаторы Menuitem (см. параметр 'MenuID' в MenuItem() ), чтобы добавить эти menuitems. В параметре 'Menuitem' гаджета MDIGadget() нужно определить минимальное значение, которое гаджет может использовать с этой целью. При добавлении дочерних оконо будут использоваться значения выше минимально установленных, таким образом нужне зарезервировать столько значений, сколько планируется создать пунктов. Рекомендуется сначала устанавливать значения идентификаторов меню программы, это поозволит избежать ошибок в работе программы.
Дополнительное примечание:
В окне можно создать только один MDIGadget(), однако можно создать другой во втором окне. Этот гаджет можна создать только в окне, его нельзя создавать в ContainerGadget() , SplitterGadget() или PanelGadget() .
Поскольку гаджет динамически отображает данные, рекомендуется использовать функцию #PB_Any, чтобы заполнять дочернее окно с гаджетами.

Используя AddGadgetItem() с этим гаджетом, фактически создается новое window PB. Все функции библиотеки Window можно применять к вновь созданному окну (кроме StickyWindow() ). Идентификатор для нового окна не может совпадать с другим окном, иначе другое окно будет закрыто. Гаджет MDI не возвращает события. События относительно дочернего окна будут получены как события обычного окна window events (#PB_Event_SizeWindow, #PB_Event_CloseWindow, ...).

'Flags' может содержать следующие константы:
  #PB_MDI_AutoSize       : Гаджет будет автоматически изменять размер в зависимости от размера родительского окна.
                           Если нет других гаджетов в родительском окне, это может быть очень практичным вариантом.
  #PB_MDI_BorderLess     : Не будет границ вокруг гаджетов.
  #PB_MDI_NoScrollBars   : Когда окно перемещается за пределы района гаджета, то не будет полос прокрутки.
К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Следующие функции можно использовать для работы с данным гаджетом:

- CountGadgetItems() : Возвращает количество дочерних окон.
- AddGadgetItem() : Добавляет новое дочернее окно.
- ClearGadgetItems() : Закрывает все дочерние окна.
- GetGadgetState() : Получает дочернее окна на котором установлен фокус в данный момент времени.
- SetGadgetState() : Устанавливает фокус окна к настоящему моменту времени или упорядочивает дочерние окна. (дополнительную информацию см. GetGadgetState() .)
- SetGadgetAttribute() : Со следующими атрибутами:
  #PB_MDI_Image    : Применяет фоновый рисунок для окна MDI. (см. ImageID())
  #PB_MDI_TileImage: Применяет фоновый рисунок для окна MDI.  Изображение повторяется много раз, чтобы полностью заполнить окно области
Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor с типом #PB_Gadget_BackColor, чтобы изменять цвет фона рабочей области MDI.

Пример:
  #Main = 0
  #MDIChild = 1
  If OpenWindow(#Main, 0, 0, 400, 300, "MDIGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget)
    If CreateMenu(#Main, WindowID(#Main))
      MenuTitle("Menu index 0")
      MenuTitle("MDI windows menu")
        MenuItem(0, "self created item")
        MenuItem(1, "self created item")

      MDIGadget(0, 0, 0, 0, 0, 1, 2, #PB_MDI_AutoSize)
        AddGadgetItem(0, #MDIChild, "child window")
          ; add gadgets here...
      UseGadgetList(WindowID(#Main)) ; go back to the main window gadgetlist
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf

Поддерживаемые ОС

Windows


OpenGadgetList

OpenGadgetList()

Синтаксис

OpenGadgetList(#Gadget [, Item] )
Описание
Использует определенный #Gadget как GadgetList, это позволяет динамически добавлять к нему новые гаджеты. После внесения всех изменений нужно вызвать CloseGadgetList() .
Следующие гаджеты поддерживаются OpenGadgetList():

- ContainerGadget()
- PanelGadget() : Параметр 'Item' нужно указывать.
- ScrollAreaGadget()


OptionGadget

OptionGadget()

Синтаксис

Result = OptionGadget(#Gadget, x, y, Width, Height, Text$ )
Описание
Создает OptionGadget в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. При первом вызове функции создается группа, и все последующие вызовы OptionGadget() добавляют гаджеты в эту группу. Для завершения создания группы, создайте гаджет другого типа. Подобные гаджеты очень полезны, поскольку позволяют выбрать в одно и то же время только один гаджет из группы.

К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Пример:
  If OpenWindow(0, 0, 0, 140, 110, "OptionGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    OptionGadget(0, 30, 20, 60, 20, "Option 1")
    OptionGadget(1, 30, 45, 60, 20, "Option 2")
    OptionGadget(2, 30, 70, 60, 20, "Option 3")
    SetGadgetState(1, 1)   ; set second option as active one
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


PanelGadget

PanelGadget()

Синтаксис

Result = PanelGadget(#Gadget, x, y, Width, Height)
Описание
Создает Panel в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. После создания панели, ее список пуст.

К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Следующие функции можно использовать для работы с данным гаджетом:

- AddGadgetItem() : Добавляет панель.
- RemoveGadgetItem() : Удаляет панель.
- CountGadgetItems() : Подсчитывает количество панелей.
- ClearGadgetItems() : Удаляет все панели.
- GetGadgetItemText() : Получает текст указанного пункта.
- SetGadgetItemText() : Изменяет текст указанного пункта.

- SetGadgetState() : Изменяет активную панель.
- GetGadgetState() : Получает индекс текущей панели.
- GetGadgetAttribute() : Должет быть один из следующих пунктов: (для работы нужен минимум один пункт)
  #PB_Panel_ItemWidth : Возвращает ширину внутренней области, где отображается гаджет.
  #PB_Panel_ItemHeight: Возвращает высоту внутренней области, где отображается гаджет.
  #PB_Panel_TabHeight : Возвращает высоту панели вкладок в верхней части гаджета.
Нужно вызвать AddGadgetItem() , что бы добавить панель, после этого можно добавлять на панель другие гаджеты. После этого гаджеты будут автоматически создаваться на этой панели. Когда в PanelGadget будут добавлены нужные элементы, нужно вызвать CloseGadgetList() , это даст возможность работать с другими GadgetList. Это означает что PanelGadget можно создавать в другой PanelGadget...

Пример:
  ; Shows using of several panels...
  If OpenWindow(0, 0, 0, 322, 220, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    PanelGadget     (0, 8, 8, 306, 203)
      AddGadgetItem (0, -1, "Panel 1")
        PanelGadget (1, 5, 5, 290, 166)
          AddGadgetItem(1, -1, "Sub-Panel 1")
          AddGadgetItem(1, -1, "Sub-Panel 2")
          AddGadgetItem(1, -1, "Sub-Panel 3")
        CloseGadgetList()
      AddGadgetItem (0, -1,"Panel 2")
        ButtonGadget(2, 10, 15, 80, 24,"Button 1")
        ButtonGadget(3, 95, 15, 80, 24,"Button 2")
    CloseGadgetList()
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


ProgressBarGadget

ProgressBarGadget()

Синтаксис

Result = ProgressBarGadget(#Gadget, x, y, Width, Height, Minimum, Maximum [, Flags] )
Описание
Создает ProgressBar в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Значения которые отображаются progress, Значения которые отображаются progress, фиксируются между Minimum Maximum.

'Flags' может содержать один из следующих параметров:
  #PB_ProgressBar_Smooth   : непрерывный прогресс бар вместо блоков
                             (Примечание: В Windows XP при включенном скине, эта опция не имеет эффекта).
  #PB_ProgressBar_Vertical : прогресс бар будет вертикальный.
К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Следующие функции можно использовать для работы с данным гаджетом:

- SetGadgetState() : Изменяет значение progress bar.
- GetGadgetState() : Получает текущее значение progress bar.
- SetGadgetAttribute() : Со следующими атрибутами:
  #PB_ProgressBar_Minimum   : Изменение минимального значения.
  #PB_ProgressBar_Maximum   : Изменение максимального значения.
- GetGadgetAttribute() : Со следующими атрибутами:
  #PB_ProgressBar_Minimum   : Возвращает минимальное значение.
  #PB_ProgressBar_Maximum   : Возвращает максимальное значение.
Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor() аргументом 'ColorType': (Примечание: если в Windows XP, то это не работает)
  #PB_Gadget_FrontColor: Цвет индикатора
  #PB_Gadget_BackColor : Цвет фона
Пример:
  If OpenWindow(0, 0, 0, 320, 160, "ProgressBarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget       (3,  10, 10, 250,  20, "ProgressBar Standard  (50/100)", #PB_Text_Center)
    ProgressBarGadget(0,  10, 30, 250,  30, 0, 100)
    SetGadgetState   (0, 50)   ;  set 1st progressbar (ID = 0) to 50 of 100
    TextGadget       (4,  10, 70, 250,  20, "ProgressBar Smooth  (50/200)", #PB_Text_Center)
    ProgressBarGadget(1,  10, 90, 250,  30, 0, 200, #PB_ProgressBar_Smooth)
    SetGadgetState   (1, 50)   ;  set 2nd progressbar (ID = 1) to 50 of 200
    TextGadget       (5, 100,135, 200,  20, "ProgressBar Vertical  (100/300)", #PB_Text_Right)
    ProgressBarGadget(2, 270, 10,  30, 120, 0, 300, #PB_ProgressBar_Vertical)
    SetGadgetState   (2, 100)   ; set 3rd progressbar (ID = 2) to 100 of 300
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf


RemoveGadgetColumn

RemoveGadgetColumn()

Синтаксис

RemoveGadgetColumn(#Gadget, Column)
Описание
Удаляет столбец определенного #Gadget. Индекс столбцов начинается с 0. Поддерживает следующие гаджеты:

- ListIconGadget()
- ExplorerListGadget()

Пример:
  If OpenWindow(0, 0, 0, 320, 160, "RemoveGadgetColumn", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    ListIconGadget(0, 10, 10, 300, 140, "Hello", 100)
      AddGadgetColumn(0, 1, "Column 2", 70)
      AddGadgetColumn(0, 2, "Column 3", 70)

    RemoveGadgetColumn(0, 1) ; Remove the 'Column 2'

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


RemoveGadgetItem

RemoveGadgetItem()

Синтаксис

RemoveGadgetItem(#Gadget, Position)
Описание
Удаляет пункт определенного #Gadget в указанной Position. Индекс позиции начинается с 0. Поддерживаются следующие гаджеты:

- ComboBoxGadget()
- EditorGadget()
- PanelGadget()
- ListViewGadget()
- ListIconGadget()
- MDIGadget()
- TreeGadget() - Если удаляемый пункт является узлом, то будут удалены все дочерние пункты.


ResizeGadget

ResizeGadget()

Синтаксис

ResizeGadget(#Gadget, x, y, Width, Height)
Описание
Изменяет размер определенного гаджета с идентификаторм #Gadget, в соответствии с новой позицией и размером. Упрощает создание графических интерфейсов (Graphical User Interfaces (GUIs)) с изменяемыми размерами в реальном режиме времени. Можно использовать #PB_Ignore для передачи любого параметра (x, y, Width или Height) и эти параметры не будут изменятся. Это удобно когда гаджет должен изменятся только по высоте или ширине.
  [...]

  ResizeGadget(0, #PB_Ignore, #PB_Ignore, 300, #PB_Ignore) ; Only change the gadget width.


ScrollAreaGadget

ScrollAreaGadget()

Синтаксис

Result = ScrollAreaGadget(#Gadget, x, y, Width, Height, ScrollAreaWidth, ScrollAreaHeight [, ScrollStep [, Flags]] )
Описание
Создает ScrollArea в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Это полезно когда гаджеты не соответствуют размеру окна. В этом случае его можно поместить в scrollarea. Вся прокрутка осуществляется автоматически. Это контейнерный гаджет, и может содержать один или несколько гаджетов в области прокрутки. После создания гаджета, все вновь созданные гаджеты будут находи в области прокрутки. Когда будут добавлены нужные элементы, необходимо вызвать CloseGadgetList() , это даст возможность работать с другими GadgetList. OpenGadgetList() используется для добавления гаджетов в область прокрутки на лету.

'ScrollAreaWidth' и 'ScrollAreaHeight' - это начальные значения области прокрутки содержащиеся в гаджете, и они должны быть больше чем 'Width' и 'Height' гаджета. 'ScrollStep' - это количество пикселей пройденных после нажатия стрелок перемещения. Этот эффект работает только на Windows. #Gadget будет числом возвращаемым функцией EventGadget() . Когда перемещается полоса прокрутки, это событие будет возвращено для данного гаджета.

'Flags' может содержать один из следующих параметров:
  #PB_ScrollArea_Flat       : Плоский Фрейм
  #PB_ScrollArea_Raised     : Поднятый Фрейм
  #PB_ScrollArea_Single     : Углубленный Фрейм
  #PB_ScrollArea_BorderLess : Без границы
  #PB_ScrollArea_Center     : If the inner size is smaller than the outer, the inner area is automatically centered.

Следующие функции можно использовать для работы с данным гаджетом:

GetGadgetAttribute() : С одним из следующих атрибутов:
  #PB_ScrollArea_InnerWidth  : Возвращает ширину (в пикселях), прокручиваемой области.
  #PB_ScrollArea_InnerHeight : Возвращает высоту (в пикселях), прокручиваемой области.
  #PB_ScrollArea_X           : Возвращает текущую позицию горизонтальной прокрутки (в пикселях).
  #PB_ScrollArea_Y           : Возвращает текущую позицию прокрутки по вертикали (в пикселях).
SetGadgetAttribute() : С одним из следующих атрибутов:
  #PB_ScrollArea_InnerWidth  : Изменяет ширину (в пикселях), прокручиваемой области.
  #PB_ScrollArea_InnerHeight : Изменяет высоту (в пикселях), прокручиваемой области.
  #PB_ScrollArea_X           : Изменяет текущую позицию горизонтальной прокрутки (в пикселях).
  #PB_ScrollArea_Y           : Изменяет текущую позицию прокрутки по вертикали (в пикселях).
Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor() с константой #PB_Gadget_BackColor, что позволяет измениять цвет фона.

Пример:
  If OpenWindow(0, 0, 0, 305, 140, "ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ScrollAreaGadget(0, 10, 10, 290,120, 375, 155, 30)
      ButtonGadget  (1, 10, 10, 230, 30,"Button 1")
      ButtonGadget  (2, 50, 50, 230, 30,"Button 2")
      ButtonGadget  (3, 90, 90, 230, 30,"Button 3")
      TextGadget    (4,130,130, 230, 20,"This is the content of a ScrollAreaGadget!",#PB_Text_Right)
      CloseGadgetList()
    Repeat
      Select WaitWindowEvent()
        Case  #PB_Event_CloseWindow
          End
        Case  #PB_Event_Gadget
          Select EventGadget()
            Case 1
              MessageRequester("Info","Button 1 was pressed!",#PB_MessageRequester_Ok)
            Case 2
              MessageRequester("Info","Button 2 was pressed!",#PB_MessageRequester_Ok)
            Case 3
              MessageRequester("Info","Button 3 was pressed!",#PB_MessageRequester_Ok)
          EndSelect
      EndSelect
    ForEver
  EndIf


ScrollBarGadget

ScrollBarGadget()

Синтаксис

Result = ScrollBarGadget(#Gadget, x, y, Width, Height, Minimum, Maximum, PageLength [, Flags] )
Описание
Создает scrollbar в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Это используется для отображения только части объекта. Minimum-Maximum диапазон должен быть между 0 и 10,000. The 'PageLength' - это количество пикселов которые определяют страницу. Например ести изображение шириной 100 пикселов и отображается 25 пикселов. То что отображено и есть страница ('page'), в этом примере длинна страницы будет равна 25, Mininum будет 0 и Maximum будет 100. #Gadget будет числом возвращаемым функцией EventGadget() .

'Flags' может иметь одно из следующих значений:
  #PB_ScrollBar_Vertical : The scrollbar is vertical (instead of horizontal, which is the default).
К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Следующие функции можно использовать для работы с данным гаджетом:

- GetGadgetState() : Возвращает текущее значение перемещения (значение в диапазоне между Minimum-Maximum).
- SetGadgetState() : Изменяет текущую позицию перемещения.
- GetGadgetAttribute() : С одним из следующих атрибутов:
  #PB_ScrollBar_Minimum   : Returns the minimum scroll position.
  #PB_ScrollBar_Maximum   : Returns the maximum scroll position.
  #PB_ScrollBar_PageLength: Returns the PageLength value.
- SetGadgetAttribute() : С одним из следующих атрибутов:
  #PB_ScrollBar_Minimum   : Changes the minimum scroll position.
  #PB_ScrollBar_Maximum   : Changes the maximum scroll position.
  #PB_ScrollBar_PageLength: Changes the PageLength value.

Пример:
  If OpenWindow(0, 0, 0, 305, 140, "ScrollBarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget       (2,  10, 25, 250,  20, "ScrollBar Standard  (start=50, page=30/100)",#PB_Text_Center)
    ScrollBarGadget  (0,  10, 42, 250,  20, 0, 100, 30)
    SetGadgetState   (0,  50)   ; set 1st scrollbar (ID = 0) to 50 of 100
    TextGadget       (3,  10,115, 250,  20, "ScrollBar Vertical  (start=100, page=50/300)",#PB_Text_Right)
    ScrollBarGadget  (1, 270, 10,  25, 120 ,0, 300, 50, #PB_ScrollBar_Vertical)
    SetGadgetState   (1, 100)   ; set 2nd scrollbar (ID = 1) to 100 of 300
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


SetActiveGadget

SetActiveGadget()

Синтаксис

SetActiveGadget(#Gadget)
Описание
Активирует (устанавливает фокус) определенный #Gadget. В основном это используется с ComboBoxGadget() и StringGadget() . При получении фокуса гаджет становится активным, что позволяет принимать данные и оперировать сочетаниями клавиш.

Пример:
  If OpenWindow(0, 0, 0, 270, 140, "SetActiveGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StringGadget  (0, 10, 10, 250, 20, "bla bla...")
    ComboBoxGadget(1, 10, 40, 250, 21)
    For a = 1 To 5 : AddGadgetItem(1, -1, "ComboBox item " + Str(a)) : Next
    SetGadgetState(1, 2)                ; set (beginning with 0) the third item as active one
    ButtonGadget  (2, 10,  90, 250, 20, "Activate StringGadget")
    ButtonGadget  (3, 10, 115, 250, 20, "Activate ComboBox")
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget
        Select EventGadget()
          Case 2 : SetActiveGadget(0)   ; Activate StringGadget
          Case 3 : SetActiveGadget(1)   ; Activate ComboBoxGadget
        EndSelect
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


SetGadgetAttribute

SetGadgetAttribute()

Синтаксис

SetGadgetAttribute(#Gadget, Attribute, Value)
Описание
Изменяет 'Attribute' в
  определенном #Gadget. Эта функция поддерживае
  функции которые имеют атрибуты:

-  ButtonImageGadget()
-  CalendarGadget()
-  DateGadget()
-
   EditorGadget()
-  ExplorerListGadget()
-  ListIconGadget()
-  MDIGadget()
-  ProgressBarGadget()
-  ScrollAreaGadget()
-  ScrollBarGadget()
-  SpinGadget()
-  SplitterGadget()
-  TrackBarGadget()
-  WebGadget()


SetGadgetColor

SetGadgetColor()

Синтаксис

SetGadgetColor(#Gadget, ColorType, Color)
Описание
Изменяет цвет созданный 'ColorType' в определенном #Gadget. Можно использовать RGB() , для получения допустимых значений цветов. Для удаления цвета и возвращения к системным цветам, установленным по умолчанию, установите параметр 'Color' в -1.

Следующие значения поддерживаются ColorType: (не все гаджеты их поддерживают)
  #PB_Gadget_FrontColor     : цвет текста
  #PB_Gadget_BackColor      : цвет фона
  #PB_Gadget_LineColor      : цвет сетки
  #PB_Gadget_TitleFrontColor: цвет текста в названии (для CalendarGadget())
  #PB_Gadget_TitleBackColor : цвет фона в названии (для CalendarGadget())
  #PB_Gadget_GrayTextColor  : цвета неактивного текста (для CalendarGadget())

Следующие гаджеты поддерживают эту функцию: (смотрите
  описание гаджетов, на предмет поддержки ColorType.)

-  CalendarGadget()
-  ContainerGadget()
-  DateGadget()
-
   EditorGadget()
-  ExplorerListGadget()
-  ExplorerTreeGadget()
-  HyperLinkGadget()
-  ListViewGadget()
-  ListIconGadget()
-  MDIGadget()
-  ProgressBarGadget()
-  ScrollAreaGadget()
-  SpinGadget()
-
   StringGadget()
-  TextGadget()
-  TreeGadget()

Примечание: С активизированным стилем Windows XP будут
  проигнорированы или перерисованы поверх.

Пример:
  If OpenWindow(0, 0, 0, 200, 170, "SetGadgetColor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StringGadget(0, 10, 10, 180, 20, "String...")
    ListViewGadget(1, 10, 40, 180, 60)
    For i = 0 To 4
      AddGadgetItem(1, -1, "Text")
    Next i
    ContainerGadget(2, 10, 110, 180, 50, #PB_Container_Raised)

    SetGadgetColor(0, #PB_Gadget_BackColor, $00FFFF)
    SetGadgetColor(1, #PB_Gadget_FrontColor, $FFFFFF)
    SetGadgetColor(1, #PB_Gadget_BackColor, $000000)
    SetGadgetColor(2, #PB_Gadget_BackColor, $0000FF)

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


SetGadgetData

SetGadgetData()

Синтаксис

SetGadgetData(#Gadget, Value)
Описание
Загружает указанное значение в определенный #Gadget. Это значение можно прочитать функцией GetGadgetData() . Это позволяет ассоциировать значения с любыми гаджетами.

Эта функция работает со всеми гаджетами PureBasic.

Пример:
  ; This code uses SetGadgetData to associate an index for the Messages()
  ; array with each button. This makes the event loop simpler as not every
  ; gadget needs to he handled separately.
  ;
  Dim Messages.s(2)
  Messages(0) = "Good morning"
  Messages(1) = "Hello World"
  Messages(2) = "Nothing to say"
  If OpenWindow(0, 0, 0, 190, 100, "SetGadgetData", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0,  10, 10, 80, 20, "Button"): SetGadgetData(0, 1)
    ButtonGadget(1,  10, 40, 80, 20, "Button"): SetGadgetData(1, 2)
    ButtonGadget(2,  10, 70, 80, 20, "Button"): SetGadgetData(2, 1)
    ButtonGadget(3, 100, 10, 80, 20, "Button"): SetGadgetData(3, 2)
    ButtonGadget(4, 100, 40, 80, 20, "Button") ; will have the value 0 because nothing was set yet
    ButtonGadget(5, 100, 70, 80, 20, "Button")
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget
        Value = GetGadgetData(EventGadget())
        MessageRequester("Message", Messages(Value))
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


SetGadgetFont

SetGadgetFont()

Синтаксис

SetGadgetFont(#Gadget, FontID)
Описание
Изменяет шрифт определенного #Gadget. Функция FontID() используется для получения допустимого FontID.

Если в #Gadget будет установлен #PB_Default, то ранее используемый шрифт будет изменет на новый.

Если в 'FontID' будет установлен #PB_Default, то по умолчанию будет использоваться системный шрифт.

Пример:
  If OpenWindow(0, 0, 0, 222, 130, "SetGadgetFont", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If LoadFont(0, "Arial", 16)
      SetGadgetFont(#PB_Default, FontID(0))   ; Set the loaded Arial 16 font as new standard
    EndIf
    ButtonGadget(0, 10, 10, 200, 30, "Button - Arial 16")
    SetGadgetFont(#PB_Default, #PB_Default)  ; Set the font settings back to original standard font
    ButtonGadget(1, 10, 50, 200, 30, "Button - standard")
    If LoadFont(1,"Courier",10, #PB_Font_Bold|#PB_Font_Underline)
      SetGadgetFont(#PB_Default, FontID(1))   ; Set the loaded Courier 10 font as new standard
    EndIf
    TextGadget(2, 10, 90, 200, 40, "Bold + underlined Courier 10 Text", #PB_Text_Center)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


SetGadgetItemAttribute

SetGadgetItemAttribute()

Синтаксис

SetGadgetItemAttribute(#Gadget, Item, Attribute, Value [, Column] )
Описание
Изменяет значение 'Attribute' указанного пункта в определеннм #Gadget. Эта функция доступна для всех гаджетов, которые поддерживают атрибуты пунктов:

- ExplorerListGadget() :
  #PB_Explorer_ColumnWidth : Изменяет ширину столбца 'Column'. Параметр 'Item' игнорируется.
- ListIconGadget() :
  #PB_ListIcon_ColumnWidth : Изменяет ширину столбца 'Column'. Параметр 'Item' игнорируется.


SetGadgetItemColor

SetGadgetItemColor()

Синтаксис

SetGadgetItemColor(#Gadget, Item, ColorType, Color [, Column] )
Описание
Изменяет цвет пункта установленный 'ColorType' в определенном #Gadget. Можно использовать RGB() , для получения допустимых значений цветов. Если у пункта в гаджете не установлены цвета, определяемые ColorType, то пункты будут использовать цвета установленные в данном гаджете. Для удаления цветов установите параметр 'Color' в -1.

Если в параметре 'Item' установить -1, то цвет в данном столбце ('Column') будет применен ко всем пунктам. Если параметр 'Column' будет установлен в -1, то цвет будет применен ко всем столбцам.

Следующие значения поддерживаются параметром ColorType:
  #PB_Gadget_FrontColor     : цвет текста
  #PB_Gadget_BackColor      : цвет фона
Эта функция поддерживается следующими гаджетами:

- ListIconGadget()
- TreeGadget()

Примечание: С активизированным стилем Windows XP будут проигнорированы или перерисованы поверх.

Пример:
  If OpenWindow(0, 0, 0, 300, 300, "SetGadgetItemColor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ListIconGadget(0, 10, 10, 280, 280, "Column 0", 100)
    AddGadgetColumn(0, 1, "Column 1", 100)
    For i = 1 To 10
      AddGadgetItem(0, -1, "Text 1"+Chr(10)+"Text 2")
    Next

    SetGadgetItemColor(0, -1, #PB_Gadget_FrontColor, $0000FF,  1)
    SetGadgetItemColor(0,  3, #PB_Gadget_BackColor,  $00FFFF, -1)
    SetGadgetItemColor(0,  9, #PB_Gadget_BackColor,  $FFFF00,  1)
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


SetGadgetItemData

SetGadgetItemData()

Синтаксис

SetGadgetItemData(#Gadget, Item, Value)
Описание
Хранит значение пункта в определенном #Gadget. Это значение можно прочитать функцией GetGadgetItemData() . Это позволяет ассоциировать пользовательские значения с пунктами гаджета. Это значение останется с пунктом даже если пункт изменит свой индекс (например, если другие пункты были удалены).

Эта функция поддерживает следующие гаджеты:
- ComboBoxGadget()
- ListIconGadget()
- ListViewGadget()
- TreeGadget()

Пример:
  ; This code uses SetGadgetItemData to store the original position
  ; of each item to later know it, even if the items index changed.
  ;
  If OpenWindow(0, 0, 0, 280, 250, "SetGadgetItemData", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0,  10, 10, 80, 20, "Add")
    ButtonGadget(1, 100, 10, 80, 20, "Remove")
    ButtonGadget(2, 190, 10, 80, 20, "Test")
    ListViewGadget(3, 10, 40, 260, 200)
    For i = 0 To 10
      AddGadgetItem(3, i, "Old Item "+Str(i))
      SetGadgetItemData(3, i, i)
    Next i

    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget
        item = GetGadgetState(3)

        Select EventGadget()
          Case 0 ; Add
            AddGadgetItem(3, item, "New Item")
            If item <> -1
              SetGadgetItemData(3, item, -1)
            Else
              SetGadgetItemData(3, CountGadgetItems(3)-1, -1)
            EndIf

          Case 1 ; Remove
            If item <> -1
              RemoveGadgetItem(3, item)
            EndIf

          Case 2 ; Test
            If item <> -1
              value = GetGadgetItemData(3, item)
              If value = -1
                MessageRequester("", "Its a new item.")
              Else
                MessageRequester("", "It was item number "+Str(value))
              EndIf
            EndIf

        EndSelect
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


SetGadgetItemState

SetGadgetItemState()

Синтаксис

SetGadgetItemState(#Gadget, Item, State)
Описание
Изменяет состояние пункта определенного #Gadget. Это универсальная функция, которая поддерживает работу почти со всеми гаджетами поддерживающими работу с несколькими пунктами.
'State' может иметь следующие значения:
- CalendarGadget() : #PB_Calendar_Bold отображает дату полужирной, #PB_Calendar_Normal в стандартном виде.
- ListViewGadget() : 1 при выборе пункта, иначе 0.
- ListIconGadget() : Комбинация следующих значений:
  #PB_ListIcon_Selected: этот пункт должен быть выбран.
  #PB_ListIcon_Checked : данный пункт должен быть отмечен галочкой (#PB_ListIcon_CheckBoxes flags).
- TreeGadget() : Комбинация следующих значений:
  #PB_Tree_Selected  : Этот пункт должен быть выбран.
  #PB_Tree_Expanded  : Этот пункт будет развернут.
  #PB_Tree_Collapsed : Этот пункт будет закрыт. If neither #PB_Tree_Expanded nor #PB_Tree_Collapsed is set, this state will not be changed.
  #PB_Tree_Checked   : checkbox должен быть установлен.

  SetGadgetItemState(0, 1, #PB_Tree_Expanded | #PB_Tree_Selected) ; The 2nd item is selected and expanded.


SetGadgetItemText

SetGadgetItemText()

Синтаксис

SetGadgetItemText(#Gadget, Item, Text$ [, Column] )
Описание
Изменяет текст указанного пункта определенного элемента #Gadget. Это универсальная функция, которая поддерживает работу почти со всеми гаджетами поддерживающими работу с несколькими пунктами:

- ComboBoxGadget()
- EditorGadget()
- ExplorerListGadget() : Если Item = -1, то текст данного пункта изменен.
- ListIconGadget() : Если Item = -1, то текст данного пункта изменен.
- ListViewGadget()
- MDIGadget()
- PanelGadget()
- TreeGadget()
- WebGadget() : С #PB_Web_HtmlCode изменяет html код в гаджете как пункта 'Item'.


SetGadgetState

SetGadgetState()

Синтаксис

SetGadgetState(#Gadget, State)
Описание
Изменяет текущее состояние определенного #Gadget. Эта функция работает почти со всеми гаджетами:

- ButtonImageGadget() : изменяет текущее состояние гаджета #PB_Button_Toggle (1 = переключено, 0 = нормально).
- ButtonGadget() : изменяет текущее состояние гаджета #PB_Button_Toggle (1 = переключено, 0 = нормально).
- CalendarGadget() : устанавливает дату к настоящему моменту времени.
- CheckBoxGadget() : 1 отмечено, иначе 0.

- ComboBoxGadget() : изменяет пункт выбранный в настоящий момент времени.
- DateGadget() : устанавливает дату к настоящему моменту времени. Если используется #PB_Date_CheckBox, то установите 'State' в 0, это позволит не проверять checkbox.
- ImageGadget() : изменяет текущее изображение гаджета.
- IPAddressGadget() : изменяет текущий IP адрес.
- ListIconGadget() : изменяет пункт выбранный в настоящий момент времени. Если установить -1, то будет снято выделение со всех пунктов.
- ListViewGadget() : изменяет пункт выбранный в настоящий момент времени. Если установить -1, то выделение будет снято.
- MDIGadget() : Изменяет фокус выбранного в настоящий момент времени дочернего окна (дает связанное число #Window), или используйте одно из следующих значений:
  #PB_MDI_Cascade         : дочерние окна каскадом
  #PB_MDI_TileVertically  : дочерние окна вертикально
  #PB_MDI_TileHorizontally: дочерние окна горизонтально
  #PB_MDI_Next            : Дать фокус следующему дочерниму окну
  #PB_MDI_Previous        : Дать фокус предыдущему дочерниму окну
  #PB_MDI_Arrange         : Упорядочить (свернутые) windows
- OptionGadget() : 1 активизирует гаджет, иначе 0.
- PanelGadget() : изменяет текущую панель.
- ProgressBarGadget() : изменяет значение progress bar.
- ScrollBarGadget() : изменяет текущую позицию scrollbar.
- SpinGadget() : изменяет текущее значение.
- SplitterGadget() : изменяет текущую позицию splitter, в пикселах.
- TrackBarGadget() : изменяет текущую позицию курсора.
- TreeGadget() : изменяет пункт выбранный в настоящий момент времени, -1 пункт не выбран.
- WebGadget() : выполняет некоторые действия в гаджете. Смотрите описание WebGadget.

Примечание: Посмотрите описание Windows Message Handling об обработке событий в Windows.


SetGadgetText

SetGadgetText()

Синтаксис

SetGadgetText(#Gadget, Text$)
Описание
Изменяет текстовое содержимое определенного #Gadget. Эта функция полезна для:

- ButtonGadget() : изменяет текст ButtonGadget.
- ComboBoxGadget() : Устанавливает отображаемый текст. Если ComboBoxGadget не доступен для редактирования, то текст должен быть в раскрывающемся списке.
- DateGadget() : изменяет маску ввода для даты. Смотрите FormatDate() для создания формата с параметром Text$.
- EditorGadget() : изменяет текстовое содержимое editor гаджета. Если нужно добавить несколько строк сразу, то разделите их "Chr(13)+Chr(10)".
- ExplorerComboGadget() : изменяет текущий отображаемый каталог.
- ExplorerListGadget() : изменяет текущий отображаемый каталог и/или шаблон для файлов (более подробно смотрите ExplorerListGadget() ).
- ExplorerTreeGadget() : изменяет текущий выбранный каталог и/или шаблон для файлов (более подробно смотрите ExplorerTreeGadget() ).
- Frame3DGadget() : изменяет заголовок Frame3DGadget.
- HyperLinkGadget() : изменяет текст HyperLinkGadget.
- ListViewGadget() : выбирает пункт который соответствует указанному тексту.
- StringGadget() : изменяет содержимое StringGadget.
- TextGadget() : изменяет содержимое TextGadget.
- TreeGadget() : изменяет текст пункта выбранного в настоящий момент времени.
- WebGadget() : изменяет текущий URL.


ShortcutGadget

ShortcutGadget()

Синтаксис

Result = ShortcutGadget(#Gadget, x, y, Width, Height, Shortcut)
Описание
Создает гаджет для выбора быстрых клавиш в текущем GadgetList. Пользователь может выбрать нажатием или напрямую ввести желаемую комбинацию клавиш, чтобы установить новое сочетание клавиш. Если #PB_Any используется в качестве параметра '#Gadget', то номер нового гаджета будет возвращен как 'Result'. #Gadget это номер, который возвращается в EventGadget(), когда пользователь меняет сочетание клавиш.

'Shortcut' определяет начальное сочетание клавиш. Возможные значения - те же, что и в AddKeyboardShortcut(). Значение 0 указывает, что сочетание клавиш не определено. Вы можете добавить 'мини помощь' на этот гаджет с помощьюGadgetToolTip().

Следующие команды могут использоваться для управления ShortcutGadget:

- GetGadgetState(): Возвращает текущую комбинацию клавиш.
- SetGadgetState(): Изменяет текущую комбинацию клавиш.

Пример:

  If OpenWindow(0, 0, 0, 240, 70, "ShortcutGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ShortcutGadget(0, 20, 20, 200, 25, #PB_Shortcut_Control|#PB_Shortcut_A)
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


SpinGadget

SpinGadget()

Синтаксис

Result = SpinGadget(#Gadget, x, y, Width, Height, Minimum, Maximum [, Flags] )
Описание
Создает SpinGadget в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. #Gadget будет числом возвращенным функцией EventGadget() .
'Flags' может содержать один из следующих параметров:
  #PB_Spin_ReadOnly : строка гаджета не редактируемая, число может быть изменено только стрелками
  #PB_Spin_Numeric  : текст будет автоматически обновляться текущим значением SetGadgetText.
К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Следующие функции можно использовать для работы с данным гаджетом:

GetGadgetState() : Получает текущее значение гаджета.
SetGadgetState() : Изменяет значение гаджета. Для того, чтобы отобразить новое значение нужно использовать SetGadgetText() !
GetGadgetText() : Получает текст содержащийся в гаджете.
SetGadgetText() : Изменяет текст содержащийся в гаджете.
GetGadgetAttribute() : С одним из следующих атрибутов:
  #PB_Spin_Minimum   : Возвращает минимальное значение.
  #PB_Spin_Maximum   : Возвращает максимальное значение.
SetGadgetAttribute() : С одним из следующих атрибутов:
  #PB_Spin_Minimum   : Изменяет минимальное значение.
  #PB_Spin_Maximum   : Изменяет максимальное значение.
Следующие события поддерживаются EventType() :
  #PB_EventType_Change: пользователь изменил текст в поле ввода.
                     1: 'Up' была нажата.
                    -1: 'Down' была нажата.
Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor() с аргументом 'ColorType':
  #PB_Gadget_FrontColor: Цвет такста
  #PB_Gadget_BackColor : Цвет фона

Пример:
  If OpenWindow(0, 0, 0, 140, 70, "SpinGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    SpinGadget     (0, 20, 20, 100, 25, 0, 1000)
    SetGadgetState (0, 5) : SetGadgetText(0, "5")   ; set initial value
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget
        If EventGadget() = 0
          SetGadgetText(0,Str(GetGadgetState(0)))
        EndIf
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


SplitterGadget

SplitterGadget()

Синтаксис

Result = SplitterGadget(#Gadget, x, y, Width, Height, #Gadget1, #Gadget2 [, Flags] )
Описание
Создает Splitter в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Splitter содержит два гаджета разделенные горизонтальным или вертикальным разделителем, при перемещении которого гаджеты автоматически изменяют размеры. #Gadget является числом возвращаемым функцией EventGadget() .

'Flags' может содержать одну из следующих констант:
  #PB_Splitter_Vertical    : SplitterGadget будет разделен по вертикали(по умолчанию, по горизонтали).
  #PB_Splitter_Separator   : A 3D-looking separator is drawn in the splitter.
  #PB_Splitter_FirstFixed  : При изменении размера SplitterGadget, первый гаджет сохраняет свои размеры
  #PB_Splitter_SecondFixed : При изменении размера SplitterGadget, второй гаджет сохраняет свои размеры
К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Следующие функции можно использовать для работы с данным гаджетом:

GetGadgetState() : Получает текущую позицию splitter в пикселах.
SetGadgetState() : Изменяет текущую позицию splitter в пикселах.
GetGadgetAttribute() : С одним из следующих атрибутов:
  #PB_Splitter_FirstMinimumSize : Получает минимальный размер (в пикселях), который первое устройство может иметь.
  #PB_Splitter_SecondMinimumSize: Получает минимальный размер (в пикселях), который второе устройство может иметь.
  #PB_Splitter_FirstGadget      : Получает номер первого устройства.
  #PB_Splitter_SecondGadget     : Получает номер второго устройства.
SetGadgetAttribute() : С одним из следующих атрибутов:
  #PB_Splitter_FirstMinimumSize : Изменяет минимальный размер (в пикселях), который первое устройство может иметь.
  #PB_Splitter_SecondMinimumSize: Изменяет минимальный размер (в пикселях), который второе устройство может иметь.
  #PB_Splitter_FirstGadget      : Изменяет номер первого устройства.
  #PB_Splitter_SecondGadget     : Изменяет номер второго устройства.
Примечание: При замене гаджетов с помощью функции SetGadgetAttribute() , предыдущий гаджет не будет автоматически удалён. Он просто переместится в родительское окно сплиттера. Это позволяет изменять гаджеты в сплиттере без необходимости их повторного создания. Если гаджет, находящийся в сплиттере нужно уничтожить, то его сначала нужно извлечь из сплиттера с помощью функции GetGadgetAttribute() , а затем уничтожить функцией FreeGadget() . Учтите, один гаждет не может находится одновременно в двух или более сплиттерах! Если потребуется переместить гаджет с одного сплиттера на другой, то его сначала нужно обводить от текущего сплиттера, чтобы гаджет переместился в основное окно, а затем поместить его во второй сплиттер.

Пример:
  If OpenWindow(0, 0, 0, 230, 180, "SplitterGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    #Button1  = 0
    #Button2  = 1
    #Splitter = 2

    ButtonGadget(#Button1, 0, 0, 0, 0, "Button 1") ; No need to specify size or coordiantes
    ButtonGadget(#Button2, 0, 0, 0, 0, "Button 2") ; as they will be sized automatically
    SplitterGadget(#Splitter, 5, 5, 220, 120, #Button1, #Button2, #PB_Splitter_Separator)

    TextGadget(3, 10, 135, 210, 40, "Above GUI part shows two automatically resizing buttons inside the 230x130 SplitterGadget area.",#PB_Text_Center )

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


StringGadget

StringGadget()

Синтаксис

Result = StringGadget(#Gadget, x, y, Width, Height, Content$ [, Flags] )
Описание
Создает String в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. #Gadget является числом возвращаемым функцией EventGadget() . 'Content$' определяет начальное содержание StringGadget. Этот гаджет отображает только одну строку текста. Для многострочного ввода используйте функцию EditorGadget() .

'Flags' поддерживает следующие константы (используйте оператор '|' OR ):
  #PB_String_Numeric    : принимаются только (положительные) целые числа.
  #PB_String_Password   : Пароль отображает только '*' вместо символов.
  #PB_String_ReadOnly   : режим только для чтения. Вы неможете ввести текст.
  #PB_String_LowerCase  : Все символы автоматически преобразуются в нижний регистр.
  #PB_String_UpperCase  : Все символы автоматически преобразуются в верхний регистр.
  #PB_String_BorderLess : граница не отображается вокруг гаджета.
Позже содержимое можно изменить функцией SetGadgetText() и получить GetGadgetText() .

Следующие события поддерживаются функцией EventType() :
  #PB_EventType_Change    : Текст был изменен пользователем.
  #PB_EventType_Focus     : StringGadget получил фокус.
  #PB_EventType_LostFocus : StringGadget потерял фокус.
Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor() с аргументом 'ColorType':
  #PB_Gadget_FrontColor: Цвет такста
  #PB_Gadget_BackColor : Цвет фона
К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .
Пример:
  ; Shows possible flags of StringGadget in action...
  If OpenWindow(0, 0, 0, 322, 205, "StringGadget Flags", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StringGadget(0, 8,  10, 306, 20, "Normal StringGadget...")
    StringGadget(1, 8,  35, 306, 20, "1234567", #PB_String_Numeric)
    StringGadget(2, 8,  60, 306, 20, "Readonly StringGadget", #PB_String_ReadOnly)
    StringGadget(3, 8,  85, 306, 20, "lowercase...", #PB_String_LowerCase)
    StringGadget(4, 8, 110, 306, 20, "uppercase...", #PB_String_UpperCase)
    StringGadget(5, 8, 140, 306, 20, "Borderless StringGadget", #PB_String_BorderLess)
    StringGadget(6, 8, 170, 306, 20, "Password", #PB_String_Password)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


TextGadget

TextGadget()

Синтаксис

Result = TextGadget(#Gadget, x, y, Width, Height, Text$ [, Flags] )
Описание
Создает TextGadget в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. TextGadget - это текстовая область для отображения текста, без возможности ввода.

Содержимое можно изменять функцией SetGadgetText() и получать GetGadgetText() . Шрифты в TextGadget() можно изменять функцией SetGadgetFont() .

'Flags' может содержать следующие константы:
  #PB_Text_Center : текст отображается по центру.
  #PB_Text_Right  : текст отображается по правому краю.
  #PB_Text_Border : утопленные границы вокруг гаджета.
Этот гаджет поддерживает функции SetGadgetColor() и GetGadgetColor() с аргументом 'ColorType':
  #PB_Gadget_FrontColor: Цвет такста
  #PB_Gadget_BackColor : Цвет фона
Примечание: Этот гаджет не получает событий, и не поддерживает GadgetToolTip() .

Пример:
  If OpenWindow(0, 0, 0, 270, 160, "TextGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget(0, 10,  10, 250, 20, "TextGadget Standard (Left)")
    TextGadget(1, 10,  70, 250, 20, "TextGadget Center", #PB_Text_Center)
    TextGadget(2, 10,  40, 250, 20, "TextGadget Right", #PB_Text_Right)
    TextGadget(3, 10, 100, 250, 20, "TextGadget Border", #PB_Text_Border)
    TextGadget(4, 10, 130, 250, 20, "TextGadget Center + Border", #PB_Text_Center|#PB_Text_Border)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


TrackBarGadget

TrackBarGadget()

Синтаксис

Result = TrackBarGadget(#Gadget, x, y, Width, Height, Minimum, Maximum [, Flags] )
Описание
Создает TrackBar в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. Этот гаджет позволяет создавать slide bar с указанным диапазоном значений, как в мультимедиа плейерах. Диапазон Minimum-Maximum должен быть между 0 и 10,000. #Gadget является числом возвращаемым функцией EventGadget() .

'Flags' можно составить из следующих констант:
  #PB_TrackBar_Ticks    : Display a 'tick' marker at each step.
  #PB_TrackBar_Vertical : The trackbar is vertical (instead of horizontal which is the default).
К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Следующие функции можно использовать для работы с данным гаджетом:

- GetGadgetState() : Возвращает текущую позицию курсора (значение между Minimum-Maximum диапазоном).
- SetGadgetState() : Изменяет текущую позицию курсора.
- GetGadgetAttribute() : С одним из следующих атрибутов:
  #PB_TrackBar_Minimum   : Возвращает минимальное значение.
  #PB_TrackBar_Maximum   : Возвращает максимальное значение.
- SetGadgetAttribute() : С одним из следующих атрибутов:
  #PB_TrackBar_Minimum   : Изменяет минимальное значение.
  #PB_TrackBar_Maximum   : Изменяет максимальное значение.

Пример:
  If OpenWindow(0, 0, 0, 320, 200, "TrackBarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget    (3, 10,  20, 250, 20,"TrackBar Standard", #PB_Text_Center)
    TrackBarGadget(0, 10,  40, 250, 20, 0, 10000)
    SetGadgetState(0, 5000)
    TextGadget    (4, 10, 100, 250, 20, "TrackBar Ticks", #PB_Text_Center)
    TrackBarGadget(1, 10, 120, 250, 20, 0, 30, #PB_TrackBar_Ticks)
    SetGadgetState(1, 3000)
    TextGadget    (5,  90, 180, 200, 20, "TrackBar Vertical", #PB_Text_Right)
    TrackBarGadget(2, 270, 10, 20, 170, 0, 10000, #PB_TrackBar_Vertical)
    SetGadgetState(2, 8000)
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


TreeGadget

TreeGadget()

Синтаксис

Result = TreeGadget(#Gadget, x, y, Width, Height [, Flags] )
Описание
Создает TreeGadget в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. #Gadget является числом возвращаемым функцией EventGadget() . Сразу после создания TreeGadget, его список пуст.

Каждому пункту в дереве каталога присваивается значение подуровня, для определения его взаимосвязи с пунктом лежащим ниже. Пункты с тем же самым подуровнем пренадлежат тому же самому узлу, пункты с более высоким подуровнем являются дочерними пунктами, и так далее. Это значение подуровня можно использовать для выявления взаимосвязей между двумя пунктами, сравнивая их значения подуровней. Используя 'Flags' и функцию AddGadgetItem() можно создавать в TreeGadget подуровни в которые добавляются новые пункты. Обратите внимание, что если функция вызвана с подуровнем в котором нельзя добавлять пункт, то пункт будет добавлен в подуровень где эта возможность есть.

'Flags' может содержать следующие константы (используйте оператор '|' OR ):
  #PB_Tree_AlwaysShowSelection : Даже если гаджет не активирован, выбор остается видимым.
  #PB_Tree_NoLines             : Скрыть черточки между всеми узлами.
  #PB_Tree_NoButtons           : Скрыть кнопки '+' узлов.
  #PB_Tree_CheckBoxes          : Добавить флажок перед каждым элементом.
К этому гаджету можете добавить всплывающую подсказку с помощью функции GadgetToolTip() .

Следующие функции можно использовать для работы с данным гаджетом:

- AddGadgetItem() : Добавляет пункт (опционально можно добавить иконки размером 16x16).
- RemoveGadgetItem() : Удаляет пункт (и все дочерние пункты).
- ClearGadgetItems() : Удаляет все пункты.
- CountGadgetItems() : Возвращает количество пунктов имеющихся в настоящий момент времени в #Gadget.
- GetGadgetItemState() : Возвращает текущее состояние указанного пункта.
- SetGadgetItemState() : Изменяет текущее состояние указанного пункта.
- GetGadgetItemText() : Возвращает текущий текст указанного пункта.
- SetGadgetItemText() : Изменяет текущий текст указанного пункта.
- GetGadgetItemData() : Возвращает значение которое сохранилось в указанном пункте.
- SetGadgetItemData() : Сохраняет значение с указанным пунктом.
- GetGadgetState() : Возвращает текущий выбранный пункт.
- SetGadgetState() : Устанавливает выбранный пункт в настоящий момент времени.
- GetGadgetText() : Возвращает текст пункта выбранного в настоящий момент времени.
- SetGadgetText() : Изменяет текст пункта выбранного в настоящий момент времени.
- GetGadgetItemAttribute() : Со следующим атрибутом:
  #PB_Tree_SubLevel: Возвращает подуровень данного пункта.
- GadgetItemID() : Возвращает хендл OS указанного пункта (полезно для API).

Следующие события поддерживаются функцией EventType() :
  #PB_EventType_LeftClick: left click on an item, or a checkbox was checked/unchecked
  #PB_EventType_LeftDoubleClick
  #PB_EventType_RightClick
  #PB_EventType_RightDoubleClick
  #PB_EventType_Change: the current item changed
  #PB_EventType_DragStart: the user tried to start a Drag & Drop operation.
После события #PB_EventType_DragStart можно использовать библиотеку Drag & Drop library , это позволяет применять Drag & Drop.
Пример:
  If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TreeGadget(0, 10, 10, 160, 160)                                         ; TreeGadget standard
    TreeGadget(1, 180, 10, 160, 160, #PB_Tree_CheckBoxes|#PB_Tree_NoLines)  ; TreeGadget with Checkboxes + NoLines
    For ID = 0 To 1
      For a = 0 To 10
        AddGadgetItem (ID, -1, "Normal Item "+Str(a), 0, 0) ; if you want to add an image, use
        AddGadgetItem (ID, -1, "Node "+Str(a), 0, 0)        ; ImageID(x) as 4th parameter
        AddGadgetItem(ID, -1, "Sub-Item 1", 0, 1)    ; These are on the 1st sublevel
        AddGadgetItem(ID, -1, "Sub-Item 2", 0, 1)
        AddGadgetItem(ID, -1, "Sub-Item 3", 0, 1)
        AddGadgetItem(ID, -1, "Sub-Item 4", 0, 1)
        AddGadgetItem (ID, -1, "File "+Str(a), 0, 0) ; sublevel 0 again
      Next
    Next
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


UseGadgetList

UseGadgetList()

Синтаксис

Result = UseGadgetList(WindowID)
Описание
Выбирает окно GadgetList, к которому будут добавлятся гаджеты. Если в GadgetList еще нет окна, оно будет создано. (т.к. оно создается с флагом #PB_Window_NoGadgets в OpenWindow() или потому что это не окно PB)

Прараметры

'WindowID' определяет окно для добавления нового гаджета. Это можно получить функцией WindowID() . Если 'WindowID' равено 0, то вернется текущее окно GadgetList, и ничто не будет изменено.

Возвращаемое значение

Возвращает WindowID предыдущего окна GadgetList, или 0 если окна отсутствовали. Это значение можно использовать для возвращения к предыдущему GadgetList.

Пример:

Этот пример показывает как использовать это функцию. Создается новое окно с гаджетами, не прерывая создание гаджетов в текущем окне:
  If OpenWindow(0, 0, 0, 500, 500, "Main Window", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    ButtonGadget(0, 10, 10, 150, 25, "Button 1")

    ; Create Window with #PB_Window_NoGadgets to prevent automatic GadgetList creation
    If OpenWindow(1, 0, 0, 300, 200, "Child Window", #PB_Window_TitleBar|#PB_Window_WindowCentered|#PB_Window_NoGadgets, WindowID(0))
      OldGadgetList = UseGadgetList(WindowID(1)) ; Create GadgetList and store old GadgetList

      ButtonGadget(10, 10, 10, 150, 25, "Child Window Button")

      UseGadgetList(OldGadgetList)               ; Return to previous GadgetList
    EndIf

    ButtonGadget(1, 10, 45, 150, 25, "Button 2") ; This will be on the main window again

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


WebGadget

WebGadget()

Синтаксис

Result = WebGadget(#Gadget, x, y, Width, Height, URL$ [, Flags] )
Описание
Создает WebGadget в текущем GadgetList. Если в качестве параметра '#Gadget' установить #PB_Any , то универсальный идентификатор (id) будет возвращен в качестве 'Result'. #Gadget является числом возвращаемым функцией EventGadget() .

'Flags' может содержать одну из следующих констант:
  #PB_Web_Mozilla : Использование ActiveX Mozilla вместо IE (только для Windows).
Следующие функции можно использовать для работы с данным гаджетом:

- SetGadgetText() : Изменяет текущий URL.
- GetGadgetText() : Получает текущий URL.
- SetGadgetState() : Выполняет указанные действия в гаджете. Доступны следующие константы:
  #PB_Web_Back   : шаг назад в истории переходов.
  #PB_Web_Forward: шаг вперед в истории переходов.
  #PB_Web_Stop   : остановка загрузки текущей страницы.
  #PB_Web_Refresh: обновление текущей страницы.
Примечание: Следующие функции не работают в окне с Mozilla ActiveX (флаг #PB_Web_Mozilla)

- SetGadgetItemText() : С #PB_Web_HtmlCode поскольку 'Item' html код можно передать потоком в Gadget.
- GetGadgetItemText() : Следующие константы можно использовать для получения информации:
  #PB_Web_HtmlCode     : Возвращает HTML-код в гаджете.
  #PB_Web_PageTitle    : Возвращает заголовок страницы.
  #PB_Web_StatusMessage: Возвращает текущее сообщение в строке состояния.
  #PB_Web_SelectedText : Возвращает выбранный текст внутри гаджетов.
- SetGadgetAttribute() : Установите следующие атрибуты:
  #PB_Web_ScrollX       : устанавливает положение горизонтальной полосы прокрутки.
  #PB_Web_ScrollYґ      : устанавливает положение вертикальной полосой прокрутки.
  #PB_Web_BlockPopups   : Блокировка всплывающих окон. #PB_EventType_PopupWindow передается как сообщение о событии, если эта опция включена.
  #PB_Web_BlockPopupMenu: Блокировать всплывающее меню по умолчанию. #PB_EventType_PopupMenu передается как сообщение о событии, если эта опция включена.
  #PB_Web_NavigationCallback: Установить callback для того, чтобы контролировать (и отключить) передвижение.
У NavigationCallback должен быть следующий формат.
  Procedure NavigationCallback(Gadget, Url$)
    ;
    ; Возвращает #True, чтобы позволить навигацию или #False для запрета.
    ;
    ProcedureReturn #True
  EndProcedure
- GetGadgetAttribute() : Получает следующие атрибуты:
  #PB_Web_ScrollX       : Получить горизонтальную позицию прокрутки.
  #PB_Web_ScrollYґ      : Получить вертикальную позицию прокрутки.
  #PB_Web_Busy          : ненулевое значение возвращается, если гаджет будет занят загрузкой страницы.
  #PB_Web_Progress      : Возвращает текущий прогресс после событий #PB_EventType_DownloadProgress event.
  #PB_Web_ProgressMax   : Возвращает максимальный прогресс после событий #PB_EventType_DownloadProgress event.
  #PB_Web_BlockPopups   : Определяет текущие настройки для блокировки всплывающих окон.
  #PB_Web_BlockPopupMenu: Определяет текущие настройки для блокировки всплывающих меню.
  #PB_Web_NavigationCallback: Возвращает текущее значение callback (если таковые имеются).
Примечание: Всплывающие окна и всплывающие меню в WebGadget не поддерживаются в Linux. Тем не менее #PB_Web_BlockPopups все же можно установить, чтобы разрешить событие #PB_EventType_PopupWindow. Это относится и к #PB_Web_BlockPopupMenu.

Следующие события поддерживаются types of events :
  #PB_EventType_TitleChange     : заголовок страницы изменился.
  #PB_EventType_StatusChange    : сообщение состояния изменилось.
  #PB_EventType_DownloadStart   : загрузка страницы началась.
  #PB_EventType_DownloadProgress: Информация роста загрузки доступна GetGadgetAttribute().
  #PB_EventType_DownloadEnd     : загрузка страницы закончена или прервана.
  #PB_EventType_PopupWindow     : Было заблокировано всплывающее окно.
  #PB_EventType_PopupMenu       : Было заблокировано всплывающее меню.
Примечание: на Microsoft Windows WebGadget использует Internet Explorer 4.0+ и объект ActiveX. Это означает что IE уже должен быть установлен (он входит в Win98/Me и Win2000/XP). Библиотека ATL.dll, которая лежит в директории PureBasic\Compilers\ должна находится в каталоге с исполняемым файлом. Как альтернатива, Mozilla ActiveX можно использовать вместо этого ( http://www.iol.ie/~locka/mozilla/mozilla.htm ), если установлен флаг #PB_Web_Mozilla (Mozilla ActiveX нужно устанавливать отдельно, он не входит в поставку FireFox или Mozilla).

Пример:
  If OpenWindow(0, 0, 0, 600, 300, "WebGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    WebGadget(0, 10, 10, 580, 280, "http://www.purebasic.com")
    ; Note: if you want to use a local file, change last parameter to "file://" + path + filename
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


WebGadgetPath

WebGadgetPath()

Синтаксис

Result = WebGadgetPath(LibraryFile$ [, MozillaPath$] )
Описание
Определяет путь к библиотеке для Gtk Mozilla Embedding Widget, которая используется WebGadget() под Linux. Эта функция работает только под Linux.

LibraryFile$ определяет полный путь (включая имя файла) к mozilla embedding library. Если аргумент пуст, то библиотека "libgtkembedmoz.so" будет найдена в:
- Все каталоги перечисленные в переменной LD_LIBRARY_PATH.
- Все библиотеки перечисленные в /etc/ld.so.cache.
- /lib, followed by /usr/lib

MozillaPath$ определяет путь где лежат компоненты mozilla (обычно они находятся где установлены mozilla или firefox browser). В этом аргументе нет необходимости, если libgtkembedmoz.so расположен в одном каталоге с компонентами mozilla. Обратите внимание, что если этот путь не правильный, то WebGadget() будучи правильно установленным не сможет загружать страницы.

Если libgtkembedmoz.so находится в одном каталоге с mozilla components и найден в одном из вышеперечисленных путей, то в этой функции нет необходимости.

Возвращаемое значение

Возвращает 1, если библиотека загружена, иначе 0. Обратите внимание что путь MozillaPath$ нельзя проверить.

Поддерживаемые ОС

Linux


Gadget3D

PureBasic - Gadget3D

Краткий обзор

The Gadget3D library allows to create complex Graphical User Interface (GUI) directly over the screen area, using the 3D engine. This is mainly intended for game or application which needs user inputs while running in fullscreen mode. This library is is based on the regular PureBasic gadget library, and offer similar syntax and behaviour. The GUI engine used is CEGUI, which offer some nice options like skinning, good speed and a lot of build-in gadgets. More information about CEGUI can be found here: http://www.cegui.org.uk.

It uses the 3D engine, so InitEngine3D() has to be called succesfully before using these functions.

Before using gadgets there will be normally opened a window first.

Краткий перечень команд

AddGadgetItem3D
ButtonGadget3D
CheckBoxGadget3D
ClearGadgetItems3D
CloseGadgetList3D
ComboBoxGadget3D
ContainerGadget3D
CountGadgetItems3D
DisableGadget3D
EditorGadget3D
Frame3DGadget3D
FreeGadget3D
GadgetHeight3D
GadgetID3D
GadgetToolTip3D
GadgetType3D
GadgetWidth3D
GadgetX3D
GadgetY3D
GetActiveGadget3D
GetGadgetAttribute3D
GetGadgetData3D
GetGadgetItemData3D
GetGadgetItemState3D
GetGadgetItemText3D
GetGadgetState3D
GetGadgetText3D
HideGadget3D
ImageGadget3D
IsGadget3D
ListViewGadget3D
OpenGadgetList3D
OptionGadget3D
PanelGadget3D
ProgressBarGadget3D
RemoveGadgetItem3D
ResizeGadget3D
ScrollAreaGadget3D
ScrollBarGadget3D
SetActiveGadget3D
SetGadgetAttribute3D
SetGadgetData3D
SetGadgetItemData3D
SetGadgetItemState3D
SetGadgetItemText3D
SetGadgetState3D
SetGadgetText3D
SpinGadget3D
StringGadget3D
TextGadget3D


AddGadgetItem3D

AddGadgetItem3D()

Синтаксис

Result = AddGadgetItem3D(#Gadget3D, Position, Text$ [, TextureID [, Flags]])
Описание
Add an item to the specified #Gadget3D. An optional TextureID() can be specified for any gadgets which support it.

The following gadgets are supported:

- ComboBoxGadget3D()
- EditorGadget3D()
- ListViewGadget3D()
- PanelGadget3D()

The position specifies the item index where the new item should be inserted. To add the item at the start, use an index of 0. To add this item to the end of the current item list, use a value of -1. Remember that when you add an item that all current items which come after the new one will have their positions increased by 1.


ButtonGadget3D

ButtonGadget3D()

Синтаксис

Result = ButtonGadget3D(#Gadget3D, x, y, Width, Height, Text$ [, Flags])
Описание
Create a button gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. #Gadget3D will be the number returned by EventGadget3D() function.

'Flags' are always optional and can be composed of one or several (using the bitwise OR operator '|') of the following constants:
  #PB_Button3D_Toggle    : Creates a toggle button: one click pushes it, another will release it.
To add a 'mini help' to this gadget, use GadgetToolTip3D().

The following functions can be used to control the gadget:

- SetGadgetText3D(): Changes the text of the ButtonGadget.
- GetGadgetText3D(): Returns the text of the ButtonGadget.
- SetGadgetState3D(): Used with #PB_Button3D_Toggle buttons to set the actual state (1 = toggled, 0 = normal).
- GetGadgetState3D(): Used with #PB_Button3D_Toggle buttons to get the actual state of the button (1 = toggled, 0 = normal).


CheckBoxGadget3D

CheckBoxGadget3D()

Синтаксис

Result = CheckBoxGadget3D(#Gadget3D, x, y, Width, Height, Text$)
Описание
Create a checkbox gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. #Gadget3D will be the number returned by EventGadget3D() function. The 'Text$' is a description of the checkbox which will be displayed to the right of it.

To add a 'mini help' to this gadget, use GadgetToolTip3D().

- GetGadgetState3D() can be used to get the current gadget state (checked or unchecked).
- SetGadgetState3D() can be used to change the gadget state (checked or unchecked).


ClearGadgetItems3D

ClearGadgetItems3D()

Синтаксис

ClearGadgetItems3D(#Gadget3D)
Описание
Clears all the items from the specified #Gadget3D. The Gadget must
  be one of the following types:

- ComboBoxGadget3D()
- EditorGadget3D()
- ListViewGadget3D()
- PanelGadget3D()


CloseGadgetList3D

CloseGadgetList3D()

Синтаксис

CloseGadgetList3D()
Описание
Terminate the current gadget list creation and go back to the previous GadgetList.

This is especially useful for the following gadgets:

- ContainerGadget3D()
- PanelGadget3D()
- ScrollAreaGadget3D()


ComboBoxGadget3D

ComboBoxGadget3D()

Синтаксис

Result = ComboBoxGadget3D(#Gadget3D, x, y, Width, Height [, Flags])
Описание
Create a ComboBox gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. #Gadget3D will be the number returned by EventGadget3D() function. Once a ComboBox is created, its list of items is empty.

To add a 'mini help' to this gadget, use GadgetToolTip3D().

The following functions can be used to act on the list contents:

- AddGadgetItem3D(): Add an item.
- GetGadgetItemText3D(): Returns the gadget item text.
- CountGadgetItems3D(): Count the items in the current combobox.
- ClearGadgetItems3D(): Remove all the items.
- RemoveGadgetItem3D(): Remove an item.
- SetGadgetItemText3D(): Changes the gadget item text.

- GetGadgetState3D(): Get the index (starting from 0) of the current element.
- GetGadgetText3D(): Get the (text) content of the current element.
- SetGadgetState3D(): Change the selected element.
- SetGadgetText3D(): Set the displayed text. If the ComboBoxGadget is not editable, the text must be in the dropdown list.

'Flags' are always optional and can be composed (using the '|' operator) of one of the following constants:
  #PB_ComboBox3D_Editable  : Makes the ComboBox editable


ContainerGadget3D

ContainerGadget3D()

Синтаксис

Result = ContainerGadget3D(#Gadget3D, x, y, Width, Height)
Описание
Creates a container gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'.

It's a simple panel gadget which can contain other gadgets. Once the gadget is created, all future created gadgets will be created inside the container. When all the needed gadgets have been created, CloseGadgetList3D() must be called to return to the previous GadgetList. OpenGadgetList3D() can be used later to add others gadgets on the fly in the container area.

To add a 'mini help' to this gadget, use GadgetToolTip3D().


CountGadgetItems3D

CountGadgetItems3D()

Синтаксис

Result = CountGadgetItems3D(#Gadget3D)
Описание
Returns the number of items in the specified #Gadget3D. If there are any items in the gadget then the count starts from 1. If the #Gadget3D doesn't contain any items, 0 is returned. This is a universal function which works for all gadgets which handle several items:

- ComboBoxGadget3D()
- EditorGadget3D()
- ListViewGadget3D()
- PanelGadget3D()


DisableGadget3D

DisableGadget3D()

Синтаксис

DisableGadget3D(#Gadget3D, State)
Описание
Disable or enable the gadget. If State = 1, the gadget will be disabled, if State = 0 it will be enabled.


EditorGadget3D

EditorGadget3D()

Синтаксис

Result = EditorGadget3D(#Gadget3D, x, y, Width, Height [, Flags])
Описание
Creates an Editor gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. #Gadget3D will be the number returned by the EventGadget3D() function.

'Flags' can be the following value:
  #PB_Editor3D_ReadOnly: The user cannot edit the text in the gadget.
To add a 'mini help' to this gadget, use GadgetToolTip3D().

The following functions can be used to act on the editor content:

- AddGadgetItem3D(): Add a text line.
- CountGadgetItems3D(): Return the number of lines in the editor gadget.
- GetGadgetItemText3D(): Get the specified line text.
- GetGadgetText3D(): Get the text content of the editor gadget.
- RemoveGadgetItem3D(): Remove a line in the editor.
- ClearGadgetItems3D(): Clear the text content.
- SetGadgetItemText3D(): Set the specified line text.
- SetGadgetText3D(): Change the text content of the editor gadget.
- SetGadgetAttribute3D(): With the following attribute:
  #PB_Editor3D_ReadOnly: Set the readonly state. (0 means editable, nonzero means readonly)
- GetGadgetAttribute3D(): With the following attribute:
  #PB_Editor3D_ReadOnly: Get the readonly state. (0 means editable, nonzero means readonly)


Frame3DGadget3D

Frame3DGadget3D()

Синтаксис

Result = Frame3DGadget3D(#Gadget3D, x, y, Width, Height, Text$)
Описание
Creates a Frame3D gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. This kind of gadget is decorative only. The Text$ parameter is only valid if no borders are specfied, else it will be ignored.

Note: As this Gadget is decorative only, GadgetToolTip3D() cannot be used. This Gadget also receives no events.


FreeGadget3D

FreeGadget3D()

Синтаксис

FreeGadget3D(#Gadget3D)
Описание
Free and remove the #Gadget3D from the display (and free its gadgetlist if the gadget was a container).

Note: all remaining gadgets are automatically freed when the program ends.


GadgetHeight3D

GadgetHeight3D()

Синтаксис

Result = GadgetHeight3D(#Gadget3D)
Описание
Returns the height of the specified #Gadget3D, in pixels.


GadgetID3D

GadgetID3D()

Синтаксис

GadgetID = GadgetID3D(#Gadget3D)
Описание
Returns the unique system identifier of the #Gadget3D.


GadgetToolTip3D

GadgetToolTip3D()

Синтаксис

GadgetToolTip3D(#Gadget3D, Text$)
Описание
Associate the specified Text$ with the #Gadget3D. A ToolTip text
  is text which is displayed when the mouse cursor is over the gadget for a
  small amount of time (typically a yellow floating box).

The following
  gadgets are supported:

- ButtonGadget3D()
- CheckBoxGadget3D()
- ComboBoxGadget3D()
- ContainerGadget3D()
- EditorGadget3D()
- ImageGadget3D()
- ListViewGadget3D()
- OptionGadget3D()
- PanelGadget3D()
- ProgressBarGadget3D()
- ScrollBarGadget3D()
- SpinGadget3D()
- StringGadget3D()


GadgetType3D

GadgetType3D()

Синтаксис

Result = GadgetType3D(#Gadget3D)
Описание
Returns the type of gadget that is represented by the specified #Gadget3D number. It can be useful to write generic functions that work with more than one type of gadget.

It returns one of the following values:
  #PB_GadgetType3D_Button        : ButtonGadget3D()
  #PB_GadgetType3D_CheckBox      : CheckBoxGadget3D()
  #PB_GadgetType3D_ComboBox      : ComboBoxGadget3D()
  #PB_GadgetType3D_Container     : ContainerGadget3D()
  #PB_GadgetType3D_Editor        : EditorGadget3D()
  #PB_GadgetType3D_Frame3D       : Frame3DGadget3D()
  #PB_GadgetType3D_Image         : ImageGadget3D()
  #PB_GadgetType3D_ListView      : ListViewGadget3D()
  #PB_GadgetType3D_Option        : OptionGadget3D()
  #PB_GadgetType3D_Panel         : PanelGadget3D()
  #PB_GadgetType3D_ProgressBar   : ProgressBarGadget3D()
  #PB_GadgetType3D_ScrollArea    : ScrollAreaGadget3D()
  #PB_GadgetType3D_ScrollBar     : ScrollBarGadget3D()
  #PB_GadgetType3D_Spin          : SpinGadget3D()
  #PB_GadgetType3D_String        : StringGadget3D()
  #PB_GadgetType3D_Text          : TextGadget3D()
  #PB_GadgetType3D_Unknown       : The type is unknown. Most likely it is not a PB gadget at all.


GadgetWidth3D

GadgetWidth3D()

Синтаксис

Result = GadgetWidth3D(#Gadget3D)
Описание
Returns the width of the specified #Gadget3D, in pixels.


GadgetX3D

GadgetX3D()

Синтаксис

Result = GadgetX3D(#Gadget3D)
Описание
Returns the X position of the specified #Gadget3D. The X position is measured in pixels, starting from the inside of the left edge of the gadget list that the gadget is in.


GadgetY3D

GadgetY3D()

Синтаксис

Result = GadgetY3D(#Gadget3D)
Описание
Returns the Y position of the specified #Gadget3D. The Y position is measured in pixels, starting from the inside of the top edge of the gadget list that the gadget is in.


GetActiveGadget3D

GetActiveGadget3D()

Синтаксис

Result = GetActiveGadget3D()
Описание
Returns the #Gadget3D number of the Gadget that currently has the keyboard focus. If no Gadget has the focus, -1 is returned.


GetGadgetAttribute3D

GetGadgetAttribute3D()

Синтаксис

Value = GetGadgetAttribute3D(#Gadget3D, Attribute)
Описание
Gets the 'Attribute' value of the specified #Gadget3D. This
  function is available for all gadgets which support attributes. See the
  individual gadget for the supported attributes:

- EditorGadget3D()
- PanelGadget3D()
- ProgressBarGadget3D()
- ScrollAreaGadget3D()
- ScrollBarGadget3D()
- SpinGadget3D()


GetGadgetData3D

GetGadgetData3D()

Синтаксис

Result = GetGadgetData3D(#Gadget3D)
Описание
Returns the 'Data' value that has been stored for this gadget with the SetGadgetData3D() function. This allows to associate a custom value with any gadget. If there was never a data value set for this gadget, the returnvalue will be 0.

This function works with all PureBasic gadgets. See SetGadgetData3D() for an example.


GetGadgetItemData3D

GetGadgetItemData3D()

Синтаксис

Result = GetGadgetItemData3D(#Gadget3D, Item)
Описание
Returns the value that was previously stored with this #Gadget3D item with the SetGadgetItemData3D() function. This allows to associate a custom value with the items of a gadget. If no value has been stored with the item yet, the returnvalue will be 0.

This function works with the following gadgets:
- ComboBoxGadget3D()
- ListViewGadget3D()

See SetGadgetItemData3D() for an example.


GetGadgetItemState3D

GetGadgetItemState3D()

Синтаксис

Result = GetGadgetItemState3D(#Gadget3D, Item)
Описание
Returns the item state of the specified #Gadget3D. This is a universal function that works for almost all gadgets which handle several items:

- ListViewGadget3D(): returns 1 if the item is selected, 0 otherwise.


GetGadgetItemText3D

GetGadgetItemText3D()

Синтаксис

Result$ = GetGadgetItemText3D(#Gadget3D, Item [, Column])
Описание
Returns the item text of the specified #Gadget3D. This is a universal function which works for almost all gadgets which handle several items:

- ComboBoxGadget3D() - 'Item' is the index of the item in the ComboBox list. 'Column' will be ignored.
- EditorGadget3D() - 'Item' is the text line in the EditorGadget. 'Column' will be ignored.
- ListViewGadget3D() - 'Item' is the index of the entry from which you want to receive the content. 'Column' will be ignored.
- PanelGadget3D() - 'Item' is the panel from which you want to receive the header text.

Note: All 'Item' index start from 0.


GetGadgetState3D

GetGadgetState3D()

Синтаксис

Result = GetGadgetState3D(#Gadget3D)
Описание
Returns the current state of the gadget. This is a universal function which works for almost all gadgets:

- ButtonGadget3D(): returns 1 if a #PB_Button3D_Toggle button is toggled, else 0.
- CheckBoxGadget3D(): returns 1 if checked, 0 otherwise.
- ComboBoxGadget3D(): returns the currently selected item index, -1 if none is selected.
- ImageGadget3D(): returns the TextureID of the currently displayed image.
- ListViewGadget3D(): returns the currently selected item index, -1 if none is selected.
- OptionGadget3D(): returns 1 if activated, 0 otherwise.
- PanelGadget3D(): returns the current panel index, -1 if no panel.
- ProgressBarGadget3D(): returns the current value of the ProgressBar.
- ScrollBarGadget3D(): returns the current slider position.
- SpinGadget3D(): returns the current value of the SpinGadget.


GetGadgetText3D

GetGadgetText3D()

Синтаксис

String$ = GetGadgetText3D(#Gadget3D)
Описание
Returns the gadget text content of the specified #Gadget3D. This function is especially useful for:

- ButtonGadget3D(): return the text of the ButtonGadget.
- ComboBoxGadget3D() - return the content of the current item.
- EditorGadget3D() - return the text content of the editor gadget. Please note, that several lines of text are normaly separated with "Chr(13)+Chr(10)".
- ListViewGadget3D() - return the content of the current item.
- StringGadget3D() - return contents of the StringGadget.
- TextGadget3D() - return contents of the TextGadget.


HideGadget3D

HideGadget3D()

Синтаксис

HideGadget3D(#Gadget3D, State)
Описание
Hide or show a gadget. If State = 1, the gadget will be hidden, if State = 0 it will be shown.


ImageGadget3D

ImageGadget3D()

Синтаксис

Result = ImageGadget3D(#Gadget3D, x, y, Width, Height, TextureID [, Flags])
Описание
Creates an Image gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. The TextureID represents an image and can be obtained with TextureID() from the Texture library. If the TextureID is 0, then no image will be displayed. The gadget dimensions autofit to the image size.

To add a 'mini help' to this gadget, use GadgetToolTip3D().

- SetGadgetState3D(): Change the current Image of the gadget. A valid TextureID can be easily obtained with the TextureID() function. If the TextureID is 0, then the image is removed from the gadget.

'Flags' are always optional and can be composed of one of the following constants:
  #PB_Image3D_Border : display a sunken border around the image.


IsGadget3D

IsGadget3D()

Синтаксис

Result = IsGadget3D(#Gadget3D)
Описание
Tests if the given #Gadget3D number is a valid and correctly initialized gadget. This function is bullet-proof and can be used with any value. If the 'Result' is not zero then the object is valid and initialized, else it returns zero. This is the correct way to ensure than a gadget is ready to use.


ListViewGadget3D

ListViewGadget3D()

Синтаксис

Result = ListViewGadget3D(#Gadget3D, x, y, Width, Height)
Описание
Creates a ListView gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. #Gadget3D will be the number returned by the EventGadget3D() function. Once a ListView is created, its list of items is empty.

To add a 'mini help' to this gadget, use GadgetToolTip3D().

The following functions can be used to act on the list content:

- AddGadgetItem3D(): Add an item.
- RemoveGadgetItem3D(): Remove an item.
- ClearGadgetItems3D(): Remove all the items
- CountGadgetItems3D(): Returns the number of items currently in the #Gadget3D.

- GetGadgetItemData3D(): Get the value that was stored with the gadget item.
- GetGadgetItemState3D(): Returns nonzero if the item is selected, zero otherwise.
- GetGadgetItemText3D(): Get the content of the given item.
- GetGadgetState3D(): Get the index of the selected item or -1 if there is no selected item.
- GetGadgetText3D(): Get the content of the selected item.
- SetGadgetItemData3D(): store a value with the given item.
- SetGadgetItemState3D(): Selects or deselects the given item.
- SetGadgetItemText3D(): Set the text of the given item.
- SetGadgetState3D(): Change the selected item. If -1 is specified, the selection will be removed.
- SetGadgetText3D(): Selects the item with the given text (the text must match exactly).


OpenGadgetList3D

OpenGadgetList3D()

Синтаксис

OpenGadgetList3D(#Gadget3D [, Item])
Описание
Use the specified #Gadget3D as a GadgetList, to dynamically add new gadgets to it. Once the all the needed changes are done, CloseGadgetList3D() should be called. The following gadgets are supported by OpenGadgetList3D():

- ContainerGadget3D()
- PanelGadget3D() : The optional 'Item' parameter need to be specified
- ScrollAreaGadget3D()


OptionGadget3D

OptionGadget3D()

Синтаксис

Result = OptionGadget3D(#Gadget3D, x, y, Width, Height, Text$)
Описание
Creates an OptionGadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. The first time this function is called, a group is created and all following calls of OptionGadget3D() will add a gadget to this group. To finish the group, just create a gadget of another type. These kind of gadgets are very useful as only one gadget from the group can be selected at any time.

To add a 'mini help' to this gadget, use GadgetToolTip3D().


PanelGadget3D

PanelGadget3D()

Синтаксис

Result = PanelGadget3D(#Gadget3D, x, y, Width, Height)
Описание
Creates a Panel gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. Once a Panel is created, its list of panels is empty.

To add a 'mini help' to this gadget, use GadgetToolTip3D().

The following functions can be used to act on the list content:

- AddGadgetItem3D(): Add a panel.
- RemoveGadgetItem3D(): Remove a panel.
- CountGadgetItems3D(): Count the number of panels.
- ClearGadgetItems3D(): Remove all panels.
- GetGadgetItemText3D(): Retrieve the text of the specified item.
- SetGadgetItemText3D(): Change the text of the specified item.

- SetGadgetState3D(): Change the active panel.
- GetGadgetState3D(): Get the index of the current panel.
- GetGadgetAttribute3D(): With one of the following attributes: (there must be at least 1 item for this to work)
  #PB_Panel3D_ItemWidth : Returns the width of the inner area where the gadgets are displayed.
  #PB_Panel3D_ItemHeight: Returns the height of the inner area where the gadgets are displayed.
  #PB_Panel3D_TabHeight : Returns height of the panel tabs on top of the gadget.
You must call AddGadgetItem3D() to add a panel before you can create other gadgets inside the panel gadget. The next gadgets will then be created automatically in the new panel. This is very convenient. When the PanelGadget item has been filled with all the needed gadgets, CloseGadgetList3D() must be called to return to the previous GadgetList. This means that a PanelGadget can be created inside another PanelGadget...


ProgressBarGadget3D

ProgressBarGadget3D()

Синтаксис

Result = ProgressBarGadget3D(#Gadget3D, x, y, Width, Height, Minimum, Maximum)
Описание
Creates a ProgressBar gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. The possible values that the progress bar can take are fixed between the Minimum and Maximum one.

To add a 'mini help' to this gadget, use GadgetToolTip3D().

The following functions can be used to act on the gadget:

- SetGadgetState3D(): Change progress bar value.
- GetGadgetState3D(): Get the current progress bar value.
- SetGadgetAttribute3D(): With the following attributes:
  #PB_ProgressBar3D_Minimum   : Changes the minimum value.
  #PB_ProgressBar3D_Maximum   : Changes the maximum value.
- GetGadgetAttribute3D(): With the following attributes:
  #PB_ProgressBar3D_Minimum   : Returns the minimum value.
  #PB_ProgressBar3D_Maximum   : Returns the maximum value.


RemoveGadgetItem3D

RemoveGadgetItem3D()

Синтаксис

RemoveGadgetItem3D(#Gadget3D, Position)
Описание
Removes an item of the specified #Gadget3D at the given Position.
  Position index starts at 0. The gadget type can be one of the following:

- ComboBoxGadget3D()
- EditorGadget3D()
- PanelGadget3D()
- ListViewGadget3D()


ResizeGadget3D

ResizeGadget3D()

Синтаксис

ResizeGadget3D(#Gadget3D, x, y, Width, Height)
Описание
Resize the specified #Gadget3D to the given position and dimensions. To ease the building of realtime resizeable Graphical User Interfaces (GUIs), #PB_Ignore can be passed as any parameter (x, y, Width or Height) and this parameter will not be changed. This is very handy because often the gadget should only change in width or in height.
  [...]

  ResizeGadget3D(0, #PB_Ignore, #PB_Ignore, 300, #PB_Ignore) ; Only change the gadget width.


ScrollAreaGadget3D

ScrollAreaGadget3D()

Синтаксис

Result = ScrollAreaGadget3D(#Gadget3D, x, y, Width, Height, ScrollAreaWidth, ScrollAreaHeight, ScrollStep)
Описание
Creates a ScrollArea gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. It's very useful when a gadget is too big to fit the window dimension. In that case, it can be put into a scrollarea. All the scrolling is handled automatically by the gadget. This is a container gadget, intended to have one or several gadget in its scroll area. Once the gadget is created, all future created gadgets will be created inside the scoll area. When all the needed gadgets have been created, CloseGadgetList3D() must be called to return to the previous GadgetList. OpenGadgetList3D() can be used later to add others gadgets on the fly in the scroll area.

'ScrollAreaWidth' and 'ScrollAreaHeight' are the initial dimensions of the scrollable area contained inside the gadget and should be greater than the gadget's 'Width' and 'Height' dimensions. 'ScrollStep' is the number of pixels scrolled when pressing a slider arrow. #Gadget3D will be the number returned by EventGadget3D() function. When the user moves the scrollbars in the gadget, an event will be received for the gadget.

The following functions can be used to act on a ScrollAreaGadget:

GetGadgetAttribute3D(): With one of the following attribute:
  #PB_ScrollArea3D_InnerWidth  : Returns the width (in pixels) of the contained scrollable area.
  #PB_ScrollArea3D_InnerHeight : Returns the height (in pixels) of the contained scrollable area.
  #PB_ScrollArea3D_X           : Returns the current horizontal scrolling position (in pixels).
  #PB_ScrollArea3D_Y           : Returns the current vertical scrolling position (in pixels).
SetGadgetAttribute3D(): With one of the following attribute:
  #PB_ScrollArea3D_InnerWidth  : Changes the width (in pixels) of the contained scrollable area.
  #PB_ScrollArea3D_InnerHeight : Changes the height (in pixels) of the contained scrollable area.
  #PB_ScrollArea3D_X           : Changes the current horizontal scrolling position (in pixels).
  #PB_ScrollArea3D_Y           : Changes the current vertical scrolling position (in pixels).


ScrollBarGadget3D

ScrollBarGadget3D()

Синтаксис

Result = ScrollBarGadget3D(#Gadget3D, x, y, Width, Height, Minimum, Maximum, PageLength [, Flags])
Описание
Creates a scrollbar gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. It's widely used when displaying only a part of an object. The Minimum-Maximum range should be between 0 and 10,000. The 'PageLength' is the number which defines a page. For example you can have a picture which is 100 pixels width and you only see 25 pixels. What you see is a called a 'page', in this example, the page length will be 25, the Mininum will be 0 and the Maximum will be 100. #Gadget3D will be the number returned by EventGadget3D() function.

'Flags' are optionals and can be composed of one of the following constants:
  #PB_ScrollBar3D_Vertical : The scrollbar is vertical (instead of horizontal, which is the default).
To add a 'mini help' to this gadget, use GadgetToolTip3D().

The following functions can be used to act on this gadget:

- GetGadgetState3D(): Returns the current slider position (value between the Minimum-Maximum range).
- SetGadgetState3D(): Changes the current slider position.
- GetGadgetAttribute3D(): With one of the following attributes:
  #PB_ScrollBar3D_Minimum   : Returns the minimum scroll position.
  #PB_ScrollBar3D_Maximum   : Returns the maximum scroll position.
  #PB_ScrollBar3D_PageLength: Returns the PageLength value.
- SetGadgetAttribute3D(): With one of the following attributes:
  #PB_ScrollBar3D_Minimum   : Changes the minimum scroll position.
  #PB_ScrollBar3D_Maximum   : Changes the maximum scroll position.
  #PB_ScrollBar3D_PageLength: Changes the PageLength value.


SetActiveGadget3D

SetActiveGadget3D()

Синтаксис

SetActiveGadget3D(#Gadget3D)
Описание
Activates (sets the focus on) the gadget specified by the given #Gadget3D number. This is mainly used with ComboBoxGadget3D() and StringGadget3D(). Activating a gadget allows it to become the current object to receive messages and handle keystrokes.


SetGadgetAttribute3D

SetGadgetAttribute3D()

Синтаксис

SetGadgetAttribute3D(#Gadget3D, Attribute, Value)
Описание
Changes the 'Attribute' value of the specified #Gadget3D. This
  function is available for all gadgets which support attributes:

- EditorGadget3D()
- ProgressBarGadget3D()
- ScrollAreaGadget3D()
- ScrollBarGadget3D()
- SpinGadget3D()


SetGadgetData3D

SetGadgetData3D()

Синтаксис

SetGadgetData3D(#Gadget3D, Value)
Описание
Stores the given value with the specified #Gadget3D. This value can later be read with the GetGadgetData3D() function. This allows to associate a custom value with any gadget.

This function works with all PureBasic gadgets.


SetGadgetItemData3D

SetGadgetItemData3D()

Синтаксис

SetGadgetItemData3D(#Gadget3D, Item, Value)
Описание
Stores the given value with the specified #Gadget3D item. This value can later be read with the GetGadgetItemData3D() function. This allows to associate a custom value with the items of a gadget. This value will remain with the item, even if the item changes its index (for example because other items were deleted).

This function works with the following gadgets:
- ComboBoxGadget3D()
- ListViewGadget3D()


SetGadgetItemState3D

SetGadgetItemState3D()

Синтаксис

SetGadgetItemState3D(#Gadget3D, Item, State)
Описание
Changes the item state of the specified #Gadget3D. This is a universal function which works for almost all gadgets which handle several items. 'State' can take the following values:
- ListViewGadget3D(): 1 if the item should be selected, 0 otherwise.


SetGadgetItemText3D

SetGadgetItemText3D()

Синтаксис

SetGadgetItemText3D(#Gadget3D, Item, Text$ [, Column])
Описание
Changes the item text of the specified #Gadget3D. This is a universal function which works for almost all gadgets which handle several items:

- ComboBoxGadget3D()
- EditorGadget3D()
- ListViewGadget3D()
- PanelGadget3D()


SetGadgetState3D

SetGadgetState3D()

Синтаксис

SetGadgetState3D(#Gadget3D, State)
Описание
Change the current state of the specified #Gadget3D. This is a universal function which works for almost all gadgets:

- ButtonGadget3D(): change the current state of a #PB_Button3D_Toggle gadget (1 = toggled, 0 = normal).
- CheckBoxGadget3D(): 1 to check it, 0 otherwise.
- ComboBoxGadget3D(): change the currently selected item.
- ImageGadget3D(): change the current image of the gadget.
- ListViewGadget3D(): change the currently selected item. . If -1 is specified, it will remove the selection.
- OptionGadget3D(): 1 to activate it, 0 otherwise.
- PanelGadget3D(): change the current panel.
- ProgressBarGadget3D(): change progress bar value.
- ScrollBarGadget3D(): change the current slider position.
- SpinGadget3D(): change the current value.


SetGadgetText3D

SetGadgetText3D()

Синтаксис

SetGadgetText3D(#Gadget3D, Text$)
Описание
Change the gadget text content of the specified #Gadget3D. This function is especially useful for:

- ButtonGadget3D(): change the text of the ButtonGadget.
- ComboBoxGadget3D(): Set the displayed text. If the ComboBoxGadget is not editable, the text must be in the dropdown list.
- EditorGadget3D(): change the text content of the editor gadget. If you want to add several lines of text at once, separate them with "Chr(13)+Chr(10)".
- Frame3DGadget3D(): change the title of the Frame3DGadget.
- ListViewGadget3D(): selects the item that exactly matches the given text.
- StringGadget3D(): change the content of the StringGadget.
- TextGadget3D(): change the content of the TextGadget.


SpinGadget3D

SpinGadget3D()

Синтаксис

Result = SpinGadget3D(#Gadget3D, x, y, Width, Height, Minimum, Maximum [, Flags])
Описание
Creates a spin gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. #Gadget3D will be the number returned by EventGadget3D() function.

'Flags' is an optional parameter and can be composed of one of the following constants:
  #PB_Spin3D_ReadOnly : The StringGadget is not editable, the number is only changeable by the arrows
  #PB_Spin3D_Numeric  : The SpinGadget will automatically update the text with value of the state, so SetGadgetText is not needed.
To add a 'mini help' to this gadget, use GadgetToolTip3D().

The following functions can be used to act on a SpinGadget:

GetGadgetState3D(): Get the current gadget value.
SetGadgetState3D(): Change the gadget value. For displaying the new value you still must use SetGadgetText3D()!
GetGadgetText3D(): Get the text contained in the gadget.
SetGadgetText3D(): Change the text contained in the gadget.
GetGadgetAttribute3D(): With one of the following attributes:
  #PB_Spin3D_Minimum   : Returns the minimum value.
  #PB_Spin3D_Maximum   : Returns the maximum value.
SetGadgetAttribute3D(): With one of the following attributes:
  #PB_Spin3D_Minimum   : Changes the minimum value.
  #PB_Spin3D_Maximum   : Changes the maximum value.


StringGadget3D

StringGadget3D()

Синтаксис

Result = StringGadget3D(#Gadget3D, x, y, Width, Height, Content$ [, Flags])
Описание
Creates a String gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. #Gadget3D will be the number returned by EventGadget3D() function. 'Content$' specifies the initial content of this StringGadget. This gadget accepts only one line of text. To get multiline input, use the EditorGadget3D() function.

'Flags' are always optional and can be composed (using the '|' OR operator) of one of the following constants:
  #PB_String3D_Numeric    : Only (positive) integer numbers are accepted.
  #PB_String3D_Password   : Password mode, displaying only '*' instead of normal characters.
  #PB_String3D_ReadOnly   : Read only mode. No text can be entered.
Later the content can be changed with SetGadgetText3D() and received with GetGadgetText3D().

The following events are supported through EventType3D():
  #PB_EventType3D_Change    : The text has been modified by the user.
  #PB_EventType3D_Focus     : The StringGadget got the focus.
  #PB_EventType3D_LostFocus : The StringGadget lost the focus.
To add a 'mini help' to this gadget, use GadgetToolTip3D().


TextGadget3D

TextGadget3D()

Синтаксис

Result = TextGadget3D(#Gadget3D, x, y, Width, Height, Text$)
Описание
Creates a Text gadget in the current GadgetList. If #PB_Any is used as '#Gadget3D' parameter, the new gadget number will be returned as 'Result'. A TextGadget is a basic text area for displaying, not entering, text.

The content can be changed with the function SetGadgetText3D() and can be obtained with GetGadgetText3D().

Note: This Gadget doesn't receive any user events, and GadgetToolTip3D() can't be used with it.


Help

PureBasic - Help

Краткий обзор

Библиотека Help дает возможность организовать для пользователей быстрый и удобый доступ к Вашей справке. PureBasic поддерживает работу с файлами формата *.hlp и *.chm.

Краткий перечень команд

CloseHelp
OpenHelp


CloseHelp

CloseHelp()

Синтаксис

CloseHelp()
Описание
закрыть ранее открытое окно справки OpenHelp().


OpenHelp

OpenHelp()

Синтаксис

OpenHelp(Filename$, Topic$)
Описание
Открывает и отображает окно справки. Filename$ - имя файла справки, например help.chm. Topic$ - название страницы справки, например print.htm или index.htm.

Пример:
   OpenHelp("help.chm",  "index.htm")
   OpenHelp("help.chm",  "print.txt")
Windows, поддерживает два формата файлов справки: HLP (старый формат) и CHM (новый формат, совместимый с HTML).


Http

PureBasic - Http

Краткий обзор

HTTP - название протокола, который используется некоторыми программами (такими как веб-браузеры) для доступа к веб-страницам и другим файлам. Каждая страница (или файл) в Сети имеет свой уникальный URL (Uniform Resource Locator). Данная библиотека содержит набор функций для работы с удалёнными файлами и их URL.

Краткий перечень команд

GetHTTPHeader
GetURLPart
ReceiveHTTPFile
SetURLPart
URLDecoder
URLEncoder


GetHTTPHeader

GetHTTPHeader()

Синтаксис

Result$ = GetHTTPHeader(URL$)
Описание
Загружает заголовки HTTP данного URL$. Содержание заголовков зависит от web-сервера, они позволяют обратиться к такой информации как дата изменения файла, тип сервера и его версия, и т.д.. URL должен быть полным, включая префикс "http://".

Прежде, чем использовать эту команду, нужно вызвать InitNetwork().

Пример:
  InitNetwork()

  Header$ = GetHTTPHeader("http://www.purebasic.com/index.php3")

  Repeat
    Index+1
    Line$ = StringField(Header$, Index, #LF$)
    Debug Line$
  Until Line$ = ""
В Result$ возвращается строка, содержащая символы #LF$. Для разделения строки используйте StringField(). Пример возвращаемой строки:
  HTTP/1.1 200 OK
  Date: Fri, 21 Mar 2008 09:49:30 GMT
  Server: Apache/1.3.34 (Debian) mod_vhost_online/1.1 mod_fastcgi/2.4.2 mod_log_online/0.1
  X-Powered-By: PHP/4.4.8-1
  Content-Type: text/html


GetURLPart

GetURLPart()

Синтаксис

Result$ = GetURLPart(URL$, Parameter$)
Описание
Получает определенную часть данного URL$. URL$ может содержать параметры, полезные при использовании языка сценариев на веб-сервере (как PHP). Синтаксис - следующий: http://www.purebasic.com/index.php3?test=1. Здесь параметр "test" и его связанное значение "1 ". Эта команда возвратит значение данного Parameter$. Параметры не зависит от регистра. Кроме того, Parameter$ может быть одной из следующих констант, чтобы обратиться к определенной части URL:
  #PB_URL_Protocol  : возвращает протокол из URL$
  #PB_URL_Site      : возвращает сайт из URL$
  #PB_URL_Port      : возвращает порт из URL$ (если определено)
  #PB_URL_Parameters: возвращает все параметры из URL$
  #PB_URL_Path      : возвращает путь из URL$
  #PB_URL_User      : возвращает имя пользователя из URL$ (если определено)
  #PB_URL_Password  : возвращает пароль из URL$ (если определено)
Пример:
  URL$ = "http://user:pass@www.purebasic.com:80/index.php3?test=1&ok=2"

  Debug GetURLPart(URL$, #PB_URL_Protocol) ; Will print "http"
  Debug GetURLPart(URL$, #PB_URL_Site)     ; Will print "www.purebasic.com"
  Debug GetURLPart(URL$, #PB_URL_Port)     ; Will print "80"
  Debug GetURLPart(URL$, #PB_URL_Parameters) ; Will print "test=1&ok=2"
  Debug GetURLPart(URL$, #PB_URL_Path)     ; Will print "index.php3"
  Debug GetURLPart(URL$, #PB_URL_User)     ; Will print "user"
  Debug GetURLPart(URL$, #PB_URL_Password) ; Will print "pass"
  Debug GetURLPart(URL$, "test")           ; Will print "1"
  Debug GetURLPart(URL$, "ok")             ; Will print "2"
Эта команда может быть очень полезной, чтобы анализировать URL при записи программы интерфейса компьютерной графики.


ReceiveHTTPFile

ReceiveHTTPFile()

Синтаксис

Result = ReceiveHTTPFile(URL$, Filename$)
Описание
Скачать файл на диск с данного URL$. Если URL$ не найден или другая ошибка, 'Result' будет равен 0.

Прежде, чем использовать эту команду, нужно вызвать InitNetwork().

Пример:
  InitNetwork()

  Filename$ = SaveFileRequester("Where to save index.php3 ?", "", "", 0)
  If ReceiveHTTPFile("http://www.purebasic.com/index.php3", Filename$)
    Debug "Success"
  Else
    Debug "Failed"
  EndIf


SetURLPart

SetURLPart()

Синтаксис

Result$ = SetURLPart(URL$, Parameter$, Value$)
Описание
Изменяет определенную часть в данном URL$. URL$ может содержать параметры, полезные при использовании языка сценариев на веб-сервере (как PHP). Синтаксис - следующий: http://www.purebasic.com/index.php3?test=1. Здесь параметр "test" и его связанное значение "1 ". Эта команда запишет значение данного Parameter$. Параметры не являются зависящими от регистра. Parameter$ может быть одной из следующей констант, чтобы изменять стандартную часть URL$ (у минимального URL$ должен быть сайт, например: "http://www.purebasic.com"):
  #PB_URL_Protocol  : изменяет протокол из URL$
  #PB_URL_Site      : изменяет сайт из URL$
  #PB_URL_Port      : изменяет порт из URL$ (если определено)
  #PB_URL_Parameters: изменяет все параметры от URL$
  #PB_URL_Path      : изменяет путь из URL$
  #PB_URL_User      : изменяет имя пользователя из URL$ (если определено)
  #PB_URL_Password  : изменяет пароль из URL$ (если определено)
Пример:
  URL$ = "http://www.test.com/hello.php3"

  URL$ = SetURLPart(URL$, #PB_URL_Protocol, "ftp")
  URL$ = SetURLPart(URL$, #PB_URL_Site, "www.purebasic.com")
  URL$ = SetURLPart(URL$, #PB_URL_Port, "80")
  URL$ = SetURLPart(URL$, #PB_URL_Path, "english/index.php3")
  URL$ = SetURLPart(URL$, #PB_URL_User, "user")
  URL$ = SetURLPart(URL$, #PB_URL_Password, "pass")
  URL$ = SetURLPart(URL$, "test", "1")
  URL$ = SetURLPart(URL$, "ok", "2")

  Debug URL$ ; Will print "ftp://user:pass@www.purebasic.com:80/english/index.php3?test=1&ok=2"


URLDecoder

URLDecoder()

Синтаксис

Result$ = URLDecoder(URL$)
Описание
Возвращает декодированный URL$ из формата HTTP.URL не может содержать некоторые символы (например Tab, символы пробела, буквы со знаком ударения, и т. д.), следовательно необходимо их закодировать, в основном используя "%" как символ ESC. Если URL не находится в закодированном формате, эта функция не имеет никакого эффекта и возвратит тот же самый URL.

Пример:
  Debug URLDecoder("http://www.purebasic.com/test%20with%20space.php3")
  ; Will print "http://www.purebasic.com/test with space.php3"
Чтобы закодировать URL, используйте URLEncoder()

Эта команда может быть очень полезной, чтобы преобразовать URL при записи программы интерфейса компьютерной графики.


URLEncoder

URLEncoder()

Синтаксис

Result$ = URLEncoder(URL$)
Описание
Возвращает URL$, в закодированный формат HTTP. URL не может содержать некоторые символы (например Tab, символы пробела, буквы со знаком ударения, и т. д.), следовательно необходимо их закодировать, в основном используя "%" как символ ESC.

Пример:
  Debug URLEncoder("http://www.purebasic.com/test with space.php3")
  ; Will print "http://www.purebasic.com/test%20with%20space.php3"
Чтобы преобразовать назад закодированный URL, используйте URLDecoder()

Эта команда может быть очень полезной, чтобы преобразовать URL при записи программы интерфейса компьютерной графики.


Image

PureBasic - Image

Краткий обзор

Изображения графические объекты, которые могут отображаться в окне или в гаджете. В настоящее время PureBasic принимает изображения в BMP, Icon (. ICO - только для Windows) и все другие форматы, которые поддерживаются через библиотеку ImagePlugin Library.

PNG формат может быть использован для отображения прозрачных изображений в gadgets, menu и toolbars. В среде Windows, также могут использоваться ICON (прозрачные изображения). Однако, предпочтительней использовать PNG, так как они поддерживаются на всех платформах.

Краткий перечень команд

CatchImage
CopyImage
CreateImage
FreeImage
GrabImage
ImageDepth
ImageHeight
ImageID
ImageOutput
ImageWidth
IsImage
LoadImage
ResizeImage
SaveImage


CatchImage

CatchImage()

Синтаксис

Result = CatchImage( #Image, MemoryAddress [, Size [, Flags] )
Описание
#Image – это уникальный идентификатор изображения.
MemoryAddress - указанная область в оперативной памяти.
Size - максимальный размер изображения.
Загружает изображение из указанной области оперативной памяти.
Если в качестве параметра #Image поставить #PB_Any, то универсальный идентификатор (id) загруженного изображения будет возвращен в качестве 'Result'.

Поддерживаются форматы изображений:
BMP, icon (.ico только в Windows) или любой другой формат поддерживаемый библиотекой ImagePlugin. При ошибке функция возвращает 0. Изображение можно выгрузить с помощью функции FreeImage().

Эту функцию полезно использовать совместно с оператором 'IncludeBinary'. Этот оператор упаковываем зображение "внутрь" откомпилированного файла.

Дополнительный параметр 'Size' определяет максимальный размер изображения (в байтах), которое необходимо загрузить. Это способствует предотвращению ошибок, если исходный файл поврежден.

Необязательный параметр 'Flags' может принимать следующие значения:
  #PB_Image_DisplayFormat: формат загруженного изображения (глубина цвета) будет соотверствовать формату десктопа.

Эти функции позволяют использовать дополнительные форматы
  изображений:

UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()

Пример:
  CatchImage(0, ?Logo)
  End

  DataSection
    Logo: IncludeBinary "Logo.bmp"
  EndDataSection
Примечание: "?" - это указатель на метку. Больше информации об указателях и обращении к память смотрите здесь здесь. Максимальный поддерживаемый размер изображения равен 8192x8192 пикселам (если достаточно оперативной памяти).


CopyImage

CopyImage()

Синтаксис

Result = CopyImage(#Image1, #Image2)
Описание
#Image – это уникальный идентификатор изображения.
Создает #Image2 полностью идентичный #Image1, если в качестве #Image2 использовать #PB_Any номер нового изображения будет возвращено как 'Result'.


CreateImage

CreateImage()

Синтаксис

Result = CreateImage( #Image, Width, Height [, Depth] )
Описание
#Image – это уникальный идентификатор изображения.
Создает пустое изображение (с черным фоном), которое используется для показа ваших изображений.
Если в качестве параметра #Image поставить #PB_Any, то универсальный идентификатор (id) загруженного изображения будет возвращен в качестве 'Result'.

'Depth' - необязательный параметр.
Если параметр 'Depth' не установлен и применена #PB_Image_DisplayFormat, то глубина цвета полученного изображения будет соответствовать десктопу. Допустимые значения для 'Depth' могут быть следующими: 1, 2, 4, 8, 16, 24 и 32 bits. Советуем сохранять открытые изображения в формате 24 или 32 bits, вы полностью сохраните качество изображения. Если осуществляется только показ изображения, то применяйте #PB_Image_DisplayFormat , это обеспечит максимальное быстродействие.

Вы можете использовать другие функции для работы с загруженными изображениями:
StartDrawing() с ImageOutput() позволяют рисовать на загруженном изображении
CopyImage() создает точную копию открытого изображения
GrabImage() создает изображение из указанной области открытого изображения
DrawImage() с ImageID() позволяет отображать изображение на площади текущего рисунка.
ImageGadget() позволяет отображать изображение в окне
ButtonImageGadget() создает кнопку с изображением в окне

Примечание: максимально поддерживаемый размер равен 8192x8192 пикселам (если достаточно оперативной памяти).


FreeImage

FreeImage()

Синтаксис

FreeImage(#Image)
Описание
#Image – это уникальный идентификатор изображения.
Выгружает указанное изображение, и очищает участок памяти, выделенный под это изображение.
Примечание: при завершении программы, все изображения будут автоматически выгружены из памяти.


GrabImage

GrabImage()

Синтаксис

Result = GrabImage(#Image1, #Image2, x, y, Width, Height)
Описание
#Image – это уникальный идентификатор изображения.
Создает новое изображение #Image2 из выбранного прямоугольного участка на #Image1, если в качестве #Image2 параметра использовать #PB_Any, id нового изображения будет возвращено как 'Result'.


ImageDepth

ImageDepth()

Синтаксис

Result = ImageDepth(#Image)
Описание
#Image – это уникальный идентификатор изображения.
Возвращает глубину цвета указанного изображения.
Пример: Изображение на 24 бита (16 миллионов цветов) вернет значение '24'. Изображение на 256 цветов вернет значение '8' (8 бит). Монохромное изображение вернет '1'.


ImageHeight

ImageHeight()

Синтаксис

Result = ImageHeight(#Image)
Описание
#Image – это уникальный идентификатор изображения.
Возвращает высоту изображения в пикселах.


ImageID

ImageID()

Синтаксис

Result = ImageID(#Image)
Описание
#Image – это уникальный идентификатор изображения.
Возвращает хэндл указанного изображения.


ImageOutput

ImageOutput()

Синтаксис

OutputID = ImageOutput(#Image)
Описание
#Image – это уникальный идентификатор изображения.
Возврвщает OutputID выбранного изображения. OutputID используется PureBasic библиотекой 2DDrawing, и позволяет создавать 2D рисунки (см. StartDrawing()). Изображение #Image должно быть типа ICO.
Изображение нужно предварительно загрузить с помощью ( LoadImage() или CatchImage()), или предварительно создать (с помощью CreateImage()).

Примечание: Если у изображения будет глубина цвета меньше чем 24 битов, то оно будет преобразовано в 24 бита, чтобы выполнить операцию рисования и затем назад к ее оригинальной глубине цвета после этого.


ImageWidth

ImageWidth()

Синтаксис

Result = ImageWidth(#Image)
Описание
#Image – это уникальный идентификатор изображения.
Возвращает ширину изображения в пикселах.


IsImage

IsImage()

Синтаксис

Result = IsImage(#Image)
Описание
#Image – это уникальный идентификатор изображения.
Эта функция проверяет уникальный идентификатор указанного изображения, а так же является ли указанное целое неотрицательное число #Image корректным и правильно инициализированным. Функция возвращает не нулевой результат, если есть открытое изображение с таким идентификатором. Если изображения с таким идентификатором нет, будет возвращён нулевой результат. Если Result не равен 0 то изображение инициализировано правильно. Обычно эту функцию используют, чтобы узнать существует ли изображение.


LoadImage

LoadImage()

Синтаксис

Result = LoadImage( #Image, Filename$ [, Flags] )
Описание
#Image – это уникальный идентификатор изображения.
FileName$ - строка, содержащая путь к файлу.
Эта функция загружает готовое изображение с жесткого диска.
Если в качестве параметра #Image поставить #PB_Any, то универсальный идентификатор (id) загруженного изображения будет возвращен в качестве 'Result'.
Поддерживаются форматы изображений:
BMP, icon (.ico только в Windows) или любой другой формат поддерживаемый библиотекой ImagePlugin Library. По умолчанию установлена глубина цвета равная 24 битам (или 32 бита, если формат поддерживает альфа-каналы. Например: PNG и TIFF).

'Flags' может принимать следующие значения:
  #PB_Image_DisplayFormat: формат загруженного изображения (глубина цвета) будет соотверствовать формату десктопа.
Эти функции позволяют использовать дополнительные форматы изображений:
Внимание: эти функции должны быть вызваны перед загрузкой изображений соответствующих типов:

UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()

Вы можете использовать другие функции для работы с загруженными изображениями:
StartDrawing() с ImageOutput() позволяют рисовать на загруженном изображении
CopyImage() создает точную копию открытого изображения
GrabImage() создает изображение из указанной области открытого изображения
DrawImage() с ImageID() позволяет отображать изображение на площади текущего рисунка.
DrawAlphaImage() с ImageID() позволяет отображать изображение (с альфа каналом) на площади текущего рисунка.
ImageGadget() позволяет отображать изображение в окне
ButtonImageGadget() создает кнопку с изображением в окне

Примечание: максимально поддерживаемый размер равен 8192x8192 пикселам (если достаточно оперативной памяти).


ResizeImage

ResizeImage()

Синтаксис

ResizeImage( #Image, Width, Height [, Mode] )
Описание
#Image – это уникальный идентификатор изображения.
Изменяет размеры изображения до указанных.

Необязательный параметр 'Mode' может принимать следующие значения:
  #PB_Image_Smooth: Resize со сглаживанием (по умолчанию)
  #PB_Image_Raw   : Изменяет размер без сглаживания.
Примечание: Эта функция изменяет handle используемого изображения. Поэтому изображение должно быть недавно создано функциями ImageGadget() и SetGadgetState(). Максимально поддерживаемый размер равен 8192x8192 пикселам (если достаточно оперативной памяти).


SaveImage

SaveImage()

Синтаксис

Result = SaveImage( #Image, Filename$ [, ImagePlugin [, Flags]] )
Описание
#Image – это уникальный идентификатор изображения.
Filename$ - это название файла.
Сохраняет выбранное изображение #Image на жесткий диск с именем FileName$. По умолчанию изображение сохраняется как BMP 24 bit. Если функция вернет 0 - сохранить не удалось.
'ImagePlugin' - это необязательный параметр, он может принимать следующие значения:
  #PB_ImagePlugin_BMP      : сохранить в формате BMP.
  #PB_ImagePlugin_JPEG     : сохранить в формате JPEG (функция UseJPEGImageEncoder() должна быть предварительно использована)
  #PB_ImagePlugin_JPEG2000 : сохранить в формате JPEG2000(функция UseJPEG2000ImageEncoder() должна быть предварительно использована)
  #PB_ImagePlugin_PNG      : сохранить в формате PNG (функция UsePNGImageEncoder() должна быть предварительно использована)
Необязательный параметр 'Flags' может принимать значение от 0 до 10 (0 - минимальное качество для сохраняемого изображения и соответственно минимальный размер, 10 - максимальное качество).
В настощий момент поддерживаются форматы JPEG и JPEG 2000 (если флаги не установлены, по умолчанию качество изображения равно '7').


ImagePlugin

PureBasic - ImagePlugin

Краткий обзор

PureBasic поддерживает различные форматы изображений через динамическую систему плагинов. Это означает, что только необходимый шифратор или дешифратор будет интегрирован в исполняемый файл, таким образом уменьшая конечный размер программы. Например, если вы нуждаетесь только в формате JPEG, то будет использован шифратор или дешифратор только этого формата. Еще одной интересной особенностью является автоматическое определение формата файла, при использовании нескольких форматов. Следующие команды поддерживают плагины для изображений: LoadImage(), CatchImage(), SaveImage(), LoadSprite() CatchSprite(), и SaveSprite().

Краткий перечень команд

UseJPEG2000ImageDecoder
UseJPEG2000ImageEncoder
UseJPEGImageDecoder
UseJPEGImageEncoder
UsePNGImageDecoder
UsePNGImageEncoder
UseTGAImageDecoder
UseTIFFImageDecoder


UseJPEG2000ImageDecoder

UseJPEG2000ImageDecoder()

Синтаксис

UseJPEG2000ImageDecoder()
Описание
Включает поддержку формата JPEG 2000 для команд CatchImage(), LoadImage(), CatchSprite() и LoadSprite(). Формат 2000 JPEG использует сильное сжатие (с потерями), это означает, что информация теряется в процессе сжатия, позволяя значительно уменьшить размер файла. В настоящее время это один из лучших доступных алгоритмов сжатия, который может уменьшить размер изображения, используется в основном в Интернете и в фотографии.


UseJPEG2000ImageEncoder

UseJPEG2000ImageEncoder()

Синтаксис

UseJPEG2000ImageEncoder()
Описание
Включает поддержку формата JPEG 2000 для команд SaveImage() и SaveSprite(). Формат 2000 JPEG использует сильное сжатие (с потерями), это означает, что информация теряется в процессе сжатия, позволяя значительно уменьшить размер файла. В настоящее время это один из лучших доступных алгоритмов сжатия, который может уменьшить размер изображения. Этот Encoder может кодировать изображения 32 бит с альфа каналом.


UseJPEGImageDecoder

UseJPEGImageDecoder()

Синтаксис

UseJPEGImageDecoder()
Описание
Включает поддержку формата JPEG для команд CatchImage(), LoadImage(), CatchSprite() и LoadSprite(). Поддерживаются все версии JPEG, в том числе прогрессивные формы. Формат JPEG использует сильное сжатие, это означает, что информация теряется в процессе сжатия, позволяя значительно уменьшить размер файла. В настоящее время это один из лучших форматов сжатия в своем классе, который может уменьшить размер изображения, используется в основном в Интернете и в фотографии.


UseJPEGImageEncoder

UseJPEGImageEncoder()

Синтаксис

UseJPEGImageEncoder()
Описание
Включает поддержку формата JPEG для команд SaveImage() и SaveSprite(). Поддерживаются все версии JPEG, в том числе прогрессивные формы. Формат JPEG использует сильное сжатие, это означает, что информация теряется в процессе сжатия, позволяя значительно уменьшить размер файла. В настоящее время это один из лучших форматов сжатия в своем классе, который может уменьшить размер изображения, используется в основном в Интернете и в фотографии.


UsePNGImageDecoder

UsePNGImageDecoder()

Синтаксис

UsePNGImageDecoder()
Описание
Включает поддержку формата PNG (Portable Network Graphic) для команд CatchImage(), LoadImage(), CatchSprite() и LoadSprite(). Поддерживаются все форматы, включая прогрессивный. Формат PNG используется дизайнерами Web-страниц, поскольку использует неразрушающее сжатие (без потерь) что означает, что изображение при архивации не теряет сведений. Это - фактически лучший доступный алгоритм сжатия без потерь.


UsePNGImageEncoder

UsePNGImageEncoder()

Синтаксис

UsePNGImageEncoder()
Описание
Включает поддержку формата PNG (Portable Network Graphic) для команд SaveImage() и SaveSprite(). Формат PNG используется дизайнерами Web-страниц, поскольку использует неразрушающее сжатие (без потерь) что означает, что изображение при архивации не теряет сведений. Этот Encoder может кодировать изображения 32 бит с альфа каналом.


UseTGAImageDecoder

UseTGAImageDecoder()

Синтаксис

UseTGAImageDecoder()
Описание
Включает поддержку формата TGA для команд CatchImage(), LoadImage(), CatchSprite() и LoadSprite(). Формат TGA при архивации не теряет информации (сжимается без потерь). Размер изображения TGA является обычно большим, поскольку очень слабое сжатие. Этот формат в основном используется в мире 3D, поскольку он одним из первых форматов включяющих альфа-канал непосредственно в изображение. Если альфа-канал присутствует в изображении, он не будет принимаються во внимание.


UseTIFFImageDecoder

UseTIFFImageDecoder()

Синтаксис

UseTIFFImageDecoder()
Описание
Включает поддержку формата TIFF для команд CatchImage(), LoadImage(), CatchSprite() и LoadSprite(). TIFF формат очень сложный и поддерживает несколько внутренних суб-форматов сжатия, таких как JPEG, LZW и т.д. Поддерживаются все варианты TIFF. Формат TIFF делает ваши программы довольно большими.


Joystick

PureBasic - Joystick

Краткий обзор

PureBasic предоставляет полный доступ к джойстикам, подключенным к компьютеру. Эта библиотека поддерживает стандартные джойстики с количеством кнопок до 8. В Windows эта библиотека использует технологию DirectX.

Краткий перечень команд

ExamineJoystick
InitJoystick
JoystickAxisX
JoystickAxisY
JoystickButton


ExamineJoystick

ExamineJoystick()

Синтаксис

Result = ExamineJoystick()
Описание
Обновить состояние джойтиска. Эта функция должна быть вызвана перед использованием следующих функций для получения текущего состояния джойстиков: JoystickButton(), JoystickAxisX(), JoystickAxisY().


InitJoystick

InitJoystick()

Синтаксис

Result = InitJoystick()
Описание
Инициализировать модуль работы с джойстиком для последующего использования. Эта функция должна быть вызвана перед любой другой функцией из этой библиотеки. В 'Result' возвращается количество доступных джойстиков. Эта функция пытается открыть DirectX. Если эта функция не справится с открытием DirectX, скорее всего это из-за того, что DirectX не доступен в системе или установленная версия устарела. Рекомендации по DirectX таковы: DirectX версия v3.0 для совместимости с NT4.0 или DirectX версия v7.0 во всех других случаях.


JoystickAxisX

JoystickAxisX()

Синтаксис

Result = JoystickAxisX(#Joystick)
Описание
Возвращает состояние оси X джойстика #Joystick. Номера джойстиков начинаются с 0. Количество доступных джойстиков возвращает функция InitJoystick().

Значение 'Result' будет одно из следующих:

-1: Движение влево
0: нет движения по оси X
1: Движение вправо

Перед вызовом этой функции должна быть вызвана функция ExamineJoystick(), чтобы обновить текущее состояние джойстика.


JoystickAxisY

JoystickAxisY()

Синтаксис

Result = JoystickAxisY(#Joystick)
Описание
Возвращает состояние оси Y джойстика #Joystick. Номера джойстиков начинаются с 0. Количество доступных джойстиков возвращает функция InitJoystick().

Значение 'Result' будет одно из следующих:

-1: Движение вверх
0: нет движения по оси Y
1: Движение вниз

Перед вызовом этой функции должна быть вызвана функция ExamineJoystick(), чтобы обновить текущее состояние джойстика.


JoystickButton

JoystickButton()

Синтаксис

Result = JoystickButton(#Joystick, ButtonNumber)
Описание
Возвращает состояние кнопок джойстика #Joystick. Номера джойстиков начинаются с 0. Количество доступных джойстиков возвращает функция InitJoystick().

Значение 'Result' будет равно 0, если указанная кнопка не нажата, иначе это будет ненулевое значение. Одновременно может быть нажато любое количество кнопок. Перед вызовом этой функции должна быть вызвана функция. ExamineJoystick(), чтобы обновить текущее состояние джойстика. Номера кнопок начинаются с 1.


Keyboard

PureBasic - Keyboard

Краткий обзор

PureBasic предоставляет быстрый и простой доступ к клавиатуре. Эту возможность следует использовать только в тех приложениях, где необходим непосредственный и предельно быстрый доступ, таких как игры, например. Библиотека использует технологию DirectX.

Эта библиотека была создана для игр и приложений мультимедиа, которым требуется быстрый доступ к клавиатуре, основанный на DirectX. Для обычных приложений Windows лучше использовать функцию AddKeyboardShortcut().

Краткий перечень команд

ExamineKeyboard
InitKeyboard
KeyboardInkey
KeyboardMode
KeyboardPushed
KeyboardReleased


ExamineKeyboard

ExamineKeyboard()

Синтаксис

ExamineKeyboard()
Описание
Обновить состояние клавиатуры. Эта функция должна быть вызвана перед использованием команд KeyboardInkey(), KeyboardPushed() или KeyboardReleased().


InitKeyboard

InitKeyboard()

Синтаксис

Result = InitKeyboard()
Описание
Инициализировать модуль работы с клавиатурой для последующего использования. Если значение 'Result' равно 0, инициализация не удалась. Вы должны вызвать эту функцию перед вызовом любой другой функции из этой библиотеки. Если эта функция не справится с открытием DirectX, скорее всего это из-за того, что DirectX не доступен в системе или установленная версия устарела. Рекомендации по DirectX таковы: DirectX версия v3.0 для совместимости с NT4.0 или DirectX версия v7.0 во всех других случаях.


KeyboardInkey

KeyboardInkey()

Синтаксис

String$ = KeyboardInkey()
Описание
Возвращает последний набранный символ, очень полезно если требуется эффективный ввод с клавиатуры в игровом приложении, такой как имя в таблице рекордов, во внутриигровой консоли и т.д.).

Пример:
  If InitSprite() And InitKeyboard() And OpenScreen(800,600,16,"")
    Repeat
      FlipBuffers()
      ClearScreen(RGB(0, 0, 0))

      ExamineKeyboard()
      FullText$ + KeyboardInkey()  ; Add the new text to the current one (if any)

      ; If we press the 'Back' key, delete the last character
      ;
      If KeyboardReleased(#PB_Key_Back)
        FullText$ = Left(FullText$, Len(FullText$)-1)
      EndIf

      ; Display the result
      ;
      If StartDrawing(ScreenOutput())
        DrawingMode(1)
        FrontColor(RGB(128, 255, 0))
        DrawText(20, 20, "Just type some text...:")
        DrawText(20, 40, FullText$)
        StopDrawing()
      EndIf
    Until KeyboardPushed(#PB_Key_Escape)
  EndIf


KeyboardMode

KeyboardMode()

Синтаксис

KeyboardMode(Flags)
Описание
Изменяет текущее поведение клавиатуры. Эта функция влияет на функции KeyboardPushed() и KeyboardReleased().

Параметр 'Flags' может быть сочетанием (с помощью операции '|') следующих значений:
  #PB_Keyboard_Qwerty         : Клавиатура игнорирует раскладку языка по умолчанию и всегда использует раскладку QWERTY (поведение по умолчанию).
  #PB_Keyboard_International  : Клавиатура использует раскладку языка по умолчанию для клавиш (может быть полезно для клавиатур не QWERTY вида).
  #PB_Keyboard_AllowSystemKeys: Разрешены системные клавиши ОС (например Win+R и т.д.). Если пользователь нажмёт их случайно в fullscreen mode
                                это может раздражать.

Поддерживаемые ОС

Windows


KeyboardPushed

KeyboardPushed()

Синтаксис

Result = KeyboardPushed(KeyID)
Описание
Возвращает 0 если указанная клавиша не нажата, иначе возвращает ненулевое значение. Одновременно может быть нажато любое количество клавиш. Перед вызовом этой функции должна быть вызвана функция ExamineKeyboard() для обновления состояния клавиатуры. Поведение клавиатуры можно изменить с помощью функции KeyboardMode().

Если вы хотите проверить, была ли указанная клавиша нажата и отпущена, посмотрите функцию KeyboardReleased().

Пример:
  If InitSprite() And InitKeyboard() And OpenScreen(800,600,16,"")
    Repeat
      FlipBuffers()

      If StartDrawing(ScreenOutput())
        DrawText(0, 0, "Press ESC to quit")
        StopDrawing()
      EndIf

      ExamineKeyboard()
      If KeyboardPushed(#PB_Key_Escape)   ; press Esc to quit
        End
      EndIf
    ForEver
  EndIf

Список корректных значений идентификатора KeyID:
    #PB_Key_All   ; Проверяются все клавиши. Очень полезно для проверок на любую клавишу.

    #PB_Key_1
    #PB_Key_2
    #PB_Key_3
    #PB_Key_4
    #PB_Key_5
    #PB_Key_6
    #PB_Key_7
    #PB_Key_8
    #PB_Key_9
    #PB_Key_0

    #PB_Key_A
    #PB_Key_B
    #PB_Key_C
    #PB_Key_D
    #PB_Key_E
    #PB_Key_F
    #PB_Key_G
    #PB_Key_H
    #PB_Key_I
    #PB_Key_J
    #PB_Key_K
    #PB_Key_L
    #PB_Key_M
    #PB_Key_N
    #PB_Key_O
    #PB_Key_P
    #PB_Key_Q
    #PB_Key_R
    #PB_Key_S
    #PB_Key_T
    #PB_Key_U
    #PB_Key_V
    #PB_Key_W
    #PB_Key_X
    #PB_Key_Y
    #PB_Key_Z

    #PB_Key_Escape
    #PB_Key_Minus
    #PB_Key_Equals
    #PB_Key_Back
    #PB_Key_Tab
    #PB_Key_LeftBracket
    #PB_Key_RightBracket
    #PB_Key_Return
    #PB_Key_LeftControl
    #PB_Key_SemiColon
    #PB_Key_Apostrophe
    #PB_Key_Grave
    #PB_Key_LeftShift
    #PB_Key_BackSlash
    #PB_Key_Comma
    #PB_Key_Period
    #PB_Key_Slash
    #PB_Key_RightShift
    #PB_Key_Multiply
    #PB_Key_LeftAlt
    #PB_Key_Space
    #PB_Key_Capital
    #PB_Key_F1
    #PB_Key_F2
    #PB_Key_F3
    #PB_Key_F4
    #PB_Key_F5
    #PB_Key_F6
    #PB_Key_F7
    #PB_Key_F8
    #PB_Key_F9
    #PB_Key_F10
    #PB_Key_F11
    #PB_Key_F12
    #PB_Key_NumLock
    #PB_Key_Scroll
    #PB_Key_Pad0
    #PB_Key_Pad1
    #PB_Key_Pad2
    #PB_Key_Pad3
    #PB_Key_Pad4
    #PB_Key_Pad5
    #PB_Key_Pad6
    #PB_Key_Pad7
    #PB_Key_Pad8
    #PB_Key_Pad9
    #PB_Key_Add
    #PB_Key_Subtract
    #PB_Key_Decimal
    #PB_Key_PadEnter
    #PB_Key_RightControl
    #PB_Key_PadComma
    #PB_Key_Divide
    #PB_Key_RightAlt
    #PB_Key_Pause
    #PB_Key_Home
    #PB_Key_Up
    #PB_Key_Down
    #PB_Key_Left
    #PB_Key_Right
    #PB_Key_End
    #PB_Key_PageUp
    #PB_Key_PageDown
    #PB_Key_Insert
    #PB_Key_Delete


KeyboardReleased

KeyboardReleased()

Синтаксис

Result = KeyboardReleased(KeyID)
Описание
Возвращает 1 если указанная клавиша была нажата и отпущена, иначе возвращает 0. Эта функция очень полезна для проверок переключающих клавиш, например клавиша 'Пауза' в игре (в первый раз игра приостанавливается, в следующий раз возобновляется). Перед вызовом этой функции должна быть вызвана функция ExamineKeyboard() для обновления состояния клавиатуры. Поведение клавиатуры можно изменить с помощью функции KeyboardMode(). Полный список значений параметра KeyID смотрите в справке по функции KeyboardPushed().

Пример:
  If InitSprite() And InitKeyboard() And OpenScreen(800,600,16,"")
    Paused = #False
    Repeat
      FlipBuffers()

      If StartDrawing(ScreenOutput())

        ExamineKeyboard()
        If KeyboardReleased(#PB_Key_P)
          If Paused = #False
            Paused = #True
          Else
            Paused = #False
          EndIf
        EndIf

        DrawingMode(0)

        If Paused = #False
          DrawText(20, 20, "Program is running...")
        Else
          DrawText(20, 20, "Program paused...    ")
        EndIf

        StopDrawing()
      EndIf
    Until KeyboardPushed(#PB_Key_Escape)
  EndIf


Library

PureBasic - Library

Краткий обзор

Библиотеки являются общими компонентами операционной системы, и содержат специальные функции. Например, библиотека может содержать команды для обработки и редактирования изображений. Каждая операционная система имеет свои собственные динамические библиотеки для облегчения жизни программиста. В PureBasic, можно использовать эти внешние библиотеки легко и динамично!

Библиотеки важны для программистов. Они освобождают программиста от необходимости постоянно перепрограммировать те же самые процедуры (каждый раз вам не нужно заново изобретать колесо). Библиотечный файл загружается в память один раз, что позволяет экономить дисковое пространство, особенно для наиболее часто используемых библиотек. Одну и ту же библиотеку одновременно могут использовать несколько программ. Другое преимущество - возможность изменять библиотеку не изменяя Вашу основную выполнимую программу (обновляя только библиотеку)

В среде Windows, эти библиотеки известны под именем 'DLL' (Dynamically Linked Library).

Краткий перечень команд

CallCFunction
CallCFunctionFast
CallFunction
CallFunctionFast
CloseLibrary
CountLibraryFunctions
ExamineLibraryFunctions
GetFunction
GetFunctionEntry
IsLibrary
LibraryFunctionAddress
LibraryFunctionName
LibraryID
NextLibraryFunction
OpenLibrary


CallCFunction

CallCFunction()

Синтаксис

Result = CallCFunction(#Library, FunctionName$ [,Parameter1 [, Parameter2...]])
Описание
Вызывает функцию FunctionName$ в библиотеке #Library, которая обрабатывает [,Parameter1 [, Parameter2...]] как и нормальные функции языка 'C', например, если функция требует 2 параметра, тогда 2 параметра должны быть переданными, даже если значения этих 2 параметров равны нулю. В настоящее время максимальное количество параметров 20. Библиотека, должно быть, заранее открыта функцией OpenLibrary(). Если функция описывается как 'cdecl' тогда, Вы должны использовать эту функцию. Однако, большинство DLLs, используемое в Windows, не использует этот вид, таким образом CallFunction() должно быть достаточно для большинства случаев.

Параметры

#Library - имя библиотеки, функцию которой вы вызываете. Это должно быть тем же самым именем, которое Вы использовали, когда Вы вызывали OpenLibrary().

FunctionName$ - строка, содержащая название функции, которую вы вызываете.

Parameter1, Parameter2, ... - параметры для функции, которую вы вызываете. Следует использовать правильное число параметров, как описано в документации для библиотеки, которую Вы используете.

Возвращаемое значение

Result - результат библиотечной функции, которую вы вызываете.

Примечание: эта функция не является очень гибкой и не может принимать и возвращать параметры типа-string/float/double/quad. Настоятельно рекомендуется использовать prototypes, чтобы заменить эту функцию.


CallCFunctionFast

CallCFunctionFast()

Синтаксис

Result = CallCFunctionFast(*FunctionPointer [,Parameter1 [, Parameter2...]])
Описание
Вызывает функцию напрямую, используя её адрес. Этот указатель может быть найден с помощью функций GetFunction(), GetFunctionEntry() или LibraryFunctionAddress(), это самый быстрый способ вызова функции библиотеки, особенно если вы храните результаты GetFunction () или LibraryFunctionAddress () как слово. Это потому, что эта функция не ищет название библиотечной функции. Эта функция должна использоваться, только если библиотечная функция использует соглашение о вызовах 'C'. Если функция описывается как 'cdecl' тогда, Вы должны использовать эту функцию. Однако, большинство DLLs, используемое в Windows, не использует этот вид, таким образом CallFunctionFast() должно быть достаточно для большинства случаев.

Если функция требует 2 параметра, тогда 2 параметра должны быть переданными, даже если значения этих 2 параметров равны нулю. В настоящее время максимальное количество параметров 20.

Параметры

*FunctionPointer - адрес функции в памяти, которую вы вызываете.

Parameter1, Parameter2, ... - параметры для функции, которую вы вызываете. Следует использовать правильное число параметров, как описано в документации для библиотеки, которую Вы используете.

Возвращаемое значение

Result - результат библиотечной функции, которую вы вызываете.

Примечание: эта функция не является очень гибкой и не может принимать и возвращать параметры типа-string/float/double/quad. Настоятельно рекомендуется использовать prototypes, чтобы заменить эту функцию.


CallFunction

CallFunction()

Синтаксис

Result = CallFunction(#Library, FunctionName$ [,Parameter1 [, Parameter2...]])
Описание
Вызывает функцию FunctionName$ в библиотеке #Library, которая обрабатывает [,Parameter1 [, Parameter2...]] используя её имя. Библиотека, должна быть, заранее открыта функцией OpenLibrary().

Если функция требует 2 параметра, тогда 2 параметра должны быть переданными, даже если значения этих 2 параметров равны нулю. В настоящее время максимальное количество параметров 20.

Параметры

#Library - имя библиотеки, функцию которой вы вызываете. Это должно быть тем же самым именем, которое Вы использовали, когда Вы вызывали OpenLibrary().

FunctionName$ - строка, содержащая название функции, которую вы вызываете.

Parameter1, Parameter2, ... - параметры для функции, которую вы вызываете. Следует использовать правильное число параметров, как описано в документации для библиотеки, которую Вы используете.

Возвращаемое значение

Result - результат библиотечной функции, которую вы вызываете.

Примечание: эта функция не является очень гибкой и не может принимать и возвращать параметры типа-string/float/double/quad. Настоятельно рекомендуется использовать prototypes, чтобы заменить эту функцию.


CallFunctionFast

CallFunctionFast()

Синтаксис

Result = CallFunctionFast(*FunctionPointer [,Parameter1 [, Parameter2...]])
Описание
Вызывает функцию напрямую, используя её адрес. Этот указатель может быть найден с помощью функций GetFunction(), GetFunctionEntry() или LibraryFunctionAddress(), это самый быстрый способ вызова функции библиотеки, особенно если вы храните результаты GetFunction () или LibraryFunctionAddress () как слово. Это потому, что эта функция не ищет название библиотечной функции.

Эта функция также позволяет Вам вызывать процедуры PureBasic из Вашего собственного программного кода. Адрес процедуры PureBasic можно получить, используя символ '@' перед названием процедуры, например "@myprocedure()".

Если функция требует 2 параметра, тогда 2 параметра должны быть переданными, даже если значения этих 2 параметров равны нулю. В настоящее время максимальное количество параметров 20.

Параметры

*FunctionPointer - адрес функции в памяти, которую вы вызываете.

Parameter1, Parameter2, ... - параметры для функции, которую вы вызываете. Следует использовать правильное число параметров, как описано в документации для библиотеки, которую Вы используете.

Возвращаемое значение

Result - результат библиотечной функции, которую вы вызываете.

Примечание: эта функция не является очень гибкой и не может принимать и возвращать параметры типа-string/float/double/quad. Настоятельно рекомендуется использовать prototypes, чтобы заменить эту функцию.


CloseLibrary

CloseLibrary()

Синтаксис

CloseLibrary(#Library)
Описание
Закрывает библиотеку #Library, которую Вы ранее открыли, использовав OpenLibrary(), и освобождаете всю память, связанную с ней.

Примечание: все оставшиеся открытыми библиотеки автоматически закрываются, когда программа завершается.

Параметры

#Library - идентификационный номер библиотеки. Это должно быть то же значение, которое вы использовали, чтобы открыть библиотеку.

Возвращаемое значение

Эта функция не возвращает значения.


CountLibraryFunctions

CountLibraryFunctions()

Синтаксис

Result = CountLibraryFunctions(#Library)
Описание
Возвращает количество функций, доступных в библиотеке. Библиотека должна быть открыта, когда вы вызываете эту функцию.

Параметры

#Library - имя библиотеки, количество функций которой необходимо получить. Это должно быть то же самое имя, которое Вы использовали, когда вызывали OpenLibrary().

Возвращаемое значение

Result - Количество функций имеющихся в распоряжении библиотеки.

Поддерживаемые ОС

Windows, Linux


ExamineLibraryFunctions

ExamineLibraryFunctions()

Синтаксис

Result = ExamineLibraryFunctions(#Library)
Описание
Приступает к просмотру функций, содержащихся в библиотеке #Library. Библиотека, должна быть, заранее открыта функцией OpenLibrary(). Если эта функция успешна, вы можете переходить по функциям в библиотеке, (используя NextLibraryFunction()) и искать имена и адреса каждой функции (с помощью LibraryFunctionName() и LibraryFunctionAddress() соответственно).

Параметры

#Library - имя библиотеки, которую вы хотите исследовать. Это должно быть то же самое имя, которое Вы использовали, когда вызывали OpenLibrary().

Возвращаемое значение

Result - Это значение показывает, могут быть исследованы библиотечные функции или нет. Если значение =0 тогда, они не могут быть исследованы. Если значение является не нулевым тогда, они могут быть исследованы.

Поддерживаемые ОС

Windows, Linux


GetFunction

GetFunction()

Синтаксис

Result.l = GetFunction(#Library, FunctionName$)
Описание
Проверяет библиотеку #Library, открытую ранее с помощью OpenLibrary(), на наличие функции FunctionName$. Обратите внимание, что имя функции чувствительно к регистру.

Параметры

#Library - имя библиотеки, в которой Вы хотите найти функцию. Это должно быть то же самое имя, которое Вы использовали, когда вызывали OpenLibrary().

FunctionName$ - строка, содержащая имя функции, которую хотите найти.

Возвращаемое значение

Result - адрес функции из библиотеки (в памяти), является полезным, для использования с командами CallFunctionFast() или CallCFunctionFast(). Если адрес равен нулю, то функция не может быть найдена, и вы не должны пытаться её вызвать.


GetFunctionEntry

GetFunctionEntry()

Синтаксис

Result = GetFunctionEntry(#Library, FunctionEntry)
Описание
Проверяет библиотеку #Library, ранее открытую с помощью OpenLibrary(), на наличие функции FunctionEntry. Эта команда ищет функцию библиотеки посредством ее позиции, в таблице функций библиотеки, вместо названия, как GetFunction(). Эта функция может быть полезна для вызова недокументированных API функций.

Параметры

#Library - имя библиотеки, в которой Вы хотите найти функцию. Это должно быть то же самое имя, которое Вы использовали, когда вызывали OpenLibrary().

FunctionEntry - число, представляющее функциональный индекс в библиотеке. Первая функция по индексу 1.

Возвращаемое значение

Result - адрес функции из библиотеки (в памяти), является полезным, для использования с командами CallFunctionFast() или CallCFunctionFast(). Если адрес равен нулю, то функция не может быть найдена, и вы не должны пытаться её вызвать.

Поддерживаемые ОС

Windows


IsLibrary

IsLibrary()

Синтаксис

Result = IsLibrary(#Library)
Описание
Проверяет наличие библиотеки #Library. Эта функция может быть с любым значением. Если 'Result' не равен нулю, то библиотека существует и инициализирована, в противном случае она возвращает нуль. Это правильный способ гарантировать, что библиотека готова к использованию.


LibraryFunctionAddress

LibraryFunctionAddress()

Синтаксис

Result.l = LibraryFunctionAddress()
Описание
Возвращает адрес функции в библиотеке, исследуемой в настоящее время ExamineLibraryFunctions() и NextLibraryFunction().

Параметры

Нет.

Возвращаемое значение

Result - содержит адрес в памяти, о библиотечной функцией, которая может быть использована с командами CallFunctionFast() или CallCFunctionFast().

Поддерживаемые ОС

Windows, Linux


LibraryFunctionName

LibraryFunctionName()

Синтаксис

Result$ = LibraryFunctionName()
Описание
Возвращает имя функции в библиотеке, исследуемой в настоящее время ExamineLibraryFunctions() и NextLibraryFunction() functions.

Параметры

Нет.

Возвращаемое значение

Result$ - содержит имя функции библиотеки, которая может быть использованной с командами CallFunction() или CallCFunction().

Поддерживаемые ОС

Windows, Linux


LibraryID

LibraryID()

Синтаксис

Result = LibraryID(#Library)
Описание
Возвращает уникальный идентификатор, который идентифицируют указанную библиотеку #Library, в операционной системе.


NextLibraryFunction

NextLibraryFunction()

Синтаксис

Result = NextLibraryFunction()
Описание
Эта функция должна только быть вызвана после успешного использования функции ExamineLibraryFunctions(). Это позволяет Вам идти шаг за шагом в библиотеке, и исследовать ее содержание. Имя и адрес каждой функции могут быть получены командами LibraryFunctionName() и LibraryFunctionAddress().

Параметры

Нет.

Возвращаемое значение

Result - Нуль, если нет больше доступных функций (конец списка). Если Result является ненулевым, тогда все еще есть функции, которые будут исследованы.

Поддерживаемые ОС

Windows, Linux


OpenLibrary

OpenLibrary()

Синтаксис

Result.l = OpenLibrary(#Library, Filename$)
Описание
Открывает общедоступную библиотеку для того, чтобы можно было обратиться к её функциям. Если Вы открываете библиотеку, с именем уже открытой библиотеки, тогда ранее открытая библиотека автоматически закроется.

Параметры

#Library - идентификационный номер открываемой библиотеки. Если #PB_Any будет использоваться как параметр, то в 'Result' будет возвращен новый номер библиотеки . Это число должно использоваться во всех других функциях всякий раз, когда Вы хотите идентифицировать библиотеку, с которой Вы хотите работать.

Filename$ - строка, содержащая имя файла открываемой библиотеки. Как правило, если Вы не указываете путь как часть имени файла, то библиотека ищется в каталоге Вашей программы, и если она там не находится, то будет просматриваться каталог системных библиотек.

Return value

Result - значение, показывающее, может быть открыта библиотека или нет. Result =0 означает, что библиотека не может быть открыта (файл, не найден или поврежден). Любое ненулевое значение означает, что библиотека была успешно открыта.

Только для опытных пользователей:
Значение, возвращенное этой командой - это OS-Handle или указатель на библиотеку. Это позволяет вам открыть библиотеку для использования непосредственно, вызовами API функций.


Light

PureBasic - Light

Краткий обзор

Lights are essential components to do realistic looking worlds. As real life light, it's possible to specify many attributes to it like the color, specular color, direction and more. InitEngine3D() should be called successfully before using the Light functions.

Краткий перечень команд

CopyLight
CreateLight
FreeLight
HideLight
IsLight
LightColor
LightLocate
LightSpecularColor
MoveLight


CopyLight

CopyLight()

Синтаксис

Result = CopyLight(#Light, #NewLight)
Описание
Creates a #NewLight which is the exact copy of the specified #Light. All the #Light attributes like color, specular color, position etc.. are duplicated. If #PB_Any is used as '#NewLight' parameter, the new light number will be returned as 'Result'. If #NewLight was already created, it will be automatically freed and replaced by the new one.


CreateLight

CreateLight()

Синтаксис

Result = CreateLight(#Light, Color [, x, y, z])
Описание
Creates a new #Light of the given Color in the current world. If #PB_Any is used as '#Light' parameter, the new light number will be returned as 'Result'.

Valid colors can be easily created with the RGB() function. The new light is created at the 0,0,0 location unless the optionals 'x,y,z' paremeters are specified. If the #Light was already created, it is automatically freed and replaced by the new one.

Пример:
  CreateLight(0, RGB(255,0,0)) ; Creates a red light

  CreateLight(1, RGB(0,255,0),  0, 100.7, 50) ; Creates a green light, the position (0, 100.7, 50)


FreeLight

FreeLight()

Синтаксис

FreeLight(#Light)
Описание
Frees the specified #Light. All its associated memory is released and this object can't be used anymore.

Note: all remaining lights are automatically freed when the program ends.


HideLight

HideLight()

Синтаксис

HideLight(#Light, State)
Описание
Hides or Shows the specified #Light. 'State' can take the following values:
  1: the #Light is hidden
  0: the #Light is shown


IsLight

IsLight()

Синтаксис

Result = IsLight(#Light)
Описание
Tests if the given #Light is a valid and correctly initialized light.

This function is bullet-proof and can be used with any value. If the 'Result' is not zero then the object is valid and initialized, else it returns zero. This is the correct way to ensure that a light is ready to use.


LightColor

LightColor()

Синтаксис

LightColor(#Light, Color)
Описание
Changes the #Light color. Valids colors can be easily created with the RGB() function.


LightLocate

LightLocate()

Синтаксис

LightLocate(#Light, x, y, z)
Описание
Changes the #Light absolute location in the world.


LightSpecularColor

LightSpecularColor()

Синтаксис

LightSpecularColor(#Light, Color)
Описание
Changes the #Light specular color. Valids colors can be easily created with the RGB() function.


MoveLight

MoveLight()

Синтаксис

MoveLight(#Light, x, y, z)
Описание
Moves the #Light in the world according to the specified x,y,z values. This is a relative move based on the previous Light location. To perform an absolute move in the world, use LightLocate().


LinkedList

PureBasic - LinkedList

Краткий обзор

Связанные списки структур для хранения данных, которые выделяются динамически в зависимости от ваших потребностей. Это список элементов (данные, которые вы хотите сохранить), каждый элемент является полностью независимым от других элементов. Вы можете добавить бесконечное число элементов (или столько, сколько поместится в памяти вашего компьютера), добавить элементы в выбранную позицию, удаление элементов и т.д.. Этот метод хранения информации является очень практичным и гибким. Это наилучший способ управления данными, если вы не знаете заранее, сколько элементов необходимо сохранить, или вы часто меняете количество хранимых элементов.

Перед началом работы со связанными списками, вы должны объявить их. Это делается с помощью команд NewList. Для сохранения содержимого также часто используются structures.

Для анализа содержания связанного списка, можно использовать следующие циклы: For : Next, ForEach : Next, Repeat : Until or While : Wend.

Краткий перечень команд

AddElement
ChangeCurrentElement
ClearList
DeleteElement
FirstElement
InsertElement
LastElement
ListIndex
ListSize
NextElement
PreviousElement
ResetList
SelectElement
SwapElements


AddElement

AddElement()

Синтаксис

AddElement(LinkedList())
Описание
Добавляет новый пустой элемент после текущего или как первый пункт в списке, если список еще пуст. Этот новый элемент становится текущим элементом списка.

Параметр:
LinkedList() - Имя переменной связанного списка, созданной оператором NewList. После имени списка необходимо включить скобки.

Возвращаемое значение:
Значение, возвращаемое этой функцией можно использовать для проверки возможности создания нового элемента (при недостаточном количестве оперативной памяти, создать новый элемент нет возможости). При создании нового элемента эта функция возвращает значение не равное нулю. Если новый элемент не создан, то функция вернет ноль.

Для продвинутых пользователей:
Значение, которое возвращает эта функция, это указатель pointer на предыдущий элемент данных или ноль, если предыдущий элемент не существует.

Пример:
  ; The simplest way to use AddElement
  NewList simple.w()
  AddElement(simple())    ; Creates the first new element in the list
  simple() = 23

  AddElement(simple())    ; Current position is the first element, so we add one to the second position
  simple() = 45

  ; This shows how to use the return value of AddElement
  NewList advanced.l()
  If AddElement(advanced()) <> 0
    advanced() = 12345
  Else
    MessageRequester("Error!", "Unable to allocate memory for new element", #PB_MessageRequester_OK)
  EndIf

  ; A small structure to demonstrate the "advanced users" description (above)
  Structure Programmer
    Name.s
    Strength.b
  EndStructure

  NewList Programmers.Programmer()  ; The list for storing the elements

  *Element.Programmer = AddElement(Programmers())
  If *Element<>0
    *Element\Name = "Dave"
    *Element\Strength = 3   ; Wow, super-strong geek! ;)
  Else
    MessageRequester("Error!", "Unable to allocate memory for new element", #PB_MessageRequester_OK)
  EndIf


ChangeCurrentElement

ChangeCurrentElement()

Синтаксис

ChangeCurrentElement(LinkedList(), *NewElement)
Описание
Изменяет текущий элемент указанного списка к данному новому элементу. Новый элемент должен быть указателем pointer на другой элемент, который существует в данном списке. Эта функция очень полезна, если вы хотите "помнить" элемент и позволяет восстановить его после выполнетия других операций.

Параметры:
LinkedList() - Имя переменной связанного списка, созданной оператором NewList. После имени списка необходимо включить скобки.
*NewElement - Для того чтобы установить новый элемент для связанного списка текущим, необходимо получить этот адрес используя оператор @ в имени списка, но не любым другим методом.

Возвращаемое значение:
Эта функция ничего не возвращает.

Пример:
  *Old_Element = @mylist()   ; Get the address of the current element

  ResetList(mylist())        ; Perform a search for all elements named
  While NextElement(mylist())   ; "John" and change them to "J"
    If mylist()\name = "John"
      mylist()\name = "J"
    EndIf
  Wend

  ChangeCurrentElement(mylist(), *Old_Element) ; Restore previous current element (from before the search)


ClearList

ClearList()

Синтаксис

ClearList(LinkedList())
Описание
Удаляет все элементы в указанном списке и освобождает память. После вызова этой процедуры с писок пуст, но пригоден к повторному наполнению (то есть в нем нет никаких элементов).

Параметры:
LinkedList() - Имя связанного списка, который создан оператором NewList. После названия списка необходимо ставить скобки.

Возвращаемое значение:
Эта функция значение не возвращает.

Пример:
  NewList Numbers.w()

  ; A small loop to add many items to the list
  For i=1 To 100
    AddElement(Numbers())
    Numbers() = i
  Next

  ; Proof that items have been added to the list
  MessageRequester("Information", "There are "+Str(ListSize(Numbers()))+" elements in the list", #PB_MessageRequester_OK)

  ; Clear the list and show that the list really is empty
  ClearList(Numbers())
  MessageRequester("Information", "There are "+Str(ListSize(Numbers()))+" elements in the list", #PB_MessageRequester_OK)

Note:
PureBasic will only free the memory for the elements. If you have been using the linked list for something such as storing handles of objects that you create directly with the OS, there is no way PureBasic (or any other language) can know what they are. Therefore, in cases such as that, you should go through the elements in the list and free the objects yourself.


DeleteElement

DeleteElement()

Синтаксис

DeleteElement(LinkedList() [, Flags])
Описание
Удаляет текущий элемент из списка.
После вызова этой функции предыдущий элемент становится текущим (первый перед удаленным элементом). Если удалить первый элемент в списке, то текущего элемента в списке не будет, как после применения функции ResetList(). Но, если установлен 'Flags' на 1 и первый элемент был удален, то новый текущий элемент будет вторым. Этот флаг гарантирует что всегда будет доступен текущий элемент. Если в списке только один элемент, то при удалении этого элемента в списке текущих элементов не будет.

Параметры:
LinkedList() - Имя связанного списка, который создан оператором NewList. После названия списка необходимо создавать скобки.

Возвращаемое значение:
Эта функция значений не возвращает.

Пример:
  NewList people.s()

  AddElement(people()) : people() = "Tom"
  AddElement(people()) : people() = "Dick"
  AddElement(people()) : people() = "Harry"
  AddElement(people()) : people() = "Bob"

  FirstElement(people())
  DeleteElement(people(), 1)
  MessageRequester("Information", "First person in list is "+people(), #PB_MessageRequester_Ok)

  LastElement(people())      ; Moves to "Bob"
  PreviousElement(people())  ; Moves to "Harry"
  DeleteElement(people())    ; And deletes him. there is an element before Harry, so it becomes the current
  MessageRequester("Information", "Current person in list is "+people(), #PB_MessageRequester_Ok)


FirstElement

FirstElement()

Синтаксис

FirstElement(LinkedList())
Описание
Изменяет текущий элемент на первый элемент списка.

Параметры:
LinkedList() - Имя связанного списка, который создан оператором NewList. После названия списка необходимо ставить скобки.

Возвращаемое значение:
Возвращаемое значение этой функции можно использовать для проверки на наличие первого элемента в списке (если первый элемент отсутствует, то список пуст). Если первый элемент существует, то данная функция вернет значение не равное нулю. Если первый элемент не существует, то функция вернет ноль.

Для продвинутых пользователей:
Значение, которое возвращает эта функция, это указатель pointer на предыдущий элемент данных или ноль, если предыдущий элемент не существует.

Пример:
  ; An example of simple usage
  NewList Numbers.w()

  AddElement(Numbers())
  Numbers() = 5
  AddElement(Numbers())
  Numbers() = 8

  FirstElement(Numbers())
  MessageRequester("Information", "First element value is "+Str(Numbers()), #PB_MessageRequester_OK)

  ; An example which uses the return value
  NewList Numbers.w()

  If FirstElement(Numbers()) <> 0
    MessageRequester("Information", "First element value is "+Str(Numbers()), #PB_MessageRequester_OK)
  Else
    MessageRequester("Information", "List is empty", #PB_MessageRequester_OK)
  EndIf

  AddElement(Numbers())
  Numbers() = 5
  AddElement(Numbers())
  Numbers() = 8

  If FirstElement(Numbers()) <> 0
    MessageRequester("Information", "First element value is "+Str(Numbers()), #PB_MessageRequester_OK)
  Else
    MessageRequester("Information", "List is empty", #PB_MessageRequester_OK)
  EndIf

  ; An example which is only for advanced users
  NewList Numbers.w()

  AddElement(Numbers())
  Numbers() = 5
  AddElement(Numbers())
  Numbers() = 8

  *Element.Word = FirstElement(Numbers())
  If *Element
    MessageRequester("Information", "First element value is "+Str(*Element\w), #PB_MessageRequester_OK)
  Else
    MessageRequester("Information", "List is empty", #PB_MessageRequester_OK)
  EndIf


InsertElement

InsertElement()

Синтаксис

InsertElement(LinkedList())
Описание
Вставляет новый пустой элемент перед текущим элементом, или в начало списка, если список пуст (то есть не имеет никаких элементов). Этот новый элемент становится текущим элементом списка.

Параметры:
LinkedList() - Имя связанного списка, который создан оператором NewList. После названия списка необходимо создавать скобки.

Возвращаемое значение:
Значение возвращаемое данной функцией можно использовать для проверки на возможность создания нового элемента в списке (например, нет больше свободной памяти). Если новый элемент был создан то функция вернет значение не равное нулю. Если новый элемент не создан, то функция вернет ноль.

Для продвинутых пользователей:
Значение, которое возвращает эта функция, это указатель pointer на предыдущий элемент данных или ноль, если предыдущий элемент не существует.

Пример:
  ; The simplest way to use InsertElement
  NewList simple.w()
  InsertElement(simple())    ; Creates the first new element in the list
  simple() = 23

  InsertElement(simple())    ; Current position is the first element, so we add this element to the start of the list
  simple() = 45              ; The old first element is now the second element in the list

  ; This shows how to use the return value of InsertElement
  NewList advanced.l()
  If InsertElement(advanced()) <> 0
    advanced() = 12345
  Else
    MessageRequester("Error!", "Unable to allocate memory for new element", #PB_MessageRequester_OK)
  EndIf

  ; A small structure to demonstrate the "advanced users" description (above)
  Structure Programmer
    Name.s
    Strength.b
  EndStructure

  NewList Programmers.Programmer()  ; The list for storing the elements

  *Element.Programmer = InsertElement(Programmers())
  If *Element<>0
    *Element\Name = "Dave"
    *Element\Strength = 3   ; Wow, super-strong geek! ;)
  Else
    MessageRequester("Error!", "Unable to allocate memory for new element", #PB_MessageRequester_OK)
  EndIf


LastElement

LastElement()

Синтаксис

LastElement(LinkedList())
Описание
Перемещает текущий элемент в конец списка.

Параметры:
LinkedList() - Имя связанного списка, который создан оператором NewList. После названия списка необходимо создавать скобки.

Возвращаемое значение:
Значение возвращаемое данной функцией используют чтобы проверить, существует ли последний элемент или нет (он не будет существовать если список пуст). Если последний элемент существует, то функция вернет значение не равное нулю. Если последний элемент не существует, то функция вернет ноль.

Для продвинутых пользователей:
Значение, которое возвращает эта функция, это указатель pointer на предыдущий элемент данных или ноль, если предыдущий элемент не существует.

Пример:
  ; An example of simple usage
  NewList Numbers.w()

  AddElement(Numbers())
  Numbers() = 5
  AddElement(Numbers())
  Numbers() = 8

  LastElement(Numbers())
  MessageRequester("Information", "Last element value is "+Str(Numbers()), #PB_MessageRequester_OK)

  ; An example which uses the return value
  NewList Numbers.w()

  If LastElement(Numbers()) <> 0
    MessageRequester("Information", "Last element value is "+Str(Numbers()), #PB_MessageRequester_OK)
  Else
    MessageRequester("Information", "List is empty", #PB_MessageRequester_OK)
  EndIf

  AddElement(Numbers())
  Numbers() = 5
  AddElement(Numbers())
  Numbers() = 8

  If LastElement(Numbers()) <> 0
    MessageRequester("Information", "Last element value is "+Str(Numbers()), #PB_MessageRequester_OK)
  Else
    MessageRequester("Information", "List is empty", #PB_MessageRequester_OK)
  EndIf

  ; An example which is only for advanced users
  NewList Numbers.w()

  AddElement(Numbers())
  Numbers() = 5
  AddElement(Numbers())
  Numbers() = 8

  *Element.Word = LastElement(Numbers())
  If *Element
    MessageRequester("Information", "Last element value is "+Str(*Element\w), #PB_MessageRequester_OK)
  Else
    MessageRequester("Information", "List is empty", #PB_MessageRequester_OK)
  EndIf


ListIndex

ListIndex()

Синтаксис

Index = ListIndex(LinkedList())
Описание
Указывает позицию текущего элемента в списке, отсчет ведется с нуля. Эта функция очень быстрая, т.к. кеширует значения.

Параметр:
LinkedList() - Имя связанного списка, который создан оператором NewList . YПосле названия списка необходимо создавать скобки.

Возвращаемое значение:
Возвращает число, указывающего на позицию текущего элемента в текущем списке. Первый элемент равен нулю, втрой 1 и т.д. Возвращает -1, в случае если нет такого элемента, список элементов пуст или перемещались с помощью функций PreviousElement() или NextElement() либо применялась функция ResetList()

Пример:
  NewList fruit.s()

  AddElement(fruit()) : fruit() = "oranges"
  AddElement(fruit()) : fruit() = "bananas"
  AddElement(fruit()) : fruit() = "apples"
  AddElement(fruit()) : fruit() = "pears"

  FirstElement(fruit())
  MessageRequester("Fruit: "+fruit(), "Now at position "+Str(ListIndex(fruit())),  #PB_MessageRequester_OK)

  NextElement(fruit())
  MessageRequester("Fruit: "+fruit(), "Now at position "+Str(ListIndex(fruit())),  #PB_MessageRequester_OK)

  NextElement(fruit())
  MessageRequester("Fruit: "+fruit(), "Now at position "+Str(ListIndex(fruit())),  #PB_MessageRequester_OK)

  NextElement(fruit())
  MessageRequester("Fruit: "+fruit(), "Now at position "+Str(ListIndex(fruit())),  #PB_MessageRequester_OK)


ListSize

ListSize()

Синтаксис

Result = ListSize(LinkedList())
Описание
Возвращает количество элементов из связанного списка. Функция не заменяет текущий элемент. Эта функция очень быстрая (она не проходит по всему списку, а использует кеш), и ее можно использовать чтобы определить пуст список или нет.
Параметр:
LinkedList() - Имя связанного списка, который создан оператором NewList. После названия списка необходимо создавать скобки.

Возвращаемое значение:
Общее количество элементов в связанном списке.

Пример:
  NewList countme.w()

  ; Small loop to add some elements to the list.
  For i=0 To 10
    AddElement(countme())
    countme() = i * 23
  Next

  ; Show how many elements there are in the list. I hope you thought
  ; of the same value as this example ;)
  MessageRequester("Information", "There are "+Str(ListSize(countme()))+" elements in the list", #PB_MessageRequester_OK)


NextElement

NextElement()

Синтаксис

Result = NextElement(LinkedList())
Описание
Перемещает с текущего элемента на следующий элемент в списке, или на первый элемент, если перед этим вызывалась функция ResetList()

Параметр:
LinkedList() - Имя связанного списка, который создан оператором NewList. После названия списка необходимо создавать скобки.

Возвращаемое значение:
Возвращаемое значение этой функции можно использовать для того чтобы проверить существует следующий элемент или нет (он не будет существовать, если текущий элемент последний). Если следующий элемент существует, то функция вернет значение не равное нулю. Если следующий элемент не существует, то функция вернет ноль.

Для продвинутых пользователей:
Значение, которое возвращает эта функция, это указатель pointer на предыдущий элемент данных или ноль, если предыдущий элемент не существует.

Пример:
  NewList Scores.w()

  For i=1 To 10
    AddElement(Scores())
    Scores() = 100 - i
  Next

  ResetList(Scores())
  While NextElement(Scores())
    ; This is OK since the first call to NextElement() will move the current element to the first item in the list
    MessageRequester("Score", Str(Scores()), #PB_MessageRequester_OK)
  Wend


PreviousElement

PreviousElement()

Синтаксис

Result = PreviousElement(LinkedList())
Описание
Меняет текущий элемент списка с предыдущим элементом и возвращает его адрес или возвращает ноль, если текущий элемент является первым элементом, или если элементы отсутствуют в списке.

Параметр:
LinkedList() - Имя связанного списка, который создан оператором NewList. После названия списка необходимо создавать скобки.

Возвращаемое значение:
Возвращаемое значение этой функции можно использовать для того чтобы показать, существует ли предыдущий элемент или нет (он не может существовать если вы в начале списка). Если предыдущий элемент существует то функция вернет значение не равное нулю. Если предыдущий элемент не существует, то функция вернет ноль.

Для продвинутых пользователей:
Значение, которое возвращает эта функция, это указатель pointer на предыдущий элемент данных или ноль, если предыдущий элемент не существует.

Пример:
  NewList Numbers.w()

  For i=1 To 10
    AddElement(Numbers())
    Numbers() = i
  Next

  Repeat
    MessageRequester("Number", Str(Numbers()), #PB_MessageRequester_OK)
  Until PreviousElement(Numbers()) = 0


ResetList

ResetList()

Синтаксис

ResetList(LinkedList())
Описание
Возвращает индекс элемента находящегося перед первым элементом. Это означает, что фактически ни один из элементов не доступен. Однако это позволяет обрабатывать все элементы списка с помощью функции NextElement().

Параметр:
LinkedList() - Имя связанного списка, который создан оператором NewList. После названия списка необходимо создавать скобки.

Возвращаемое значение:
Эта функция значений не возвращает.

Пример:
  NewList Friends.s()

  AddElement(Friends())
  Friends() = "Arnaud"

  AddElement(Friends())
  Friends() = "Seb"

  ResetList(Friends())
  While NextElement(Friends())
    Debug Friends() ; Display all the list elements
  Wend


SelectElement

SelectElement()

Синтаксис

SelectElement(LinkedList(), Position)
Описание
Изменяет текущий элемент списка на указанный. Первый элемент в списке имеет значение ноль, следующий 1 и так далее. Это полезно при переходе к определенной позиции без применения цикла.

Поскольку связанный список не использует индексы, функция будет переходить по каждому элементу списка пока не достигнет указанной позиции. Если необходим более быстрый способ, то используйте функцию ChangeCurrentElement().

Параметр:
LinkedList() - Имя переменной связанного списка, созданной оператором NewList. После имени списка необходимо включить скобки.
Position - Для перемещения в указанную позицию в списке элементов, учитывая что отсчет ведется с нуля. Необходимо проверять что указанная позиция не находится за пределами списка элементов.

Возвращаемое значение:
Эта функция значений не возвращает.

Пример:
  NewList mylist.l()

  AddElement(mylist()) : mylist() = 23
  AddElement(mylist()) : mylist() = 56
  AddElement(mylist()) : mylist() = 12
  AddElement(mylist()) : mylist() = 73

  SelectElement(mylist(), 0)
  MessageRequester("Position", "At position 0, the value is "+Str(mylist()),0)

  SelectElement(mylist(), 2)
  MessageRequester("Position", "At position 2, the value is "+Str(mylist()),0)

  SelectElement(mylist(), 1)
  MessageRequester("Position", "At position 1, the value is "+Str(mylist()),0)

  SelectElement(mylist(), 3)
  MessageRequester("Position", "At position 3, the value is "+Str(mylist()),0)


SwapElements

SwapElements()

Синтаксис

SwapElements(LinkedList(), *FirstElement, *SecondElement)
Описание
Меняем местами два элемента определенного списка. В параметрах '*FirstElement' и '*SecondElement' должны быть указатели pointers на допустимые значения списка. Эта функция полезна при сортировке или реорганизации списка элементов.

Параметр:
LinkedList() - Имя переменной связанного списка, созданной оператором NewList. После имени списка необходимо включить скобки.
*FirstElement - Адрес первого элемента. Адрес можно получить используя оператор @ в имени списка.
*SecondElement - Адрес второго элемента. Адрес можно получить используя оператор @ в имени списка.

Возвращаемое значение:
Эта функция значений не возвращает.

Пример:
  NewList Numbers()

  For k=0 To 10
    AddElement(Numbers())
    Numbers() = k
  Next

  SelectElement(Numbers(), 3) ; Get the 4th element (first element is 0)
  *FirstElement = @Numbers()

  SelectElement(Numbers(), 9) ; Get the 10th element
  *SecondElement = @Numbers()

  ; Swap the 3 with the 9
  ;
  SwapElements(Numbers(), *FirstElement, *SecondElement)

  ; Prove it
  ;
  ForEach Numbers()
    Debug Numbers()
  Next


Mail

PureBasic - Mail

Краткий обзор

Mail (электронная почта) стало обычным способом обмена информацией между двумя удаленными компьютерами. Эта библиотека позволяет создавать письма с вложениями или без них, и их отправлять их в один или несколько адресов с помощью почтового сервера.

Все эти команды основанных на библиотеке network library, поэтому InitNetwork() должна вызываться перед их использованием.

Краткий перечень команд

AddMailAttachment
AddMailAttachmentData
AddMailRecipient
CreateMail
FreeMail
GetMailAttribute
GetMailBody
IsMail
MailProgress
RemoveMailRecipient
SendMail
SetMailAttribute
SetMailBody


AddMailAttachment

AddMailAttachment()

Синтаксис

Result = AddMailAttachment(#Mail, Description$, Filename$ [, MimeType$])
Описание
Если приложение добавляет файл к #Mail. 'Description$' будет текстом, который появится рядом с файлом при просмотре электронной почты. 'Filename$' это имя файла, приложенного к письму. После добавления файла, локальный файл можно изменить или удалить, так как все содержимое копируется по почте. Если вложение не может быть создано, 'Result' будет равен 0.

Необязательный параметр 'MimeType$' позволяет определить тип файла вложения. Если этот параметр не указан, то расширение файла будет выбираться из указанного ниже.
  application/acad          | AutoCAD    dwg
  application/clariscad     | ClarisCAD  ccad
  application/drafting      | MATRA Prelude drafting   drw
  application/dxf           | AutoCAD  dxf
  application/i-deas        | SDRC I-deas  unv
  application/iges          | Format d'йchange CAO IGES   igs,iges
  application/oda           | ODA  oda
  application/pdf           | Adobe Acrobat  pdf
  application/postscript    | PostScript   ai,eps,ps
  application/pro_eng       | ProEngineer  prt
  application/rtf           | Rich text   rtf
  application/set           | CAO SET  set
  application/sla           | stйrйolithographie   stl
  application/solids        |  MATRA Solids   dwg
  application/step          | de donnйes STEP  step
  application/vda           | de surface   vda
  application/x-mif         | Framemaker   mif
  application/x-csh         | Script C-Shell (UNIX)   dwg
  application/x-dvi         | texte dvi  dvi
  application/hdf           | de donnйes   hdf
  application/x-latex       | LaTEX  latex
  application/x-netcdf      | netCDF   nc,cdf
  application/x-sh          | Script Bourne Shell   dwg
  application/x-tcl         | Script Tcl  tcl
  application/x-tex         | fichiers Tex  tex
  application/x-texinfo     | eMacs  texinfo,texi
  application/x-troff       | Troff  t,tr,troff
  application/x-troff-man   | Troff/macro man  man
  application/x-troff-me    | Troff/macro ME   me
  application/x-troff-ms    | Troff/macro MS   ms
  application/x-wais-source | Source Wais   src
  application/x-bcpio       | CPIO binaire  bcpio
  application/x-cpio        | CPIO Posix  cpio
  application/x-gtar        | Tar GNU   gtar
  application/x-shar        | Archives Shell  shar
  application/x-sv4cpio     | CPIO SVR4n  sv4cpio
  application/x-sv4crc      | CPIO SVR4 avec CRC  sc4crc
  application/x-tar         | compressйs tar   tar
  application/x-ustar       | compressйs tar Posix   man
  application/zip           | compressйs ZIP   man
  audio/basic               | audio basiques   au,snd
  audio/x-aiff              | audio AIFF   aif,aiff,aifc
  audio/x-wav               | audio Wave   wav
  image/gif                 | Images gif  man
  image/ief                 | Images exchange format  ief
  image/jpeg                | Images Jpeg   jpg,jpeg,jpe
  image/png                 | Images Png  png
  image/tiff                | Images Tiff   tiff,tif
  image/x-cmu-raster        | Raster cmu  cmu
  image/x-portable-anymap   | Anymap PBM   pnm
  image/x-portable-bitmap   | Bitmap PBM   pbm
  image/x-portable-graymap  | Graymap PBM  pgm
  image/x-portable-pixmap   | Pixmap PBM   ppm
  image/x-rgb               | Image RGB   rgb
  image/x-xbitmap           | Images Bitmap X   xbm
  image/x-xpixmap           | Images Pixmap X   xpm
  image/x-xwindowdump       | Images dump X Window  man
  multipart/x-zip           | archive zip  zip
  multipart/x-gzip          | archive GNU zip  gz,gzip
  text/html                 | HTML   htm,html
  text/plain                | texte sans mise en forme   txt,g,h,c,cc,hh,m,f90
  text/richtext             | texte enrichis   rtx
  text/tab-separated-value  | texte avec sйparation des valeurs  tsv
  text/x-setext             | texte Struct   etx
  video/mpeg                | Vidйos MPEG   mpeg,mpg,mpe
  video/quicktime           | Vidйos QuickTime  qt,mov
  video/msvideo             | Vidйos Microsoft Windows  avi
  video/x-sgi-movie         | Vidйos MoviePlayer  movie
Примечание: любое количество вложений может быть добавлено к письму, но размер вложений не может превышать 100 Мб. Большинство серверов и клиентов не будет обрабатывать такие большие письма, поэтому рекомендуется отправлять вложения разумного размера.

Пример:
  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    If AddMailAttachment(0, "Attachment 1", OpenFileRequester("Choose an attachment", "", "", 0))
      Debug "Attachment correctly added"
    Else
      Debug "Attachment failed"
    EndIf
  EndIf


AddMailAttachmentData

AddMailAttachmentData()

Синтаксис

Result = AddMailAttachmentData(#Mail, Description$, *Buffer, BufferLength [, MimeType$])
Описание
Добавляет выбранные данные из памяти в качестве вложения к #Mail. 'Description$' будет текстом, который появится рядом с данными при просмотре электронной почты. '*Buffer' и 'BufferLength' определяют участок памяти memory area и его размер, данные из которого надо добавить к письму. После добавления данных, участок памяти можно изменить или освободить, так как все содержимое копируется по почте. Если вложение не может быть создано, 'Result' будет равен 0.

Более подробная информация о необязательном параметре 'MimeType$' может быть найдена на AddMailAttachment().

Примечание: любое количество вложений может быть добавлено к письму, но размер вложений не может превышать 100 Мб. Большинство серверов и клиентов не будет обрабатывать такие большие письма, поэтому рекомендуется отправлять вложения разумного размера.

Пример:
  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")

    If AddMailAttachmentData(0, "Attachment 1", ?Hello, 5)
      Debug "Attachment correctly added"
    Else
      Debug "Attachment failed"
    EndIf
  EndIf

  DataSection
    Hello:
      Data.b 'H', 'e', 'l', 'l', 'o'


AddMailRecipient

AddMailRecipient()

Синтаксис

AddMailRecipient(#Mail, Address$, Flags)
Описание
Добавляет получателя к указанному #Mail. 'Address$' должен быть допустимым форматом адреса, или e-mail не будет послан. 'Flags' может быть комбинацией следующих значений:
  #PB_Mail_To : Основной получатель (при необходимости)
  #PB_Mail_Cc : Получатель видимой копии (при необходимости)
  #PB_Mail_Bcc: Получатель невидимой копии (при необходимости)
Пример:
  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    AddMailRecipient(0, "andre@purebasic.com", #PB_Mail_To) ; Andre is the main recipient
    AddMailRecipient(0, "fred@purebasic.com", #PB_Mail_Cc)  ; Fred is in copy
    AddMailRecipient(0, "timo@purebasic.com", #PB_Mail_Bcc) ; Timo is in copy as well, but Andre and Fred doesn't know it
  EndIf


CreateMail

CreateMail()

Синтаксис

Result = CreateMail(#Mail, From$, Subject$ [, Encoding])
Описание
Создать новый, пустой #Mail. Если #PB_Any используется в качестве параметра '#Mail', то новый номер почты, будет возвращен как 'Result'. 'From$' будет адресом ответа на это письмо. 'Subject$' представляет собой текст (заголовок, краткое содержание письма). 'Encoding' дополнительный параметр и может принимать одно из следующих значений:
  PB_Ascii : письмо будет в ASCII (по умолчанию)
  PB_UTF8  : письмо будет в UTF-8
Если письмо не может быть создано правильно, 'Result' будет равен 0.

SetMailBody(), SetMailAttribute(), AddMailAttachment() и AddMailAttachmentData() может быть использована для изменения содержания #Mail.

Примечание: следуя стандарту RFC 2822, строки в сообщениях электронной почты необходимо отправлять используя CRLF символы.

Пример:
  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    SetMailBody(0, "This is a body !" + #CRLF$ + "Second line")
    Debug "Mail created"
  Else
    Debug "Can't create the mail"
  EndIf


FreeMail

FreeMail()

Синтаксис

FreeMail(#Mail)
Описание
#Mail удаляет и освобождает связанную с ним память.

Примечание: Все остальные письма будут автоматически удалены, когда программа завершится.


GetMailAttribute

GetMailAttribute()

Синтаксис

Result$ = GetMailAttribute(#Mail, Attribute)
Описание
Возвращает атрибуты #Mail. 'Attribute' может быть одним из следующих значений:
  #PB_Mail_From   : Возвращает обратный адрес, указанный в CreateMail().
  #PB_Mail_Subject: Возвращает атрибут 'Subject' указанный в CreateMail().
  #PB_Mail_XMailer: Возвращает атрибут 'X-Mailer' (если таковые имеются)
  #PB_Mail_Date   : Возвращает атрибут 'Date' (если таковые имеются)
  #PB_Mail_Custom : Возвращает пользовательские поля (если таковые имеются)
Пример:
  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    Debug GetMailAttribute(0, #PB_Mail_From) ; Will print "test@purebasic.com"
    Debug GetMailAttribute(0, #PB_Mail_Subject) ; Will print "Hello"
  EndIf
SetMailAttribute() может использоваться, чтобы изменять атрибуты #Mail.


GetMailBody

GetMailBody()

Синтаксис

Result$ = GetMailBody(#Mail)
Описание
Возвращает содержание #Mail, которое было предварительно установлено SetMailBody().

Пример:
  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    SetMailBody(0, "This is the body")
    Debug GetMailBody(0) ; Will print "This is the body"
  EndIf


IsMail

IsMail()

Синтаксис

Result = IsMail(#Mail)
Описание
Проверяет, является ли указанный номер #Mail, действительным и правильно инициализированным. Эта функция может быть использована с любым значением. Если 'Result' не равен нулю, то такой объект является действительным и инициализированным, в противном случае она возвращает нуль. Это правильный путь, чтобы убедиться, что почта готова к использованию.


MailProgress

MailProgress()

Синтаксис

Result = MailProgress(#Mail)
Описание
Возвращает прогресс отправки почты, начатой SendMail().

'Result' это количество отправленных байт или одно из следующих значений:
  #PB_Mail_Connected: Отправка почты находится в стадии инициализации.
  #PB_Mail_Finished : почта отправлена правильно.
  #PB_Mail_Error    : почта отправлена, но произошла ошибка.


RemoveMailRecipient

RemoveMailRecipient()

Синтаксис

RemoveMailRecipient(#Mail, Address$, Flags)
Описание
Удаляет получателя из указанной #Mail. 'Address$' должен быть допустимым форматом адреса, или e-mail не будет послан. 'Flags' может быть комбинацией следующих значений:
  #PB_Mail_To : Основной получатель (при необходимости)
  #PB_Mail_Cc : Получатель видимой копии (при необходимости)
  #PB_Mail_Bcc: Получатель невидимой копии (при необходимости)
Пример:
  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    AddMailRecipient(0, "andre@purebasic.com", #PB_Mail_To) ; Andre is the main recipient
    AddMailRecipient(0, "fred@purebasic.com", #PB_Mail_Cc)  ; Fred is in copy
    AddMailRecipient(0, "timo@purebasic.com", #PB_Mail_Bcc) ; Timo is in copy as well, but Andre and Fred doesn't know it

    ; Ensure Fred is removed from every destination :-)
    RemoveMailRecipient(0, "fred@purebasic.com", #PB_Mail_To | #PB_Mail_Cc | #PB_Mail_Bcc)
  EndIf


SendMail

SendMail()

Синтаксис

Result = SendMail(#Mail, Smtp$ [, Port [, Asynchronous]])
Описание
Послать указанное #Mail. 'Smtp$' адрес почтового сервера, который будет использоваться, чтобы послать почту. 'Port' дополнительный параметр, чтобы определить порт сервера (значение по умолчанию 25). По умолчанию, процесс выполнения программы блокируется, до полной отправки электронной почты. Если 'Asynchronous' установлено в 1, то письмо будет отправлено в фоновом режиме и с помощью MailProgress() можно следить за его прогрессом. Если почта не может быть отправлена 'Result' = 0.

Пример:
  InitNetwork()

  ; Note: change the address and smtp to have a working example
  ;
  If CreateMail(0, "test@youraddress.com", "Hello")
    AddMailRecipient(0, "youraddess@youraddress.com", #PB_Mail_To)

    Debug SendMail(0, "smtp.yourfavoritesmtp.com")
  EndIf


SetMailAttribute

SetMailAttribute()

Синтаксис

SetMailAttribute(#Mail, Attribute, Value$)
Описание
Изменяет указанный атрибут Attribute новым значением Value$ почты #Mail. 'Attribute' может быть одним из следующих значений:
  #PB_Mail_From   : Изменят обратный адрес, указанный в CreateMail().
  #PB_Mail_Subject: Изменят атрибут 'Subject' указанный в CreateMail().
    #PB_Mail_XMailer: Изменят атрибут 'X-Mailer' (если таковые имеются)
  #PB_Mail_Date   : Изменят атрибут 'Date' (если таковые имеются)
  #PB_Mail_Custom : Изменят пользовательские поля (если таковые имеются).
Пример:
  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    SetMailAttribute(0, #PB_Mail_XMailer, "PureMailer")
    Debug GetMailAttribute(0, #PB_Mail_XMailer) ; Will print "PureMailer"
  EndIf


SetMailBody

SetMailBody()

Синтаксис

SetMailBody(#Mail, Body$)
Описание
Изменение содержания #Mail. GetMailBody() доступно для его получения.

Пример:
  InitNetwork()

  If CreateMail(0, "test@purebasic.com", "Hello")
    SetMailBody(0, "This is the body")
    Debug GetMailBody(0) ; Will print "This is the body"
  EndIf


Map

PureBasic - Map

Краткий обзор

Карты (список, таблица, каталог) являются структурами для хранения данных, которые могут динамически распределяться, в соответствии с вашими потребностями. Они представляют собой набор элементов (данные, которые вы хотите сохранить). Каждый элемент является полностью независимым от других элементов. Вы можете добавить столько пунктов, сколько хотите (ограничено только объемом доступной памяти), и обращаться к ним при помощи ключа. Этот вид управления данными очень полезен, когда Вы нуждаетесь в быстром доступе к случайному элементу. Последовательность добавления элементов не сохраняется при использовании карты (в отличие от LinkedList) и поэтому они не могут быть отсортированы.

Перед началом работы с картами, сначала вы должны объявить их. Это может быть сделано с ключевым словом NewMap. structures также часто используются, чтобы сохранять несколько данных в отдельном элементе.

Для поиска в картах, рекомендуется применять циклы: For : Next, ForEach : Next, Repeat : Until или While : Wend.

Краткий перечень команд

AddMapElement
ClearMap
DeleteMapElement
FindMapElement
MapKey
MapSize
NextMapElement
ResetMap


AddMapElement

AddMapElement()

Синтаксис

Result = AddMapElement(Map(), Key$ [, Flags])
Описание
Добавляет в карту Map() новый пустой элемент с заданным ключом 'Key$'. Этот новый элемент становится текущим элементом карты. Если Result = 0, то элемент не был создан (не хватает памяти), в противном случае возвращается указатель на элемент данных.

'Flags' является дополнительным параметром, который может принимать одно из следующих значений:
  #PB_Map_ElementCheck  : Проверяет, существует ли элемент с тем же самым ключом, и заменяет его (значение по умолчанию).
  #PB_Map_NoElementCheck: заменяет не проверяя.
Примечание: Эта функция не является обязательной для управления картами, так как элементы добавляются автоматически, когда значеню присваивается новый ключ.

Пример:
  NewMap Country.s()

  ; Regular way to add an element
  Country("US") = "United State"

  ; The same using AddMapElement()
  AddMapElement(Country(), "FR")
  Country() = "France"

  ForEach Country()
    Debug Country()
  Next


ClearMap

ClearMap()

Синтаксис

ClearMap(Map())
Описание
Удаляет все элементы в указанной карте Map() и освобождает память. После этого вызова, карту еще можно использовать, но она пустая (т.е. она не содержит никаких элементов).

Пример:
  NewMap Country.s()
  Country("FR") = "France"
  Country("US") = "United States"
; Proof that items have been added to the map
  MessageRequester("Information", "There are "+Str(MapSize(Country()))+" elements in the map")
 ; Clear the map and show that the map really is empty
  ClearMap(Country())
  MessageRequester("Information", "There are "+Str(MapSize(Country()))+" element in the map")

Примечание: PureBasic только освободит память, занятую элементами. Если карта была использована для хранения динамических объектов, что не представляется возможным определить (в PureBasic или на другом языке), в этом случае, вы должны идти по элементам на карте и освобождать объекты самостоятельно.


DeleteMapElement

DeleteMapElement()

Синтаксис

DeleteMapElement(Map() [, Key$])
Описание
Удаляет текущий элемент карты 'Map()'. После этой операции, текущим элементом может быть любой элемент, поскольку карта не отсортирована. Если только один элемент был на карте, и вы удалите его, то вы останетесь без текущего элемента!, как после ResetMap().

Если указан параметр 'Key$' то связанный с этим ключом элемент будет удален с карты (если таковые имеются).

Пример:
  NewMap Country.s()
  Country("US") = "United States"
  Country("FR") = "France"
  Country("GE") = "Germany"
; Delete a country
  DeleteMapElement(Country(), "FR")
ForEach Country()
Debug Country()
Next


FindMapElement

FindMapElement()

Синтаксис

Result = FindMapElement(Map(), Key$)
Описание
Изменить текущий элемент карты, на элемент, связанный с данным ключем 'Key$'. Если 'Результат' = 0, нет элемента, соответствующего данному ключу, в противном случае она является указателем на элемент данных.

Пример:
  NewMap Country.s()
  Country("US") = "United States"
  Country("FR") = "France"
  Country("GE") = "Germany"
If FindMapElement(Country(), "US")
Debug "'US' is in the country list."
Else
Debug "'US' is NOT in the country list !"
EndIf
If FindMapElement(Country(), "UK")
Debug "'UK' is in the country list."
Else
Debug "'UK' is NOT in the country list !"
EndIf


MapKey

MapKey()

Синтаксис

Key$ = MapKey(Map())
Описание
Возвращает ключ текущего элемента карты. Если нет текущего элемента, возвращается пустая строка.

Пример:
  NewMap Country.s()
  Country("US") = "United States"
  Country("FR") = "France"
  Country("GE") = "Germany"
ForEach Country()
Debug MapKey(Country())
Next


MapSize

MapSize()

Синтаксис

Result = MapSize(Map())
Описание
Возвращает количество элементов, содержащихся в указанной карте 'Map()'. Это не изменяет текущий элемент. Эта функция работает очень быстро (не повторяет всю карту, а использует результат из кэша), и может безопасно использоваться, чтобы определить, пуста карта или нет.

Пример:
  NewMap Country.s()
  Country("FR") = "France"
  Country("US") = "United States"
; Will print '2'
Debug "Size of the map: " + Str(MapSize(Country()))


NextMapElement

NextMapElement()

Синтаксис

Result = NextMapElement(Map())
Описание
Перемещается от текущего элемента, к следующему элементу в указанной 'Map()', или на первый элемент, если ранее была команда ResetMap(). Если Result равен 0, нет следующего элемента в карте, в противном случае она возвращает указатель на элемент данных (для расширенного использования только).

Пример:
  NewMap Country.s()
  Country("US") = "United States"
  Country("FR") = "France"
  Country("GE") = "Germany"
  ResetMap(Country())
While NextMapElement(Country())
Debug Country()
Wend


ResetMap

ResetMap()

Синтаксис

ResetMap(Map())
Описание
Устанавливает позицию текущего элемента указанной карты 'Map()', перед первым элементом карты. Это означает, что нет текущего элемента. Тем не менее, это очень полезно для обработки всех элементов с помощью NextMapElement().

Пример:
  NewMap Country.s()
  Country("US") = "United States"
  Country("FR") = "France"
  Country("GE") = "Germany"
  ResetMap(Country())
While NextMapElement(Country())
Debug Country()
Wend


Material

PureBasic - Material

Краткий обзор

Materials are composed of one or several textures and sometimes of some colors. They are widely used by the other objects of the 3D world like the entities, billboards and particles to give them a skin.

Each material has a lot a properties like the shading, ambient and specular color, etc. to allow realistic looking material like wood, water, glass and more.

InitEngine3D() should be called successfully before using the Material functions.

Краткий перечень команд

AddMaterialLayer
CopyMaterial
CountMaterialLayers
CreateMaterial
DisableMaterialLighting
FreeMaterial
IsMaterial
MaterialAmbientColor
MaterialBlendingMode
MaterialDiffuseColor
MaterialFilteringMode
MaterialID
MaterialShadingMode
MaterialSpecularColor
RemoveMaterialLayer
RotateMaterial
ScrollMaterial


AddMaterialLayer

AddMaterialLayer()

Синтаксис

Result = AddMaterialLayer(#Material, TextureID [, Mode])
Описание
Adds a new layer to the #Material and put the specified texture in it. A valid 'TextureID' can be easily obtained with the TextureID() function.

'Mode' is an optional parameter and can take one of the following value:
  #PB_Material_Add        : Performs a pоxel 'Add' operation over previous layer (black color is like transparent)
  #PB_Material_Replace    : Performs a pоxel 'Replace' operation over previous layer
  #PB_Material_AlphaBlend : Use the alphachannel layer of the texture (should be a TGA or PNG one) and blend it with the previous layer
  #PB_Material_Modulate   : Performs a pоxel 'Modulate' operation over previous layer


CopyMaterial

CopyMaterial()

Синтаксис

Result = CopyMaterial(#Material, #NewMaterial)
Описание
Creates a #NewMaterial which is the exact copy of the specified #Material. If #PB_Any is used as '#NewMaterial' parameter, the new material number will be returned as 'Result'.

If the 'Result' is 0, the Material copy has failed. If the #NewMaterial was already created, it is automatically freed and replaced by the new one.


CountMaterialLayers

CountMaterialLayers()

Синтаксис

Result = CountMaterialLayers(#Material)
Описание
Returns the number of layers the #Material contains.


CreateMaterial

CreateMaterial()

Синтаксис

Result = CreateMaterial(#Material, TextureID)
Описание
Creates a new #Material based on the specified texture. If #PB_Any is used as '#Material' parameter, the new material number will be returned as 'Result'. A valid 'TextureID' can be easily obtained with the TextureID() function.

If the 'Result' is 0, the Material creation has failed. If the #Material was already created, it is automatically freed and replaced by the new one.


DisableMaterialLighting

DisableMaterialLighting()

Синтаксис

DisableMaterialLighting(#Material, State)
Описание
Enables or disables the dynamic #Material lighting. This means than the object which will use this material will be not affected by a dynamic light, created with the CreateLight() function. Dynamic lighting is enabled by default, when a material is created. 'State' can take the following values:
  1: Dynamic lighting is disabled
  0: Dynamic lighting is enabled


FreeMaterial

FreeMaterial()

Синтаксис

FreeMaterial(#Material)
Описание
Frees the specified #Material. All its associated memory is released and this object can't be used anymore.

Note: all remaining materials are automatically freed when the program ends.


IsMaterial

IsMaterial()

Синтаксис

Result = IsMaterial(#Material)
Описание
Tests if the given #Material is a valid and correctly initialized material.

This function is bullet-proof and can be used with any value. If the 'Result' is not zero then the object is valid and initialized, else it returns zero. This is the correct way to ensure that a material is ready to use.


MaterialAmbientColor

MaterialAmbientColor()

Синтаксис

MaterialAmbientColor(#Material, Color)
Описание
Changes the #Material ambient color. The ambient material color is the color the material gets by default, without other lighting.

A valid color can be easily obtained with the RGB() function. If 'Color' is set to #PB_Material_AmbientColors, then the color informations associated to each vertex (as specified in the mesh creation) are used.


MaterialBlendingMode

MaterialBlendingMode()

Синтаксис

MaterialBlendingMode(#Material, Mode)
Описание
Changes the way the #Material will be blended with the scene (screen background). 'Mode' can take one of the following value:
  #PB_Material_Add       : Performs a pоxel 'Add' operation over the scene (black color is like transparent).
  #PB_Material_AlphaBlend: Uses the alphachannel layer of the texture (should be a TGA or PNG one) to blend it with the scene.
  #PB_Material_Color     : Uses the texture transparent color value when blending the material with the scene.


MaterialDiffuseColor

MaterialDiffuseColor()

Синтаксис

MaterialDiffuseColor(#Material, Color)
Описание
Changes the #Material diffuse color. The diffuse material color is the color than the material will reflect when it will be dynamically lighted. For example, using a full white color (RGB(255,255,255)) will result at normal lighting (all colors are reflected). If you use a red (RGB(255,0,0)), then only the red colors of the material will be reflected, resulting as a full red material (or black one, if the material doesn't contain any red color). A valid color value can be easily obtained with the RGB() function.


MaterialFilteringMode

MaterialFilteringMode()

Синтаксис

MaterialFilteringMode(#Material, Mode)
Описание
Changes the #Material filtering mode. 'Mode' can take one of the following value:
  #PB_Material_None     : Don't filter the material which becomes very pixelized when the camera gets close.
  #PB_Material_Bilinear : Performs a bilinear filtering when the camera gets close, resulting to a smooth, a bit blured picture.
  #PB_Material_Trilinear: Performs a trilinear filtering when the camera gets close, resulting in the best picture quality possible.
When a material is created, the bilinear filtering is used by default. Using a filter doesn't have a big performance impact on the rendering, as many graphics cards do it using the hardware.


MaterialID

MaterialID()

Синтаксис

MaterialID = MaterialID(#Material)
Описание
Returns the MaterialID of the specified #Material. This is the unique Material identifier needed by other functions: EntityMaterial().


MaterialShadingMode

MaterialShadingMode()

Синтаксис

MaterialShadingMode(#Material, Mode)
Описание
Changes the #Material shading mode. 'Mode' can take one of the following value:
  #PB_Material_Flat   : The material use the flat mode, the lighting is done face by face.
  #PB_Material_Gouraud: Performs a shading using the Gouraud algorithme.
  #PB_Material_Phong  : Performs a shading using the Phong algorithme.
When a material is created, the Gouraud shading is used by default.


MaterialSpecularColor

MaterialSpecularColor()

Синтаксис

MaterialSpecularColor(#Material, Color)
Описание
Changes the #Material specular color. The specular material color is the color than the material will reflect when it will be dynamically lighted by a light which has a specular color value. For example, using a full white color (RGB(255,255,255)) will result at normal lighting (all colors are reflected). If you use a red (RGB(255,0,0)), then only the red colors of the material will be reflected, resulting as a full red material (or black one, if the material doesn't contain any red color). A valid color value can be easily obtained with the RGB() function.


RemoveMaterialLayer

RemoveMaterialLayer()

Синтаксис

RemoveMaterialLayer(#Material)
Описание
Removed the top most (last added) #Material layer.


RotateMaterial

RotateMaterial()

Синтаксис

RotateMaterial(#Material, Angle, Mode [, Layer])
Описание
Rotates the material layer according to the Angle value. By default the layer 0 is rotated except if the optional 'Layer' parameter is used. 'Mode' can take one of the following value:
  #PB_Material_Fixed   : The material is rotated of the specified 'Angle', without regards of the previous rotate function.
  #PB_Material_Animated: Each frame is the material is rotated of the specified 'Angle' automatically.


ScrollMaterial

ScrollMaterial()

Синтаксис

ScrollMaterial(#Material, x, y, Mode [, Layer])
Описание
Scrolls the material layer according to x,y values. By default the layer 0 is scrolled except if the optional 'Layer' parameter is used. 'Mode' can take one of the following value:
  #PB_Material_Fixed   : The material is scrolled of the specified x,y offset, without regards of the previous scroll function.
  #PB_Material_Animated: Each frame is the material is scrolled of the specified x,y offset automatically.


Math

PureBasic - Math

Краткий обзор

Math (математика) библиотека предоставляет основные арифметические функции, такие как Cos(), Sin(), Pow(), Log() etc... Почти все команды работают с плавающей запятой (.f).

Краткий перечень команд

ACos
ASin
ATan
Abs
Cos
Int
IntQ
Log
Log10
Pow
Round
Sin
Sqr
Tan


ACos

ACos()

Синтаксис

Result.f = ACos(Value.f)
Описание
Возвращает ARC-Косинус (в радианах). Value.f должен быть между-1 и 1 (включительно).

Пример:
  Result.f = ACos(1) ; Will return '0'
  Result.f = Acos(-1) ; Will return pi
Является обратной функцией Cos().


ASin

ASin()

Синтаксис

Result.f = ASin(Value.f)
Описание
Возвращает ARC-Sinus (в радианах). Value.f должен быть между-1 и 1 (включительно).

Пример:
  Result.f = ASin(1) ; Will return '1.570796' (pi/2)
  Result.f = ASin(0) ; Will return '0'
Является обратной функцией Sin().


ATan

ATan()

Синтаксис

Result.f = ATan(Value.f)
Описание
Возвращает ARC-Тангенс (в радианах). Value.f может быть любым значением.

Пример:
  Result.f = ATan(1) ; Will return '0.785398' (pi/4)
Является обратной функцией Tan().


Abs

Abs()

Синтаксис

Result.f = Abs(Number.f)
Описание
Возвращает абсолютную величину (без знака) указанного значения float. Эта функция работает корректно только с числами с плавающей запятой. С целым числом будет терпеть неудачу, если целое число будет слишком большим (потеря точности). Для целых чисел, есть другая функция.


Cos

Cos()

Синтаксис

Result.f = Cos(Angle.f)
Описание
Возвращает косинус заданного угла (результат будет от -1 до +1). Angle.f должно быть в радианах.

Пример:
  Result.f = Cos(3.141593) ; Will return '-1'
Является обратной функцией ACos().


Int

Int()

Синтаксис

Result = Int(Number.f)
Описание
Возвращает целочисленную часть числа с плавающей запятой.

Пример:
  Result = Int(10.565)  ; Will return '10'


IntQ

IntQ()

Синтаксис

Result = IntQ(Number.d)
Описание
Возвращает целочисленную часть двойного числа.

Пример:
  Result.q = IntQ(12345678901.565)  ; will return '12345678901'

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


Log

Log()

Синтаксис

Result.f = Log(Number.f)
Описание
Возвращает натуральный логарифм числа Number.


Log10

Log10()

Синтаксис

Result.f = Log10(Number.f)
Описание
Возвращает десятичный логарифм числа Number.


Pow

Pow()

Синтаксис

Result.f = Pow(Number.f, Power.f)
Описание
Возведение в степень Number^Power.


Round

Round()

Синтаксис

Result.f = Round(Number.f, Mode)
Описание
Округляет число float number в зависимости от заданного режима. 'Mode' может быть одним из следующих значений:
  #PB_Round_Down   : округляет уменьшая число
  #PB_Round_Up     : округляет увеличивая число
  #PB_Round_Nearest: округляет до ближайшего целого числа (0.5 и выше округляются до 1)
Пример:
  Debug Round(11.6, #PB_Round_Down)    ; Will print '11'
  Debug Round(-3.6, #PB_Round_Down)    ; Will print '-4'

  Debug Round(11.6, #PB_Round_Up)      ; Will print '12'
  Debug Round(-1.6, #PB_Round_Up)      ; Will print '-1'

  Debug Round(11.6, #PB_Round_Nearest) ; Will print '12'
  Debug Round(11.4, #PB_Round_Nearest) ; Will print '11'
  Debug Round(11.5, #PB_Round_Nearest) ; Will print '12'
  Debug Round(-7.5, #PB_Round_Nearest) ; Will print '-8'


Sin

Sin()

Синтаксис

Result.f = Sin(Angle.f)
Описание
Возвращает синус заданного угла (результат будет от -1 до +1). Angle.f должно быть в радианах.

Пример:
  Result.f = Sin(1.5708) ; Will return '1'
Является обратной функцией ASin().


Sqr

Sqr()

Синтаксис

Result.f = Sqr(Number.f)
Описание
Возвращает корень квадратный указанного числа.


Tan

Tan()

Синтаксис

Result.f = Tan(Angle.f)
Описание
Возвращает косинус заданного угла. Angle.f должно быть в радианах.

Пример:
  Result.f = Tan(0.785398) ; Will return '1'
Является обратной функцией ATan().


Memory

PureBasic - Memory

Краткий обзор

Иногда, очень полезно иметь доступ к оперативной памяти (RAM), чтобы обрабатывать несколько операций с большими временными затратами и ускорять их. Эта библиотека позволяет выделить любое количество буферов памяти и использовать их непосредственно в PureBasic.

Краткий перечень команд

AllocateMemory
CompareMemory
CompareMemoryString
CopyMemory
CopyMemoryString
FillMemory
FreeMemory
MemorySize
MemoryStringLength
MoveMemory
PeekA
PeekB
PeekC
PeekD
PeekF
PeekI
PeekL
PeekQ
PeekS
PeekU
PeekW
PokeA
PokeB
PokeC
PokeD
PokeF
PokeI
PokeL
PokeQ
PokeS
PokeU
PokeW
ReAllocateMemory


AllocateMemory

AllocateMemory()

Синтаксис

*MemoryID = AllocateMemory(Size)
Описание
Выделяет область памяти указанного размера (в байтах). Если необходимая память будет доступна, то в *MemoryID будет записан начальный адрес области памяти.
Если же не удалось выделить область памяти указанного размера, то в *MemoryID будет записанно число 0, что укажет на ошибку при выделении памяти.

Примечание: все выделенные области памяти автоматически выгружаются при выходе из программы.

Пример:
  *MemoryID = AllocateMemory(5000)
  If *MemoryID
    Debug "Starting address of the 5000 Byte memory area:"
    Debug *MemoryID
    PokeS(*MemoryID, "Store this string in the memory area")
    FreeMemory(*MemoryID)  ; will also be done automatically at the end of program
  Else
    Debug "Couldn't allocate the requested memory!"
  EndIf


CompareMemory

CompareMemory()

Синтаксис

Result = CompareMemory(*MemoryID1, *MemoryID2, Length)
Описание
Сравнивает две области памяти и возвращает 1, если они равны или 0 если они не совпадают.

*MemoryID получаем AllocateMemory() или ReAllocateMemory().


CompareMemoryString

CompareMemoryString()

Синтаксис

Result = CompareMemoryString(*String1, *String2 [, Mode [, Length [, Flags]]] )
Описание
Сравнивает две строки в указанной области памяти. Строка должна иметь символ окончания строки или необходимо указать длинну 'Length', чтобы указать, какое количество символов нужно сравнивать. Эта функция полезна для сравнения строк в буфере памяти.

'Mode' может принимать следующее значение:
  #PB_String_NoCase: Сравнение строк нечуствительно к регистру (a = A). По умолчанию сравнение зависит от регистра.
'Result' может принимать одно из следующих значений:
  #PB_String_Equal  : Если String1 равняется String2
  #PB_String_Lower  : Если String1 меньше чем String2
  #PB_String_Greater: Если String1 больше чем String2
'Flags' может принимать одно из следующих значений:
  #PB_Ascii  : Сравнивает строки как ascii, даже когда программа откомпилирована в режиме unicode
  #PB_UTF8   : Сравнивает строки как UTF8 (программа может быть или в уникоде или в ascii режиме)
  #PB_Unicode: Сравнивает строки как строку уникода, даже когда программа откомпилирована в ascii режиме
Примечание: если аргумент 'Flags' задействован, то в качестве длины строки - аргумента 'Length' можно указать -1 что позволит сравнивать строки пока не будет дистигнут их конец.


CopyMemory

CopyMemory()

Синтаксис

CopyMemory(*SourceMemoryID, *DestinationMemoryID, Length)
Описание
Копирует ячейку указанную в *SourceMemoryID (адрес памяти для копированя) и помещает в *DestinationMemoryID (адрес памяти получателя) с указанной длинной (в bytes).

Если исходный и конечный буферы прекрываются, то безопаснее использовать MoveMemory(), иначе возможен неправильный результат.


CopyMemoryString

CopyMemoryString()

Синтаксис

Result = CopyMemoryString(*String [, @*DestinationMemoryID] )
Описание
Копирует строку по указанному адресу и передает ее в указанную область памяти, если она указана, или помещает в конце текущего буфера. Если *DestinationMemoryID определен, то внутренний адрес получает указанное значение. Внутренний указатель после копирования автоматически обновляется, это удобно при потоковом копировании строк, сохраняя при этом указатель . Эта функция оптимизирована для работы с буфером памяти.

Пример:
  *Buffer = AllocateMemory(1000)
  *Pointer = *Buffer
  CopyMemoryString("Hello", @*Pointer)
  CopyMemoryString(" World")  ; This one will be put just after "Hello"
  *Pointer-2                  ; Come back from 2 characters (on the 'l' of 'World')
  CopyMemoryString("LD")      ; Finally the last letter will be uppercase
  Debug PeekS(*Buffer)


FillMemory

FillMemory()

Синтаксис

FillMemory(*Memory, Size [, Value [, Type]] )
Описание
Заполняет область памяти '*Memory' указанным значением 'Value'. Если значение не указано, память будет заполнена нулями.

Дополнительный параметр 'Type' может быть одной из следующих констант:
  #PB_Byte: Заполнить память значением типа byte (1 байт)значение по умолчанию.
  #PB_Word: Заполнить память значением типа word (2 байта).
  #PB_Long: Заполнить память значением типа long (4 байта).
Пример:
  *Buffer = AllocateMemory(500)

  FillMemory(*Buffer, 500) ; Fill 500 bytes of value 0 (clear the memory area)
  FillMemory(*Buffer, 500, $FF) ; Fill 500 bytes of value $FF
  FillMemory(*Buffer, 500, $BADF00D, #PB_Long) ; Fill 500 bytes of value $BADF00D


FreeMemory

FreeMemory()

Синтаксис

FreeMemory(*MemoryID)
Описание
Освобождает память прежде выделенную функциями AllocateMemory() или ReAllocateMemory().

Примечание: при выходе из программы память освобождается автоматически.


MemorySize

MemorySize()

Синтаксис

Result = MemorySize(*MemoryID)
Описание
Возвращает длинну (в bytes) указанного '*MemoryID'.

Эта область памяти выделяется функциями AllocateMemory() или ReAllocateMemory().


MemoryStringLength

MemoryStringLength()

Синтаксис

Result = MemoryStringLength(*String [, Flags] )
Описание
Возвращает длинну строки (количество символов) до метки об окончании строки. Если 'Flags' не указан, строка читается в формате unicode, при условии что программа скомпилирована в unicode или как ascii, если программа скомпилирована в этом формате.

'Flags' может принимать одно из следующих значений:
  #PB_Ascii  : Возвращает длину ascii строки, даже когда программа откомпилирована в режиме уникода
  #PB_UTF8   : Возвращает длину строки UTF8 (программа может быть или в уникоде или в ascii режиме)
  #PB_Unicode: Возвращает длину строки уникода, даже когда программа откомпилирована в ascii режиме


MoveMemory

MoveMemory()

Синтаксис

MoveMemory(*SourceMemoryID, *DestinationMemoryID, Length)
Описание
Копирует ячейку указанную в *SourceMemoryID (адрес памяти для копированя) и помещает в *DestinationMemoryID (адрес памяти получателя) с указанной длинной (в байтах).
В отличии от CopyMemory() исходный и конечный буферы могут перекрываться. MoveMemory() медленнее чем CopyMemory(), таким образом лучше использовать эту функцию только при необходимости.


PeekA

PeekA()

Синтаксис

Value.a = PeekA(*MemoryBuffer)
Описание
Для опытных программистов. PeekA() читает ascii символ (1 байт) из указанного адреса памяти.


PeekB

PeekB()

Синтаксис

Value.b = PeekB(*MemoryBuffer)
Описание
Для опытных программистов. PeekB() читает один байт из указанного адреса памяти.


PeekC

PeekC()

Синтаксис

Value.c = PeekC(*MemoryBuffer)
Описание
Для опытных программистов. PeekC() читает один символ (1 байт в ascii, 2 байта в unicode) из указанного адреса памяти.


PeekD

PeekD()

Синтаксис

Value.d = PeekD(*MemoryBuffer)
Описание
Для опытных программистов. PeekD() читает число типа double (8 байт) из указанного адреса памяти.

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


PeekF

PeekF()

Синтаксис

Value.f = PeekF(*MemoryBuffer)
Описание
Для опытных программистов. PeekF() читает число типа float (4 байта) из указанного адреса памяти.


PeekI

PeekI()

Синтаксис

Value.i = PeekI(*MemoryBuffer)
Описание
Для опытных программистов. PeekI() читает число типа integer (4 байта на 32 битном процессоре и 8 байт на 64 битном процессоре) из указанного адреса памяти.


PeekL

PeekL()

Синтаксис

Value.l = PeekL(*MemoryBuffer)
Описание
Для опытных программистов. PeekL() читает число типа long (4 байта) из указанного адреса памяти.


PeekQ

PeekQ()

Синтаксис

Value.q = PeekQ(*MemoryBuffer)
Описание
Для опытных программистов. PeekQ() число типа quad (8 байт) из указанного адреса памяти.

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


PeekS

PeekS()

Синтаксис

Text$ = PeekS(*MemoryBuffer [, Length [, Flags]] )
Описание
Читает строку по указанному адресу памяти. Строка должна иметь символ окончания '0', читается строка до символа '0'.
Можно дополнительно указать длинну 'Length' (количество символов). Если 'Flags' не указан, строка читается в формате unicode, при условии что программа скомпилирована в unicode или как ascii, если программа скомпилирована в этом формате.

'Flags' может принимать одно из следующих значений:
  #PB_Ascii  : Читает строку как ascii, даже когда программа откомпилирована в режиме уникода
  #PB_UTF8   : Читает строку как UTF8 (программа может быть или в уникоде или в ascii режиме)
  #PB_Unicode: Читает строку как уникод, даже когда программа откомпилирована в ascii режиме
Когда указан параметр 'Flags', 'Length' можно указать как -1, что позволит читать строку до символа окончания строки.

Примечание: комбинацию PokeS() и PeekS() можно использовать для конвертации между форматами (Ascii, UTF8 и Unicode).


PeekU

PeekU()

Синтаксис

Value.u = PeekU(*MemoryBuffer)
Описание
Для опытных программистов. PeekU() читает символ уникода (2 байта) из указанного адреса памяти.


PeekW

PeekW()

Синтаксис

Value.w = PeekW(*MemoryBuffer)
Описание
Для опытных программистов. PeekW() читает значение типа word (2 байта) из указанного адреса памяти.


PokeA

PokeA()

Синтаксис

PokeA(*MemoryBuffer, Number)
Описание
Для опытных программистов. PokeA() записывает ascii символ (1 байт) по указанному адресу памяти.


PokeB

PokeB()

Синтаксис

PokeB(*MemoryBuffer, Number)
Описание
Для опытных программистов. PokeB() пишет байт (1 байт) по указанному адресу памяти.


PokeC

PokeC()

Синтаксис

PokeC(*MemoryBuffer, Number)
Описание
Для опытных программистов. PokeC() записывает символ (1 байт в ascii, 2 байта в unicode) по указанному адресу памяти.


PokeD

PokeD()

Синтаксис

PokeD(*MemoryBuffer, Number)
Описание
Для опытных программистов. PokeD() записывает двойное число ( 8 байт) по указанному адресу памяти.

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


PokeF

PokeF()

Синтаксис

PokeF(*MemoryBuffer, Number.f)
Описание
Для опытных программистов. PokeF() пишет число типа float (4 байта) по указанному адресу памяти.


PokeI

PokeI()

Синтаксис

PokeI(*MemoryBuffer, Number)
Описание
Для опытных программистов. PokeI() записывает целое число (4 байта на микропроцессорах на 32 бита, 8 байтов на микропроцессорах на 64 бита) по указанному адресу памяти.


PokeL

PokeL()

Синтаксис

PokeL(*MemoryBuffer, Number)
Описание
Для опытных программистов. PokeL() пишет число типа long (4 байта) по указанному адресу памяти.


PokeQ

PokeQ()

Синтаксис

PokeQ(*MemoryBuffer, Number)
Описание
Для опытных программистов. PokeQ() пишет число типа quad (8 байт) по указанному адресу памяти.

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


PokeS

PokeS()

Синтаксис

PokeS(*MemoryBuffer, Text$ [, Length [, Flags]] )
Описание
Для опытных программистов.
PokeS пишет строку (включая символ окончания строки '0') по указанному адресу памяти.

Дополнительным параметром length (в символах) можно указать длинну строки, при этом в конце строки будет помещен '0' (то есть указываем 6, а записываем 7 байт, 6 для строки и последний байт будет '0').
Если 'Flags' не указан, строка пишется в формате unicode, при условии что программа скомпилирована в unicode или как ascii, если программа скомпилирована в этом формате.

'Flags' может принимать одно из следующих значений:
  #PB_Ascii  : Записывает строку как ascii, даже когда программа откомпилирована в режиме уникода
  #PB_UTF8   : Записывает строку как UTF8 (программа может быть или в уникоде или в ascii режиме)
  #PB_Unicode: Записывает строку как уникод, даже когда программа откомпилирована в ascii режиме
Если аргумент 'Flags' задействован, то в качестве длины строки - аргумента 'Length' можно указать -1, что позволит автоматически определить требуемую длину строки.

Примечание: комбинацию PokeS() и PeekS() можно использовать для конвертации между форматами (Ascii, UTF8 и Unicode).


PokeU

PokeU()

Синтаксис

PokeU(*MemoryBuffer, Number)
Описание
Для опытных программистов. PokeU() записывает символ уникода (2 байта) по указанному адресу памяти.


PokeW

PokeW()

Синтаксис

PokeW(*MemoryBuffer, Number)
Описание
Для опытных программистов. PokeW() пишет значения типа word (2 байта) по указанному адресу памяти.


ReAllocateMemory

ReAllocateMemory()

Синтаксис

*MemoryID = ReAllocateMemory(*MemoryID, Size)
Описание
Выделяет новый (когда *MemoryID равен 0) или перераспределяет существующий (с допустимым параметром *MemoryID) участок памяти согласно указанному размеру (в байтах). Если не получится выделить участок памяти требуемого размера, то функция вернёт 0, но при этом сохранится старый участок памяти, адрес которого задан в первом аргументе функции.

Если новый размер области памяти меньший чем предшествующий, то конец области будет просто удалён и больше не доступен для программы. Если новый размер больший чем предшествующий, то добавляемая область памяти (к концу существующей) будет заполнена нулями.

Примечание: Все выделеные участки памяти будут автоматически освобождены при завершении работы программы.

Пример:
  *MemoryID = AllocateMemory(1000)
  PokeS(*MemoryID, "Store this string")
  ; do something more with it here...
  ;
  *NewMemoryID = ReAllocateMemory(*MemoryID, 2000) ; need more memory
  If *NewMemoryID
    ; work with *NewMemoryID now with size 2000
    Debug "The old contents are still here:"
    Debug PeekS(*NewMemoryID)
    ;
    FreeMemory(*NewMemoryID)
  Else
    ; resizing failed, keep working with *MemoryID (size 1000)
    ;
    FreeMemory(*MemoryID)
  EndIf


Menu

PureBasic - Menu

Краткий обзор

Создание и управление меню в PureBasic. Можно, приспособить меню для своих определенных потребностей.

Чтобы использовать меню, следует сначала запустить CreateMenu() для нормальных меню, или CreatePopupMenu() для всплывающих меню.

Краткий перечень команд

CloseSubMenu
CreateImageMenu
CreateMenu
CreatePopupImageMenu
CreatePopupMenu
DisableMenuItem
DisplayPopupMenu
FreeMenu
GetMenuItemState
GetMenuItemText
GetMenuTitleText
HideMenu
IsMenu
MenuBar
MenuHeight
MenuID
MenuItem
MenuTitle
OpenSubMenu
SetMenuItemState
SetMenuItemText
SetMenuTitleText


CloseSubMenu

CloseSubMenu()

Синтаксис

CloseSubMenu()
Описание
Закрывает текущее суб-меню и возвращается к предыдущему. Перед этой командой, должна быть вызвана OpenSubMenu()!

Для примера смотрите OpenSubMenu().


CreateImageMenu

CreateImageMenu()

Синтаксис

Result = CreateImageMenu( #Menu, WindowID [, Flags] )
Описание
Создает новое пустое меню, с поддержкой изображения внутри, на окне WindowID, с номером #Menu. Если #PB_Any будет использоваться как параметр '#Menu' то будет возвращен номер меню, как 'Result'. Если меню не может быть создано, 'Result' будет 0. WindowID может быть получен с помощью WindowID(). После создания меню, оно будет текущим, для вставки элементов. Теперь можно пользоваться такими функциями, как MenuTitle(), MenuItem(), MenuBar(), OpenSubMenu() и т.д.

'Flags' может быть комбинацией следующих значений:
  #PB_Menu_ModernLook: Включить градиент и современный вид
Для обработки событий, связанных с меню, см. описание следующих команд:
WaitWindowEvent() (или WindowEvent())
EventWindow()
EventMenu()

Пример:
  If LoadImage(0, OpenFileRequester("Choose an icon file", "", "", 0))
    If OpenWindow(0, 200, 200, 200, 100, "Image menu Example")
      If CreateImageMenu(0, WindowID(0))    ; menu creation starts....
        MenuTitle("Project")
          MenuItem(1, "Open"   +Chr(9)+"Ctrl+O", ImageID(0))
          MenuItem(2, "Save"   +Chr(9)+"Ctrl+S")
          MenuItem(3, "Save as"+Chr(9)+"Ctrl+A")
          MenuItem(4, "Close"  +Chr(9)+"Ctrl+C")
      EndIf

      Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
    EndIf
  EndIf


CreateMenu

CreateMenu()

Синтаксис

Result = CreateMenu(#Menu, WindowID)
Описание
Создает новое пустое меню на окне WindowID, с номером #Menu. Если #PB_Any будет использоваться как параметр '#Menu' то будет возвращен номер меню, как 'Result'. Если меню не может быть создано, 'Result' будет 0. WindowID может быть получен с помощью WindowID() .После создания меню, оно будет текущим, для вставки элементов. Теперь можно пользоваться такими функциями, как MenuTitle(), MenuItem(), MenuBar(), OpenSubMenu() и т.д.

Для обработки событий, связанных с меню, см. описание следующих команд:
WaitWindowEvent() (или WindowEvent())
EventWindow()
EventMenu()

Пример:
  If OpenWindow(0, 200, 200, 200, 100, "Menu Example")
    If CreateMenu(0, WindowID(0))    ; menu creation starts....
      MenuTitle("Project")
        MenuItem(1, "Open"   +Chr(9)+"Ctrl+O")
        MenuItem(2, "Save"   +Chr(9)+"Ctrl+S")
        MenuItem(3, "Save as"+Chr(9)+"Ctrl+A")
        MenuItem(4, "Close"  +Chr(9)+"Ctrl+C")
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf


CreatePopupImageMenu

CreatePopupImageMenu()

Синтаксис

Result = CreatePopupImageMenu(#Menu [, Flags])
Описание
Создает новое пустое всплывающее меню, с поддержкой изображения внутри. Если #PB_Any будет использоваться как параметр '#Menu' то будет возвращен номер меню, как 'Result'. Если меню не может быть создано, 'Result' будет 0. После создания меню, оно будет текущим, для вставки элементов. Теперь можно пользоваться такими функциями, как MenuItem(), MenuBar(), OpenSubMenu() и т.д.

'Flags' может быть комбинацией следующих значений:
  #PB_Menu_ModernLook: Включить градиент и современный вид
DisplayPopupMenu() can be used to display this popup menu at any position on the screen.

Для обработки событий, связанных с меню, см. описание следующих команд:
WaitWindowEvent() (или WindowEvent())
EventWindow()
EventMenu()

Пример:
  If OpenWindow(0, 200, 200, 200, 120, "Image Popup-Menu Example")
    If CreatePopupImageMenu(0, #PB_Menu_ModernLook)      ; creation of the pop-up menu begins...
      MenuItem(1, "Open")      ; You can use all commands for creating a menu
      MenuItem(2, "Save")      ; just like in a normal menu...
      MenuItem(3, "Save as")
      MenuItem(4, "Quit")
      MenuBar()
      OpenSubMenu("Recent files")
        MenuItem(5, "PureBasic.exe")
        MenuItem(6, "Test.txt")
      CloseSubMenu()
    EndIf
    Repeat
      Select WaitWindowEvent()     ; check for window events
        Case #WM_RBUTTONDOWN       ; right mouse button was clicked =>
          DisplayPopupMenu(0, WindowID(0))  ; now display the popup-menu
        Case #PB_Event_Menu        ; an item of the popup-menu was clicked
          Select EventMenu()     ; get the clicked menu item...
            Case 1 : Debug "Menu: Open"
            Case 2 : Debug "Menu: Save"
            Case 3 : Debug "Menu: Save as"
            Case 4 : Quit = 1
            Case 5 : Debug "Menu: PureBasic.exe"
            Case 6 : Debug "Menu: Text.txt"
          EndSelect
        Case #PB_Event_CloseWindow
          Quit = 1
      EndSelect
    Until Quit = 1
  EndIf


CreatePopupMenu

CreatePopupMenu()

Синтаксис

Result = CreatePopupMenu(#Menu)
Описание
Создает новое пустое всплывающее меню. Если #PB_Any будет использоваться как параметр '#Menu' то будет возвращен номер меню, как 'Result'. Если меню не может быть создано, 'Result' будет 0. После создания меню, оно будет текущим, для вставки элементов. Теперь можно пользоваться такими функциями, как MenuItem(), MenuBar(), OpenSubMenu() и т.д.

DisplayPopupMenu() может использоваться, чтобы отобразить это всплывающее меню в любой позиции на экране.

Для обработки событий, связанных с меню, см. описание следующих команд:
WaitWindowEvent() (или WindowEvent())
EventWindow()
EventMenu()

Пример:
  If OpenWindow(0, 200, 200, 200, 120, "Popup-Menu Example")
    If CreatePopupMenu(0)      ; creation of the pop-up menu begins...
      MenuItem(1, "Open")      ; You can use all commands for creating a menu
      MenuItem(2, "Save")      ; just like in a normal menu...
      MenuItem(3, "Save as")
      MenuItem(4, "Quit")
      MenuBar()
      OpenSubMenu("Recent files")
        MenuItem(5, "PureBasic.exe")
        MenuItem(6, "Test.txt")
      CloseSubMenu()
    EndIf
    Repeat
      Select WaitWindowEvent()     ; check for window events
        Case #WM_RButtonDown       ; right mouse button was clicked =>
          DisplayPopupMenu(0, WindowID(0))  ; now display the popup-menu
        Case #PB_Event_Menu        ; an item of the popup-menu was clicked
          Select EventMenu()     ; get the clicked menu item...
            Case 1 : Debug "Menu: Open"
            Case 2 : Debug "Menu: Save"
            Case 3 : Debug "Menu: Save as"
            Case 4 : Quit = 1
            Case 5 : Debug "Menu: PureBasic.exe"
            Case 6 : Debug "Menu: Text.txt"
          EndSelect
        Case #PB_Event_CloseWindow
          Quit = 1
      EndSelect
    Until Quit = 1
  EndIf


DisableMenuItem

DisableMenuItem()

Синтаксис

DisableMenuItem(#Menu, MenuItem, State)
Описание
Включает или выключает элемент меню #Menu под номером 'MenuItem'. Если State=1, то пункт меню отключен, а если State=0, то пункт меню включен.

Пример:
  If OpenWindow(0, 200, 200, 200, 100, "DisableMenuItem Example")
    If CreateMenu(0, WindowID(0))
      MenuTitle("Project")
        MenuItem(1, "Open")
        MenuItem(2, "Save")
        DisableMenuItem(0, 2, 1)     ; disable the second menu item (Save)
    EndIf

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


DisplayPopupMenu

DisplayPopupMenu()

Синтаксис

DisplayPopupMenu(#Menu, WindowID [ , x, y])
Описание
Отображает всплывающее меню под позицией мыши, на окне WindowID, с номером #Menu. Координаты x,y являются необязательными, и могут быть определены, чтобы отобразить меню в любой позиции на экране. Координаты указываются в пикселях, начинающихся с левого верхнего угла экрана.

Для примера смотрите CreatePopupMenu().


FreeMenu

FreeMenu()

Синтаксис

FreeMenu(#Menu)
Описание
Удаляет меню #Menu и освобождает память. Если меню было выставлено в окно, то оно автоматически удаляется. Вы можете использовать освободившийся номер для следующего списка меню.

Примечание: все остающиеся меню автоматически освобождаются, когда программа заканчивается.


GetMenuItemState

GetMenuItemState()

Синтаксис

Result = GetMenuItemState(#Menu, MenuItem)
Описание
Возвращает статус пункта MenuItem в меню #Menu. Если пункт меню "checked" (галочка установлена),то Result=1, в противном случае Result=0. Галочка может добавляться к пункту меню SetMenuItemState().

Пример:
  If OpenWindow(0, 200, 200, 200, 100, "GetMenuItemState Example")
    If CreateMenu(0, WindowID(0))
      MenuTitle("Project")
        MenuItem(1, "Changed")
        SetMenuItemState(0,1,1)    ; set check mark for the previously created menu item
    EndIf
    Repeat
      Event = WaitWindowEvent()          ; wait for an event
      If Event = #PB_Event_Menu          ; a menu event appeared
        If EventMenu() = 1             ; first menu item was clicked
          If GetMenuItemState(0,1) = 1   ; actual item state = check marked
            SetMenuItemState(0,1,0)      ; now remove the check mark
          Else                           ; actual item state = no check mark
            SetMenuItemState(0,1,1)      ; now set the check mark
          EndIf
        EndIf
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


GetMenuItemText

GetMenuItemText()

Синтаксис

Text$ = GetMenuItemText(#Menu, Item)
Описание
Возвращает текст из указанного элемента Item, в меню #Menu.


GetMenuTitleText

GetMenuTitleText()

Синтаксис

Text$ = GetMenuTitleText(#Menu, Title)
Описание
Возвращает текст заголовка указанного элемента Title, в меню #Menu.


HideMenu

HideMenu()

Синтаксис

HideMenu(#Menu, State)
Описание
Скрывает или выводит указаное меню #Menu. Если State=0, выводит меню, в противном случае скрывает.


IsMenu

IsMenu()

Синтаксис

Result = IsMenu(#Menu)
Описание
Проверяет существование меню #Menu. Данная функция может быть использована с любым значением. Если 'Result' не равен нулю, то этот объект существует. Это правильный способ гарантировать, что меню существует.


MenuBar

MenuBar()

Синтаксис

MenuBar()
Описание
Создает горизонтальную полосу в меню.

Пример:
  If OpenWindow(0, 200, 200, 200, 100, "MenuBar Example")
    If CreateMenu(0, WindowID(0))  ; here the menu creating starts....
      MenuTitle("Project")
        MenuItem(1, "Open")
        MenuBar()                 ; here the separator bar will be inserted
        MenuItem(4, "Close")
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf


MenuHeight

MenuHeight()

Синтаксис

MenuHeight()
Описание
Возвращает высоту строки меню (в пикселях). Полезно, чтобы правильно рассчитать высоту окна при использовании меню.


MenuID

MenuID()

Синтаксис

MenuID = MenuID(#Menu)
Описание
Возвращает уникальный системный идентификатор #Menu.

Этот результат иногда также называют 'Handle'. Смотрите дополнительную главу "Handles and Numbers" для более подробной информации.


MenuItem

MenuItem()

Синтаксис

MenuItem(MenuItemID, Text$ [, ImageID])
Описание
Создает новый пункт в меню с номером MenuItemID. В строке Text$, вы можете использовать специальные '&' чтобы подчеркнуть характер конкретной записи :

"&File" будет выглядеть следующим образом: File

Если вы хотите назначить сочетание клавиш (которые будут созданы с помощью AddKeyboardShortcut()) и выравниваются по правой стороне меню (например, "Сохранить Ctrl + S"), то вы можете использовать символ табуляции. У cимвола табуляции есть код ASCII 9, следовательно, надо будет использовать команду Chr () 9, чтобы вставить cимвол табуляции to insert a tab character. The code may look something like this:
  MenuItem(1, "&Open" + Chr(9) + "Ctrl+O")
'ImageID' является необязательным и определяет изображение, которое будет отображаться для этого элемента. Меню должно быть создано с помощью CreateImageMenu() или CreatePopupImageMenu(). 'ImageID' может быть получен с помощью ImageID().

Пример:
  If OpenWindow(0, 200, 200, 200, 100, "MenuItem Example")
    If CreateMenu(0, WindowID(0))
      MenuTitle("Project")
        MenuItem(1, "Open")    ; normal item
        MenuItem(2, "&Save")   ; item with underlined character, the underline will only
                               ; be displayed, if menu is called with F10 + arrow keys
        MenuItem(3, "Quit"+Chr(9)+"Esc")   ; item with separate shortcut text
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf


MenuTitle

MenuTitle()

Синтаксис

MenuTitle(Title$)
Описание
Создает новый горизонтальный элемент заголовка для меню. В заголовке Title$ Вы можете использовать специальное символ '&', чтобы подчеркнуть определенную букву:

"&File" будет выглядеть следующим образом: File

Пример:
  If OpenWindow(0, 200, 200, 200, 100, "MenuTitle Example")
    If CreateMenu(0, WindowID(0))
      MenuTitle("Project")      ; normal menu title with following item
        MenuItem(1, "Open")
        MenuItem(2, "Close")
      MenuTitle("&Edit")        ; menu title with underlined character, the underline
                                ; will only be displayed, when called with F10 key
        MenuItem(3, "Undo")
        MenuItem(4, "Redo")
      MenuTitle("About")        ; only menu title
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf


OpenSubMenu

OpenSubMenu()

Синтаксис

OpenSubMenu(Text$)
Описание
Создает пустое подменю в текущем меню. В заголовке Title$ Вы можете использовать специальное символ '&', чтобы подчеркнуть определенную букву:

"&File" будет выглядеть следующим образом: File

Пример:
  If OpenWindow(0, 200, 200, 220, 100, "SubMenu Example")
    If CreateMenu(0, WindowID(0))
      MenuTitle("Project")
        MenuItem(1, "Open")
        MenuItem(2, "Close")
        MenuBar()
        OpenSubMenu("Recent files")       ; begin sub-menu
          MenuItem( 3, "C:\Autoexec.bat")
          MenuItem( 4, "D:\Test.txt")
        CloseSubMenu()                    ; end sub-menu
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf


SetMenuItemState

SetMenuItemState()

Синтаксис

Result = SetMenuItemState(#Menu, MenuItem, State)
Описание
Изменяет состояние MenuItem в меню #Menu. Эта функция позволяет отображать 'check mark'(галочку) слева от текста. Если State = 1 тогда появится галочка, в противном случае 'check mark' отображаться не будет.

GetMenuItemState() может быть использована для получения текущего состояния пункта меню.

Пример:
  If OpenWindow(0, 200, 200, 200, 100, "SetMenuItemState Example")
    If CreateMenu(0, WindowID(0))
      MenuTitle("Project")
        MenuItem(1, "Changed")
        SetMenuItemState(0,1,1)    ; set check mark before the previously created menu item
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf


SetMenuItemText

SetMenuItemText()

Синтаксис

SetMenuItemText(#Menu, Item, Text$)
Описание
Изменяет текст Text$ указанного элемента Item в меню #Menu.


SetMenuTitleText

SetMenuTitleText()

Синтаксис

SetMenuTitleText( #Menu, Title, Text$ )
Описание
Изменяет текст Text$ заголовка Title в меню #Menu.


Mesh

PureBasic - Mesh

Краткий обзор

Meshs are 3D objects composed of many vertices (and triangles) which are linked together to make a shape. A mesh can have an optional skeleton, with bones to allow realtime animation. A mesh can't be moved or displayed directly, but need to be manipulated through an entity.

InitEngine3D() has to be called successfully before using the Mesh functions.

Краткий перечень команд

CopyMesh
CreateMesh
FreeMesh
IsMesh
LoadMesh
MeshID
SetMeshData


CopyMesh

CopyMesh()

Синтаксис

Result = CopyMesh(#Mesh, #NewMesh)
Описание
Creates a #NewMesh which is the exact copy of the specified #Mesh. If #PB_Any is used as the '#NewMesh' parameter, then the new mesh number will be returned as 'Result'.

If the Result equals 0, then the mesh copy has failed. If #NewMesh was already exists, then it is freed and replaced by a new one.


CreateMesh

CreateMesh()

Синтаксис

Result = CreateMesh(#Mesh, BoundingBoxRadius)
Описание
Creates a new empy #Mesh. If #PB_Any is used as the '#Mesh' parameter, then the new mesh number will be returned as 'Result'.

SetMeshData() can be used to build a mesh from scratch by inserting the required vertices, normals, uv textures, etc. 'BoundingBoxRadius' specifies the bounding box radius applied to the mesh.

If Result equals 0, the creation of the mesh has failed. If the #Mesh was already created, then it is freed and replaced by a new one.


FreeMesh

FreeMesh()

Синтаксис

FreeMesh(#Mesh)
Описание
Free the specified #Mesh. All its associated memory is released and the object can't be used anymore.

Note: all remaining meshes are automatically freed when the program ends.


IsMesh

IsMesh()

Синтаксис

Result = IsMesh(#Mesh)
Описание
Tests if the given #Mesh is a valid and correctly initialized mesh.

This function is bullet-proof and can be used with any value. If Result equals zero then the given mesh has not been properly created or initialized. This is the correct way to ensure that a mesh is ready to use.


LoadMesh

LoadMesh()

Синтаксис

Result = LoadMesh(#Mesh, Filename$)
Описание
Loads a new #Mesh from disk. If #PB_Any is used as the '#Mesh' parameter, then the new mesh number will be returned as 'Result'. Before loading a mesh, an archive has to be specified with Add3DArchive().

Mesh has to be in the OGRE .mesh format. It's possible to create or convert existing meshes into this format then you can use an existing exporter, such as Milkshape, Lightwave or 3DS Max. More information can be found on the OGRE website.

If Result equals 0, then the Mesh can't be loaded. If the #Mesh was already exists, then it is freed and replaced by a new one.


MeshID

MeshID()

Синтаксис

Result = MeshID(#Mesh)
Описание
Returns the unique MeshID of the #Mesh. This function is especially needed by the CreateEntity().


SetMeshData

SetMeshData()

Синтаксис

SetMeshData(#Mesh, Type, Data, DataLength)
Описание
Set specific data to a #Mesh. 'Data' is the memory address of the data to be set in the #Mesh. 'DataLength' is the length of the data, depending of its type. This function is mainly used in combination with CreateMesh().

'Type' can be one of the following values:
  #PB_Mesh_Vertex       : 'Data' is an array of vertices, 'DataLength' is the number of elements
  #PB_Mesh_Face         : 'Data' is an array of triangles, each triangle vertex is an index of the vertices array. The array

                           need to be of 'word' type (.w). 'DataLength' is the number of elements
  #PB_Mesh_UVCoordinate : 'Data' is an array of UVCoordinates, 'DataLength' is the number of elements
  #PB_Mesh_Normal       : 'Data' is an array of Normals, 'DataLength' is the number of elements
  #PB_Mesh_Color        : 'Data' is an array of Colors, 'DataLength' is the number of elements


Misc

PureBasic - Misc

Краткий обзор

Эта библиотека объединяет различные функции, которые не могут быть классифицированными в другом месте.

Краткий перечень команд

Alpha
AlphaBlend
Blue
Delay
ElapsedMilliseconds
Green
OSVersion
RGB
RGBA
Random
RandomSeed
Red


Alpha

Alpha()

Синтаксис

Result = Alpha(Color)
Описание
Возвращает значение альфа (прозрачность цвета) - RGBA в 32 бита. Возвращаемое значение от 0 (полностью прозрачный), до 255 (полностью непрозрачный).

RGBA() сочетает в себе значения красного, зеленого, синего и альфа цвета 32 бит. Эта функция является полезной для опериций рисования Drawing operations.


AlphaBlend

AlphaBlend()

Синтаксис

Color = AlphaBlend(Color1, Color2)
Описание
Возвращает 32-битный цвет от смешивания Color1 и Color2. RGBA() может быть использована для создания 32-битного цвета с альфа-каналом прозрачности.

Эта функция является полезной для опериций рисования Drawing operations.


Blue

Blue()

Синтаксис

Result = Blue(Color)
Описание
Возвращает значение синего цвета в 24 бит RGB (между 0 и 255).

Чтобы совместить красный, зеленый и синий 24-битные цвета RGB,используйте функцию RGB(). Эта функция является полезной для опериций рисования Drawing operations.


Delay

Delay()

Синтаксис

Delay(Time)
Описание
Останавливает выполнение программы на указанный период Time.

Время задержки, полезно в ждущих циклах, события WindowEvent() или ExamineKeyboard(), чтобы не монополизировать все время процессора.


ElapsedMilliseconds

ElapsedMilliseconds()

Синтаксис

Result = ElapsedMilliseconds()
Описание
Возвращает количество миллисекунд, прошедших с определенного времени в прошлом. Возвращенное абсолютное значение, не имеет смысла, так как оно изменяется в зависимости от операционной системы.

Эта функция является достаточно точной: в зависимости от установленной операционной системы, может иметь небольшие различия, потому что некоторые системы имеют более низкую разрешающую способность таймера.
  StartTime = ElapsedMilliseconds()             ; определяем текущее значение
  Delay(1000)                                   ; ожидает 1000 миллисекунд
  ElapsedTime = ElapsedMilliseconds()-StartTime ; 'ElapsedTime' должна быть примерно 1000 миллисекунд


Green

Green()

Синтаксис

Result = Green(Color)
Описание
Возвращает значение зеленого цвета в 24 бит RGB (между 0 и 255).

Чтобы совместить красный, зеленый и синий 24-битные цвета RGB,используйте функцию RGB(). Эта функция является полезной для опериций рисования Drawing operations.


OSVersion

OSVersion()

Синтаксис

Result = OSVersion()
Описание
Определяет версию операционной системы, в которой была запущена программа. Это может быть полезно, чтобы автоматически, в зависимости от текущей операционной системы, включить или выключить некоторые функции.

'Result' может быть одним из следующих значений:
  #PB_OS_Windows_NT3_51
  #PB_OS_Windows_95
  #PB_OS_Windows_NT_4
  #PB_OS_Windows_98
  #PB_OS_Windows_ME
  #PB_OS_Windows_2000
  #PB_OS_Windows_XP
  #PB_OS_Windows_Server_2003
  #PB_OS_Windows_Vista
  #PB_OS_Windows_Server_2008
  #PB_OS_Windows_7
  #PB_OS_Windows_Future  ; Новые версии Windows (не существующей на момент написания программы)
Пример:
  Select OSVersion()
    Case #PB_OS_Windows_98
      MessageRequester("Info", "Windows 98")

    Case #PB_OS_Windows_2000
      MessageRequester("Info", "Windows 2000")

    Case #PB_OS_Windows_XP
      MessageRequester("Info", "Windows XP")

    Default
      MessageRequester("Info", "Unsupported Windows version")
  EndSelect
Обратите внимание, что значение констант соблюдает хронологический порядок различных версий, что позволяет быстро определить, более ранняя или более поздняя версия используется.
  If OsVersion() < #PB_OS_Windows_2000
    ;
    ; Все версии старше Windows 2000
    ;
  EndIf


RGB

RGB()

Синтаксис

Color = RGB(Red, Green, Blue)
Описание
Возвращает значение цвета 24 бита, соответственно красного, зеленого и синего. Эти значения лежат в диапазоне от 0 до 255, что дает в итоге до 16,7 млн возможных цветов.

Чтобы извлечь значение одного цвета, используйте функции Red(), Green() и Blue(). Эта функция является полезной для опериций рисования Drawing operations.

Таблица цветов находится здесь.


RGBA

RGBA()

Синтаксис

Color = RGBA(Red, Green, Blue, Alpha)
Описание
Возвращает значение цвета 32 бита, соответственно красного, зеленого, синего и прозрачность Alpha. Эти значения лежат в диапазоне от 0 до 255, что дает в итоге до 16,7 млн возможных цветов, с 256 уровнями прозрачности. Значение Alpha от 0 (полностью прозрачный), до 255 (полностью непрозрачный).

Чтобы извлечь значение одного цвета или прозрачности, используйте функции Red(), Green(), Blue() и Alpha(). Эта функция является полезной для опериций рисования Drawing operations.


Random

Random()

Синтаксис

Result = Random(Maximum)
Описание
Возвращает случайное целое число от 0 до указанного максимального значения Maximum(включительно). 'Maximum' может быть максимум 2147483647 (положительное long значение). Дополнительно RandomSeed() может использоваться, чтобы изменить начальное значение случайного числа.

Примечание: каждый раз в начале программы, создается новое случайное значение, поэтому RandomSeed() имеет смысл только, если вы хотите генерировать одни и те же случайные числа, и в том же порядке, каждый раз, когда программа запускается.


RandomSeed

RandomSeed()

Синтаксис

RandomSeed(Value)
Описание
Изменение таблицы случайных чисел, возвращаемых Random().

Примечание: каждый раз в начале программы, создается новое случайное значение, поэтому RandomSeed() имеет смысл только, если вы хотите генерировать одни и те же случайные числа, и в том же порядке, каждый раз, когда программа запускается.


Red

Red()

Синтаксис

Result = Red(Color)
Описание
Возвращает значение красного цвета в 24 бит RGB (между 0 и 255).

Чтобы совместить красный, зеленый и синий 24-битные цвета RGB,используйте функцию RGB(). Эта функция является полезной для опериций рисования Drawing operations.


Module

PureBasic - Module

Краткий обзор

PureBasic может проигрывать стандартные музыкальные модули создавая музыкальный фон в игре или в приложении. Модули хорошо известны среди авторов демосцены, так как это эффективный способ создания музыки на компьютере. Средства, используемые для создания модулей, называются 'Трекеры' (ProTracker, FastTracker, Impulse Tracker...). Преимущество модуля по сравнению с файлами .wav/mp3 это его очень малый размер, практически неограниченная длина, очень быстрое воспроизведение, возможность перепрыгнуть к определённой части музыки соответствующей действиям на экране и т.д.... Разумеется можно смешивать standard sound и звук модулей чтобы оба проигрывались одновременно.

Для проигрывания модулей с очень высоким качеством и поддержкой различных трекеров используется библиотека ModPlug.

Перед использованием любых функций работы с модулями должна быть успешно вызвана функция InitSound().

Краткий перечень команд

CatchModule
FreeModule
GetModulePosition
GetModuleRow
IsModule
LoadModule
ModuleVolume
PlayModule
SetModulePosition
StopModule


CatchModule

CatchModule()

Синтаксис

Result = CatchModule(#Module, MemoryAddress, Size)
Описание
Загрузить указанный модуль из данной области памяти. Если для параметра '#Module' задано значение #PB_Any , в 'Result' возвращается новый номер модуля. Если значение 'Result' не равно 0, модуль был корректно загружен и готов к проигрыванию с помощью функции PlayModule(), иначе загрузка модуля не удалась. Если другой модуль был ранее загружен с тем же номером модуля, то прежний модуль автоматически удаляется.

Библиотека ModPlug поддерживает множество форматов модулей, включая: Protracker (4 канала), FastTracker (до 32 каналов, качество 16 бит), Impulse Tracker, и т.д..

Эта функция полезна при использовании ключевого слова PureBasic 'IncludeBinary'. В этом случае модули можно вставлять в исполняемый файл. Однако используйте эту опцию осторожно, так как она потребует больше памяти, чем хранение модуля во внешнем файле (модуль и находится в исполняемой памяти, и загружен в физическую память).

Пример:
  CatchModule(0, ?Module, ?ModuleEnd-?Module)
  End

  DataSection
    Module:
      IncludeBinary "Module.xm"
    ModuleEnd:
  EndDataSection


FreeModule

FreeModule()

Синтаксис

FreeModule(#Module)
Описание
Остановить и удалить из памяти указанный модуль, ранее загруженный с помощью функции LoadModule() После того как модуль был удалён, его больше нельзя проигрывать.

Примечание: все оставшиеся в памяти модули автоматически удаляются по окончании работы программы.


GetModulePosition

GetModulePosition()

Синтаксис

Position = GetModulePosition(#Module)
Описание
Возвращает позицию текущего паттерна в проигрываемом модуле #Module. Первый паттерн начинается с 0.


GetModuleRow

GetModuleRow()

Синтаксис

Row = GetModuleRow(#Module)
Описание
Возвращает позицию строки в паттерне проигрываемого модуля #Module. Первая строка начинается с 0.


IsModule

IsModule()

Синтаксис

Result = IsModule(#Module)
Описание
Проверяет, соответствует ли заданный номер модуля #Module корректному и правильно инициализированному объекту модуля. Эта функция абсолютно надёжна, ей можно передать любое значение. Если значение 'Result' не ноль, значит объект модуля корректен и инициализирован, иначе функция возвратит ноль. Это корректный способ убедиться, что модуль готов к использованию.


LoadModule

LoadModule()

Синтаксис

Result = LoadModule(#Module, Filename$)
Описание
Загрузить указанный модуль в память. Если для параметра '#Module' задано значение #PB_Any , в 'Result' возвращается новый номер модуля. Если значение 'Result' не равно 0, модуль был корректно загружен и готов к проигрыванию с помощью функции PlayModule(), иначе загрузка модуля не удалась. Если другой модуль был ранее загружен с тем же номером модуля, то прежний модуль автоматически удаляется.

Библиотека ModPlug поддерживает множество форматов модулей, включая: Protracker (4 канала), FastTracker (до 32 каналов, качество 16 бит), Impulse Tracker, и т.д..


ModuleVolume

ModuleVolume()

Синтаксис

Result = ModuleVolume(#Module, Volume)
Описание
Изменить громкость указанного модуля, в реальном времени. Значение громкости может быть между 0 и 100. Полезно для эффектов проявления/угасания.


PlayModule

PlayModule()

Синтаксис

PlayModule(#Module)
Описание
Начинает проигрывать указанный модуль, ранее загруженный с помощью функции LoadModule().


SetModulePosition

SetModulePosition()

Синтаксис

SetModulePosition(#Module, Position)
Описание
Изменить позицию текущего паттерна в проигрываемом модуле #Module на другую. Первый паттерн начинается с 0.


StopModule

StopModule()

Синтаксис

StopModule(#Module)
Описание
Остановить модуль #Module (если он проигрывался). Если значение параметра '#Module' равно -1, все проигрываемые в данный момент модули будут остановлены.


Mouse

PureBasic - Mouse

Краткий обзор

PureBаsic обеспечивает полный доступ к мыши, подключенной к компьютеру. Работает со стандартной мышкой, 3 кнопки. Библиотка оптимизирована в основном под игры. Не используйте команды этой библиотеки в приложениях, для этого есть команды WindowMouseX(), WindowMouseY() и EventType(). Использует технологию Directx.

Краткий перечень команд

ExamineMouse
InitMouse
MouseButton
MouseDeltaX
MouseDeltaY
MouseLocate
MouseWheel
MouseX
MouseY
ReleaseMouse


ExamineMouse

ExamineMouse()

Синтаксис

Result = ExamineMouse()
Описание
Обновляет состояние мыши. Если она возвращает 0, мышь не может быть использова. Эта команда должна быть использована до MouseDeltaX(), MouseDeltaY(), MouseX(), MouseY() или MouseButton(). В настоящее время поддерживается только стандартная мышь.


InitMouse

InitMouse()

Синтаксис

Result = InitMouse()
Описание
Инициализация среды мыши для последующего использования. Вы должны вызвать эту функцию до любых других функций в этой библиотеке. Если результат равен нулю, то мышь не доступна. Эта функция пытается открыть DirectX (v3.0 с совместимостью NT4.0 или V7.0), если она не работает, то DirectX либо отсутствует, либо слишком старый.


MouseButton

MouseButton()

Синтаксис

Result = MouseButton(ButtonNumber)
Описание
Если указанная кнопка мыши не нажата возвращает 0, в противном случае кнопка нажата. Одновременно может быть нажато любое количество кнопок. ExamineMouse() должна вызываться до этой функции (для обновления состояния кнопок).

'ButtonNumber' can be one of the following constants:
  #PB_MouseButton_Left  : Проверяет нажата ли левая кнопка мыши
  #PB_MouseButton_Right : Проверяет нажата ли правая кнопка мыши
  #PB_MouseButton_Middle: Проверяет нажата ли средняя кнопка мыши


MouseDeltaX

MouseDeltaX()

Синтаксис

Result = MouseDeltaX()
Описание
Возвращает горизонтальное перемещение мыши X (в пикселях) с момента последнего вызова этой функции. Это означает, что результат может быть положительным или отрицательным в зависимости от того, в какую сторону было сделано перемещение (в правую или левую) с момента последнего вызова этой функции. ExamineMouse() должна вызываться до этой функции (для обновления фактического положения мыши).


MouseDeltaY

MouseDeltaY()

Синтаксис

Result = MouseDeltaY()
Описание
Возвращает вертикальное смещение мыши Y (в пикселях) с момента последнего вызова этой функции. Это означает, что результат может быть положительным или отрицательным в зависимости от того, было сделано движение вверх или вниз с момента последнего вызова этой функции. ExamineMouse() должна вызываться до этой функции (для обновления фактического положения мыши).


MouseLocate

MouseLocate()

Синтаксис

Result = MouseLocate(x, y)
Описание
Изменяет абсолютную позицию (в пикселях) мыши на текущем экране. Это полезно при использовании функции MouseX() или MouseY().


MouseWheel

MouseWheel()

Синтаксис

Result = MouseWheel()
Описание
Возвращает количество импульсов "щелчков" колеса мыши с момента последнего вызова. Значение будет положительным, если колесо было прокручено вперед, и отрицательным, если колесо прокручено назад. ExamineMouse() должна вызываться до этой функции, для обновления статуса мыши.

Поддерживаемые ОС

Windows


MouseX

MouseX()

Синтаксис

Result = MouseX()
Описание
Возвращает горизонтальное положение мыши X (в пикселях) на текущем экране. Позиция может быть изменена функцией MouseLocate(). ExamineMouse() нужно вызвать перед этой функцией, чтобы обновить текущее положение мыши.


MouseY

MouseY()

Синтаксис

Result = MouseY()
Описание
Возвращает вертикальное положение мыши Y (в пикселях) на текущем экране. Позиция может быть изменена функцией MouseLocate(). ExamineMouse() нужно вызвать перед этой функцией, чтобы обновить текущее положение мыши.


ReleaseMouse

ReleaseMouse()

Синтаксис

Result = ReleaseMouse(State)
Описание
Блокировать или выпустить мышь, чтобы позволить ее использование операционной системой. Обычно используют эту функцию, после проверки вывода IsScreenActive() function. Если "State" равен 1, мышь отпущена, в противном случае она заблокированна программой PureBasic.


Movie

PureBasic - Movie

Краткий обзор

PureBasic имеет простые, но довольно функциональные средства для проигрывания видео, с помощью PureBasic Вы можете легко включать видеозаставки в Ваши приложения и игры.

Windows: Для показа видео в Windows используется технология DirectX (DirectShow), поддерживаются такие форматы как: AVI, MPG, DivX, Mp3.

MacOS X: Для MacOS X используется технология QuickTime, поддерживаются такие форматы как: AVI, MPG, DivX, Mp3.

Краткий перечень команд

FreeMovie
InitMovie
IsMovie
LoadMovie
MovieAudio
MovieHeight
MovieInfo
MovieLength
MovieSeek
MovieStatus
MovieWidth
PauseMovie
PlayMovie
RenderMovieFrame
ResizeMovie
ResumeMovie
StopMovie


FreeMovie

FreeMovie()

Синтаксис

FreeMovie(#Movie)
Описание
Выгрузить указанный ролик #Movie из памяти.

Примечание: все оставшиеся фильмы, автоматически освобождаются, когда программа завершается.


InitMovie

InitMovie()

Синтаксис

Result = InitMovie()
Описание
Инициализирует ВидеоБиблиотеку для дальнейшего использования. Ее необходимо использовать перед любыми другими функциями этой библиотеки. Требуется наличае DirectX как минимум 7 версии.


IsMovie

IsMovie()

Синтаксис

Result = IsMovie(#Movie)
Описание
Проверяет, является ли уникальный идентификатор #Movie уникальным идентификатором загруженного ролика, если нет - вернет 0.


LoadMovie

LoadMovie()

Синтаксис

Result = LoadMovie(#Movie, Filename$)
Описание
Пытается открыть файл ролика (Filename$). #Movie - уникальный идентификатор ролика (целое число больше 0), если вместо этого параметра использовать константу #PB_Any уникальный идентификатор будет передан как Result. Если ф-ция возвращает 0 - файл ролика открыть не удалось. PlayMovie() может быть использована для начала воспроизведения.


MovieAudio

MovieAudio()

Синтаксис

MovieAudio(#Movie, Volume, Balance)
Описание
Данная функция позволяет контролировать аудиопоток ролика #Movie, предназначена для регулирования громкости и баланса звука во время проигрывания. Громкость Volume можно изменять от 0 до 100, баланс Balance от -100 (слева), 0 (по центру), до 100 (справа).

Поддерживаемые ОС

Windows, MacOS X


MovieHeight

MovieHeight()

Синтаксис

Height = MovieHeight(#Movie)
Описание
Возвращает высоту (в пикселах) видеоролика #Movie. Если вернет -1, то видеопоток не найден или не поддерживается (mp3...).


MovieInfo

MovieInfo()

Синтаксис

Result = MovieInfo(#Movie, Flags)
Описание
Возвращает дополнительную информацию о видеоролике #Movie.

Если параметр Flags=0, функция вернет количество кадров в секунду (*1000).

Примечание: эта функция работает только с видеороликами, не работает с mp3 и т.д..

Поддерживаемые ОС

Windows, MacOS X


MovieLength

MovieLength()

Синтаксис

Length = MovieLength(#Movie)
Описание
Возвращает длину видеоролика #Movie в кадрах, не работает с mp3 и т.п.

Поддерживаемые ОС

Windows, MacOS X


MovieSeek

MovieSeek()

Синтаксис

Result = MovieSeek(#Movie, Frame)
Описание
Изменить "позицию проигрывания" видеоролика #Movie на указанный кадр - Frame.

Поддерживаемые ОС

Windows, MacOS X


MovieStatus

MovieStatus()

Синтаксис

Result = MovieStatus(#Movie)
Описание
Позволяет выяснить статус данного ролика. Возможные значения для Result:

-1: ролик на паузе.
0: ролик остановлен
> 0: ролик играет. Возвращаемое значение соответствует номеру текущего кадра.

Будте осторожны при использовании этой функции с аудио роликами.


MovieWidth

MovieWidth()

Синтаксис

Width = MovieWidth(#Movie)
Описание
Возвращает ширину Width (в пикселах) видеоролика #Movie. Если вернет -1, то видеопоток не найден или не поддерживается (mp3...).


PauseMovie

PauseMovie()

Синтаксис

PauseMovie(#Movie)
Описание
Приостановить воспроизведение фильма #Movie, он может быть возобновлен с помощью функции ResumeMovie().


PlayMovie

PlayMovie()

Синтаксис

PlayMovie(#Movie, WindowID)
Описание
Начать проигрывать предварительно загруженный функцией LoadMovie() ролик #Movie в окне WindowID смотрите WindowID().

Команда ResizeMovie() может быть использована для изменения размера и расположения фильма в этом окне WindowID (для примера: не использовать полный размер окна).

Если видеоролик проигрывается в спрайте с помощью RenderMovieFrame(), то вместо 'WindowID' надо указать константу #PB_Movie_Rendered.

Также можно разместить видео на весь экран, используя вместо WindowID ScreenID() смотрите ScreenID().


RenderMovieFrame

RenderMovieFrame()

Синтаксис

RenderMovieFrame(#Movie, SpriteID)
Описание
Передать видеофрейм прямо на спрайт. Это очень мощная функция, при использовании Sprite3D она позволяет создавать специальные эффекты в реальном времени, такие как прозрачность, увеличение, вращение. Следует заметить, что не все видеокодеки поддерживаются. Правильный SpriteID может быть получен с помощью SpriteID(). При использовании этой функции, в PlayMovie() необходимо указать константу #PB_Movie_Rendered.

Поддерживаемые ОС

Windows


ResizeMovie

ResizeMovie()

Синтаксис

ResizeMovie(#Movie, x, y, Width, Height)
Описание
Изменить/указать размеры и расположение видеообласти на окне, это необходимо сделать до применения PlayMovie().


ResumeMovie

ResumeMovie()

Синтаксис

ResumeMovie(#Movie)
Описание
Возобновить проигрывание ролика #Movie, после вызова команды PauseMovie().


StopMovie

StopMovie()

Синтаксис

StopMovie(#Movie)
Описание
Остановить ролик, если его затем запустить снова (с помощью PlayMovie()) он начнется с начала.


Network

PureBasic - Network

Краткий обзор

Сети используются во всем мире, для облегчения связи и передачи информации между компьютерами. PureBasic поддерживает официальный межсетевой протокол по обмену данными: TCP/IP. Данная библиотека позволяет создавать приложения или игры, на основе этого протокола, и модели "клиент-сервер". Используя эти функции, можно писать приложения, с любыми типами подключения к Интернет (браузер, веб-сервер, FTP клиент ...) или многопользовательские игры.

Краткий перечень команд

CloseNetworkConnection
CloseNetworkServer
ConnectionID
CreateNetworkServer
EventClient
EventServer
ExamineIPAddresses
GetClientIP
GetClientPort
HostName
IPAddressField
IPString
InitNetwork
MakeIPAddress
NetworkClientEvent
NetworkServerEvent
NextIPAddress
OpenNetworkConnection
ReceiveNetworkData
ReceiveNetworkFile
SendNetworkData
SendNetworkFile
SendNetworkString
ServerID


CloseNetworkConnection

CloseNetworkConnection()

Синтаксис

CloseNetworkConnection(Connection)
Описание
Закрывает указанное соединение Connection. Когда клиент вызывает эту функцию, сервер получает событие #PB_NetworkEvent_Disconnect. Когда сервер вызывает эту функцию, соединение будет закрыто без уведомления клиента.

Примечание: все соединения автоматически закрываются, когда программа завершается.


CloseNetworkServer

CloseNetworkServer()

Синтаксис

CloseNetworkServer(#Server)
Описание
Закрывает указанный сервер #Server. Все клиенты, подключенные к этому серверу, будут автоматически отключены. Порт освобождается и может снова использоваться другим приложением или другим сервером.


ConnectionID

ConnectionID()

Синтаксис

Result = ConnectionID(Connection)
Описание
Возвращает уникальный системный идентификатор подключения 'Connection'.

Этот результат иногда также известен как 'Handle'. Смотрите дополнительную главу Handles and Numbers для получения дополнительной информации.


CreateNetworkServer

CreateNetworkServer()

Синтаксис

Result = CreateNetworkServer( #Server, Port [, Mode] )
Описание
Создание нового сетевого сервера #Server на локальном компьютере, используя указанный порт Port. Если #PB_Any используется в качестве параметра '#Server' , то новое число сервера будет возвращено как результат 'Result'.

Значения порта могут колебаться в диапазоне значений от 6000 до 7000 (это рекомендуемый диапазон, в действительности, значение может лежать в области от 0 до 65 000).

Любое количество серверов может работать одновременно на одной машине, единственное ограничение, два сервера не могут использовать один и тот же номер.

Если Result = 0, то сервер не может быть создан, в противном случае сервер был создан и готов к использованию.

Port: номер порта для этого сервера

Параметр 'Mode' необязательный и может быть одним из следующих значений:
  #PB_Network_TCP: сервер будет использовать TCP network protocol (значение по умолчанию)
  #PB_Network_UDP: сервер будет использовать UDP network protocol


EventClient

EventClient()

Синтаксис

Client = EventClient()
Описание
Эта функция необходима только на стороне сервера. Возвращает идентификатор клиента, который отправил данные.

Функции GetClientIP() и GetClientPort() могут использоваться, чтобы получить более подробную информацию о клиенте, который послал данные.


EventServer

EventServer()

Синтаксис

Server = EventServer()
Описание
Эта функция необходима только на стороне сервера. Она возвращает дескриптор(номер) сервера, который, получил данные. Это позволяет вам управлять несколькими серверами в одной программе.


ExamineIPAddresses

ExamineIPAddresses()

Синтаксис

ExamineIPAddresses()
Описание
Начало изучения имеющихся адресов IP на локальном компьютере. NextIPAddress() используется для получения значения каждого номера IP.


GetClientIP

GetClientIP()

Синтаксис

IP = GetClientIP(Client)
Описание
Эта команда должна вызываться после EventClient() и возвращает IP-адрес клиента Client. Для определения порта клиента используйте GetClientPort(). IPString() может использоваться, чтобы преобразовать адрес IP в строку.


GetClientPort

GetClientPort()

Синтаксис

Port = GetClientPort(Client)
Описание
Эта команда должна вызываться после EventClient() и возвращает номер порта клиента. Для определения IP-адреса клиента используйте GetClientIP() .


HostName

HostName()

Синтаксис

String$ = HostName()
Описание
Возвращает имя локального компьютера.


IPAddressField

IPAddressField()

Синтаксис

Result = IPAddressField(IPAddress, Field)
Описание
Возвращает значение поля Field из указанного IP-адреса IPAddress.

'IPAddress' может быть создан командой MakeIPAddress(). Field может иметь значение от 0 до 3 (0 является левым значения, 3 правым).

Например: 127.0.0.1: поле 0 равно '127 'и поле 3 равно '1'.

Команда полезна при использовании в сочетании с:

- IPAddressGadget()
- MakeIPAddress()


IPString

IPString()

Синтаксис

String$ = IPString(IPAddress)
Описание
Возвращает строковое представление IP-адреса ("127.0.0.1") из указанного числового IPAddress.


InitNetwork

InitNetwork()

Синтаксис

Result = InitNetwork()
Описание
Эта функция должна вызываться перед всеми другими командами библиотеки Network library.

Если результат равен 0, то в системе нет доступных TCP/IP.


MakeIPAddress

MakeIPAddress()

Синтаксис

Result = MakeIPAddress(Field0, Field1, Field2, Field3)
Описание
Возвращает числовое значение, эквивалентное указанному адресу IP. Каждое поле может иметь значение от 0 до 255. Чтобы преобразовать числовое значение в строку (например, "127.0.0.1"), используйте команду IPString().

Эта команда полезна, когда она используется в союзе с:

- IPAddressGadget()


NetworkClientEvent

NetworkClientEvent()

Синтаксис

Result = NetworkClientEvent(Connection)
Описание
Возвращает 0, если никакая информация (или данные) не были получены на указанном Connection порту клиента.

Возвращаемое значение указывает на то, что произошло на самом деле:
  0                    : ничего не произошло
  #PB_NetworkEvent_Data: исходные данные были получены (могут читаться посредством ReceiveNetworkData())
  #PB_NetworkEvent_File: файл был получен (может читаться посредством ReceiveNetworkFile())


NetworkServerEvent

NetworkServerEvent()

Синтаксис

Result = NetworkServerEvent()
Описание
Возвращает 0, если никакая информация (или данные) не были получены на входе сервера.

Возвращаемое значение указывает на то, что произошло на самом деле:
  0                          : Ничего не произошло
  #PB_NetworkEvent_Connect   : новый клиент был подключен к серверу
  #PB_NetworkEvent_Data      : исходные данные были получены (могут читаться посредством ReceiveNetworkData())
  #PB_NetworkEvent_File      : файл был получен (может читаться посредством ReceiveNetworkFile())
  #PB_NetworkEvent_Disconnect: Клиент покинул сервер (отключен)


NextIPAddress

NextIPAddress()

Синтаксис

Result = NextIPAddress()
Описание
Эта команда должна вызываться после ExamineIPAddresses(). Она возвращает имеющиеся в распоряжении компьютера IP-адреса в численной форме. Они могут быть легко преобразованы в строку командой IPString().

Если 'Result' равен 0, то никаких дополнительных адресов небыло найдено.


OpenNetworkConnection

OpenNetworkConnection()

Синтаксис

Connection = OpenNetworkConnection(ServerName$, Port [, Mode])
Описание
Попытка установить подключение к указанному серверу. 'ServerName$' может быть IP адрес или полное имя (например: "127.0.0.1" или "ftp.home.net").

Если подключение с сервером подтверждено, Connection содержит идентификатор этого подключения, необходимый всем командам отправки и получения данных. Если Connection = 0, тогда подключение потерпело неудачу.

Дополнительный параметр 'Mode' может быть одним из следующих значений:
  #PB_Network_TCP: сервер будет использовать TCP network protocol (значение по умолчанию)
  #PB_Network_UDP: сервер будет использовать UDP network protocol. В этом режиме подключение
                   не будет конкретно установлено, поскольку UDP является протоколом
                   без установления соединения, Однако новая запись будет добавлена
                   в таблицу соединений управляемых PureBasic, с помощью команд SendNetworkData()
                   PureBasic разрешает отправку данных через UDP


ReceiveNetworkData

ReceiveNetworkData()

Синтаксис

Result = ReceiveNetworkData(Connection, *DataBuffer, DataBufferLength)
Описание
Получает необработанные данные от указанного клиента. Эта функция может использоваться приложениями клиента и сервера.

На стороне сервера 'Connection' определяет клиента, который послал данные. ClientID можно получить с помощью функции EventClient()).
На стороне клиента, 'Connection' определяется командой OpenNetworkConnection().

Данные читаются в указанную область памяти *DataBuffer. Область памяти может создаваться посредством AllocateMemory().

'Result' количество байт прочитанных функцией. Если 'Result' равен DataBufferLength, то есть данные ожидающие считывание. Если произошла ошибка связи, 'Result' будет -1.


ReceiveNetworkFile

ReceiveNetworkFile()

Синтаксис

ReceiveNetworkFile(Connection, Filename$)
Описание
Получает файл Filename$ от указанного клиента Connection. Эта функция может использоваться приложениями клиента и сервера.

На стороне сервера, 'Connection' идентифицирует клиента, который послал файл.
На стороне клиента, 'Connection' определяется командой OpenNetworkConnection().

Файл должен быть послан посредством команды SendNetworkFile().


SendNetworkData

SendNetworkData()

Синтаксис

Result = SendNetworkData(Connection, *MemoryBuffer, Length)
Описание
Отправляет необработанные данные указанному клиенту Connection. Эта функция может использоваться приложениями клиента и сервера.

На стороне сервера, 'Connection' это клиент, который должен принимать данные.
На стороне клиента, 'Connection' определяется командой OpenNetworkConnection().

'Result' это количество отправленных байт. Если 'Result' равен длинне 'Length', то все данные переданы. Если нет данных для отправки, то 'Result' будет равен -1.


SendNetworkFile

SendNetworkFile()

Синтаксис

Result = SendNetworkFile(Connection, Filename$)
Описание
Отправляет файл указанному клиенту Connection. Эта функция может использоваться приложениями клиента и сервера.

На стороне сервера, 'Connection' это клиент, который должен принимать данные.
На стороне клиента, 'Connection' определяется командой OpenNetworkConnection().

Файл отправляется с использованием определённого метода. Оно должен быть получен функцией ReceiveNetworkFile(). Эта функция блокирует выполнение программы, пока весь файл не будет отправлен.

'Result' будет равен 1, если файл был успешно отправлен, 0 при ошибке.


SendNetworkString

SendNetworkString()

Синтаксис

SendNetworkString(Connection, String$)
Описание
Отправляет строку указанному клиенту Connection. Эта функция может использоваться приложениями клиента и сервера.

На стороне сервера, 'Connection' это клиент, который должен принимать данные.
На стороне клиента, 'Connection' определяется командой OpenNetworkConnection().

Примечание: Не существует команды ReceiveNetworkString (), SendNetworkString() предусматривает только отправку строк. Строки передаются в необработанном виде (без нулевого символа), и может быть получена командой ReceiveNetworkData(), после возвращения командами NetworkServerEvent() / NetworkClientEvent() параметра #PB_NetworkEvent_Data). В режиме unicode строку посылают как UTF-8, который является независимым (в отличие от UTF-16, который привязан к порядку байт процессора).


ServerID

ServerID()

Синтаксис

Result = ServerID(#Server)
Описание
Возвращает уникальный идентификатор сервера '#Server' в операционной системе.

Этот результат иногда также называют 'Handle'. Смотрите дополнительную главу Handles and Numbers для получения дополнительной информации.


Node

PureBasic - Node

Краткий обзор

Nodes are containers which can be used to group objects like entities, sound, camera, billboard and even nodes together. Once an object is attached to a node, its position and movement is relative to the node position. It allows easy hierarchical object management.

InitEngine3D() should be called successfully before using the node functions.

Краткий перечень команд

AttachNodeObject
CreateNode
DetachNodeObject
FreeNode
IsNode
MoveNode
NodeID
NodeLocate
NodeLookAt
NodeX
NodeY
NodeZ
RotateNode


AttachNodeObject

AttachNodeObject()

Синтаксис

Result = AttachNodeObject(#Node, ObjectID, Type)
Описание
Attach an existing object to a #Node. The supported objects are the followings:
  - Entity : use EntityID() as 'ObjectID' and #PB_Node_Entity as 'Type'.
  - Sound3D: use SoundID3D() as 'ObjectID' and #PB_Node_Sound3D as 'Type'.
  - Camera : use CameraID() as 'ObjectID' and #PB_Node_Camera as 'Type'.
  - Node   : use NodeID() as 'ObjectID' and #PB_Node_Node as 'Type'.
  - BillboardGroup : use BillboardGroupID() as 'ObjectID' and #PB_Node_BillboardGroup as 'Type'.
  - ParticleEmitter: use ParticleEmitterID() as 'ObjectID' and #PB_Node_ParticleEmitter as 'Type'.
An object can be detached from a node with DetachNodeObject().


CreateNode

CreateNode()

Синтаксис

Result = CreateNode(#Node [, x, y, z])
Описание
Creates a new #Node at the specified position. If #PB_Any is used as '#Node' parameter, the new node number will be returned as 'Result'.

If the 'Result' is 0, the #Node creation has failed. If the #Node was already created, it is automatically freed and replaced by the new one.


DetachNodeObject

DetachNodeObject()

Синтаксис

Result = DetachNodeObject(#Node, ObjectID, Type)
Описание
Detach a previously attached object from a #Node. The supported objects are the followings:
  - Entity : use EntityID() as 'ObjectID' and #PB_Node_Entity as 'Type'.
  - Sound3D: use SoundID3D() as 'ObjectID' and #PB_Node_Sound3D as 'Type'.
  - Camera : use CameraID() as 'ObjectID' and #PB_Node_Camera as 'Type'.
  - Node   : use NodeID() as 'ObjectID' and #PB_Node_Node as 'Type'.
  - BillboardGroup : use BillboardGroupID() as 'ObjectID' and #PB_Node_BillboardGroup as 'Type'.
  - ParticleEmitter: use ParticleEmitterID() as 'ObjectID' and #PB_Node_ParticleEmitter as 'Type'.
An object can be attached to a node with AttachNodeObject().


FreeNode

FreeNode()

Синтаксис

FreeNode(#Node)
Описание
Free the specified #Node created with CreateNode() before. All its associated memory is released and this object can't be used anymore. The attached objects are not freed automatically, and can be re-used.

Note: All remaining nodes are automatically freed when the program ends.


IsNode

IsNode()

Синтаксис

Result = IsNode(#Node)
Описание
Tests if the given #Node is a valid and correctly initialized entity.

This function is bullet-proof and can be used with any value. If the 'Result' is not zero then the object is valid and initialized, else it returns zero. This is the correct way to ensure that an entity is ready to use.


MoveNode

MoveNode()

Синтаксис

MoveNode(#Node, x, y, z)
Описание
Moves the #Node in the world according to the specified x,y,z values.

This is a relative move based on the previous node location. To perform an absolute move in the world, use NodeLocate().


NodeID

NodeID()

Синтаксис

NodeID = NodeID(#Node)
Описание
Returns the unique ID which identifies the given '#Node' in the operating system. This function is very useful when another library needs a window reference.


NodeLocate

NodeLocate()

Синтаксис

NodeLocate(#Node, x, y, z)
Описание
Changes the #Node absolute position relative to its parent node. If the node doesn't have a parent node, it changes the #Node absolute position in the world.


NodeLookAt

NodeLookAt()

Синтаксис

NodeLookAt(#Node, x, y, z)
Описание
Changes the #Node orientation in the world, to point towards the specified x,y,z point.


NodeX

NodeX()

Синтаксис

Result = NodeX(#Node)
Описание
Returns the 'x' position of the #Node relative to its parent node. If the node doesn't have a parent node, it returns the 'x' position in the world.


NodeY

NodeY()

Синтаксис

Result = NodeY(#Node)
Описание
Returns the 'y' position of the #Node relative to its parent node. If the node doesn't have a parent, it returns the 'y' position in the world.


NodeZ

NodeZ()

Синтаксис

Result = NodeZ(#Node)
Описание
Returns the 'z' position of the #Node relative to its parent node. If the node doesn't have a parent, it returns the 'z' position in the world.


RotateNode

RotateNode()

Синтаксис

RotateNode(#Node, x, y, z [, Mode])
Описание
Rotates the #Node according to the specified x,y,z angle values. All angles are in degree, with values ranging from 0 to 360. The optional 'Mode' can be one of the following value:
  PB_Absolute: absolute rotation (default).
  PB_Relative: relative rotation based on the previous node rotation.


OnError

PureBasic - OnError

Краткий обзор

Эта библиотека даёт возможность по аналогии с PureBasic debugger, проследить ошибки в программе (сбои программы), собрать информацию о них и отправить разработчику, не увеличивая при этом размер и не снижая скорость.

PureBasic debugger является лучшим инструментом для поиска ошибок на этапе разработки, поскольку она предоставляет подробную информацию о состоянии программы (такую, как текущие значения variable), а также определяет местоположение ошибок.

Примечание: Если одновременно активизированы эта библиотека и PureBasic debugger, то не все ошибки будут обнаружены библиотекой ONERROR, так как проверка осуществляется модулем отладки, до того как код будет выполнен.

Эта библиотека может предоставить информацию об исходном файле и строке, в которой произошла ошибка через команды ErrorFile() и ErrorLine(), но только если эта функция включена, при компиляции (это приводит к небольшому замедлению скорости выполнения, для отслеживания номеров строк). Чтобы включить эту функцию, установите флажок в поле "Enable OnError lines support" при компиляции compiler options или дайте команду /LINENUMBERING (Windows) или --linenumbering (Linux, Mac OSX) при компиляции из commandline.

Краткий перечень команд

ErrorAddress
ErrorCode
ErrorFile
ErrorLine
ErrorMessage
ErrorRegister
ErrorTargetAddress
ExamineAssembly
InstructionAddress
InstructionString
NextInstruction
OnErrorCall
OnErrorDefault
OnErrorExit
OnErrorGoto
RaiseError


ErrorAddress

ErrorAddress()

Синтаксис

Result = ErrorAddress()
Описание
Возвращает адрес в памяти инструкции ассемблера, которая вызвала ошибку. Эта команда возвращает значимое значение, только если ошибка была обработана OnErrorCall() или OnErrorGoto().


ErrorCode

ErrorCode()

Синтаксис

Result = ErrorCode()
Описание
Возвращает код ошибки обрабатываемой в настоящее время. Эта команда возвращает значимое значение, только если ошибка была обработана OnErrorCall() или OnErrorGoto().

Возвращаемое значение

Возвращает одно из следующих значений:
  #PB_OnError_InvalidMemory         : чтение или запись защищенной области
  #PB_OnError_Floatingpoint         : ошибка с плавающей запятой
  #PB_OnError_Breakpoint            : достигнутая контрольная точка Отладчика (контрольные точки non-PureBasic)
  #PB_OnError_IllegalInstruction    : попытка выполнить недопустимую инструкцию
  #PB_OnError_PriviledgedInstruction: попытка выполнить привилегированную инструкцю системы
  #PB_OnError_DivideByZero          : деление на нуль (только Windows)
#PB_OnError_Floatingpoint : деление на нуль (Linux и Mac OSX)

Кроме того, у каждой OS могут быть другие возможные значения ошибок. В среде Windows, индивидуальные ошибки могут быть сгенерированы командой RaiseError().


ErrorFile

ErrorFile()

Синтаксис

Result$ = ErrorFile()
Описание
Возвращает имя файла исходного кода или includefile, где произошла текущая ошибка. Эта команда возвращает значимое значение, только если ошибка была обработана OnErrorCall() или OnErrorGoto().

Контроль номеров строк должен быть активирован при компилировании. Чтобы включить эту функцию, установите флажок в поле "Enable OnError lines support" при компиляции compiler options или дайте команду /LINENUMBERING (Windows) или --linenumbering (Linux, Mac OSX) при компиляции из commandline.

Возвращаемое значение

Возвращает имя файла с ошибкой, или "OnError line support disabled" если OnError отключено. (Простой способ узнать, включена ли поддержка OnError, это проверить результат ErrorLine(), если -1 то отключено.)


ErrorLine

ErrorLine()

Синтаксис

Result = ErrorLine()
Описание
Возвращает номер строки в исходном тексте, где произошла текущая ошибка. Эта команда возвращает значимое значение, только если ошибка была обработана OnErrorCall() или OnErrorGoto().

Контроль номеров строк должен быть активирован при компилировании. Чтобы включить эту функцию, установите флажок в поле "Enable OnError lines support" при компиляции compiler options или дайте команду /LINENUMBERING (Windows) или --linenumbering (Linux, Mac OSX) при компиляции из commandline.

Возвращаемое значение

Возвращает номер строки с ошибкой, или-1, если поддержка OnError отключена.


ErrorMessage

ErrorMessage()

Синтаксис

Result$ = ErrorMessage([ErrorCode])
Описание
Возвращает сообщение об ошибках для данного ErrorCode кода ошибки на английском языке.

Параметры

Без параметра эта функция возвращает сообщение об ошибке обрабатываемой в настоящее время. 'ErrorCode' может быть определен, чтобы получить сообщение для определенного кода ошибки.


ErrorRegister

ErrorRegister()

Синтаксис

Result = ErrorRegister(Register)
Описание
Возвращает информационное наполнение указанного Register регистра центрального процессора во время ошибки. Эта команда возвращает значимое значение, только если ошибка была обработана OnErrorCall() или OnErrorGoto().

Параметры

Доступные константы регистра, зависят от типа центрального процессора, для которого откомпилирована программа. Доступны следующие значения:

x86:
  #PB_OnError_EAX
  #PB_OnError_EBX
  #PB_OnError_ECX
  #PB_OnError_EDX
  #PB_OnError_EBP
  #PB_OnError_ESI
  #PB_OnError_EDI
  #PB_OnError_ESP
  #PB_OnError_Flags
x64:
  #PB_OnError_RAX
  #PB_OnError_RCX
  #PB_OnError_RDX
  #PB_OnError_RBX
  #PB_OnError_RSP
  #PB_OnError_RBP
  #PB_OnError_RSI
  #PB_OnError_RDI
  #PB_OnError_R8
  #PB_OnError_R9
  ...
  #PB_OnError_R15
  #PB_OnError_Flags
PowerPC:
  #PB_OnError_r0
  #PB_OnError_r1
  #PB_OnError_r2
  ...
  #PB_OnError_r31
  #PB_OnError_cr
  #PB_OnError_xer
  #PB_OnError_lr
  #PB_OnError_ctx


ErrorTargetAddress

ErrorTargetAddress()

Синтаксис

Result = ErrorTargetAddress()
Описание
После сообщения об ошибке, с кодом #PB_OnError_InvalidMemory, эта команда возвращает адрес памяти, который читался/записывался, когда произошла ошибка. Эта команда не имеет никакого значения для других кодов ошибок.


ExamineAssembly

ExamineAssembly()

Синтаксис

Result = ExamineAssembly(*Address [, *EndAddress] )
Описание
Инициализирует дизассемблирование в данном адресе или адресном интервале.

Важно: Дисассемблеры используют команды Udis86 disassembler library чтобы расшифровывать инструкции. Эта библиотека была опубликована под лицензией BSD которая может быть прочитана здесь. Если ExamineAssembly() и связанные команды используются в программе, которая должна быть обнародована, вышеупомянутый текст лицензии должен быть включен в программное обеспечение.

Параметры

*Address адрес первой дизассемблируемой команды. Если *EndAddress будет определен, то дизассемблирование закончится (NextInstruction() возвратится 0), как только будет достигнут *EndAddress. Если *EndAddress не будет определен, то дизассемблирование будет работать, пока не вызовут NextInstruction().

Возвращаемое значение

Возвращает значение, отличное от ноля, если дизассемблирование возможно.

Пример:

  DisableDebugger ; do not disassemble any debugger related instructions

  Code_Start:
    ; Place code to be disassembled here
    a = (Random(100) * 5) + 2000
  Code_End:

  Text$ = "Disassembled code: " + Chr(13)
  If ExamineAssembly(?Code_Start, ?Code_End)
    While NextInstruction()
      Text$ + RSet(Hex(InstructionAddress()), SizeOf(Integer)*2, "0")
      Text$ + " " + InstructionString() + Chr(13)
    Wend
  EndIf

  MessageRequester("Result", Text$)

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


InstructionAddress

InstructionAddress()

Синтаксис

Result = InstructionAddress()
Описание
Возвращает адрес команды, которая дизассемблировалась командой NextInstruction().

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


InstructionString

InstructionString()

Синтаксис

Result$ = InstructionString()
Описание
Возвращает строковое представление машинной команды, которая дизассемблировалась командой NextInstruction().

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


NextInstruction

NextInstruction()

Синтаксис

Result = NextInstruction()
Описание
Дизассемблирует следующую машинную команду после команды ExamineAssembly(). Информация о дизассемблированной машинной команде может быть прочитана командой InstructionString() и InstructionAddress().

Возвращаемое значение

Возвращает значение отличное от нуля, если машинная команда была успешно дизассемблирована. Возвращает нуль, если больше не было никакой машинной команды, чтобы дизассемблировать. (достигли *EndAddress, который был определен в ExamineAssembly())

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


OnErrorCall

OnErrorCall()

Синтаксис

OnErrorCall( @ErrorHandler() )
Описание
Указывает на процедуру которую надо выполнить, если происходит ошибка. Обработчик может отобразить пользователю информацию об ошибке, используя команды этой библиотеки, и сделать любое необходимое действие для завершения приложения. Программа закончится, как только обработчик закончит выполнение.

Параметры

Адрес процедуры в следующей форме:
  Procedure ErrorHandler()

  EndProcedure

Пример:

  Procedure ErrorHandler()
    MessageRequester("OnError test", "The following error happened: " + ErrorMessage())
  EndProcedure

  MessageRequester("OnError test", "Test start")

  OnErrorCall(@ErrorHandler())
  Pokes(10, "Hello World") ; Cause a #PB_OnError_InvalidMemory error

  MessageRequester("OnError test", "This should never be displayed")


OnErrorDefault

OnErrorDefault()

Синтаксис

OnErrorDefault()
Описание
Указывает на действие которое надо выполнить по умолчанию, если происходит ошибка. Обычно показывают окно сообщающее об ошибке и выходят из программы, но можно также указать просто игнорировать некоторые ошибки. Для выхода из программы при любой ошибке, используйте OnErrorExit().

Примечание: Если библиотека OnError используется в dll лучше установить обработчик ошибок в начале каждой функции dll и возвращать его этой командой на параметр по умолчанию.

Пример:

  Procedure ErrorHandler()
    MessageRequester("OnError test", "The following error happened: " + ErrorMessage())
  EndProcedure

  MessageRequester("OnError test", "Test start")

  OnErrorCall(@ErrorHandler())
  OnErrorDefault()         ; Comment this to get the handler call instead of the system error handling
  Pokes(10, "Hello World") ; Cause a #PB_OnError_InvalidMemory error

  MessageRequester("OnError test", "This should never be displayed")


OnErrorExit

OnErrorExit()

Синтаксис

OnErrorExit()
Описание
Прекращает выполнение программы при любой ошибке поддерживаемой библиотекой OnError, хотя программа не заканчивается в месе этой ошибке. Система может вывести окно или сообщение об ошибке в консоли перед выходом.

Чтобы закончить программу незаметно и избежать системного сообщения, используйте OnErrorCall() и завершите программу из проводника.

Пример:

  MessageRequester("OnError test", "Test start")

  OnErrorExit()
  Pokes(10, "Hello World") ; Cause a #PB_OnError_InvalidMemory error

  MessageRequester("OnError test", "This should never be displayed")


OnErrorGoto

OnErrorGoto()

Синтаксис

OnErrorGoto(?LabelAddress)
Описание
Указывает на действие которое надо выполнить, если происходит ошибка, чтобы перейти к указанной метке, и продолжить выполнение программы там. После перехода к метке можно использовать функции этой библиотеки, чтобы получить дополнительную информацию об ошибке.

Примечание: Стек программы не фиксируется пере переходом к метке, таким образом к локальным переменным обратиться будет нельзя, поскольку они больше не могут быть доступными. Также не возможно продолжить нормальное выполнение программы после ошибки, поскольку адрес возврата процедуры может быть неправильными. Лучшая практика, собрать информацию об ошибке и затем выйти из программы.

Параметры

Адрес метки в программе для перехода.

Пример:

  MessageRequester("OnError test", "Test start")

  OnErrorGoto(?ErrorHandler)
  Pokes(10, "Hello World") ; Cause a #PB_OnError_InvalidMemory error

  MessageRequester("OnError test", "This should never be displayed")
  End

  ErrorHandler:
  MessageRequester("OnError test", "The following error happened: " + ErrorMessage())
  End


RaiseError

RaiseError()

Синтаксис

RaiseError(ErrorNumber)
Описание
Искусственно создать данную ошибку, для выполнения соответствующего механизма - требование обработчика ошибок или завершение программы системой (если никакой обработчик не будет установлен). ErrorNumber может быть получен из обработчика ошибок с помощью команды ErrorCode().

Параметры

В среде Windows, может быть использован любой номер ошибки (в том числе определенный пользователем). В Linux и Mac OSX, могут быть указаны только следующие ошибки:
  #PB_OnError_InvalidMemory         : чтение или запись защищенной области
  #PB_OnError_Floatingpoint         : ошибка с плавающей запятой
  #PB_OnError_Breakpoint            : достигнутая контрольная точка Отладчика (контрольные точки non-PureBasic)
  #PB_OnError_IllegalInstruction    : попытка выполнить недопустимую инструкцию
  #PB_OnError_PriviledgedInstruction: попытка выполнить привилегированную инструкцю системы

Пример:

  Procedure ErrorHandler()
    MessageRequester("OnError test", "The following error happened: " + ErrorMessage())
  EndProcedure

  MessageRequester("OnError test", "Test start")

  OnErrorCall(@ErrorHandler())
  RaiseError(#PB_OnError_InvalidMemory)

  MessageRequester("OnError test", "This should never be displayed")


Packer

PureBasic - Packer

Краткий обзор

Библиотека упаковщика обеспечивает, эффективный набор функций, чтобы сжимать / распаковывать данные. Упаковка и распаковка данных основана на отличном алгоритме JCalG1, и интегрированы в PureBasic (не требуется никаких внешних DLL).

Краткий перечень команд

AddPackFile
AddPackMemory
ClosePack
CreatePack
NextPackFile
OpenPack
PackFileSize
PackMemory
PackerCallback
UnpackMemory


AddPackFile

AddPackFile()

Синтаксис

Result = AddPackFile(Filename$ [, CompressionLevel])
Описание
Добавляет и сжимает указанный Filename$ файл в текущий Result ранее созданный командой CreatePack(). Добавление большого файла может занять длительное время с максимальной степенью сжатия, но скорость декомпрессии чрезвычайно высока (почти мгновенно), а коэффициент сжатия на очень хорошем уровне. 'CompressionLevel' является дополнительным параметром, которое может колебаться от 0 (не очень эффективное, но более быстрое сжатие) до 9 (очень медленное, но очень эффективное сжатие). Уровень сжатия по умолчанию 6.


AddPackMemory

AddPackMemory()

Синтаксис

Result = AddPackMemory(MemoryAddress, Length [, CompressionLevel])
Описание
Добавляет и сжимает данные из области памяти MemoryAddress в текущий Result ранее созданный командой CreatePack(). Добавление большого файла может занять длительное время с максимальной степенью сжатия, но скорость декомпрессии чрезвычайно высока (почти мгновенно), а коэффициент сжатия на очень хорошем уровне. 'CompressionLevel' является дополнительным параметром, которое может колебаться от 0 (не очень эффективное, но более быстрое сжатие) до 9 (очень медленное, но очень эффективное сжатие). Уровень сжатия по умолчанию 6.

Пример:

  Dim Tableau(10) ; Table of 11 elements

  ; Filling the table
  For i=0 To 10
    Tableau(i) = i
  Next

  If CreatePack("test.pak")
    ; Add and compresses the data of the table
    AddPackMemory(@Tableau(), SizeOf(Long)*11, 9)
    ClosePack()
  EndIf

  ; Setting the table contents to zero
  For i=0 To 10
    Tableau(i) = 0
  Next

  ; Open the packed file
  If OpenPack("test.pak")
    *Pointeur=NextPackFile() ; Read and decompresses the memory zone
    Taille=PackFileSize()    ; Get the size of the memory zone
    ; Copy the decompressed memory zone to the table
    CopyMemory(*Pointeur, @Tableau(), Taille)
    ClosePack()
  EndIf

  ; Reading the table
  For i=0 To 10
    Debug Tableau(i)
  Next


ClosePack

ClosePack()

Синтаксис

Result = ClosePack()
Описание
Закрывает все архивы, ранее открытые командой OpenPack() или CreatePack() и освобождает используемую память. Поэтому эта команда должна была вызываться только после окончания упаковки и(или) распаковки.

Примечание: все открытые файлы упаковки автоматически закрываются, когда программа заканчивается.


CreatePack

CreatePack()

Синтаксис

Result = CreatePack(Filename$)
Описание
Создает новый пустой файл (архив) Filename$. Если результат Result равен 0, то файл (архив) не будет создан. Следующие функции могут быть использованы для добавления данных в пакет файла:

AddPackFile(): Добавляет и сжимает файл.
AddPackMemory(): Добавляет и сжимает зону памяти.

После того как все операции записи были завершены нужно вызвать ClosePack() . Примечание: PureBasic автоматически закрывает все открытые пакеты, когда программа завершает работу.
  ; Create the packed file...
  CreatePack("mycompressedfiles.pak")
    ; add your files
    AddPackFile("Image1.bmp")
    AddPackFile("Image2.bmp")
    AddPackFile("mywave1.wav")
    AddPackFile("mywave2.wav")
  ClosePack()


NextPackFile

NextPackFile()

Синтаксис

MemoryAddress = NextPackFile()
Описание
Читает и распаковывает следующий файл, находящийся в текущем пакете, ранее открытом командой OpenPack(). Адрес памяти MemoryAddress никогда не должен освобождаться программистом. Чтобы узнать размер необходимой памяти (то есть: размер распакованного файла), используйте команду PackFileSize().


OpenPack

OpenPack()

Синтаксис

Result = OpenPack(Filename$)
Описание
Открывает файл Filename$, ранее созданный командой CreatePack(). Если 'Result' =0, то файл не может быть открыт. NextPackFile() используется, чтобы получить данные из файла.

После того как все операции записи были завершены нужно вызвать ClosePack(). Примечание: PureBasic автоматически закрывает все открытые пакеты, когда программа завершает работу.
  ; Loading the packed files back to memory...
  OpenPack("mycompressedfiles.pak")
    CatchSprite(0,NextPackFile())   ; InitSprite must be called before in your program...
    CatchSprite(1,NextPackFile())   ; ...first file will be loaded as Sprite 0, second as Sprite 1
    CatchSound(0,NextPackFile())    ; InitSound must be called before in your program...
    CatchSound(1,NextPackFile())    ; ...first file will be loaded as Sound 0, second as Sound 1
  ClosePack()


PackFileSize

PackFileSize()

Синтаксис

Size = PackFileSize()
Описание
Возвращает размер файла, который будет распакован после вызова команды NextPackFile().


PackMemory

PackMemory()

Синтаксис

Result = PackMemory(SourceMemoryID, DestinationMemoryID, SourceLength [, CompressionLevel])
Описание
Сжимает содержимое области памяти SourceMemoryID в область памяти DestinationMemoryID.DestinationMemoryID должна иметь длину, по меньшей мере равное длине SourceMemoryID + 8. Если результат равен 0, то сжатие не может быть произведено (или файл не сжимаемый этим алгоритмом), в противном случае она содержит сжатый размер целевой области памяти. Сжатые данные могут быть распакованы командой UnpackMemory(). Для опытных программистов, обратного вызова можно добавить к контролю за ходом сжатия PackerCallback(). Область памяти, может быть выделена с помощью команды AllocateMemory(). 'CompressionLevel' является дополнительным параметром, которое может колебаться от 0 (не очень эффективное, но более быстрое сжатие) до 9 (очень медленное, но очень эффективное сжатие).

Примечание: Алгоритм сжатия немного медленный, но дает очень хорошие результаты (лучше, чем формат ZIP). И распаковка идет удивительно быстро (намного быстрее ZIP).


PackerCallback

PackerCallback()

Синтаксис

PackerCallback(@Procedure())
Описание
Добавляет процедуру обратного вызова (точку возврата) для сжатия данных. Так как сжатие может занять значительное время, то эту процедуру можно вызывать через регулярные промежутки времени, чтобы следить за ходом сжатия. Время между двумя вызовами не может быть определено пользователем, оно будет рассчитываться автоматически. Эта функция предназначена для использования опытных программистов.

Процедура обратного вызова должна иметь следующий вид:

Procedure CompressCallback(SourcePosition, DestinationPosition)

EndProcedure

SourcePosition: Фактическое положение, в байтах, в буфере источников (без сжатия)
DestinationPosition: Фактическое положение, в байтах, в буфере назначения (сжатый)

Чтобы продолжить сжатие, процедура должна вернуть 1. Чтобы отменить его, возвращает 0.


UnpackMemory

UnpackMemory()

Синтаксис

Result = UnpackMemory(SourceMemoryID, DestinationMemoryID)
Описание
Распаковывает ранее сжатый командой PackMemory() участок памяти SourceMemoryID, в участок памяти DestinationMemoryID. Если Result равняется 0, то данные не могут быть распакованы (повреждены или имеют недопустимый формат), иначе размер распакованных данных возвращается как 'Result'.

UnpackMemory() ожидает правильно сжатые данные, так как функция не осуществляет проверки (по причинам производительности). Если вы извлекаете данные, которые не заслуживают доверия, вы должны сначала их проверить на пример MD5().

Примечание: декомпрессия происходит очень быстро, в отличие от сжатия.


Palette

PureBasic - Palette

Краткий обзор

Палитры могут использоваться только в режимах экрана с 256 цветами (или менее) и позволяют переопределять отображаемые цвета. Можно назначить каждому цвету (индексируемому от 0 до 255) заданный цвет RGB, выбранный из 24-битной палитры (16 миллионов цветов). Преимущество огромное, так как все пиксели данного цвета можно перекрасить в другой цвет всего лишь изменением назначенного цвета. Это позволяет делать очень быстрый сдвиг палитры (palette cycling), проявление (fade-in), угасание (fade-out) и другие хорошо известные эффекты.

Таблица с основными цветами находится здесь.

Краткий перечень команд

CreatePalette
DisplayPalette
FreePalette
GetPaletteColor
InitPalette
IsPalette
LoadPalette
SetPaletteColor

Поддерживаемые ОС

Windows, Linux


CreatePalette

CreatePalette()

Синтаксис

Result = CreatePalette(#Palette)
Описание
Создать новую пустую 256-цветную палитру. Если для параметра '#Palette' задано значение #PB_Any, в 'Result' возвращается новый номер палитры. Палитра инициализируется цветом 0. Если значение 'Result' равно 0, создать палитру #Palette не удалось. Предыдущий объект палитры #Palette автоматически удаляется.

Поддерживаемые ОС

Windows, Linux


DisplayPalette

DisplayPalette()

Синтаксис

DisplayPalette(#Palette)
Описание
Отобразить данную палитру #Palette, ранее созданную с помощью функции CreatePalette() или LoadPalette() на текущем экране.

Поддерживаемые ОС

Windows, Linux


FreePalette

FreePalette()

Синтаксис

FreePalette(#Palette)
Описание
Освободить память, занятую указанной палитрой #Palette.

Примечание: все оставшиеся палитры автоматически освобождаются по окончании работы программы.

Поддерживаемые ОС

Windows, Linux


GetPaletteColor

GetPaletteColor()

Синтаксис

Color = GetPaletteColor(#Palette, Index)
Описание
Извлекает цвет RGB по данному индексу из палитры #Palette. Чтобы получить Красный, Зелёный и Синий компоненты цвета, воспользуйтесь функциями Red(), Green() и Blue().

Поддерживаемые ОС

Windows, Linux


InitPalette

InitPalette()

Синтаксис

Result = InitPalette()
Описание
Инициализирует работу с палитрами для последующего использования. Вы должны поместить эту функцию перед любыми другими функциями работающими с палитрами. Если значение 'Result' равно 0, то не удалось инициализировать библиотеку, поэтому функции работы с палитрами использовать невозможно. Если в Windows не удалось инициализировать библиотеку, то это вероятно из-за того, что не найден DirectX 7 (или DirectX 3, совместимый с NT4.0).

Поддерживаемые ОС

Windows, Linux


IsPalette

IsPalette()

Синтаксис

Result = IsPalette(#Palette)
Описание
Проверяет, соответствует ли заданный номер палитры #Palette корректному и правильно инициализированному объекту палитры. Эта функция абсолютно надёжна, ей можно передать любое значение. Если значение 'Result' не ноль, значит объект палитры корректен и инициализирован, иначе функция вернёт ноль. Это корректный способ убедиться, что палитра готова к использованию.

Поддерживаемые ОС

Windows, Linux


LoadPalette

LoadPalette()

Синтаксис

Result = LoadPalette(#Palette, Filename$)
Описание
Загрузить палитру из стандартного файла BMP (только 256-цветные картинки). Если в качестве параметра '#Palette' использовать #PB_Any, в 'Result' возвращается номер палитры установленный РВ. Палитра инициализируется значениями, найденными в файле. Если палитра загружена корректно, значение 'Result' не равно 0, иначе произошла ошибка. Предыдущий объект палитры #Palette автоматически удаляется.

Поддерживаемые ОС

Windows, Linux


SetPaletteColor

SetPaletteColor()

Синтаксис

SetPaletteColor(#Palette, Index, Color)
Описание
Изменяет цвет RGB по данному индексу в палитре #Palette. Чтобы получить корректное значение цвета RGB, воспользуйтесь функцией RGB() или следующей формулой (быстрее):

RGBColorValue = Red + Green << 8 + Blue << 16

Поддерживаемые ОС

Windows, Linux


Palette

PureBasic - Particle

Краткий обзор

Particles systems are widely used in the 3D scenes to simulate hard to predict events, like the rain, fire, explosions etc. PureBasic allows to create any number of particle emitters as needed which are running in an autonomous manner. Each emitter has its own shape, and its own properties like the velocity, speed, emission rate and more.

InitEngine3D() should be called successfully before using any of the Particle functions.

Краткий перечень команд

CreateParticleEmitter
FreeParticleEmitter
HideParticleEmitter
IsParticleEmitter
MoveParticleEmitter
ParticleColorFader
ParticleColorRange
ParticleEmissionRate
ParticleEmitterDirection
ParticleEmitterID
ParticleEmitterLocate
ParticleEmitterX
ParticleEmitterY
ParticleEmitterZ
ParticleMaterial
ParticleSize
ParticleTimeToLive
ParticleVelocity
ResizeParticleEmitter


CreateParticleEmitter

CreateParticleEmitter()

Синтаксис

Result = CreateParticleEmitter(#ParticleEmitter, Width, Height, Depth, Type, [, x, y, z])
Описание
Creates a new empty #ParticleEmitter of the given width, height and depth (respectively x,y and z dimension). If #PB_Any is used as '#ParticleEmitter' parameter, the new particle emitter number will be returned as 'Result'.

The default size of the future Particles can be specified with the ParticleSize() function. The optionals x,y,z parameters can be specified to set the position of the newly created emitter in the world. If the 'Result' is 0, the #ParticleEmitter can't be created. If the #ParticleEmitter was already created, it is automatically freed and replaced by the new one.

The 'Type' parameter can be one of the following value:
  #PB_Particle_Point: The emitter is a single point
  #PB_Particle_Box  : The emitter is a box, with an width, height and depth


FreeParticleEmitter

FreeParticleEmitter()

Синтаксис

FreeParticleEmitter(#ParticleEmitter)
Описание
Free the specified #ParticleEmitter. All its associated memory is released and this object can't be used anymore.

Note: all remaining particle emitters are automatically freed when the program ends.


HideParticleEmitter

HideParticleEmitter()

Синтаксис

HideParticleEmitter(#ParticleEmitter, State)
Описание
Hides or Shows the specified #ParticleEmitter. 'State' can take the following values:
  1: the #ParticleEmitter is hidden
  0: the #ParticleEmitter is shown


IsParticleEmitter

IsParticleEmitter()

Синтаксис

Result = IsParticleEmitter(#ParticleEmitter)
Описание
Tests if the given #ParticleEmitter is a valid and correctly initialized particle emitter.

This function is bullet-proof and can be used with any value. If the 'Result' is not zero then the object is valid and initialized, else it returns zero. This is the correct way to ensure that a particle emitter is ready to use.


MoveParticleEmitter

MoveParticleEmitter()

Синтаксис

MoveParticleEmitter(#ParticleEmitter, x, y, z)
Описание
Moves the #ParticleEmitter in the world according to the specified x,y,z values. This is a relative move based on the previous #ParticleEmitter location. To perform an absolute move in the world, use ParticleEmitterLocate().


ParticleColorFader

ParticleColorFader()

Синтаксис

ParticleColorFader(#ParticleEmitter, RedRate, GreenRate, BlueRate)
Описание
Changes the particles color fader rate (In world time unit).


ParticleColorRange

ParticleColorRange()

Синтаксис

ParticleColorRange(#ParticleEmitter, StartColor, EndColor)
Описание
Changes the particles color range for the #ParticleEmitter. Every emitted particle will get a random value, within the 'StartColor' and 'EndColor' range. The 'StartColor' and 'EndColor' parameters are regular RGB values. RGB() can be used to get a valid color value.


ParticleEmissionRate

ParticleEmissionRate()

Синтаксис

ParticleEmissionRate(#ParticleEmitter, Rate)
Описание
Change the #ParticleEmitter emission rate, in particles per second.


ParticleEmitterDirection

ParticleEmitterDirection()

Синтаксис

ParticleEmitterDirection(#ParticleEmitter, x, y, z)
Описание
Changes the direction of the #ParticleEmitter according to the specified x,y,z values.


ParticleEmitterID

ParticleEmitterID()

Синтаксис

ParticleEmitterID = ParticleEmitterID(#ParticleEmitter)
Описание
Returns the unique ID which identifies the given '#ParticleEmitter' in the operating system. This function is very useful when another library needs a particle emitter reference.


ParticleEmitterLocate

ParticleEmitterLocate()

Синтаксис

ParticleEmitterLocate(#ParticleEmitter, x, y, z)
Описание
Changes the #ParticleEmitter absolute position in the world.


ParticleEmitterX

ParticleEmitterX()

Синтаксис

Result = ParticleEmitterX(#ParticleEmitter)
Описание
Returns the #ParticleEmitter X absolute position in the world.


ParticleEmitterY

ParticleEmitterY()

Синтаксис

Result = ParticleEmitterY(#ParticleEmitter)
Описание
Returns the #ParticleEmitter Y absolute position in the world.


ParticleEmitterZ

ParticleEmitterZ()

Синтаксис

Result = ParticleEmitterZ(#ParticleEmitter)
Описание
Returns the #ParticleEmitter Z absolute position in the world.


ParticleMaterial

ParticleMaterial()

Синтаксис

ParticleMaterial(#ParticleEmitter, MaterialID)
Описание
Assigns a material to the specified #ParticleEmitter. This material will be used by all the Particles of this emitter. An emitter can only have one material assigned at once. A valid 'MaterialID' can be easily obtained with the MaterialID() function.


ParticleSize

ParticleSize()

Синтаксис

ParticleSize(#ParticleEmitter, Width, Height)
Описание
Change the particles dimensions. Particles are 2D planes (billboards) which always face the camera. All particles in an emitter always have the same size.


ParticleTimeToLive

ParticleTimeToLive()

Синтаксис

ParticleTimeToLive(#ParticleEmitter, MininumTime, MaximumTime)
Описание
Change the particles time to live for the #ParticleEmitter. Every particle will live at least 'MinimumTime' and at most the 'MaximumTime' (in world time unit). A random value, within this range, will be used by every particle emitted.


ParticleVelocity

ParticleVelocity()

Синтаксис

ParticleVelocity(#ParticleEmitter, Minimum, Maximum)
Описание
Changes the particles velocity. A random velocity value, picked in the 'Minimum' and 'Maximum' range, will be used by every particle emitted.


ResizeParticleEmitter

ResizeParticleEmitter()

Синтаксис

ResizeParticleEmitter(#Particle, #ParticleEmitter, Width, Height, Depth)
Описание
Resizes the #Particle to the new specified 'Width', 'Height' and 'Depth' dimension, in world metrics.


Preference

PureBasic - Preference

Краткий обзор

Привилегированный файл, содержит определяемые пользователем параметры программы. Он хранится на диске и загружается каждый раз при запуске программы (например 'файл.INI' в Windows ). PureBasic дает возможность создать привилегированный файл, используемый на любом компьютере (на различных платформах). Формат файла по умолчанию сохраняется в ASCII. Используя синтаксис одной строки 'ключ = значение'. Для удобства чтения, могут быть созданы группы.

Компиляция в режиме unicode modus вынуждает PureBasic сохранять строки в привилегированном файле в формате UTF-8 format.

Краткий перечень команд

ClosePreferences
CreatePreferences
ExaminePreferenceGroups
ExaminePreferenceKeys
NextPreferenceGroup
NextPreferenceKey
OpenPreferences
PreferenceComment
PreferenceGroup
PreferenceGroupName
PreferenceKeyName
PreferenceKeyValue
ReadPreferenceDouble
ReadPreferenceFloat
ReadPreferenceInteger
ReadPreferenceLong
ReadPreferenceQuad
ReadPreferenceString
RemovePreferenceGroup
RemovePreferenceKey
WritePreferenceDouble
WritePreferenceFloat
WritePreferenceInteger
WritePreferenceLong
WritePreferenceQuad
WritePreferenceString


ClosePreferences

ClosePreferences()

Синтаксис

ClosePreferences()
Описание
Закрывает файл, открытый с помощью OpenPreferences() или созданный CreatePreferences().


CreatePreferences

CreatePreferences()

Синтаксис

Result = CreatePreferences(Filename$)
Описание
Создает файл Filename$, нулевой длинны. Если файл существует, он будет заменен на новый. Если файл не создан, в 'Result' вернется 0. После создания файла можно использовать функции подобные WritePreferenceString() для создания записей. После создания записей в preference файле, можно использовать функции подобные ReadPreferenceString(). Для удаления ключа или группы используйте функции RemovePreferenceKey() и RemovePreferenceGroup(). Для создания или изменения текущей группы используйте функцию PreferenceGroup().

После выполнения всех операций с записью данных, примените ClosePreferences() , это позволит записать все данные на винчестер.


ExaminePreferenceGroups

ExaminePreferenceGroups()

Синтаксис

Result = ExaminePreferenceGroups()
Описание
Перечисляет все группы найденные в текущем файле. Функция NextPreferenceGroup() перечисляет всю найденные группы. Если функция не может запустить перечисление, в 'Result' вернется 0.


ExaminePreferenceKeys

ExaminePreferenceKeys()

Синтаксис

Result = ExaminePreferenceKeys()
Описание
Находит все ключи в текущей группе в указанном preference файле. Текущую группу можно выбрать с помощью PreferenceGroup() или просканировать все группы с помощью функции ExaminePreferenceGroups(). Функция NextPreferenceKey() применяется для обнаружения всех ключей. Если функция не может начать сканирование, в 'Result' вернется 0.


NextPreferenceGroup

NextPreferenceGroup()

Синтаксис

Result = NextPreferenceGroup()
Описание
Получает информацию о следующей группе обнаруженной при сканировании, с помощью функции ExaminePreferenceGroups(). Для получения названия группы, используйте функцию PreferenceGroupName(). Текущая исследуемая preference группа будет также использоваться, когда значения будут прочитаны из preferences или когда ключи сканируются функцией ExaminePreferenceKeys(). Если больше не найдено групп, то в 'Result' вернется 0,.


NextPreferenceKey

NextPreferenceKey()

Синтаксис

Result = NextPreferenceKey()
Описание
Получает информацию о следующем ключе, найденном функцией ExaminePreferenceKeys(). Для получения имени и значения ключа, используйте функции PreferenceKeyName() и PreferenceKeyValue(). Если ключей больше не найдено, то в 'Result' вернется 0.


OpenPreferences

OpenPreferences()

Синтаксис

Result = OpenPreferences(Filename$)
Описание
Открывает ранее созданный файл Filename$. Если в 'Result' возвращается 0, значит файл невозможно открыть или он не обнаружен. Однако, если файл не был найден, программист может все еще использовать функции чтения, и он сможет всегда вернуть значение по умолчанию. Функции подобные ReadPreferenceString() используются для чтения сохраненных в preference файлах данных.

Для удаления ключей и групп, используйте функции RemovePreferenceKey() и RemovePreferenceGroup(). Для создания или изменения используйте функцию PreferenceGroup(). Для изменения существующих значений используйте функции подобные WritePreferenceString().

После выполнения всех операций с записью данных примените ClosePreferences(), это позволит записать все данные на винчестер.


PreferenceComment

PreferenceComment()

Синтаксис

PreferenceComment(Text$)
Описание
Создает новую строку комментариев Text$ в preference файле.


PreferenceGroup

PreferenceGroup()

Синтаксис

Result = PreferenceGroup(Name$)
Описание
Создает новую группу Name$ или изменяет существующую группу в preference файле. Все операции чтения или записи будут ограничиваться этой группой. Чтобы покинуть группу может использоваться, пустое имя Name$. Функция возвращает 1, если группа существует и 0 если нет.

Если группа не существует, она будет создана при записи первого ключа. Это позволяет не создавать функцией PreferenceGroup() много пустых групп.


PreferenceGroupName

PreferenceGroupName()

Синтаксис

Group$ = PreferenceGroupName()
Описание
Возвращает имя текущей группы, которая перечисляется с помощью функции ExaminePreferenceGroups().


PreferenceKeyName

PreferenceKeyName()

Синтаксис

Key$ = PreferenceKeyName()
Описание
Возвращает имя текущего ключа, перечисляемое функцией ExaminePreferenceKeys(). Для получения заначения ключа, используйте PreferenceKeyValue().


PreferenceKeyValue

PreferenceKeyValue()

Синтаксис

Value$ = PreferenceKeyValue()
Описание
Возвращает значение ключа, в виде строки перечисляемой с помощью функции ExaminePreferenceKeys(). Для получения имени ключа используйте функцию PreferenceKeyName().


ReadPreferenceDouble

ReadPreferenceDouble()

Синтаксис

Result.d = ReadPreferenceDouble(Keyword$, DefaultValue)
Описание
Поиск и чтение указанного значения ключа 'Keyword$'. Если использовалась функция PreferenceGroup(), то поиск ограничивается текущей группой. Если 'Keyword$' не найден или preference файл не был открыт (например, отсутствие файла), будет возвращено указанное значение по умолчанию.


ReadPreferenceFloat

ReadPreferenceFloat()

Синтаксис

Result.f = ReadPreferenceFloat(Keyword$, DefaultValue)
Описание
Поиск и чтение указанного значения ключа 'Keyword$'. Если использовалась функция PreferenceGroup(), то поиск ограничивается текущей группой. Если 'Keyword$' не найден или preference файл не был открыт (например, отсутствие файла), будет возвращено указанное значение по умолчанию.


ReadPreferenceInteger

ReadPreferenceInteger()

Синтаксис

Result = ReadPreferenceInteger(Keyword$, DefaultValue)
Описание
Поиск и чтение указанного значения ключа 'Keyword$'. Если использовалась функция PreferenceGroup(), то поиск ограничивается текущей группой. Если 'Keyword$' не найден или preference файл не был открыт (например, отсутствие файла), будет возвращено указанное значение по умолчанию.


ReadPreferenceLong

ReadPreferenceLong()

Синтаксис

Result = ReadPreferenceLong(Keyword$, DefaultValue)
Описание
Поиск и чтение указанного значения ключа 'Keyword$'. Если использовалась функция PreferenceGroup(), то поиск ограничивается текущей группой. Если 'Keyword$' не найден или preference файл не был открыт (например, отсутствие файла), будет возвращено указанное значение по умолчанию.


ReadPreferenceQuad

ReadPreferenceQuad()

Синтаксис

Result.q = ReadPreferenceQuad(Keyword$, DefaultValue)
Описание
Поиск и чтение указанного значения ключа 'Keyword$'. Если использовалась функция PreferenceGroup(), то поиск ограничивается текущей группой. Если 'Keyword$' не найден или preference файл не был открыт (например, отсутствие файла), будет возвращено указанное значение по умолчанию.


ReadPreferenceString

ReadPreferenceString()

Синтаксис

Result$ = ReadPreferenceString(Keyword$, DefaultValue)
Описание
Поиск и чтение указанного значения ключа 'Keyword$'. Если использовалась функция PreferenceGroup(), то поиск ограничивается текущей группой. Если 'Keyword$' не найден или preference файл не был открыт (например, отсутствие файла), будет возвращено указанное значение по умолчанию.

Для чтения значений ключей непосредственно как типы переменных, используйте следующие функции:

ReadPreferenceDouble()
ReadPreferenceFloat()
ReadPreferenceLong()
ReadPreferenceQuad()


RemovePreferenceGroup

RemovePreferenceGroup()

Синтаксис

RemovePreferenceGroup(Group$)
Описание
Удаляет указанную 'Group$' и все ключи.


RemovePreferenceKey

RemovePreferenceKey()

Синтаксис

RemovePreferenceKey(Key$)
Описание
Удаляет указанный 'Key$' и все его значения.


WritePreferenceDouble

WritePreferenceDouble()

Синтаксис

WritePreferenceDouble(Keyword$, Value.d)
Описание
Создает указанный 'Keyword$' и его значение в виде: 'Keyword$ = Value' и создает запись в preference файле, созданном ранее CreatePreferences() или открытым с помощью функции OpenPreferences(). Если ключ уже существует, он будет переписан.


WritePreferenceFloat

WritePreferenceFloat()

Синтаксис

WritePreferenceFloat(Keyword$, Value.f)
Описание
Создает указанный 'Keyword$' и его значение в виде: 'Keyword$ = Value' и создает запись в preference файле, созданном ранее CreatePreferences() или открытым с помощью функции OpenPreferences(). Если ключ уже существует, он будет переписан.


WritePreferenceInteger

WritePreferenceInteger()

Синтаксис

WritePreferenceInteger(Keyword$, Value)
Описание
Создает указанный 'Keyword$' и его значение в виде: 'Keyword$ = Value' и создает запись в preference файле, созданном ранее CreatePreferences() или открытым с помощью функции OpenPreferences(). Если ключ уже существует, он будет переписан.


WritePreferenceLong

WritePreferenceLong()

Синтаксис

WritePreferenceLong(Keyword$, Value)
Описание
Создает указанный 'Keyword$' и его значение в виде: 'Keyword$ = Value' и создает запись в preference файле, созданном ранее CreatePreferences() или открытым с помощью функции OpenPreferences(). Если ключ уже существует, он будет переписан.


WritePreferenceQuad

WritePreferenceQuad()

Синтаксис

WritePreferenceQuad(Keyword$, Value.q)
Описание
Создает указанный 'Keyword$' и его значение в виде: 'Keyword$ = Value' и создает запись в preference файле, созданном ранее CreatePreferences() или открытым с помощью функции OpenPreferences(). Если ключ уже существует, он будет переписан.


WritePreferenceString

WritePreferenceString()

Синтаксис

WritePreferenceString(Keyword$, Value$)
Описание
Создает указанный 'Keyword$' и его значение в виде: 'Keyword$ = Value' и создает запись в preference файле, созданном ранее CreatePreferences() или открытым с помощью функции OpenPreferences(). Если ключ уже существует, он будет переписан.

Для записи значений ключа непосредственно из числовых переменных используйте следующие функции:

WritePreferenceDouble()
WritePreferenceFloat()
WritePreferenceLong()
WritePreferenceQuad()


Printer

PureBasic - Printer

Краткий обзор

Принтеры необходимы чтобы выводить цифровую информацию на бумагу. Большая часть программных продуктов требует вывода на печать информации, чтобы быть полностью эффективными. Purebasic позволяет печатать любой вид данных от необработанных текстов до изображений, с любой разрешающей способностью.

Краткий перечень команд

DefaultPrinter
NewPrinterPage
PrintRequester
PrinterOutput
PrinterPageHeight
PrinterPageWidth
StartPrinting
StopPrinting


DefaultPrinter

DefaultPrinter()

Синтаксис

Result = DefaultPrinter()
Описание
Выбирает текущий принтер как актуальный для операций печати. Эта команда должна вызываться перед любыми другими командами принтера. Если 'Result' = 0, то нет доступных принтеров. Как только DefaultPrinter() будет успешно вызван, StartPrinting() можно использовать чтобы начать печатать.


NewPrinterPage

NewPrinterPage()

Синтаксис

NewPrinterPage()
Описание
Создает новую пустую страницу. Предыдущая страница посылается на принтер и не может быть изменена. Эта команда должна вызываться внутри блока StartDrawing()/StopDrawing().

Пример:

  If PrintRequester()
    If StartPrinting("Two sheets")
      If StartDrawing(PrinterOutput())
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(10, 10, "First page !", RGB(0, 0, 0))

        ; Tell the printer to start a new page
        NewPrinterPage()

        DrawText(10, 10, "Second page !", RGB(0, 0, 0))

        StopDrawing()
      EndIf

      StopPrinting()
    EndIf
  EndIf


PrintRequester

PrintRequester()

Синтаксис

Result = PrintRequester()
Описание
Открывает диалоговое окно для выбора принтера и настройки параметров. Эта команда должна вызываться перед любыми другими командами принтера. Если 'Result' = 0, принтер не доступен или пользователь закрыл диалоговое окно. Как только PrintRequester() будет успешно вызван, StartPrinting() можно использовать чтобы начать печатать.


PrinterOutput

PrinterOutput()

Синтаксис

OutputID = PrinterOutput()
Описание
Возвращает идентификатор OutputID текущего принтера который надо использовать с командой StartDrawing(). Все команды библиотеки 2DDrawing доступны и могут использоваться для печати. Принтер рассматривается как пустой лист бумаги, также, как окно или изображение.


PrinterPageHeight

PrinterPageHeight()

Синтаксис

Result = PrinterPageHeight()
Описание
Возвращает высоту участка рисунка, в пикселах. Значение варьируется в зависимости от разрешения dpi (точек на дюйм) принтера. Это означает, что документ отпечатанный при 75 dpi, в 4 раза меньше, чем отпечатанный при 150 dpi.

Примечание: Возвращаемое значение представляет собой аппаратно ширину, доступную для печати, не включая полей принтеров которые нельзя изменить.


PrinterPageWidth

PrinterPageWidth()

Синтаксис

Result = PrinterPageWidth()
Описание
Возвращает ширину участка рисунка, в пикселах. Значение варьируется в зависимости от разрешения dpi (точек на дюйм) принтера. Это означает, что документ отпечатанный при 75 dpi, в 4 раза меньше, чем отпечатанный при 150 dpi.

Примечание: Возвращаемое значение представляет собой аппаратно ширину, доступную для печати, не включая полей принтеров которые нельзя изменить.


StartPrinting

StartPrinting()

Синтаксис

Result = StartPrinting(JobName$)
Описание
Инициализирует принтер и запускает операцию печати. The JobName$ имя, которое появится в диспетчере очереди печати и которое идентифицирует задачу печати. Если 'Result' is 0, то операция печати не смогла запуститься.


Pure Basic Reference Manual

StopPrinting()

Синтаксис

StopPrinting()
Описание
Останавливает все операции печати, и посылает эти данные на принтер.


Process

PureBasic - Process

Краткий обзор

Библиотека процесс позволяет получать информацию о текущей программе, а так же запускать другие программы и общаться с ними. Она предлагает независимый от платформы доступ к блоку среды программы, к параметрам программны, а также к стандартному вводу и выводу данных.

Краткий перечень команд

AvailableProgramOutput
CloseProgram
CountProgramParameters
EnvironmentVariableName
EnvironmentVariableValue
ExamineEnvironmentVariables
GetEnvironmentVariable
IsProgram
KillProgram
NextEnvironmentVariable
ProgramExitCode
ProgramFilename
ProgramID
ProgramParameter
ProgramRunning
ReadProgramData
ReadProgramError
ReadProgramString
RemoveEnvironmentVariable
RunProgram
SetEnvironmentVariable
WaitProgram
WriteProgramData
WriteProgramString
WriteProgramStringN


AvailableProgramOutput

AvailableProgramOutput()

Синтаксис

Result = AvailableProgramOutput(Program)
Описание
Возвращает количество байт, доступных для чтения, после запуска программы. Программа должна быть запущена командой RunProgram() используя параметр #PB_Program_Read.

Вывод может быть прочитана командами ReadProgramString() или ReadProgramData().


CloseProgram

CloseProgram()

Синтаксис

CloseProgram(Program)
Описание
Закрывает соединение с указанной программой Program (начатую RunProgram()) и освобождает все данные связанные с ней.

Примечание: Это не заканчивает программу, а только закрывает подключение к ней. Чтобы закончить программу, вызовите KillProgram(). Даже если программа завершилась нормально, эта команда должна вызываться для правильного освобождения всех данных.

Если программа была запущена с параметром #PB_Program_Write, CloseProgram() пошлет сигнал EOF (конец файла) данной программе. Этот сигнал может быть искусственно спровоцирован, не закрывая подключения с программой, вызвав WriteProgramData() со специальным значением #PB_Program_Eof.


CountProgramParameters

CountProgramParameters()

Синтаксис

Result = CountProgramParameters()
Описание
Возвращает число параметров, которые были переданы в программу PureBasic через командную строку (или RunProgram()).

ProgramParameter() может использоваться для чтения каждого параметра.


EnvironmentVariableName

EnvironmentVariableName()

Синтаксис

Result$ = EnvironmentVariableName()
Описание
Эта команда должна вызываться после ExamineEnvironmentVariables() и NextEnvironmentVariable().

Она возвращает имя текущей переменной. Для получения значения этой переменной, используйте EnvironmentVariableValue().


EnvironmentVariableValue

EnvironmentVariableValue()

Синтаксис

Result$ = EnvironmentVariableValue()
Описание
Эта команда должна вызываться после ExamineEnvironmentVariables() и NextEnvironmentVariable().

Она возвращает значение текущей переменной. Для получения имени этой переменной, используйте EnvironmentVariableName() .


ExamineEnvironmentVariables

ExamineEnvironmentVariables()

Синтаксис

Result = ExamineEnvironmentVariables()
Описание
Инициализирует список переменных окружения, которые может получить программа PureBasic. Если список переменных в блоке не может быть прочитан, то 'Result' = 0.

Командами NextEnvironmentVariable(), EnvironmentVariableName() и EnvironmentVariableValue() можно получить информацию о каждой переменной.

Пример:
  ; Will output all environment variables of the program
  ;
  OpenConsole()
  If ExamineEnvironmentVariables()
    While NextEnvironmentVariable()
      PrintN(EnvironmentVariableName() + " = " + EnvironmentVariableValue())
    Wend
  EndIf
  PrintN("")
  PrintN("Press Enter to quit.")
  Input()


GetEnvironmentVariable

GetEnvironmentVariable()

Синтаксис

Result$ = GetEnvironmentVariable(Name$)
Описание
Возвращает содержание указанной переменной из блока программы. если переменная величина не существует, то возвращается пустая строка.

Пример:
  ; Prints the content of the "PATH" environment variable
  ;
  OpenConsole()
  PrintN(GetEnvironmentVariable("PATH"))
  PrintN("")
  PrintN("Press Enter to quit.")
  Input()


IsProgram

IsProgram()

Синтаксис

Result = IsProgram(Program)
Описание
Проверяет, является ли правильно инициализированным номер указанной 'Program' ранее запущенной командой RunProgram(). Эта функция является "пуленепробиваемые" и может быть использована с любым значением. Если 'Result' не равен нулю, то этот объект является действительным. Это функция позволяет убедиться, что объект правильно инициализирован.


KillProgram

KillProgram()

Синтаксис

KillProgram(Program)
Описание
Немедленно прекращает выполнение указанной программы (ранее начатую RunProgram()).

Примечание: Эта команда завершает программу, но она не закрывает соединение с программой. CloseProgram() всегда должна быть вызвана, для того, чтобы высвободить ресурсы, связанные с программой.


NextEnvironmentVariable

NextEnvironmentVariable()

Синтаксис

Result = NextEnvironmentVariable()
Описание
Эта функция должна вызываться после ExamineEnvironmentVariables(). Она идет шаг за шагом, по переменным программы и возвращает ноль, когда нет переменных ля чтения.

Используйте EnvironmentVariableName() и EnvironmentVariableValue(), чтобы определить название и содержание текущей переменной.


ProgramExitCode

ProgramExitCode()

Синтаксис

Result = ProgramExitCode(Program)
Описание
Возвращает exitcode, после завершения программы. Данная 'Program' должна быть запущена командой RunProgram().

Эта команда должна использоваться, только после того, как указанная программа закончилась. Команды ProgramRunning() или WaitProgram() позволяют сделать эту проверку.

Еxitcode позволяет вернуть одно значение из указанной программы, программе которая её запустила. Это обычно используется, чтобы определить ошибку или успешное завершение программы.

Чтобы вернуть ExitCode из программы PB, используйте дополнительное значение с командой End:
  End 1   ; returns the exitcode 1


ProgramFilename

ProgramFilename()

Синтаксис

Result$ = ProgramFilename()
Описание
Возвращает полный путь и имя файла работающей программы. Это может использоваться, чтобы узнать, где программа была установлена или как называется программа. GetPathPart() или GetFilePart() может использоваться, чтобы получить только путь или имя.

Если эта команда используется для Dll, она возвращает имя и путь к DLL, а не имя и путь основной программы, которая загрузила DLL.


ProgramID

ProgramID()

Синтаксис

Result = ProgramID(Program)
Описание
Возвращает уникальный системный идентификатор данной программы (запущенной RunProgram()). Это так называемый идентификатор процесса "Process ID".

Если идентификатор не может быть возвращен, то Result = -1.Это происходит, когда RunProgram() используется для открытия файлов, таких как RunProgram("Source.pb").

Примечание: возвращаемое значение не является handle (как в большинстве других командах ...ID()). Чтобы получить handle процесса, можно использовать OpenProcess_() Api.


ProgramParameter

ProgramParameter()

Синтаксис

Result$ = ProgramParameter( [Index] )
Описание
Получает следующую строку параметра, который был передан в исполнимую PureBasic программу. Если используется параметр 'Index' (начинается с 0) вернётся параметр с этим индексом. Возвращается пустая строка, если больше нет доступных параметров.

Эта команда особенно полезна в console programs, где пользователь указывает один или несколько параметров при запуске программы.

Примечание: использовать метод выявления последнего параметра, путём возвращения пустой строки, не является хорошей практикой. Лучший способ выявить количество параметров, использовать команду CountProgramParameters() и вызовом ProgramParameter() столько раз, сколько необходимо.

Пример:
  MyProgram.exe MyText.txt /FAST "Special Mode"
Первый раз ProgramParameter() возвращает "MyText.txt", второй раз "/FAST" и третий раз "Special Mode".


ProgramRunning

ProgramRunning()

Синтаксис

Result = ProgramRunning(Program)
Описание
Проверяет, работает ли программа, которая ранее была запущена командой RunProgram(). Результат будет отличен от нуля, если программа еще не завершена.


ReadProgramData

ReadProgramData()

Синтаксис

Result = ReadProgramData(Program, *Buffer, size)
Описание
Считывает данные из указанного выхода программы (STDOUT), и сохраняет его в буфере (области памяти защищенной с помощью AllocateMemory()).

Программа должна быть запущена командой RunProgram() с параметром #PB_Program_Read.

Команда считывает количество 'size' байт или меньше, но не можент вернуть ноль байт, так как, всегда дожидается любого количества данных. Количество действительно прочитанных байт, возвращается в 'Result'.

Примечание: Эта команда блокирует программу, пока не будут считаны данные. Чтобы предотвратить это, проверьте командой AvailableProgramOutput(), есть ли данные для считывания.

Возвращаемое значение

Возвращает количество байт, которые были фактически прочитаны.


ReadProgramError

ReadProgramError()

Синтаксис

Result$ = ReadProgramError(Program)
Описание
Считывает строку из вывода ошибок (STDERR) указанной программы. Программа должна быть запущена командой RunProgram() с параметром #PB_Program_Error.

Эта функция не ждёт, пока данные будут доступны. Если ошибки нет, функция возвращает пустую строку.


ReadProgramString

ReadProgramString()

Синтаксис

Result$ = ReadProgramString(Program)
Описание
Считывает текстовую строку из вывода (stdout) указанной программы. Программа должна быть запущена командой RunProgram() с параметром #PB_Program_Read.

Примечание: Эта команда блокирует программу, пока не будут считаны данные. Чтобы предотвратить это, проверьте командой AvailableProgramOutput(), есть ли данные для считывания. Эта команда также ожидает, чтобы была получена полная строка. Если необходимо считывание бинарных данных, можно использовать команду ReadProgramData().


RemoveEnvironmentVariable

RemoveEnvironmentVariable()

Синтаксис

RemoveEnvironmentVariable(Name$)
Описание
Удаляет данную переменную из блока программы.


RunProgram

RunProgram()

Синтаксис

Result = RunProgram(Filename$ [, Parameter$, WorkingDirectory$ [, Flags [, SenderProgram]]])
Описание
Запускает внешнюю программу. 'Filename$' содержит имя и путь исполнимого файла. 'Parameters$' может содержать параметр командной строки, который передаётся программе. 'WorkingDirectory$' определяет каталог, который будет текущим каталогом для внешней программы.

Flags является дополнительным и может быть комбинацией (использующей | оператор OR) следующих значений:
  #PB_Program_Wait   : Ждать до оканчания запущенной программы
  #PB_Program_Hide   : Начать программу в фоновом режиме
  #PB_Program_Open   : Открыть программу для общения между запущенной программой и программой PureBasic.
  #PB_Program_Read   : Считывание на стандартном выходе. (stdout)
  #PB_Program_Write  : Запись на стандартном вводе. (stdin)
  #PB_Program_Error  : Считывание на выходе ошибки. (stderr)
  #PB_Program_Connect: Подключение других программ выхода на этот вход программы.
Программа запущенная с параметром #PB_Program_Open, должна быть закрыта с помощью команды CloseProgram(). 'Read', 'Write', 'Error' и 'Connect' также необходимо запускать с параметром #PB_Program_Open.

При использовании параметра #PB_Program_Connect, необходимо сначала запустить программу с параметром #PB_Program_Open и #PB_Program_Read. При запуске этой программы возвращенный номер должен передаваться как параметр 'SenderProgram' команды RunProgram(). Вывод программы отправителя посылают непосредственно во ввод выполняемой программы. Несколько программ могут быть подключены таким образом, чтобы передать данные нескольким программам.

Следующие команды можно использовать, с параметром #PB_Program_Open:

- IsProgram(): проверяет номер работающей программы.
- ProgramID(): Возвращает системный идентификатор программы.
- ProgramRunning(): проверяет, работает ли все еще программа.
- WaitProgram(): дожидается окончания программы.
- KillProgram(): выход из программы.
- ProgramExitCode(): вычисляет код выхода из программы.
- CloseProgram(): закрывает подключение к программе.

Следующие команды можно использовать, с параметром 'Read', 'Write' и 'Error':

- AvailableProgramOutput(): проверяет, доступен ли вывод программы.
- ReadProgramString(): читает строку из вывода программы.
- ReadProgramData(): читает данные из вывода программы.
- ReadProgramError(): читает строку ошибки из вывода программы.
- WriteProgramString(): записывает строку во вход программ.
- WriteProgramData(): записывает данные во вход программ.

Возвращаемое значение

Если программа не может быть выполнена, возвращаемое значение равно нулю. Если RunProgram() была успешной, возвращаемое значение отлично от нуля.

Если используется параметр #PB_Program_Open, то возвращаемое значение содержит номер, который идентифицирует новую программу, которая может быть использована командами ReadProgramString() или ProgramExitCode() или упомянутыми выше.

Пример:
  ; Executes the PB compiler with the /? option and displays the output (windows version)
  ; For Linux/MacOS change the "/?" to "-h" and the "\" to "/" in the compiler path.
  ;
  Compiler = RunProgram(#PB_Compiler_Home+"\Compilers\pbcompiler", "/?", "", #PB_Program_Open|#PB_Program_Read)
  Output$ = ""
  If Compiler
    While ProgramRunning(Compiler)
      Output$ + ReadProgramString(Compiler) + Chr(13)
    Wend
    Output$ + Chr(13) + Chr(13)
    Output$ + "Exitcode: " + Str(ProgramExitCode(Compiler))
  EndIf
  MessageRequester("Output", Output$)
В среде Windows RunProgram () использует программу по умолчанию, связанную с типом файла. Например: RunProgram ("Test.html ") откроет программу просмотра .html файлов, которая установлена в вашей системе.


SetEnvironmentVariable

SetEnvironmentVariable()

Синтаксис

SetEnvironmentVariable(Name$, Value$)
Описание
Создает переменную в блоке этой программы с именем Name$ и значением Value$. Если переменная величина с этим именем уже существует, ее содержание будет изменено на новое значение.

Блок среды программы передается другим программам, запущеным командой RunProgram(), таким образом этот метод может использоваться, для передачи информации из вашей программы, в любую другую программу. (Запущенная программа может использовать GetEnvironmentVariable() чтобы считать содержание переменных.)


WaitProgram

WaitProgram()

Синтаксис

Result = WaitProgram(Program [, Timeout])
Описание
Останавливает выполнение кода, пока указанная программа (запущенная командой RunProgram()) не закончилась или пока дополнительное время ожидания (в миллисекундах) не будет достигнуто.

Возвращаемое значение

Возвращает ненулевое значение, если программа завершилась и ноль, если был достигнут тайм-аут.


WriteProgramData

WriteProgramData()

Синтаксис

Result = WriteProgramData(Program, *Buffer, size)
Описание
Запись данных из буфера на вход указанной программы (STDIN). Программа должна быть запущена командой RunProgram() с параметром #PB_Program_Write.

Особое значение #PB_Program_Eof для параметра *Buffer используется, чтобы программа получила EOF (конец файла) в необходимом представлении. Параметр 'Size' игнорируется в данном случае. После вызова WriteProgramData() с этим значением, входные данные не могут более быть записаны в программу.

Возвращаемое значение

Возвращает количество байт, которые были фактически записаны.


WriteProgramString

WriteProgramString()

Синтаксис

Result = WriteProgramString(Program, String$)
Описание
Записывает данную строку в указанную программу (stdin). Программа должна быть запущена командой RunProgram() с параметром #PB_Program_Write.

После записи строки, следущая строка может быть записана командой WriteProgramStringN(). Для ввода данных в программу, может использоваться WriteProgramData(). Эта функция может использоваться для отправки EOF (конец файла) сообщая программе, что данных больше не будет.


WriteProgramStringN

WriteProgramStringN()

Синтаксис

Result = WriteProgramStringN(Program, String$)
Описание
Записывает данную строку в указанную программу (stdin). Программа должна быть запущена командой RunProgram() с параметром #PB_Program_Write.

Для того, чтобы послать строку без newline используйте WriteProgramString(). Для ввода данных в программу, может использоваться WriteProgramData().


RegularExpression

PureBasic - RegularExpression

Краткий обзор

Регулярные выражения могут искать, извлекать и заменять текст в строке, которая совпадает с шаблоном. Эти модели часто довольно трудно писать и понимать, но когда они используются должным образом они делают работу с строкой проще. Эта библиотека не для начинающих, и вам необходимо иметь некоторое представление о PureBasic и программирования в целом для того, чтобы использовать эту библиотеку эффективно.

Эта библиотека использует PCRE, которая является OpenSource реализацией регулярных выражений Perl. Все регулярные выражения PCRE признаются в PureBasic. Чтобы иметь полный список поддерживаемых шаблонов и аргументов, пожалуйста, посетите страницу PCRE: http://www.pcre.org/pcre.txt
Лицензию PCRE можно посмотреть здесь.

Важно: Лицензия PCRE требует, чтобы уведомление об авторском праве и сам текст лицензии, были включены в любое программное обеспечение, которое использует библиотеку.
Краткий перечень команд
CreateRegularExpression
ExtractRegularExpression
FreeRegularExpression
IsRegularExpression
MatchRegularExpression
RegularExpressionError
ReplaceRegularExpression


CreateRegularExpression

CreateRegularExpression()

Синтаксис

Result = CreateRegularExpression(#RegularExpression, Pattern$ [, Flags])
Описание
Создание нового регулярного выражения. Если #PB_Any используется как параметр '#RegularExpression' номер нового регулярного выражения, будет возвращено как 'Result'. 'Pattern$' это правило будет применяться к строке для поиска, извлечения и замены текста. Если в шаблоне будет обнаружена ошибка, 'Result' будет равен 0. Для получения дополнительной информации об ошибке, см. RegularExpressionError().

Если регулярное выражение не используется больше, используйте FreeRegularExpression().

'Flags' может быть комбинацией следующих значений:
  #PB_RegularExpression_DotAll    : '.' принимает во внимание все, включая символ новой строки.
  #PB_RegularExpression_Extended  : пробелы и '#' комментарии будут игнорироваться.
  #PB_RegularExpression_MultiLine : '^' и '$' учитывает возвращение к данным с новой строки.
  #PB_RegularExpression_AnyNewLine: 'CR', 'LF', и 'CRLF' рассматриваются как символ новой строки.
Пример:
  ; This expression will match every word of 3 letter which begin by a lower case letter,
  ; followed with the character 'b' and which ends with an uppercase letter. ex: abC
  ;
  If CreateRegularExpression(0, "[a-z]b[A-Z]")
    Debug MatchRegularExpression(0, "abC") ; Will be 1
    Debug MatchRegularExpression(0, "abc") ; Will be 0
  Else
    Debug RegularExpressionError()
  EndIf


ExtractRegularExpression

ExtractRegularExpression()

Синтаксис

Result = ExtractRegularExpression(#RegularExpression, String$, Array$())
Описание
Извлечения строк в соответствии с шаблоном #RegularExpression в массив. Размер массива автоматически увеличевается на число равное количеству найденных элементов в 'String$'. Количество найденных элементов, будет возвращено в 'Result'.

Пример:
  ; This expression will match every word of 3 letter which begin by a lower case letter,
  ; followed with the character 'b' and which ends with an uppercase letter. ex: abC
  ;
  If CreateRegularExpression(0, "[a-z]b[A-Z]")
    Dim Result$(0)
    NbFound = ExtractRegularExpression(0, "abC ABc zbA abc", Result$())
    For k = 0 To NbFound-1
      Debug Result$(k)
    Next
  Else
    Debug RegularExpressionError()
  EndIf


FreeRegularExpression

FreeRegularExpression()

Синтаксис

FreeRegularExpression(#RegularExpression)
Описание
Освобождает указанное регулярное выражение #RegularExpression и выделенной для него памяти.

Примечание: все остающиеся регулярные выражения, автоматически освобождаются, когда программа завершается.


IsRegularExpression

IsRegularExpression()

Синтаксис

Result = IsRegularExpression(#RegularExpression)
Описание
Проверяет, является ли указанное #RegularExpression регулярным выражением действительным и должным образом инициализированым. Эта функция может быть использована с любым значением.Если 'Result' не равен нулю, то этот объект является действительным, и правильно инициализирован.


MatchRegularExpression

MatchRegularExpression()

Синтаксис

Result = MatchRegularExpression(#RegularExpression, String$)
Описание
Проверяет строку String$ на наличие шаблона #RegularExpression. 'Result' будет 1, если имеется одино или более совпадений, или 0 если не будет найден шаблон.

Пример:
  ; This expression will match every word of 3 letter which begin by a lower case letter,
  ; followed with the character 'b' and which ends with an uppercase letter. ex: abC
  ;
  If CreateRegularExpression(0, "[a-z]b[A-Z]")
    If MatchRegularExpression(0, "abC ABc zbA abc")
      Debug "The string match !"
    Else
      Debug "No pattern found in the string"
    EndIf
  Else
    Debug RegularExpressionError()
  EndIf


RegularExpressionError

RegularExpressionError()

Синтаксис

Result$ = RegularExpressionError()
Описание
Возвращает текстовую форму (на английском языке) описания произошедшей ошибки, во время последнего вызова CreateRegularExpression().

Пример:
  ; Here we put an extra bracked '[', so there is a syntax error in the regular expression
  ;
  If CreateRegularExpression(0, "[a-z]b[[A-Z][]")
    Debug "Success"
  Else
    Debug RegularExpressionError()
  EndIf


ReplaceRegularExpression

ReplaceRegularExpression()

Синтаксис

Result$ = ReplaceRegularExpression(#RegularExpression, String$, ReplaceString$)
Описание
Заменят строки в соответствии с #RegularExpression. Каждый шаблон регулярного выражения будет заменён на 'ReplaceString$'.

Пример:
  ; This expression will match every word of 3 letter which begin by a lower case letter,
  ; followed with the character 'b' and which ends with an uppercase letter. ex: abC
  ;
  If CreateRegularExpression(0, "[a-z]b[A-Z]")
    Result$ = ReplaceRegularExpression(0, "abC ABc zbA abc", "---")
    Debug Result$ ; Will print "--- ABc --- abc"
  Else
    Debug RegularExpressionError()
  EndIf


Requester

PureBasic - Requester

Краткий обзор

Диалоги присутствуют практически во всех приложениях с графическим интерфейсом. Они очень удобны для выполнения некоторых простых задач (например, открытие файла, выбор цвета или шрифта и т.д. ..) все осуществляется через стандартный Windows.

Краткий перечень команд

ColorRequester
FontRequester
InputRequester
MessageRequester
NextSelectedFilename
OpenFileRequester
PathRequester
SaveFileRequester
SelectedFilePattern
SelectedFontColor
SelectedFontName
SelectedFontSize
SelectedFontStyle


ColorRequester

ColorRequester()

Синтаксис

Color = ColorRequester( [CurrentColor] )
Описание
Открывает стандартное диалоговое окно выбора цвета. Цвет выбранного цвета возвращается в виде значения 24 бит (3 байта), каждый байт содержит значение одного из компонентов красного, зеленого и синего. Чтобы легко получить значение каждого компонента RGB ипользуйте Red(), Green() и Blue(). Если пользователь выбирает кнопку <Cancel> диалога, возвращается значение -1. Необязательный параметр 'CurrentColor' может быть использован для выбора цвета по умолчанию при открытии окна.

Пример:
  Color.l = ColorRequester()
  If Color > -1
    a$ = "You have selected following color value:" + Chr(10)  ; Chr(10) only needed
    a$ + "24 Bit value: " + Str(Color)              + Chr(10)  ; for line-feed
    a$ + "Red value:    " + Str(Red(Color))         + Chr(10)
    a$ + "Green value:  " + Str(Green(Color))       + Chr(10)
    a$ + "Blue value:   " + Str(Blue(Color))
  Else
    a$ = "The requester was canceled."
  EndIf
  MessageRequester("Information", a$, 0)
  End


FontRequester

FontRequester()

Синтаксис

Result = FontRequester(FontName$, FontSize, Flags [, Color [, Style]])
Описание
Открывает стандартное диалоговое окно выбора шрифта. Если пользователь отменяет выбор,то в Result возвращается 0, иначе значение 1. 'FontName$' и 'FontSize' используются для инициализации шрифта по умолчанию, при открытии окна диалога.

SelectedFontColor(), SelectedFontName(), SelectedFontSize() и SelectedFontStyle() могут быть использованы после успешного вызова этой функции, для получения информации о выбранном шрифте.

'Color' необязательный параметр и может быть использован для выбора цвета по умолчанию при открытии окна. Вы можете использовать RGB() для определения цвета.

'Style' может быть использовано для выбора стиля по умолчанию при открытии окна. Обратитесь к команде SelectedFontStyle() для определения доступных стилей.

'Flags' может быть одним из следующих значений:
  #PB_FontRequester_Effects : Активирует результаты (в том числе селекционер цвета).
Пример:
  FontName$ = "Arial"   ; set initial font  (could also be blank)
  FontSize  = 14        ; set initial size  (could also be null)
  Result = FontRequester(FontName$, FontSize, #PB_FontRequester_Effects)
  If Result
    Message$ = "You have selected following font:"  + #LF$
    Message$ + "Name:  " + SelectedFontName()       + #LF$
    Message$ + "Size:  " + Str(SelectedFontSize())  + #LF$
    Message$ + "Color: " + Str(SelectedFontColor()) + #LF$
    If SelectedFontStyle() & #PB_Font_Bold
      Message$ + "Bold" + #LF$
    EndIf
    If SelectedFontStyle() & #PB_Font_StrikeOut
      Message$ + "StrikeOut" + #LF$
    EndIf
    If SelectedFontStyle() & #PB_Font_Underline
      Message$ + "Underline" + #LF$
    EndIf
  Else
    Message$ = "The requester was canceled."
  EndIf

  MessageRequester("FontRequester", Message$, #PB_MessageRequester_Ok)


InputRequester

InputRequester()

Синтаксис

Text$ = InputRequester(Title$, Message$, DefaultText$)
Описание
Открывает диалоговое окно для ввода текста.

Пример:
  Input$ = InputRequester("Title", "Please make your input:", "I'm the default input.")

  If Input$ > ""
    a$ = "You entered in the requester:" + Chr(10)  ; Chr(10) only needed
    a$ + Input$                                                  ; for line-feed
  Else
    a$ = "The requester was cancelled or there was nothing entered."
  EndIf
  MessageRequester("Information", a$, 0)
  End


MessageRequester

MessageRequester()

Синтаксис

Result = MessageRequester(Title$, Text$ [, Flags])
Описание
Открывает диалоговое окно для отображения сообщения, предназначенного для предоставления информации пользователю. Программа прерывается, пока пользователь не закроет его.

Дополнительный параметр Flags может быть одной из следующих констант:
  #PB_MessageRequester_YesNo       : Для отображения кнопки "Да" и "Нет"
  #PB_MessageRequester_YesNoCancel : Для отображения кнопки "Да", "нет" и "Отмена"
  #PB_MessageRequester_Ok          : Для отображения только кнопки "OK"
Возможные возвращенные значения константы:
  #PB_MessageRequester_Yes    : была нажата кнопка "Да"
  #PB_MessageRequester_No     : была нажата кнопка "Нет"
  #PB_MessageRequester_Cancel : была нажата кнопка "Отмена"
Пример:
  ; Simple MessageRequester  (normally used for information purposes only)
  ; (result will be always the same, so we don't check it here)
  MessageRequester("Information", "Just a short information text.", #PB_MessageRequester_Ok)

  ; MessageRequester with Yes / No buttons  (normally used for questions)
  ; (result will be shown in the following information requester)
  Result = MessageRequester("Title", "Please make your input:", #PB_MessageRequester_YesNo)
  a$ = "Result of the previously requester was: "
  If Result = #PB_MessageRequester_Yes    ; pressed Yes button (Result = 6)
    a$ + "Yes"
  Else                                    ; pressed No button (Result = 7)
    a$ + "No"
  EndIf
  MessageRequester("Information", a$, #PB_MessageRequester_Ok)

  ; MessageRequester with Yes / No / Cancel buttons  (normally used for questions)
  ; (result will be shown in the following information requester)
  Result = MessageRequester("Title", "Please make your input:", #PB_MessageRequester_YesNoCancel)
  a$ = "Result of the previously requester was: "
  If Result = #PB_MessageRequester_Yes       ; pressed Yes button
    a$ + "Yes"
  ElseIf Result = #PB_MessageRequester_No    ; pressed No button
    a$ + "No"
  Else                                       ; pressed Cancel button or Esc
    a$ + "Cancel"
  EndIf
  MessageRequester("Information", a$, #PB_MessageRequester_Ok)

Примечание: В PureBasic также поддерживаются многие другие константы Windows API. Но будьте осторожны, эти константы не кросс-платформенны! Обзор вы найдете в библиотеке MSDN на функцию MessageBox.


NextSelectedFilename

NextSelectedFilename()

Синтаксис

Filename$ = NextSelectedFilename()
Описание
После OpenFileRequester() с помощью постоянной #PB_Requester_MultiSelection, она возвращает следующий выбранный файл (если таковой имеется). Если в 'Filename$' возвращается значение (""), то нет выбранных файлов в списке.

Пример:
  Filename$ = OpenFileRequester("Choose some files","","",0, #PB_Requester_MultiSelection)

  While Filename$
    Debug Filename$
    Filename$ = NextSelectedFilename()
  Wend


OpenFileRequester

OpenFileRequester()

Синтаксис

Filename$ = OpenFileRequester(Title$, DefaultFile$, Pattern$, PatternPosition [, Flags])
Описание
Открывает стандартное диалоговое окно выбора файлов. Title$ заменяет используемое по умолчанию название окна. DefaultFile$ указывает на каталог и имя файла при открытии окна.

Pattern стандартный фильтр, который позволяет просматривать файлы, расширение которых и/или имя соответствует фильтру. Он должен быть в следующей форме: "Text file | *.txt | Music file | *.mus;*.mod" Каждый фильтр всегда работает в паре: имя (которое содержится в фильтре) и расширение (например: *. TXT). Несколько расширений могут быть указаны для одного типа с помощью ; (точка с запятой).

'PatternPosition' определяет, какой шаблон должен быть значением по умолчанию. Начинается от 0 до числа шаблонов. Как только программа формирования запросов будет закрыта, SelectedFilePattern() может использоваться, для получения позиции выбранного фильтра.

Возвращенный 'Filename$' может быть разбит на файл, путь и/или расширение при помощи следующих команд: GetFilePart(), GetPathPart() и GetExtensionPart().

'Flags' является дополнительными и может быть комбинацией следующих значений:
  #PB_Requester_MultiSelection: Активирует мультивыбор. (см. NextSelectedFilename())

Пример:
  StandardFile$ = "C:\autoexec.bat"   ; set initial file+path to display
  ; With next string we will set the search patterns ("|" as separator) for file displaying:
  ;  1st: "Text (*.txt)" as name, ".txt" and ".bat" as allowed extension
  ;  2nd: "PureBasic (*.pb)" as name, ".pb" as allowed extension
  ;  3rd: "All files (*.*) as name, "*.*" as allowed extension, valid for all files
  Pattern$ = "Text (*.txt)|*.txt;*.bat|PureBasic (*.pb)|*.pb|All files (*.*)|*.*"
  Pattern = 0    ; use the first of the three possible patterns as standard
  File$ = OpenFileRequester("Please choose file to load", StandardFile$, Pattern$, Pattern)
  If File$
    MessageRequester("Information", "You have selected following file:" + Chr(10) + File$, 0)
  Else
    MessageRequester("Information", "The requester was canceled.", 0)
  EndIf


PathRequester

PathRequester()

Синтаксис

Filename$ = PathRequester(Title$, InitialPath$)
Описание
Открывает диалоговое окно запроса каталогов, чтобы выбрать путь к каталогу. Title$ заменяет используемое по умолчанию название окна. InitialPath$ открывает окно по указанному пути. Путь возвращается с окончанием '\'

Пример:
  InitialPath$ = "C:\"   ; set initial path to display (could also be blank)
  Path$ = PathRequester("Please choose your path", InitialPath$)
  If Path$
    MessageRequester("Information", "You have selected following path:"+Chr(10)+Path$, 0)
  Else
    MessageRequester("Information", "The requester was canceled.", 0)
  EndIf


SaveFileRequester

SaveFileRequester()

Синтаксис

Filename$ = SaveFileRequester(Title$, DefaultFile$, Pattern$, PatternPosition)
Описание
Открывает стандартный диалог сохранения файла. Title$ заменяет используемое по умолчанию название окна. DefaultFile$ указывает на каталог и имя файла при открытии окна.

Pattern стандартный фильтр, который позволяет просматривать файлы, расширение которых и/или имя соответствует фильтру. Он должен быть в следующей форме: "Text file | *.txt | Music file | *.mus;*.mod" Каждый фильтр всегда работает в паре: имя (которое содержится в фильтре) и расширение (например: *. TXT). Несколько расширений могут быть указаны для одного типа с помощью ; (точка с запятой).

'PatternPosition' определяет, какой шаблон должен быть значением по умолчанию. Начинается от 0 до числа шаблонов. Как только программа формирования запросов будет закрыта, SelectedFilePattern() может использоваться, для получения позиции выбранного фильтра.

Возвращенный 'Filename$' может быть разбит на файл, путь и/или расширение при помощи следующих команд: GetFilePart(), GetPathPart() и GetExtensionPart().

Пример:
  StandardFile$ = "C:\autoexec.bat"   ; set initial file+path to display
  ; With next string we will set the search patterns ("|" as separator) for file displaying:
  ;  1st: "Text (*.txt)" as name, ".txt" and ".bat" as allowed extension
  ;  2nd: "PureBasic (*.pb)" as name, ".pb" as allowed extension
  ;  3rd: "All files (*.*) as name, "*.*" as allowed extension, valid for all files
  Pattern$ = "Text (*.txt)|*.txt;*.bat|PureBasic (*.pb)|*.pb|All files (*.*)|*.*"
  Pattern = 0    ; use the first of the three possible patterns as standard
  File$ = SaveFileRequester("Please choose file to save", StandardFile$, Pattern$, Pattern)
  If File$
    MessageRequester("Information", "You have selected following file:"+Chr(10)+File$, 0)
  Else
    MessageRequester("Information", "The requester was canceled.", 0)
  EndIf


SelectedFilePattern

SelectedFilePattern()

Синтаксис

Index = SelectedFilePattern()
Описание
Возвращает индекс фильтра (*. BMP, *. GIF и т.д. ...) выбранный командой OpenFileRequester() или SaveFileRequester(). Индекс первого фильтра равен 0.

Пример:
  StandardFile$ = "C:\autoexec.bat"        ; initial path + file
  Pattern$ = "Text (*.txt)|*.txt;*.bat|"   ; set first pattern  (index = 0)
  Pattern$ + "PureBasic (*.pb)|*.pb|"      ; set second pattern (index = 1)
  Pattern$ + "Bmp (*.bmp)|*.bmp|"          ; set third pattern  (index = 2)
  Pattern$ + "Jpeg (*.jpg)|*.jpg|"         ; set fourth pattern (index = 3)
  Pattern$ + "All files (*.*)|*.*"         ; set fifth pattern  (index = 4)
  Pattern = 1    ; use the second of the five possible patterns as standard

  ; Now we open a filerequester, you can change the pattern and will get the index after closing
  File$ = OpenFileRequester("Please choose file to load", StandardFile$, Pattern$, Pattern)
  Index = SelectedFilePattern()
  If Index > -1
    MessageRequester("Information", "Following pattern index was selected: "+Str(Index), 0)
  Else
    MessageRequester("Information", "The requester was canceled.", 0)
  EndIf


SelectedFontColor

SelectedFontColor()

Синтаксис

Color = SelectedFontColor()
Описание
Возвращает цвет, выбранный пользователем с помощью функции FontRequester(). Цвет является значением 24 бит (3 байта), каждый байт содержит значение каждого из компонентов красного, зеленого и синего. Чтобы получить значение каждого компонента, используйте Red(), Green() и Blue().

Поддерживаемые ОС

Windows


SelectedFontName

SelectedFontName()

Синтаксис

Name$ = SelectedFontName()
Описание
Возвращает имя шрифта, выбранного пользователем с помощью функции FontRequester(). Это имя может использоваться в функции LoadFont().


SelectedFontSize

SelectedFontSize()

Синтаксис

Size = SelectedFontSize()
Описание
Возвращает размер шрифта, выбранного пользователем с помощью функции FontRequester().


SelectedFontStyle

SelectedFontStyle()

Синтаксис

Style = SelectedFontStyle()
Описание
Возвращает стиль шрифта, выбранного пользователем с помощью функции FontRequester(). 'Style' может содержать одно или более значений:
  #PB_Font_Bold  : Жирным шрифтом.
  #PB_Font_Italic: Шрифт курсивом.
To test if a value is present, use the '&' (bitwise AND) operator:
  If SelectedFontStyle() & #PB_Font_Bold
    ; The font is bold
  EndIf


Scintilla

PureBasic - Scintilla

Краткий обзор

Scintilla это бесплатный компонент для редактирования исходного кода. Он поставляется с исходным кодом и лицензией разрешающей использовать её в любых бесплатных или коммерческих проектах. Лицензия может быть найдена здесь. Исходный код и документацию можно найти на Scintilla Homepage.

From the Scintilla Homepage: As well as features found in standard text editing components, Scintilla includes features especially useful when editing and debugging source code. These include support for syntax styling, error indicators, code completion and call tips. The selection margin can contain markers like those used in debuggers to indicate breakpoints and the current line. Styling choices are more open than with many editors, allowing the use of proportional fonts, bold and italics, multiple foreground and background colours and multiple fonts.

Important: The scintilla license requires that a copyright notice be included in all software that uses it and the license text itself be included in the documentation for the software. So if this library is used in software that is to be made public, the above linked license MUST be included with the software.

PureBasic integrates the Scintilla library with the gadget library, so standard commands like ResizeGadget() or HideGadget() can be used with the scintilla control. Furthermore it provides the ScintillaSendMessage() function to communicate with the control to use its full potential. All structures and constants needed are allready defined in PureBasic.

Note: The MacOSX version of this library is an unofficial port of Scintilla done by the PureBasic Team and does not support all features and messages described in the Scintilla documentation.

Краткий перечень команд

InitScintilla
ScintillaGadget
ScintillaSendMessage


InitScintilla

InitScintilla()

Синтаксис

Result = InitScintilla([LibraryName$])
Описание
Эта функция подключает файл Scintilla.dll или SciLexer.dll к программе, в зависимости от, того, какое имя было указано в аргументе функции. Эта функция должна быть вызвана перед функцией ScintillaGadget()).

Примечание: Эта команда присутствует только в Windows.

Возвращаемое значение

Результат работы функции не равен нулю, в случае успешного подключения файла к программе.

Поддерживаемые ОС

Windows


ScintillaGadget

ScintillaGadget()

Синтаксис

Result = ScintillaGadget( #Gadget, x, y, Width, Height, @Callback() )
Описание
Эта функция регистрирует в системе редактор Scintilla как обычный гаджет. К нему можно обращаться, используя функции из раздела Gadget справки. Если #PB_Any используется вместо параметра '#Gadget', то номер гаджета будет возвращен в 'Result'.

'@callback()' это физический адрес в памяти, процедуры, обрабатывающей события от редактора. 'Gadget' идентификатор создаваемого гаджета - любое целое положительное число и аргументы x, y, Width, Height это соответственно положение гаджета относительно окна и его размеры.
  ProcedureDLL ScintillaCallBack(Gadget, *scinotify.SCNotification)
    ;
    ; The ProcedureDLL declaration is important for the callback to work correctly on MacOSX,
    ; on all other OS it has no effect.
    ;
  EndProcedure
After creation, Scintilla specific commands can be sent to the control with the ScintillaSendMessage() command. In addition common gadget commands like ResizeGadget() or HideGadget() can be used with the control as well.


ScintillaSendMessage

ScintillaSendMessage()

Синтаксис

Result = ScintillaSendMessage(#Gadget, Message [, Param [, lParam]])
Описание
Эта функция позволяет управлять редактором. Первый её аргумент – идентификатор гаджета, второй – посылаемое сообщение (команда) в виде константы (об этом ниже). Третий и четвёртый аргументы — это параметры сообщения. Эти аргументы являются не обязательными, и их наличие зависит от конкретного сообщения, на это указывают квадратные скобки, которых в реальной программе не должно быть! Аргумент Message задаёт команду, посылаемую редактору. Описание всех доступных команд можно найти на официальном сайте Scintilla Homepage. К началу каждой команды следует добавлять символ #SCI_[...] т. е. допустим команда, считывающая весь текст из редактора SCI_GETTEXT должна выглядеть так #SCI_GETTEXT.

Возвращаемое значение

Возвращает результат посланного сообщения.


SerialPort

PureBasic - SerialPort

Краткий обзор

Последовательный порт (также известный как порт RS-232) по-прежнему широко используются в промышленности, несмотря на его возраст: он был создан в 1969 году. Эта библиотека предоставляет полный доступ к последовательным портам. Желательно знать, определения и термины, связанные с последовательными портами, для получения дополнительной информации ознакомтесь с : Wikipedia - RS232 .

Краткий перечень команд

AvailableSerialPortInput
AvailableSerialPortOutput
CloseSerialPort
GetSerialPortStatus
IsSerialPort
OpenSerialPort
ReadSerialPortData
SerialPortError
SerialPortID
SerialPortTimeouts
SetSerialPortStatus
WriteSerialPortData
WriteSerialPortString


AvailableSerialPortInput

AvailableSerialPortInput()

Синтаксис

Result = AvailableSerialPortInput(#SerialPort)
Описание
В Result возвращается количество байт, оставшихся на входе в буфере #SerialPort.


AvailableSerialPortOutput

AvailableSerialPortOutput()

Синтаксис

Result = AvailableSerialPortOutput(#SerialPort)
Описание
В Result возвращается количество байт, оставшихся на выходе в буфере #SerialPort.


CloseSerialPort

CloseSerialPort()

Синтаксис

CloseSerialPort(#SerialPort)
Описание
Закрывает указанный #SerialPort ранее открытый командой OpenSerialPort().

ПРИМЕЧАНИЕ: все, оставшиеся открытыми последовательные порты, автоматически закрываются при завершении программы.


GetSerialPortStatus

GetSerialPortStatus()

Синтаксис

Result = GetSerialPortStatus(#SerialPort, Attribute)
Описание
Возвращает состояние указанного #SerialPort (статус). 'Attribute' может быть одним из следующих значений:
  #PB_SerialPort_RI : Возвращает состояние сигнала RI (0 или 1)
  #PB_SerialPort_DCD: Возвращает состояние сигнала DCD (0 или 1)
  #PB_SerialPort_DSR: Возвращает состояние сигнала DSR (0 или 1)
  #PB_SerialPort_CTS: Возвращает состояние сигнала CTS (0 или 1)
  #PB_SerialPort_XonCharacter : Символ, используемый для установления последовательности связи процедуры Xon/Xoff (от 1 до 255)
  #PB_SerialPort_XoffCharacter: Символ, используемый для установления последовательности связи процедуры Xon/Xoff (от 1 до 255)


IsSerialPort

IsSerialPort()

Синтаксис

Result = IsSerialPort(#SerialPort)
Описание
Проверяет, является ли данный #SerialPort действительным и правильно инициализированным. Эта функция была разработана, чтобы принять любое значение в качестве параметра. Если 'Result' не равен нулю, то этот объект является допустимым. Используйте эту функцию, чтобы убедиться, что объект правильно инициализирован.


OpenSerialPort

OpenSerialPort()

Синтаксис

Result = OpenSerialPort(#SerialPort, SerialPortName$, Bauds, Parity, Data, Stop, HandshakeMode, InputBufferSize, OutputBufferSize)
Описание
Открывает последовательный порт для использования. Если использовать #PB_Any в качестве параметра '#SerialPort', то в 'Result' вернётся номер присвоенный компилятором РВ. 'SerialPortName$' является текстовым идентификатором(латинскими буквами) для последовательного порта, например "COM1" для Windows или "/dev/ttyS0" для Linux. 'Bauds' определяет скорость соединения последовательного порта и может принимать одно из следующих значений:
    50, 75, 110, 150, 300, 600, 1200, 1800, 2400
    4800, 9600, 19200, 38400, 57600 or 115200
'Parity' определяет четность во время общения, и может быть одним из следующих значений:
  #PB_SerialPort_NoParity   : No parity
  #PB_SerialPort_EvenParity : Even parity
  #PB_SerialPort_MarkParity : Mark parity
  #PB_SerialPort_OddParity  : Odd parity
  #PB_SerialPort_SpaceParity: Space parity
'Data' определяет длину данных, в байтах (как правило 7 или 8). 'Stop' определяет число стоп-битов (1, 1.5 или 2). 'HandshakeMode' может быть одним из следующих значений:
  #PB_SerialPort_NoHandshake     : Нет протокола инициализации
  #PB_SerialPort_RtsHandshake    : Нет протокола инициализации но RTS устанавливается в 1
  #PB_SerialPort_RtsCtsHandshake : Протокол RTS/CTS
  #PB_SerialPort_XonXoffHandshake: Протокол Xon/Xoff
'InputBufferSize' определяет размер в байтах буфера ввода. 'OutputBufferSize' определяет размер в байтах буфера вывода.

Если последовательный порт не может быть открыт (уже используется, или установлены неправильные параметры), в 'Result' вернётся 0.

Пример:
  If OpenSerialPort(0, "COM1", 300, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
    Debug "Success"
  Else
    Debug "Failed"
  EndIf


ReadSerialPortData

ReadSerialPortData()

Синтаксис

Result = ReadSerialPortData(#SerialPort, *Buffer, Length)
Описание
Считывает произвольное количество данных из #SerialPort в *Buffer. В 'Result' возвращается количество считанных байт. Если входной буфер был пуст, эта функция будет блокировать выполнение программы до тех пор, пока не считает данные. Чтобы проверить, доступны ли данные, используйте AvailableSerialPortInput().


SerialPortError

SerialPortError()

Синтаксис

Result = SerialPortError(#SerialPort)
Описание
Возвращает ошибку, которая произошла #SerialPort после команд ReadSerialPortData(), WriteSerialPortData() или WriteSerialPortString(). 'Result' может быть комбинацией из следующих значений:
  #PB_SerialPort_RxOver: Произошло переполнение входного буфера.
                         То есть нет больше места в буфере или
                         данные были получены после символа EOF(конец файла)
  #PB_SerialPort_OverRun: Произошло переполнение буфера.
                          Следующие символы будут утеряны.
  #PB_SerialPort_RxParity : ошибка четности.
  #PB_SerialPort_Frame    : ошибка формирования пакетов данных.
  #PB_SerialPort_Break    : обнаруженно условие останова.
  #PB_SerialPort_TxFull   : приложение попыталось передать символ, когда буфер был полон.
  #PB_SerialPort_IOE      :  ошибка ввода-вывода во время работы с устройством.
  #PB_SerialPort_WaitingCTS  : Указывает, что система ожидает сигнал CTS (clear-to-send) signal to be sent.
  #PB_SerialPort_WaitingDSR  : Указывает, что система ожидает сигнал DSR (data-set-ready) signal to be sent.
  #PB_SerialPort_WaitingRLSD : Указывает, что система ожидает сигнал RLSD (receive-line-signal-detect) signal to be sent.
  #PB_SerialPort_XoffReceived: Указывает, что система ожидает, потому, что был получен сигнал XOFF.
  #PB_SerialPort_XoffSent    : Указывает, что система ожидает, потому, что был послан сигнал XOFF.
                               система ожидает сигнал XON, не зависимо от поступающих символов.
  #PB_SerialPort_EOFSent: Указывает, что был получен символ EOF(конец файла).


SerialPortID

SerialPortID()

Синтаксис

SerialPortID = SerialPortID(#SerialPort)
Описание
Возвращает уникальный системный идентификатор(ID) '#SerialPort'. Эта команда полезна, когда другая библиотека нуждается в том, чтобы обращаться к последовательному порту.


SerialPortTimeouts

SerialPortTimeouts()

Синтаксис

SerialPortTimeouts(#SerialPort, RIT, RTTC, RTTM, WTTC, WTTM)
Описание
Изменение времени ожидания по умолчанию #SerialPort.

'RIT' (ReadIntervalTimeout): Specifies the maximum time, in milliseconds, allowed to elapse between the arrival of two characters on the communications line. Default value is 100.

'RTTC' (ReadTotalTimeoutConstant): Specifies the constant, in milliseconds, used to calculate the total time-out period for read operations. For each read operation, this value is added to the product of the ReadTotalTimeoutMultiplier member and the requested number of bytes. Default value is 100.

'RTTM' (ReadTotalTimeoutMultiplier): Specifies the multiplier, in milliseconds, used to calculate the total time-out period for read operations. For each read operation, this value is multiplied by the requested number of bytes to be read. Default value is 10.

'WTTC' (WriteTotalTimeoutConstant): Specifies the constant, in milliseconds, used to calculate the total time-out period for write operations. For each write operation, this value is added to the product of the WriteTotalTimeoutMultiplier member and the number of bytes to be written. Default value is 10.

'WTTM' (WriteTotalTimeoutMultiplier): Specifies the multiplier, in milliseconds, used to calculate the total time-out period for write operations. For each write operation, this value is multiplied by the number of bytes to be written. Default value is 100.


SetSerialPortStatus

SetSerialPortStatus()

Синтаксис

SetSerialPortStatus(#SerialPort, Attribute, Value)
Описание
Изменение статуса #SerialPort. 'Attribute' может иметь одно из следующих значений:
  #PB_SerialPort_DTR: Установить статус сигнала DTR (0 или 1)
  #PB_SerialPort_RTS: Установить статус сигнала RTS (0 или 1)
  #PB_SerialPort_TXD: Установить статус сигнала TXD (0 или 1)
  #PB_SerialPort_XonCharacter : Символ, используемый для установления последовательности связи процедуры Xon/Xoff (от 1 до 255). Значение по умолчанию $11.
  #PB_SerialPort_XoffCharacter: Символ, используемый для установления последовательности связи процедуры Xon/Xoff (от 1 до 255). Значение по умолчанию $13.

Пример:
  If OpenSerialPort(0, "COM1", 300, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_XonXoffHandshake, 1024, 1024)
    SetSerialPortStatus(0, #PB_SerialPort_XonCharacter, 8)
    SetSerialPortStatus(0, #PB_SerialPort_XoffCharacter, 9)
    Debug "Success"
  Else
    Debug "Failed"
  EndIf


WriteSerialPortData

WriteSerialPortData()

Синтаксис

Result = WriteSerialPortData(#SerialPort, *Buffer, Length)
Описание
Записывает произвольное количество данных в #SerialPort из буфера *Buffer. Length количество записываемых данных. Количество в действительности записанных байт, возвращается в 'Result'. Чтобы проверить, сколько данных доступно в буфере вывода, используйте AvailableSerialPortOutput().


WriteSerialPortString

WriteSerialPortString()

Синтаксис

Result = WriteSerialPortString(#SerialPort, String$ [, Format])
Описание
Записывает строку 'String$' в #SerialPort. 'Format' может бытьPB_Ascii, PB_UTF8 или PB_UTF16 (по умолчанию PB_Ascii, см. Unicode для получения дополнительной информации). Чтобы проверить, сколько данных доступно в буфере вывода, используйте AvailableSerialPortOutput().


Sort

PureBasic - Sort

Краткий обзор

Часто элементы, которые будут использоваться, должны быть отсортированы. PureBasic предлагает оптимизированые функции для сортировки массивов arrays и связанных списков linked lists, либо по возрастанию, либо по убыванию.

Краткий перечень команд

SortArray
SortList
SortStructuredArray
SortStructuredList

Пример

Sort (Numeric).pb
Sort (String).pb


SortArray

SortArray()

Синтаксис

SortArray(ArrayName(), Options [, Start, End])
Описание
Сортирует указанный массив array, according to the given 'Options'. Массив может иметь один из следующих типов basic type: byte, word, long, integer, string или float. Можно опционально указать 'Start' и 'End', это начальный и конечный индекс массива.

'Options' может иметь следующие значения:

#PB_Sort_Ascending : Сортировка массива в порядке возрастания
#PB_Sort_Descending: Сортировка массива по убыванию
#PB_Sort_NoCase : Сортировка массива строк, не чувствительны к регистру (a=A, b=B и т.д..)

Примечание: Если массив полностью не заполнен, тогда пустые элементы будут отсортированы первыми в порядке возрастания, а следующие за ними в порядке убывания.


SortList

SortList()

Синтаксис

SortList(ListName(), Options [, Start, End])
Описание
Сортирует связанный списк list, согласно указанным опциям 'Options'. Список может быть одним из следующих типов: byte, word, long, integer, string или float. Можно опционально указать 'Start' и 'End', это начало и конец диапазона списка.

'Options' может иметь следующие значения:

#PB_Sort_Ascending : сортирует таблицу в порядке возрастания
#PB_Sort_Descending: сортирует таблицу по убыванию
#PB_Sort_NoCase : сортирует таблицу не принимая во внимание регистр (a=A, b=B и т.д..)


SortStructuredArray

SortStructuredArray()

Синтаксис

SortStructuredArray(ArrayName(), Options, OffsetOf(Structure\Field), Type [, Start, End])
Описание
Сортирует указанный массив array, согласно установленным 'Options'. Массив должен иметь ассоциированную structure. OffsetOf() может использоваться для получения области смещения в структуре связанной с массивом. Параметр 'Type' определяет тип области в структуре. Это должно соответствовать реальной области в структуре. Доступные типы:
  #PB_Sort_Byte     : поле структуры использует для сортировки (.b)
  #PB_Sort_Word     : поле структуры использует для сортировки (.w)
  #PB_Sort_Long     : поле структуры использует для сортировки (.l)
  #PB_Sort_String   : поле структуры использует для сортировки (.s или $, если переменная не объявлена)
  #PB_Sort_Float    : поле структуры использует для сортировки (.f)
  #PB_Sort_Double   : поле структуры использует для сортировки (.d)
  #PB_Sort_Quad     : поле структуры использует для сортировки (.q)
  #PB_Sort_Character: поле структуры использует для сортировки (.c)
  #PB_Sort_Integer  : поле структуры использует для сортировки (.i)
  #PB_Sort_Ascii    : поле структуры использует для сортировки ascii (.a)
  #PB_Sort_Unicode  : поле структуры использует для сортировки unicode (.u)
Можно опционально указать 'Start' и 'End', это начало и конец диапазона.

'Options' может иметь следующие значения:

#PB_Sort_Ascending : Сортировка массива в порядке возрастания
#PB_Sort_Descending: Сортировка массива по убыванию
#PB_Sort_NoCase : Сортировка массива строк, не чувствительны к регистру (a=A, b=B и т.д..)

Примечание: Если массив полностью не заполнен, тогда пустые элементы будут отсортированы первыми в порядке возрастания, а следующие за ними в порядке убывания.
Сортировка Fixed strings не поддерживается программой.

Пример:
  Structure Animal
    Name$
    Speed.l
  EndStructure

  Dim Animals.Animal(2)

  Animals(0)\Name$ = "Tiger"
  Animals(0)\Speed = 10

  Animals(1)\Name$ = "Jaguar"
  Animals(1)\Speed = 40

  Animals(2)\Name$ = "Zebre"
  Animals(2)\Speed = 30

  ; Sort the array on the 'name$' field, which is a string
  ;
  SortStructuredArray(Animals(), 0, OffsetOf(Animal\Name$), #PB_Sort_String)

  For k=0 To 2
    Debug Animals(k)\Name$+" - Speed: "+Str(Animals(k)\Speed)
  Next

  ; Sort the array on the 'speed' field, which is a long
  ;
  SortStructuredArray(Animals(), 0, OffsetOf(Animal\Speed), #PB_Sort_Long)

  For k=0 To 2
    Debug Animals(k)\Name$+" - Speed: "+Str(Animals(k)\Speed)
  Next


SortStructuredList

SortStructuredList()

Синтаксис

SortStructuredList(ListName(), Options, OffsetOf(Structure\Field), Type [, Start, End])
Описание
Сортирует указанный список list, согласно установленным 'Options'. У списка должна быть ассоциированная structure. OffsetOf() может использоваться для получения области смещения в структуре связанной со сописком. Параметр 'Type' определяет тип области в структуре. Это должно соответствовать реальной области в структуре. Доступные типы:
  #PB_Sort_Byte     : поле структуры использует для сортировки (.b)
  #PB_Sort_Word     : поле структуры использует для сортировки (.w)
  #PB_Sort_Long     : поле структуры использует для сортировки (.l)
  #PB_Sort_String   : поле структуры использует для сортировки (.s or $, fixed strings are not supported)
  #PB_Sort_Float    : поле структуры использует для сортировки (.f)
  #PB_Sort_Double   : поле структуры использует для сортировки (.d)
  #PB_Sort_Quad     : поле структуры использует для сортировки (.q)
  #PB_Sort_Character: поле структуры использует для сортировки (.c)
  #PB_Sort_Integer  : поле структуры использует для сортировки (.i)
  #PB_Sort_Ascii    : поле структуры использует для сортировки ascii (.a)
  #PB_Sort_Unicode  : поле структуры использует для сортировки unicode (.u)
Можно опционально указать 'Start' и 'End', это начало и конец диапазона.

'Options' может иметь следующие значения:

#PB_Sort_Ascending : сортирует таблицу в порядке возрастания
#PB_Sort_Descending: сортирует таблицу по убыванию
#PB_Sort_NoCase : сортирует таблицу не принимая во внимание регистр (a=A, b=B и т.д..)

Примечание: Сортировка Fixed strings не поддерживается программой.

Пример:
  Structure Animal
    Name$
    Speed.l
  EndStructure

  NewList Animals.Animal()

  AddElement(Animals())
  Animals()\Name$ = "Tiger"
  Animals()\Speed = 10

  AddElement(Animals())
  Animals()\Name$ = "Jaguar"
  Animals()\Speed = 40

  AddElement(Animals())
  Animals()\Name$ = "Zebre"
  Animals()\Speed = 30

  ; Sort the list on the 'name$' field, which is a string
  ;
  SortStructuredList(Animals(), 0, OffsetOf(Animal\Name$), #PB_Sort_String)

  ForEach Animals()
    Debug Animals()\Name$+" - Speed: "+Str(Animals()\Speed)
  Next

  ; Sort the list on the 'speed' field, which is a long
  ;
  SortStructuredList(Animals(), 0, OffsetOf(Animal\Speed), #PB_Sort_Long)

  ForEach Animals()
    Debug Animals()\Name$+" - Speed: "+Str(Animals()\Speed)
  Next


Sound

PureBasic - Sound

Краткий обзор

Звуковая библиотека PureBasic может добавить звук в приложения или игры. Функции библиотеки специально оптимизированы чтобы брать максимум из доступных аппаратных средств. Библиотека нуждается в DirectX7 (Windows 9x / 2000) или DirectX 3 при использовании Windows NT 4.0 в режиме эмуляции.

Краткий перечень команд

CatchSound
FreeSound
InitSound
IsSound
LoadSound
PlaySound
SoundFrequency
SoundPan
SoundVolume
StopSound


CatchSound

CatchSound()

Синтаксис

Result = CatchSound(#Sound, MemoryAddress [, Length [, Flags]])
Описание
Загружает WAV или любой другой формат, поддерживаемый библиотекой SoundPlugin, содержащиеся по указанному адресу MemoryAddress. Если используется #PB_Any, как параметр '#Sound', то в 'Result', будет возвращен номер звука присвоенный РВ. Если 'Result' не равен 0, то звук загружен и готов к использованию командой PlaySound(), иначе звук загрузить не удалось. Для файлов формата WAV, параметр 'Length' указываеть ненадо. Следующие функции могут использоваться, чтобы активировать большее количество звуковых форматов:

UseFLACSoundDecoder(): параметр 'Length' должен быть указан
UseOGGSoundDecoder(): параметр 'Length' должен быть указан

Необязательный параметр 'Flags', может быть сочетанием следующих значений:
  #PB_Sound_Streaming: Включает потоковое воспроизведение (поддерживаются только FLAC и OGG))
Пример:
  CatchSound(0, ?Music)
  End

  DataSection
    Music: IncludeBinary "Sound.wav"
Примечание: Знак "?" - это указатель на метку. Подробнее об указателях и доступе к памяти написано в этой главе.


FreeSound

FreeSound()

Синтаксис

FreeSound(#Sound)
Описание
Останавливает и удаляет звук, ранее загруженный командами LoadSound() или CatchSound(). Как только звук будет освобождён, он больше не может проигрываться.

Примечание: все оставшиеся звуки автоматически освобождаются, когда программа заканчивается.


InitSound

InitSound()

Синтаксис

Result = InitSound()
Описание
Инициализирует звуковую среду. Если в 'Result' возвращается 0, то звук нельзя запустить (звуковая карта занята, нет звуковой карты в системе, и т.д.). Эта функция должна всегда вызываться, перед любой другой звуковой функцией и всегда необходимо проверять результат. Если звуковая среда неможет быть активирована, необходимо отключить все вызовы звуковых функций.

Possible causes of failure under MS Windows: DirectX 7 isn't available or no sound card are present. If the program need to run on NT4.0, be sure to enable the 'NT4.0 Compliant executable' in the compiler options.


IsSound

IsSound()

Синтаксис

Result = IsSound(#Sound)
Описание
Проверяет номер #Sound, является ли он корректным и правильно инициализированным звуком. Эта функция может использоваться с любым значением. Если 'Result' не равен нулю, то объект правильный и инициализирован. Это - идеальный способ гарантировать, что звук готов к использованию.


LoadSound

LoadSound()

Синтаксис

Result = LoadSound(#Sound, Filename$ [, Flags])
Описание
Загружает WAV или любой другой формат, поддерживаемый библиотекой SoundPlugin. Если используется #PB_Any, как параметр '#Sound', то в 'Result', будет возвращен номер звука присвоенный РВ. Если 'Result' не равен 0, то звук загружен и готов к использованию командой PlaySound(), иначе звук загрузить не удалось.

Необязательный параметр 'Flags', может быть сочетанием следующих значений:
  #PB_Sound_Streaming: Включает потоковое воспроизведение (поддерживаются только FLAC и OGG))
Следующие функции могут использоваться, чтобы активировать большее количество звуковых форматов:

UseFLACSoundDecoder()
UseOGGSoundDecoder()


PlaySound

PlaySound()

Синтаксис

Result = PlaySound(#Sound [, Flags])
Описание
Воспроизводит указанный звук. 'Flags' является дополнительным параметром и может быть комбинацией следующих значений:
  #PB_Sound_Loop        : непрерывно играет звук (перезагружает его, как только будет достигнут конец)
  #PB_Sound_MultiChannel: запускает параллельное воспроизведение, т.е. не останавливает
        воспроизведение других звуков. Это позволяет использовать один и тот же звук на
        разных каналах. 'Result' будет новым выделенным каналом, и может использоваться
        другими командами: SoundVolume(), SoundFrequency(), SoundPan() и StopSound().


SoundFrequency

SoundFrequency()

Синтаксис

SoundFrequency(#Sound, Frequency [, Channel])
Описание
Устанавливает новую частоту (в Герцах), для #Sound,в реальном времени. Частота сохраняется для каждого #Sound, поэтому нет необходимости назначать её каждый раз. Допустимые значения от 1000 Гц до 100000 Гц.

'Channel' является дополнительным параметром и определяет, на каком канале должна быть изменена звуковая частота. 'Channel' доступен при использовании PlaySound() с параметром #PB_Sound_MultiChannel.

Поддерживаемые ОС

Windows


SoundPan

SoundPan()

Синтаксис

SoundPan(#Sound, Pan [, Channel])
Описание
Установить новое панорамирование(баланс), для #Sound, в реальном масштабе времени. Значение сохраняется для каждого #Sound, поэтому нет необходимости назначать его каждый раз. Доступные значения от -100 (весь звук на левый динамик) до 100 (весь звук на правый динамик). Если значение Pan=0, тогда звук одинаков на обоих динамиках.

'Channel' является дополнительным параметром и определяет, на каком канале должен быть изменён баланс. 'Channel' доступен при использовании PlaySound() с параметром #PB_Sound_MultiChannel.

Поддерживаемые ОС

Windows, MacOS X


SoundVolume

SoundVolume()

Синтаксис

SoundVolume(#Sound, Volume [, Channel])
Описание
Регулирует громкость, для #Sound, в реальном времени. Значение сохраняется для каждого #Sound, поэтому нет необходимости назначать его каждый раз. Допустимые параметры от 0 (нет звука) до 100 (полная громкость).

'Channel' является дополнительным параметром и определяет, на каком канале должна быть изменена громкость. 'Channel' доступен при использовании PlaySound() с параметром #PB_Sound_MultiChannel.


StopSound

StopSound()

Синтаксис

StopSound(#Sound [, Channel])
Описание
Остановить указанный звук (если он играл). Если #Sound установить в -1, то остановятся все звуки проигрываемые в данный момент.

'Channel' является дополнительным параметром и определяет, на каком канале должен быть остановлен звук. 'Channel' доступен при использовании PlaySound() с параметром #PB_Sound_MultiChannel.


Sound3D

PureBasic - Sound3D

Краткий обзор

The Sound3D library allows to handle sounds in 3D space. For example, it can handle automatic fading depending of the distance. It is based on the regular sound library syntax and behaviour.

It uses the 3D engine, so InitEngine3D() has to be called succesfully before using these functions.

Краткий перечень команд

FreeSound3D
IsSound3D
LoadSound3D
PlaySound3D
SoundCone3D
SoundID3D
SoundRange3D
SoundVolume3D
StopSound3D


FreeSound3D

FreeSound3D()

Синтаксис

FreeSound3D(#Sound3D)
Описание
Stop and remove a sound previously loaded with LoadSound3D() from memory. Once a sound has been freed, it can't be played anymore.

Note: all remaining sounds are automatically freed when the program ends.


IsSound3D

IsSound3D()

Синтаксис

Result = IsSound3D(#Sound3D)
Описание
Tests if the given #Sound3D number is a valid and correctly initialized sound. This function is bullet-proof and can be used with any value. If the 'Result' is not zero then the object is valid and initialized, else it returns zero. This is the correct way to ensure than a sound is ready to use.


LoadSound3D

LoadSound3D()

Синтаксис

Result = LoadSound3D(#Sound3D, Filename$ [, Flags])
Описание
Load a WAV or an OGG sound file into memory. The sound has to be mono, as stereo sounds doesn't allow space positioning. If #PB_Any is used as '#Sound3D' parameter, the new sound number will be returned as 'Result'. If the 'Result' is not 0, the sound has been correctly loaded and is ready to be played with the function PlaySound3D(), else the sound loading has failed.

The 'Flags' optional parameter can be a combination of the following values:
  #PB_Sound3D_Streaming: Enable sound streaming playback
Note: a sound doesn't hold its position. It can be attached to a node object to have its own position.


PlaySound3D

PlaySound3D()

Синтаксис

Result = PlaySound3D(#Sound3D [, Flags])
Описание
Start to play the specified sound. 'Flags' is optional and can be a combination of the following values:
  #PB_Sound3D_Loop: play the sound continuously (starts again when end is reached)


SoundCone3D

SoundCone3D()

Синтаксис

SoundCone3D(#Sound3D, InnerCone.f, OuterCone.f, OuterConeVolume)
Описание
Set the cone angle, to create a directional sound. The 'InnerCone' and 'OuterCone' value determine the cone angle (values are from 0 to 360). 'OuterConeVolume' is the sound volume outside of the cone (values are from 0 to 100).


SoundID3D

SoundID3D()

Синтаксис

SoundID3D = SoundID3D(#Sound3D)
Описание
Returns the unique ID which identifies the given '#Sound3D' in the operating system. This function is very useful when another library needs a window reference.


SoundRange3D

SoundRange3D()

Синтаксис

SoundRange3D(#Sound3D, Minimum, Maximum)
Описание
Set the range, in world units, for the sound emission. The 'Minimum' distance is the distance from the sound location when the sound volume starts fading. The 'Maximum' distance is the distance from the sound location when the sound can still be heard. Above this distance, the sound will stop playing. Between these two value, the sound will fade according to the current listener position. The first camera is the sound listener.


SoundVolume3D

SoundVolume3D()

Синтаксис

SoundVolume3D(#Sound3D, Volume)
Описание
Set the new volume, in realtime, for the #Sound3D. The volume value is saved for the #Sound3D, so it's not needed to call it everytime. The valid values are from 0 (no volume) to 100 (full volume).


StopSound3D

StopSound3D()

Синтаксис

StopSound3D(#Sound3D)
Описание
Stop the specified sound (if it was playing). If the #Sound3D value is -1, then all sounds currently playing are stopped.


SoundPlugin

PureBasic - SoundPlugin

Краткий обзор

PureBasic поддерживает различные звуковые форматы файлов, благодаря системе плагинов. Это означает, что в исполняемый файл добавляется только нужный кодер или декодер, что значительно сокращает его размер. Например, если вам нужен только OGG формат, то будет использоваться только кодер или декодер OGG формата. Другой интересной особенностью является автоматическое определение формата файла, если используются несколько плагинов. Следующие функции поддерживают плагины звука: LoadSound() и CatchSound().

Краткий перечень команд

UseFLACSoundDecoder
UseOGGSoundDecoder


UseFLACSoundDecoder

UseFLACSoundDecoder()

Синтаксис

UseFLACSoundDecoder()
Описание
Активирует поддержку FLAC (Free Lossless Audio Codec) для функций CatchSound() и LoadSound().

Поскольку FLAC сжимает без потерь, размер файла будет большим, особенно по сравнению с форматом OGG. Это позволяет уменьшить размер файла, с сохранением всей оригинальной звуковой информации. Для получения дополнительной информации смотрите: Wikipedia - FLAC.

Этим плагином поддерживается потоковое аудио.


UseOGGSoundDecoder

UseOGGSoundDecoder()

Синтаксис

UseOGGSoundDecoder()
Описание
Активирует поддержку OGG (OGG Vorbis) для функций CatchSound() и LoadSound().

Формат OGG использует разрушительное сжатие (с потерями), которое влечет за собой потерю некоторой исходной информации, во время сжатия. В настоящее время это один из наилучших имеющихся алгоритмов сжатия с потерями, превосходя стандарт MP3 как по качеству, так и по размеру. Для получения дополнительной информации смотрите: Wikipedia - OGG.

Этим плагином поддерживается потоковое аудио.


Sprite

PureBasic - Sprite

Краткий обзор

Спрайты ('Sprites') хорошо знакомы игрокам в компьютерные игры. Это маленькие картинки, которые могут отображаться в любой позиции на экране. Спрайты можно двигать поверх графики с помощью прозрачного слоя. Более того, PureBasic позволяет вам задействовать в реальном времени эффекты вроде Тени (Shadow), Наложения с прозрачностью (AlphaBlending), Цветные Фильтры (RGBFilters), Канала прозрачности (Alpha channel), ... всё это в оконном или полноэкранном режиме!

Так как спрайты сильно связаны с экраном, функции, относящиеся к работе с экраном были включены в библиотеку работы со спрайтами (возможно, позднее это изменится). После инициализации экрана и модуля работы со спрайтами с помощью функции InitSprite() вы можете начать с открытия full-size или windowed экрана.

Windows: для работы со спрайтами используется DirectX 9, что позволяет вашим программам использовать аппаратное ускорение, если оно доступно. Если понадобится, в вашем распоряжении есть ещё три Subsystems: "OpenGL", "DirectX7" и "NT4"

Linux: для работы со спрайтами используется SDL (Simple Directmedia Layer). Это позволяет вашим программам использовать аппаратное ускорение, если оно доступно. Также в вашем распоряжении есть Subsystem "OpenGL", использующая OpenGL для реализации всех функций работы со спрайтами и трехмерными спрайтами (sprite3D).

MacOS X: для работы со спрайтами используется OpenGL, что позволяет использовать аппаратное ускорение.

Краткий перечень команд

AvailableScreenMemory
CatchSprite
ChangeAlphaIntensity
ChangeGamma
ClearScreen
ClipSprite
CloseScreen
CopySprite
CreateSprite
DisplayAlphaSprite
DisplayRGBFilter
DisplayShadowSprite
DisplaySolidSprite
DisplaySprite
DisplayTranslucentSprite
DisplayTransparentSprite
ExamineScreenModes
FlipBuffers
FreeSprite
GrabSprite
InitSprite
IsScreenActive
IsSprite
LoadSprite
NextScreenMode
OpenScreen
OpenWindowedScreen
SaveSprite
ScreenID
ScreenModeDepth
ScreenModeHeight
ScreenModeRefreshRate
ScreenModeWidth
ScreenOutput
SetFrameRate
SpriteCollision
SpriteDepth
SpriteHeight
SpriteID
SpriteOutput
SpritePixelCollision
SpriteWidth
StartSpecialFX
StopSpecialFX
TransparentSpriteColor
UseBuffer

Примеры

Sprite.pb
WindowedScreen.pb

Поддерживаемые ОС

Все

Reference Manual - Index


AvailableScreenMemory

AvailableScreenMemory()

Синтаксис

Result = AvailableScreenMemory()
Описание
Возвращает количество видеопамяти, доступное для спрайтов и других видеоданных (в байтах). Эта функция должны вызываться только после функции OpenScreen() или OpenWindowedScreen().

Поддерживаемые ОС

Windows (DirectX), Linux (SDL)


CatchSprite

CatchSprite()

Синтаксис

Result = CatchSprite(#Sprite, MemoryAddress [, Mode])
Описание
Загружает заданный спрайт из данной области памяти. Если для параметра '#Sprite' задано значение #PB_Any, в 'Result' возвращается номер нового спрайта. Перед загрузкой спрайта экран должен быть открыт с помощью функции OpenScreen() или OpenWindowedScreen(). В случае ошибки возвращается значение 0. Спрайты могут быть в формате (глубина цвета 1 бит, 4 бита, 8 бит, 16 бит, 24 бита или 32 бита, в несжатом (не RLE виде) или любом другом формате, поддерживаемом библиотекой ImagePlugin. Захваченный спрайт можно освободить с помощью функции FreeSprite(). Функция CatchSprite() полезна при использовании ключевого слова PureBasic 'IncludeBinary'. Изображения могут быть упакованы внутрь исполняемого файла. Всё же используйте эту возможность очень осторожно, так как она расходует больше памяти, чем хранение спрайта во внешнем файле (спрайт займёт место в образе исполняемого файла в памяти, да ещё будет загружен в физическую память). Чтобы включить автоматическую поддержку большего количества форматов изображения, можно воспользоваться следующими функциями:

UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()

Параметр 'Mode' необязателен и может принимать следующие значения (сочетаемые с помощью оператора '|'):
  0                       : Режим по умолчанию. Спрайт размещается в видеопамяти (если возможно)
  #PB_Sprite_Memory       : Спрайт загружается в основную память компьютера (для спецэффектов (SpecialFX))
  #PB_Sprite_Alpha        : Спрайт в формате 8 бит в оттенках серого, будет использоваться с функцией DisplayAlphaSprite() или DisplayShadowSprite()
  #PB_Sprite_Texture      : Спрайт создаётся с поддержкой 3D - полезно для функции CreateSprite3D() из библиотеки Sprite3D.
  #PB_Sprite_AlphaBlending: Спрайт создаётся с поддержкой канала прозрачности для каждого пикселя, формат изображения должен поддерживать это (только
                            PNG и TIFF). Флаг #PB_Sprite_Texture также должен быть задан, а спрайт
                            должен отображаться с помощью функции DisplaySprite3D().
Пример:
  CatchSprite(0, ?Pic)
  End

  Pic: IncludeBinary "Sprite.bmp"
Примечание: Символ "?" обозначает указатель на метку. Дополнительную информацию об указателях и доступе к памяти вы найдёте в разделе на эту тему здесь.

При использовании 8-битных режимов экрана (256 цветов с палитрой), только 8-битный BMP принимается как формат спрайтов. Форматы библиотеки ImagePlugins или BMP с другим форматом цвета не поддерживаются.


ChangeAlphaIntensity

ChangeAlphaIntensity()

Синтаксис

ChangeAlphaIntensity(R, G, B)
Описание
Изменяет прозрачность (AlphaIntensity) независимо, для каждого из каналов цвета - Красного (Red), Зелёного (Green) и Синего (Blue). Используется вместе с функцией DisplayAlphaSprite(). Это значит, что прозрачный спрайт (AlphaSprite) можно отобразить в красном, зелёном или любом цвете вместо прозрачности. Это позволяет делать отличные эффекты в реальном времени.


ChangeGamma

ChangeGamma()

Синтаксис

ChangeGamma(RedIntensity, GreenIntensity, BlueIntensity)
Описание
Изменяет яркость (Gamma) для текущего экрана. Работает только в полноэкранном режиме (не в оконном). Для цветовых каналов Красного, Зелёного и Синего можно изменить яркость индивидуально. Корректные значения для каждого канала от 0 до 255. С помощью этой функции можно сделать полноэкранное постепенное появление/исчезновение, мерцание цветов и т.д.. Если она ничего не делает, значит нет аппаратной поддержки (эмуляция не предусмотрена из-за большого числа операций, требуемых для программной реализации этих эффектов).
  ChangeGamma(255, 255, 0)   ; Will remove completely the blue channel from the screen

Поддерживаемые ОС

Windows (DirectX)


ClearScreen

ClearScreen()

Синтаксис

ClearScreen(Color)
Описание
Заливает весь экран заданным цветом 'color'. Чтобы получить корректное значение цвета, можно воспользоваться функцией RGB(). Таблица с основными цветами находится здесь.

Примечание: функция ClearScreen() должна вызываться за пределами программного блока StartDrawing() : StopDrawing().


ClipSprite

ClipSprite()

Синтаксис

Result = ClipSprite(#Sprite, x, y, Width, Height)
Описание
Добавляет зону отсечения на заданный спрайт. Например, если размеры спрайта 100*100 (ширина Width * высота Height) и добавляется зона отсечения x=10, y=10, Width=20, Height=20, то при отображении спрайта будет отображена только прямоугольная область от x=10, y=10 с шириной=20 и высотой=20. Чтобы удалить отсечение на спрайте #Sprite, воспользуйтесь константой #PB_Default в качестве значения для параметров 'x', 'y', 'Width' и 'Height'.

Примечание: На некоторых старых видеокартах отсечение с помощью функции ClipSprite() не работает как надо, если спрайт по размерам больше, чем используемый экран. Функция ClipSprite() не имеет никакого эффекта при использовании с Sprite3D.


CloseScreen

CloseScreen()

Синтаксис

CloseScreen()
Описание
Закрывает текущий экран (в оконном или полноэкранном режиме). После закрытия экрана все спрайты должны быть загружены повторно, так как формат экрана утерян, а видеопамять освобождена. Приложение или игра может переключаться между полным экраном и окном на лету без каких-либо проблем.


CopySprite

CopySprite()

Синтаксис

Result = CopySprite(#Sprite1, #Sprite2 [, Mode])
Описание
Копирует спрайт #Sprite1 в спрайт #Sprite2. Если для параметра '#Sprite2' задано значение #PB_Any , в 'Result' возвращается номер нового спрайта. Если спрайт #Sprite2 не существовал, он будет создан.

Параметр 'Mode' необязателен и может принимать следующие значения (сочетаемые с помощью оператора '|'):
  0                       : Режим по умолчанию. Спрайт размещается в видеопамяти (если возможно)
  #PB_Sprite_Memory       : Спрайт загружается в основную память компьютера (для спецэффектов (SpecialFX))
  #PB_Sprite_Alpha        : Спрайт в формате 8 бит в оттенках серого, будет использоваться с функцией DisplayAlphaSprite() или DisplayShadowSprite()
  #PB_Sprite_Texture      : Спрайт создаётся с поддержкой 3D - полезно для функции CreateSprite3D() из библиотеки Sprite3D.
  #PB_Sprite_AlphaBlending: Спрайт создаётся с поддержкой канала прозрачности для каждого пикселя, формат изображения должен поддерживать это (только
                            PNG и TIFF). Флаг #PB_Sprite_Texture также должен быть задан, а спрайт
                            должен отображаться с помощью функции DisplaySprite3D().


CreateSprite

CreateSprite()

Синтаксис

Result = CreateSprite(#Sprite, Width, Height [, Mode])
Описание
Создаёт пустой спрайт с данными размерами Width и Height. Если для параметра '#Sprite' задано значение #PB_Any, в 'Result' возвращается номер нового спрайта.

Параметр 'Mode' необязателен и может принимать следующие значения:
  0                       : Режим по умолчанию. Спрайт размещается в видеопамяти (если возможно)
  #PB_Sprite_Memory       : Спрайт загружается в основную память компьютера (для спецэффектов (SpecialFX))
  #PB_Sprite_Alpha        : Спрайт в формате 8 бит в оттенках серого, будет использоваться с функцией DisplayAlphaSprite() или DisplayShadowSprite()
  #PB_Sprite_Texture      : Спрайт создаётся с поддержкой 3D - полезно для функции CreateSprite3D() из библиотеки Sprite3D.
  #PB_Sprite_AlphaBlending: Спрайт создаётся с поддержкой канала прозрачности для каждого пикселя, формат изображения должен поддерживать это (только
                            PNG и TIFF). Флаг #PB_Sprite_Texture также должен быть задан, а спрайт
                            должен отображаться с помощью функции DisplaySprite3D().


DisplayAlphaSprite

DisplayAlphaSprite()

Синтаксис

DisplayAlphaSprite(#Sprite, x, y)
Описание
Отображает спрайт #Sprite в заданной позиции на текущем экране. Цвет 128,128,128 (серый) считается прозрачным цветом (этот цвет не отображается). Спрайт эмулирует канал прозрачности (AlphaChannel)', поэтому с ним возможны все трюки, рассчитанные на этот канал. Спрайт должен быть 8-битный (256 цветов), в одних лишь оттенках серого цвета. На этом спрайте любой оттенок серого яркостью меньшей 128,128,128 делает область всё более темной, а каждый оттенок ярче 128,128,128 делает область всё более яркой. Это позволяет вашей программе делать очень крутые эффекты в реальном времени, такие как мягкие тени и т.д.. возможности огромны. С помощью функции ChangeAlphaIntensity() можно контролировать каждый цветовой компонент (R,G,B) канала прозрачности. Спрайт должен быть загружен с помощью функции LoadSprite() с использованием флага #PB_Sprite_Alpha. Эта функция учитывает отсечение, так что вполне допустимо отображать спрайты за пределами экрана.

Эта функция работает намного быстрее, если использована функция StartSpecialFX().


DisplayRGBFilter

DisplayRGBFilter()

Синтаксис

DisplayRGBFilter(x, y, Width, Height, R, G, B)
Описание
Отображает (просвечивающий) цветовой фильтр поверх экрана. Это позволяет вам очень быстро, отображать прямоугольные области любого цвета.

Эта функция работает намного быстрее, если использована функция StartSpecialFX().


DisplayShadowSprite

DisplayShadowSprite()

Синтаксис

DisplayShadowSprite(#Sprite, x, y)
Описание
Отображает спрайт #Sprite в заданной позиции на текущем экране. Цвет 0 считается прозрачным (этот цвет не отображается). Спрайт отображается как тень, с использованием более быстрого алгоритма, чем функция DisplayAlphaSprite(), но только для оттенков одного цветового компонента. Спрайт должен быть 8-битный (256 цветов). Он должен быть загружен с помощью функции LoadSprite() с использованием флага #PB_Sprite_Alpha. Эта функция учитывает отсечение, так что вполне допустимо отображать спрайты за пределами экрана.

Эта функция работает намного быстрее, если использована функция StartSpecialFX().


DisplaySolidSprite

DisplaySolidSprite()

Синтаксис

DisplaySolidSprite(#Sprite, x, y, Color)
Описание
Отображает спрайт #Sprite в заданной позиции на текущем экране. Цвет 0 считается прозрачным (этот цвет не отображается).

Спрайт отображается одним цветом 'Color'. Чтобы получить корректное значение цвета, можно использовать функцию RGB(). Таблица с основными цветами находится здесь.

Спрайт должен быть 8-битный (256 цветов). Он должен быть загружен с помощью функции LoadSprite() с использованием флага #PB_Sprite_Alpha. Эта функция учитывает отсечение, так что вполне допустимо отображать спрайты за пределами экрана.

Эта функция работает намного быстрее, если использована функция StartSpecialFX().


DisplaySprite

DisplaySprite()

Синтаксис

DisplaySprite(#Sprite, x, y)
Описание
Отображает спрайт #Sprite в заданной позиции на текущем экране. Без какого-либо прозрачного цвета. Эта функция учитывает отсечение, так что вполне допустимо отображать спрайты за пределами экрана.


DisplayTranslucentSprite

DisplayTranslucentSprite()

Синтаксис

DisplayTranslucentSprite(#Sprite, x, y, Intensity)
Описание
Отображает спрайт #Sprite в заданной позиции на текущем экране. Цвет 0 считается прозрачным (этот цвет не отображается). Параметр intensity задаёт прозрачность спрайта над фоном. Значение параметра Intensity может быть от 0 (полностью прозрачно) до 255 (непрозрачно). Этот эффект также известен как наложение с эффектом прозрачности ('AlphaBlending'). Эта функция учитывает отсечение, так что вполне допустимо отображать спрайты за пределами экрана.

Эта функция работает намного быстрее, если использована функция StartSpecialFX().


DisplayTransparentSprite

DisplayTransparentSprite()

Синтаксис

DisplayTransparentSprite(#Sprite, x, y)
Описание
Отображает спрайт #Sprite в заданной позиции на текущем экране. Прозрачный цвет по умолчанию 0 (чёрный - этот цвет не отображается). Можно сменить прозрачный цвет с помощью функции TransparentSpriteColor(). Эта функция учитывает отсечение, так что вполне допустимо отображать спрайты за пределами экрана.


ExamineScreenModes

ExamineScreenModes()

Синтаксис

Result = ExamineScreenModes()
Описание
Начинает просмотр доступных режимов экрана локального компьютера. Список режимов экрана можно получить с помощью функции NextScreenMode(). Если 'Result' равен 0, режимы экрана просмотреть невозможно.


FlipBuffers

FlipBuffers()

Синтаксис

FlipBuffers()
Описание
Переключает задний и передний буферы текущего экрана. Невидимая область становится видимой и наоборот, что позволяет вам получить эффект 'двойной буферизации' (отображения графики без моргания). Экран должен быть ранее открыт с помощью функции OpenScreen() или OpenWindowedScreen(). Способ переключения буфера (с синхронизацией или без) задаётся функцией OpenScreen() или OpenWindowedScreen().

Примечание: функция FlipBuffers() должна вызываться за пределами программного блока StartDrawing() : ... : StopDrawing().


FreeSprite

FreeSprite()

Синтаксис

FreeSprite(#Sprite)
Описание
Удаляет заданный спрайт из памяти. Более невозможно обращаться к спрайту после вызова этой функции.

Примечание: все оставшиеся в памяти спрайты автоматически удаляются по окончании работы программы.


GrabSprite

GrabSprite()

Синтаксис

Result = GrabSprite(#Sprite, x, y, Width, Height [, Mode])
Описание
Захватывает изображение с экрана из области x, y, Width, Height, и создаёт новый спрайт #Sprite. Если для параметра '#Sprite' задано значение #PB_Anyв 'Result' возвращается номер нового спрайта.

Параметр 'Mode' необязателен и может принимать следующие значения:
  0                       : Режим по умолчанию. Спрайт размещается в видеопамяти (если возможно)
  #PB_Sprite_Memory       : Спрайт загружается в основную память компьютера (для спецэффектов (SpecialFX))
  #PB_Sprite_Alpha        : Спрайт в формате 8 бит в оттенках серого, будет использоваться с функцией DisplayAlphaSprite() или DisplayShadowSprite()
  #PB_Sprite_Texture      : Спрайт создаётся с поддержкой 3D - полезно для функции CreateSprite3D() из библиотеки Sprite3D.
Примечание: функция GrabSprite() должна вызываться за пределами программного блока StartDrawing() : StopDrawing().


InitSprite

InitSprite()

Синтаксис

Result = InitSprite()
Описание
Инициализирует модуль работы со спрайтами и подготавливает его к дальнейшему использованию. Вы должны поместить вызов этой функции перед функциями работы со спрайтами.

Значение Result будет равно 0, если инициализация модуля работы со спрайтами не удалась. Вам следует всегда проверять этот результат, чтобы знать, что модуль работы со спрайтами инициализирован корректно. Если это не так, вы должны завершить программу или отключить все вызовы функций работы со спрайтами. Эта функция пытается инициализировать DirectX 7, так что если она не справится, это наверно потому, что DirectX не обнаружен или установлена более ранняя версия.


IsScreenActive

IsScreenActive()

Синтаксис

Result = IsScreenActive()
Описание
Игры и полноэкранные приложения, использующие функции PureBasic, выполняются в многозадачном окружении (AmigaOS, Windows или Linux). Это означает, что пользователь может переключиться с полного экрана обратно на обычный рабочий стол. Такое изменение ситуации можно обнаружить с помощью этой функции и принять надлежащие меры, такие как ReleaseMouse(), сделать паузу в игре, остановить звуки и т.д.. Если значение 'Result' равно 0, то экран более не активен, иначе экран активен. Эту функцию следует вызвать после функции FlipBuffers(), так как внутри функции FlipBuffers() обрабатываются события.


IsSprite

IsSprite()

Синтаксис

Result = IsSprite(#Sprite)
Описание
Проверяет, соответствует ли данный номер объекта #Sprite корректному и правильно инициализированному спрайту. Эта функция абсолютно надёжна, ей можно передать любое значение. Если значение 'Result' не ноль, значит объект корректен и инициализирован, иначе функция возвратит ноль. Это корректный способ убедиться, что спрайт готов к использованию.


LoadSprite

LoadSprite()

Синтаксис

Result = LoadSprite(#Sprite, Filename$ [, Mode])
Описание
Загружает заданный спрайт в память для непосредственного использования. Если для параметра '#Sprite' задано значение #PB_Any, в 'Result' возвращается номер нового спрайта.

Спрайт может быть в формате BMP (глубина цвета 1 бит, 4 бита, 8 бит, 16 бит, 24 бита или 32 бита, в несжатом (не RLE виде) или любом другом формате, поддерживаемом библиотекой ImagePlugin.

Перед загрузкой спрайта экран должен быть открыт с помощью функции OpenScreen() или OpenWindowedScreen(). В случае ошибки возвращается значение 0, иначе спрайт был загружен успешно. Загруженный спрайт можно освободить с помощью функции FreeSprite(). Чтобы включить автоматическую поддержку большего количества форматов изображения, можно воспользоваться следующими функциями:

UseJPEGImageDecoder()
UseJPEGImage2000Decoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()

Параметр 'Mode' необязателен и может принимать следующие значения (сочетаемые с помощью оператора '|'):
  0                       : Режим по умолчанию. Спрайт размещается в видеопамяти (если возможно)
  #PB_Sprite_Memory       : Спрайт загружается в основную память компьютера (для спецэффектов (SpecialFX))
  #PB_Sprite_Alpha        : Спрайт в формате 8 бит в оттенках серого, будет использоваться с функцией DisplayAlphaSprite() или DisplayShadowSprite()
  #PB_Sprite_Texture      : Спрайт создаётся с поддержкой 3D - полезно для функции CreateSprite3D() из библиотеки Sprite3D.
  #PB_Sprite_AlphaBlending: Спрайт создаётся с поддержкой канала прозрачности для каждого пикселя, формат изображения должен поддерживать это (только
                            PNG и TIFF). Флаг #PB_Sprite_Texture также должен быть задан, а спрайт
                            должен отображаться с помощью функции DisplaySprite3D().
Примечание: Спрайты не должны быть больше по размерам, чем экран в используемом режиме экрана. Использование спрайтов большего размера возможно работает на каком-то железе, на другом не работает. Лучше разделите ваш большой спрайт на несколько спрайтов поменьше.

При использовании 8-битных режимов экрана (256 цветов с палитрой), только 8-битный BMP принимается как формат спрайтов. Форматы библиотеки ImagePlugins или BMP с другим форматом цвета не поддерживаются.


NextScreenMode

NextScreenMode()

Синтаксис

Result = NextScreenMode()
Описание
Эту функцию следует вызывать после функции ExamineScreenModes(). Она пройдёт шаг за шагом список просмотра режимов экрана. Информацию о текущем режиме экрана можно получить с помощью следующих функций: ScreenModeWidth(), ScreenModeHeight(), ScreenModeDepth() и ScreenModeRefreshRate(). Если значение 'Result' равно 0, просмотр режимов экрана закончен.

Пример:
  InitSprite()

  If ExamineScreenModes()
    While NextScreenMode()
      Debug Str(ScreenModeWidth())+"x"+Str(ScreenModeHeight())+"x"+Str(ScreenModeDepth())+"@"+Str(ScreenModeRefreshRate())+"Hz"
    Wend
  EndIf


OpenScreen

OpenScreen()

Синтаксис

Result = OpenScreen(Width, Height, Depth, Title$ [, FlipMode [, RefreshRate])
Описание
Открывает новый экран согласно заданным значениям параметров 'Width', 'Height' и 'Depth'. Открываемый экран создаётся с 2 видеобуферами, чтобы позволить вам реализовать двойную буферизацию, особенно полезно для игр. Буферами можно манипулировать с помощью функции FlipBuffers(). Если экран открыть не удалось, значение Result равно '0'.

Параметры ширины Width и высоты Height должны содержать стандартные комбинации: 640*480, 800*600, 1024*768...

Параметр глубины цвета Depth может принимать следующие значения:
  4 :    16 цветов, независимая палитра
  8 :   256 цветов, независимая палитра
  16: 65000 цветов, фиксированная палитра
  24: 16 Mo цветов, фиксированная палитра
  32: 16 Mo цветов, быстрее чем 24-битный режим
Необязательный параметр 'FlipMode' позволяет дожидаться или не дожидаться синхронизации экрана перед переключением буферов с помощью функции FlipBuffers() (также известно как 'сигнал вертикальной синхронизации (Vertical blank synchronization)'). Он может иметь одно из следующих значений:
   #PB_Screen_NoSynchronization   : отключить синхронизацию
   #PB_Screen_WaitSynchronization : включить синхронизацию (значение по умолчанию)
   #PB_Screen_SmartSynchronization: включить синхронизацию, с отдачей процессорного времени когда программа не потребляет
                                    его полностью (только полноэкранный режим)
Ожидание синхронизации экрана позволяет выполнять переключение буферов идеально (без 'разрывов' или других видимых огрехов), потому что переключение выполняется когда экран полностью отрисован (или рисуемая область за пределами видимой области экрана). Также это привязывает процесс переключения к обновлению экрана, например: для экрана с частотой 60 Гц можно делать максимум 60 переключений в секунду, и т.д..

Для нового экрана можно задать необязательный параметр частоты 'RefreshRate' (в Гц). Если заданное значение не поддерживается, функция OpenScreen() завершится с ошибкой.
Примечание: в Windows частота обновления может быть жёстко задана драйвером видеокарты, поэтому значение может быть неточным.

Примечание: в Windows параметр 'Title$' будет отображаться на панели задач, так что рекомендуется использовать заголовок, связанный с названием приложения. Функции Requester невозможно использовать с экранами, созданными с помощью функции OpenScreen.

Чтобы открыть экранную область в обычном окне, смотрите описание функции OpenWindowedScreen().


OpenWindowedScreen

OpenWindowedScreen()

Синтаксис

Result = OpenWindowedScreen(WindowID, x, y, Width, Height, AutoStretch, RightOffset, BottomOffset [, FlipMode])
Описание
Открывает новую экранную область согласно данным параметрам в данном окне Window, которое должно быть открыто перед этим с помощью функции OpenWindow(). Такой "оконный экран" может использовать аппаратное ускорение точно так же, как полноразмерный, открываемый функцией OpenScreen().

Если значение параметра AutoStretch равно 1, экранная область будет автоматически подгоняться под новые размеры (а её содержимое будет масштабироваться под новый размер экрана), когда размер окна изменяется.

Параметры RightOffset и BottomOffset служат для задания отступа справа и снизу в окне (для statusbar, например).

Необязательный параметр 'FlipMode' позволяет дожидаться или не дожидаться синхронизации экрана перед переключением буферов с помощью функции FlipBuffers() (также известно как 'сигнал вертикальной синхронизации'). Он может иметь одно из следующих значений:
   #PB_Screen_NoSynchronization   : отключить синхронизацию
   #PB_Screen_WaitSynchronization : включить синхронизацию (значение по умолчанию)
   #PB_Screen_SmartSynchronization: включить синхронизацию, с отдачей процессорного времени когда программа не потребляет
                                    его полностью (только полноэкранный режим)
Ожидание синхронизации экрана позволяет выполнять переключение буферов идеально (без 'разрывов' или других видимых огрехов), потому что переключение выполняется когда экран полностью отрисован (или рисуемая область за пределами видимой области экрана). Также это привязывает процесс переключения к обновлению экрана, например: для экрана с частотой 60 Гц можно делать максимум 60 переключений в секунду, и т.д..

Открываемый экран создаётся с 2 видеобуферами, чтобы позволить вам реализовать двойную буферизацию, особенно полезно для игр. Буферами можно манипулировать с помощью функции FlipBuffers().

Если экран открыть не удалось, значение Result равно '0'.

Примечание: В одном окне можно открыть только один экран
Пример1: (неизменяемый размер экрана и гаджеты)
  If InitSprite() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
  EndIf

  If OpenWindow(0, 0, 0, 220, 160, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0, 170, 135, 45, 20, "Quit")

    If OpenWindowedScreen(WindowID(0), 0, 0, 160, 160, 0, 0, 0)
      CreateSprite(0, 20, 20)
      If StartDrawing(SpriteOutput(0))
        Box(0, 0, 20, 20, RGB(255, 0, 155))
        Box(5, 5, 10, 10, RGB(155, 0, 255))
        StopDrawing()
      EndIf
    Else
      MessageRequester("Error", "Can't open windowed screen!", 0)
      End
    EndIf
  EndIf

  direction = 2
  Repeat
    ; It's very important to process all the events remaining in the queue at each frame
    ;
    Repeat
      Event = WindowEvent()

      Select Event
        Case #PB_Event_Gadget
          If EventGadget() = 0
            End
          EndIf

        Case #PB_Event_CloseWindow
          End
      EndSelect
    Until Event = 0

    FlipBuffers()
    ClearScreen(RGB(0, 0, 0))
    DisplaySprite(0, x, x)
    x + direction
    If x > 140 : direction = -2 : EndIf
    If x < 0   : direction =  2 : EndIf
    Delay(1)
  ForEver

Пример 2: (экран с растягиванием и отступом снизу)
  If InitSprite() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
  EndIf

  If OpenWindow(0, 0, 0, 320, 200, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
    CreateStatusBar(0, WindowID(0))
      AddStatusBarField(320)

    StatusBarText(0, 0, "Automatically zoomed screen area when changing window size...")

    If OpenWindowedScreen(WindowID(0), 0, 0, 320, 200, 1, 0, 20)  ; we don't need exact screen width/height, because it will be automatically stretched...

      CreateSprite(0, 50, 50) ; Create an empty sprite, will be whole black

      Repeat
        ; It's very important to process all the events remaining in the queue at each frame
        ;
        Repeat
          Event = WaitWindowEvent(10)

          If Event = #PB_Event_CloseWindow
            End
          EndIf
        Until Event = 0

        FlipBuffers()
        ClearScreen(RGB(0, 0, 200)) ; A blue background

        DisplaySprite(0, 10, 10)  ; Display our black box at the left-top corner
        DisplaySprite(0, 260, 10) ; Display our black box at the right-top corner
      ForEver

    Else
      MessageRequester("Error", "Can't open windowed screen!", 0)
    EndIf
  EndIf

Более подробный пример смотрите в файле
WindowedScreen.pb


SaveSprite

SaveSprite()

Синтаксис

Result = SaveSprite(#Sprite, Filename$ [, ImagePlugin [, Flags]])
Описание
Сохраняет заданный спрайт #Sprite в файл. По умолчанию изображение будет в 24-битном BMP формате. Очень полезно для снимков экрана при использовании вместе с функцией GrabSprite() . Если значение 'Result' равно 0, спрайт не был сохранён (диск полон, неправильное имя файла и т.д.). Необязательный параметр 'ImagePlugin' может быть одной из следующих констант:
  #PB_ImagePlugin_BMP     : Сохранить изображение в BMP  (формат по умолчанию)
  #PB_ImagePlugin_JPEG    : Сохранить изображение в JPEG (необходимо использовать функцию UseJPEGImageEncoder())
  #PB_ImagePlugin_JPEG2000: Сохранить изображение в JPEG2000 (необходимо использовать функцию UseJPEGImage2000Encoder())
  #PB_ImagePlugin_PNG     : Сохранить изображение в PNG  (необходимо использовать функцию UsePNGImageEncoder())
Параметр 'Flags' необязательный, зависит от используемого плагина. Пока поддерживается только настройка качества изображения: число от 0 (худшее качество) до 10 (максимальное качество). Только плагины JPEG и JPEG 2000 на данный момент поддерживают его (по умолчанию качество установлено в '7', если не заданы никакие флаги).


ScreenID

ScreenID()

Синтаксис

Result = ScreenID()
Описание
Возвращает идентификатор экрана, полученный от операционной системы (OS ScreenID). В Windows это обычный идентификатор окна WindowID, так что любая функция, которой нужен такой идентификатор, может использовать его, как например функция PlayMovie().

Поддерживаемые ОС

Windows (DirectX), Linux (SDL)


ScreenModeDepth

ScreenModeDepth()

Синтаксис

Depth = ScreenModeDepth()
Описание
Возвращает глубину цвета для текущего режима экрана из списка просмотра функций ExamineScreenModes() и NextScreenMode(). Глубина цвета может быть 8, 15, 16, 24 или 32 бита в зависимости от видеокарты.


ScreenModeHeight

ScreenModeHeight()

Синтаксис

Height = ScreenModeHeight()
Описание
Возвращает высоту (в пикселях) текущего режима экрана из списка просмотра функций ExamineScreenModes() и NextScreenMode().


ScreenModeRefreshRate

ScreenModeRefreshRate()

Синтаксис

RefreshRate = ScreenModeRefreshRate()
Описание
Возвращает частоту смены кадров (в Герцах) текущего режима экрана из списка просмотра функций ExamineScreenModes() and NextScreenMode().
Примечание: В linux, с подсистемой SDL, эта команда всегда возвращает 0.

Поддерживаемые ОС

Windows, Linux (OpenGl), MacOS X


ScreenModeWidth

ScreenModeWidth()

Синтаксис

Width = ScreenModeWidth()
Описание
Возвращает ширину (в пикселях) текущего режима экрана из списка просмотра функций ExamineScreenModes() и NextScreenMode().


ScreenOutput

ScreenOutput()

Синтаксис

OutputID = ScreenOutput()
Описание
Возвращает идентификатор текущего экрана OutputID для выполнения операций двумерного отображения на нём. Эта функция использует библиотеку двумерной графики PureBasic (смотрите StartDrawing())


SetFrameRate

SetFrameRate()

Синтаксис

SetFrameRate(FrameRate)
Описание
Устанавливает частоту смены кадров (в кадрах в секунду) для текущего экрана. Это особенно полезно для оконного режима, в котором нет частоты обновления экрана. Эта функция устанавливает частоту обновления экрана в кадрах в секунду, которая вызывается FlipBuffers().

Поддерживаемые ОС

Windows (DirectX)


SpriteCollision

SpriteCollision()

Синтаксис

Result = SpriteCollision(#Sprite1, x1, y1, #Sprite2, x2, y2)
Описание
Проверяет, перекрываются ли два спрайта. Если нет, значение Result равно 0. Параметры x и y содержат координаты двух спрайтов, ширину и высоту каждого спрайта PureBasic знает сам.

Эта функция сравнивает прямоугольные области, ограничивающие спрайты, давая очень быстрый, но не очень точный результат (в зависимости от формы ваших спрайтов). Очень полезна для быстрых аркадных игр.

Для более точной проверки столкновения воспользуйтесь функцией SpritePixelCollision().


SpriteDepth

SpriteDepth()

Синтаксис

Result = SpriteDepth(#Sprite)
Описание
Возвращает глубину цвета для заданного спрайта.


SpriteHeight

SpriteHeight()

Синтаксис

Result = SpriteHeight(#Sprite)
Описание
Возвращает высоту заданного спрайта в пикселях.


SpriteID

SpriteID()

Синтаксис

SpriteID = SpriteID(#Sprite)
Описание
Возвращает уникальный системный идентификатор спрайта #Sprite.

Возвращаемый результат иногда называют дескриптором ('Handle'). Дополнительную информацию об указателях смотрите в главе Handles and Numbers.


SpriteOutput

SpriteOutput()

Синтаксис

OutputID = SpriteOutput(#Sprite)
Описание
Возвращает идентификатор устройства вывода заданного спрайта для выполнения операций двумерного отображения на нём. Эта функция использует библиотеку двумерной графики PureBasic (смотрите StartDrawing()).

Примечание: Невозможно использовать SpriteOutput() (и как следствие функции библиотеки 2DDrawing) со спрайтами '#PB_Sprite_Alpha'.

Эта команда не поддерживается subsystem OpenGL.


SpritePixelCollision

SpritePixelCollision()

Синтаксис

Result = SpritePixelCollision(#Sprite1, x1, y1, #Sprite2, x2, y2)
Описание
Проверяет, перекрываются ли два спрайта. Если нет, значение result равно 0. Параметры x и y содержат координаты двух спрайтов, ширину и высоту каждого спрайта PureBasic знает сам.

Эта функция выполняет проверку точного столкновения по каждому пикселю с учётом прозрачности, давая более медленный, но очень точный результат. Чтобы оптимизировать сравнение, вы должны всегда убирать как можно больше прозрачных пикселей, так чтобы спрайт заполнял весь свой размер (т.е. не имел широкой прозрачной каймы вокруг собственно изображения спрайта).

Для менее точной, но очень быстрой проверки столкновения, воспользуйтесь функцией SpriteCollision().

Примечание: функция SpritePixelCollision() на данный момент не работает с каналом прозрачности (альфаканалом в PNG, TIFF), он игнорируется.

Поддерживаемые ОС

Windows (DirectX)


SpriteWidth

SpriteWidth()

Синтаксис

Result = SpriteWidth(#Sprite)
Описание
Возвращает ширину заданного спрайта в пикселях.


StartSpecialFX

StartSpecialFX()

Синтаксис

StartSpecialFX()
Описание
PureBasic позволяет вам реализовывать в реальном времени эффекты вроде наложения с прозрачностью, тени, цветового фильтра и т.д.. Эти эффекты отображения сильно нагружают процессор (даже если они хорошо оптимизированы), поэтому для быстроты нужно использовать особый трюк. Функция StartSpecialFX() создаёт буфер в памяти, в котором выполняется всё отображение, а результат затем копируется обратно в видеопамять, когда вызывается функция StopSpecialFX(). Это означает, что аппаратное ускорение (т.е. микросхемы видеокарты) в это время использовать нельзя. Все операции выполняются главным процессором. Важно понимать это, иначе скорость графики в игре сильно упадет.

Все операции со спецэффектами следует сгруппировать и выполнить одновременно (тень, просвечивающий спрайт и т.д). Стандартные спрайты следует отображать после вызова функции StopSpecialFX() чтобы задействовать аппаратное ускорение как обычно. Если вы используете вызов функции ClearScreen(), расположите его внутри блока StartSpecialFX() : ... : StopSpecialFX(). Текущий экран не копируется в буфер (было бы слишком медленно), поэтому удостоверьтесь, что не вызываете никаких функций отображения перед вызовом функции StartSpecialFX(), так как они будут проигнорированы.

Так как все операции выполняются в системной памяти (не в видеопамяти), спрайты следует загружать с флагом #PB_Sprite_Memory, чтобы намного увеличить скорость отображения спрайтов.

функции, использующие режим спецэффектов: DisplayAlphaSprite(), DisplaySolidSprite(), DisplayShadowSprite(), DisplayRGBFilter() and DisplayTranslucentSprite()

Поддерживаемые ОС

Windows (DirectX), Linux (SDL)


StopSpecialFX

StopSpecialFX()

Синтаксис

StopSpecialFX()
Описание
После завершения всех операций отображения (смотрите описание функции StartSpecialFX()), эта функция копирует буфер обратно в видеопамять, после чего снова можно использовать аппаратное ускорение.

Поддерживаемые ОС

Windows (DirectX), Linux (SDL)


TransparentSpriteColor

TransparentSpriteColor()

Синтаксис

TransparentSpriteColor(#Sprite, Color)
Описание
Изменяет прозрачный цвет спрайта (для отображения через функцию DisplayTransparentSprite()). Чтобы получить корректное значение цвета, можно воспользоваться функцией RGB(). Таблица с основными цветами находится здесь.

Если для параметра #Sprite задано значение #PB_Default, цвет по умолчанию (обычно чёрный (0,0,0)) меняется на данный, и все загружаемые впредь спрайты (с помощью функции LoadSprite()) будут использовать этот цвет в качестве прозрачного.


UseBuffer

UseBuffer()

Синтаксис

UseBuffer(#Sprite)
Описание
Меняет буфер отображения по умолчанию (обычно экран) на данный спрайт #Sprite. Это значит, что все последующие вызовы функций DisplaySprite() и ей подобных, будут отображаться на спрайте #Sprite.

Чтобы вернуться к основному буферу экрана, воспользуйтесь значением #PB_Default для параметра #Sprite.

Поддерживаемые ОС

Windows (DirectX), Linux (SDL)


Sprite3D

PureBasic - Sprite3D

Краткий обзор

Библиотека Sprite3D это маленький трёхмерный движок, используемый для отображения двумерных спрайтов с задействованием возможностей нового трёхмерного оборудования, таких как приближение в реальном времени, преобразование координат, прозрачность и так далее. Чтобы узнать больше о спрайтах, прочитайте раздел документации 'Sprite'. Чтобы получить полную мощность этих функций (с трёхмерным ускорением), настоятельно рекомендуется новая графическая карта. Трёхмерные спрайты предоставляются для упрощения реализации нетипичных эффектов, но помните, что они могут накладывать больше ограничений, чем обычный спрайт (например относительно размера).

Краткий перечень команд

CreateSprite3D
DisplaySprite3D
FreeSprite3D
InitSprite3D
IsSprite3D
RotateSprite3D
Sprite3DBlendingMode
Sprite3DQuality
Start3D
Stop3D
TransformSprite3D
ZoomSprite3D

Поддерживаемые ОС

Windows, Linux (OpenGl), MacOS X


CreateSprite3D

CreateSprite3D()

Синтаксис

Result = CreateSprite3D(#Sprite3D, #Sprite)
Описание
Создать трёхмерный спрайт с заданным двумерным спрайтом. Если для параметра '#Sprite3D' задано значение #PB_Any , в 'Result' возвращается новый номер трёхмерного спрайта. Трёхмерный спрайт это только 4 точки (прямоугольник), куда будет наложена текстура. Вы не можете рисовать непосредственно на трёхмерном спрайте.

Текстура на деле есть обычный спрайт, загружаемый с помощью функции LoadSprite() или CatchSprite() или создаваемый с помощью функции CreateSprite() с режимом #PB_Sprite_Texture. Текстура должна быть квадратом одного из следующих размеров: 16*16, 32*32, 64*64, 128*128 или 256*256. Другие размеры могут работать на некоторых конкретных картах, но не на всех.

Если значение 'Result' равно 0, трёхмерный спрайт создать невозможно, иначе всё в порядке.

Двумерный спрайт, использованный для создания трёхмерного спрайта, не должен удаляться пока его использует трёхмерный спрайт. Один двумерный спрайт может использоваться любым количеством трёхмерных спрайтов.

Поддерживаемые ОС

Windows, Linux (OpenGl), MacOS X


DisplaySprite3D

DisplaySprite3D()

Синтаксис

DisplaySprite3D(#Sprite3D, x, y [, Transparency])
Описание
Отобразить заданный трёхмерный спрайт #Sprite3D по данным координатам (x,y). Значение прозрачности Transparency используется и должно быть между 0 и 255. 0 означает невидимый, 255 означает непрозрачный. Можно использовать любые значения в этом диапазоне. Для лучшего отображения настоятельно рекомендуется 32-битный режим экрана для плавного проявления и угасания. Если потребуется с помощью функции Sprite3DQuality() вы можете настроить режим отображения трёхмерного спрайта.

Для отображения спрайта с поддержкой канала прозрачности, спрайт, который был выбран для создания трёхмерного спрайта, должен иметь флаг #PB_Sprite_AlphaBlending.

Перед использованием этой функции должна быть вызвана функция Start3D() . Если следует отобразить несколько трёхмерных спрайтов, намного лучше отобразить их всех одновременно.
Пример:
  Start3D()
    DisplaySprite3D(1, 100, 100, 128)
    DisplaySprite3D(2, 100, 150, 100)
  ; ...
  Stop3D()

Поддерживаемые ОС

Windows, Linux (OpenGl), MacOS X


FreeSprite3D

FreeSprite3D()

Синтаксис

FreeSprite3D(#Sprite3D)
Описание
Удалить заданный спрайт из памяти. Связанный с ним двумерный спрайт не удаляется.

Примечание: все оставшиеся трёхмерные спрайты автоматически удаляются по окончании работы программы.

Поддерживаемые ОС

Windows, Linux (OpenGl), MacOS X


InitSprite3D

InitSprite3D()

Синтаксис

Result = InitSprite3D()
Описание
Попытаться инициализировать работу с трёхмерными спрайтами. Если значение 'Result' равно 0, трёхмерное оборудование (или эмуляция) отсутствует. Перед этой функцией должна быть вызвана функция InitSprite().

Поддерживаемые ОС

Windows, Linux (OpenGl), MacOS X


IsSprite3D

IsSprite3D()

Синтаксис

Result = IsSprite3D(#Sprite3D)
Описание
Проверяет, соответствует ли заданный номер трёхмерного спрайта #Sprite3D корректному и правильно инициализированному объекту трёхмерного спрайта. Эта функция абсолютно надёжна, ей можно передать любое значение. Если значение 'Result' не ноль, значит объект трёхмерного спрайта корректен и инициализирован, иначе функция вернёт ноль. Это корректный способ убедиться, что трёхмерный спрайт готов к использованию.

Поддерживаемые ОС

Windows, Linux (OpenGl), MacOS X


RotateSprite3D

RotateSprite3D()

Синтаксис

RotateSprite3D(#Sprite3D, Angle.f, Mode)
Описание
Поворачивает заданный трёхмерный спрайт #Sprite3D на данный угол 'Angle'. Значение параметра 'Angle' может быть от 0 до 360. Параметр 'Mode' принимает следующие значения:
  #PB_Absolute: задаётся новое значение угла.
  #PB_Relative: угол добавляется к предыдущему углу трёхмерного спрайта #Sprite3D.

Поддерживаемые ОС

Windows, Linux (OpenGl), MacOS X


Sprite3DBlendingMode

Sprite3DBlendingMode()

Синтаксис

Sprite3DBlendingMode(SourceMode, DestinationMode)
Описание
Изменяет способ наложения трёхмерных спрайтов на фон с эффектом прозрачности (при использовании функции DisplaySprite3D() и уровня прозрачности). И режим источника, и режим приёмника могут принимать значения от 1 до 13. Эта функция только для опытных пользователей. Вот список соответствующих значений для DirectX:
  #D3DBLEND_ZERO            = 1
  #D3DBLEND_ONE             = 2
  #D3DBLEND_SRCCOLOR        = 3
  #D3DBLEND_INVSRCCOLOR     = 4
  #D3DBLEND_SRCALPHA        = 5
  #D3DBLEND_INVSRCALPHA     = 6
  #D3DBLEND_DESTALPHA       = 7
  #D3DBLEND_INVDESTALPHA    = 8
  #D3DBLEND_DESTCOLOR       = 9
  #D3DBLEND_INVDESTCOLOR    = 10
  #D3DBLEND_SRCALPHASAT     = 11
  #D3DBLEND_BOTHSRCALPHA    = 12
  #D3DBLEND_BOTHINVSRCALPHA = 13
Примечание: значения по умолчанию это Sprite3DBlendingMode(#D3DBLEND_SRCALPHA, #D3DBLEND_INVSRCALPHA).

Поддерживаемые ОС

Windows, Linux (OpenGl), MacOS X


Sprite3DQuality

Sprite3DQuality()

Синтаксис

Sprite3DQuality(Quality)
Описание
Изменяет способ отображения трёхмерных спрайтов. Параметр 'Quality' может принимать следующие значения:
  #PB_Sprite3D_NoFiltering      : No filtering (faster but ugly when zooming/rotating)
  #PB_Sprite3D_BilinearFiltering: Bilinear filtering (slower but very clean when zooming/rotating)
Значение параметра 'Quality' по умолчанию #PB_Sprite3D_NoFiltering.

Поддерживаемые ОС

Windows, Linux (OpenGl), MacOS X


Start3D

Start3D()

Синтаксис

Result = Start3D()
Описание
Запускает трёхмерный движок и настраивает его для отображения трёхмерных спрайтов. Эта функция должна быть вызвана перед использованием функции DisplaySprite3D(), а функция Stop3D() должна быть вызвана когда всё отображение будет выполнено. Если значение 'Result' равно 0, инициализация не удалась и функции работы с трёхмерными спрайтами использовать невозможно.

Примечание: Внутри блока Start3D() : Stop3D() не должно быть функций Sprite library (например DisplaySprite()), только функции библиотеки работы с трёхмерными спрайтами. Код внутри блока должен завершаться вызовом функции FlipBuffers().

Пример:
  For a = 0 To 255
    DisplaySprite(10, 0, 0)       ; display background image
    Start3D()
      DisplaySprite3D(0, 0, 0, a)
    Stop3D()
    FlipBuffers()
  Next

Поддерживаемые ОС

Windows, Linux (OpenGl), MacOS X


Stop3D

Stop3D()

Синтаксис

Stop3D()
Описание
Остановить трёхмерный движок. Обычно вызывается после отображения последнего трёхмерного спрайта. Перед использованием этой функции должна быть вызвана функция Start3D().

Поддерживаемые ОС

Windows, Linux (OpenGl), MacOS X


TransformSprite3D

TransformSprite3D()

Синтаксис

TransformSprite3D(#Sprite3D, x1, y1, [z1], x2, y2, [z2], x3, y3, [z3], x4, y4, [z4])
Описание
Преобразовывает трёхмерный спрайт #Sprite3D в новые данные координаты. Обычно это используется для выполнения преобразований в реальном времени. Внимание, так как трёхмерный спрайт это 2 вершины (2 треугольника), преобразование может выглядеть очень странно... Если задан один из необязательных параметров 'z', нужно задать их все.

  ;
  ; x1         x2
  ;   ---------
  ;   |      /|
  ;   |    /  |
  ;   |  /    |
  ;   |/      |
  ;   ---------
  ; x4         x3
  ;

Поддерживаемые ОС

Windows, Linux (OpenGl), MacOS X


ZoomSprite3D

ZoomSprite3D()

Синтаксис

ZoomSprite3D(#Sprite3D, Width, Height)
Описание
Изменяет заданный трёхмерный спрайт #Sprite3D до данного размера.

Поддерживаемые ОС

Windows, Linux (OpenGl), MacOS X


StatusBar

PureBasic - StatusBar

Краткий обзор

'StatusBar' представляет собой горизонтальную панель информации (строка состояния) в нижней части окна. Эта панель всегда видна и может быть разделена на несколько областей.

Краткий перечень команд

AddStatusBarField
CreateStatusBar
FreeStatusBar
IsStatusBar
StatusBarHeight
StatusBarID
StatusBarImage
StatusBarProgress
StatusBarText


AddStatusBarField

AddStatusBarField()

Синтаксис

AddStatusBarField(Width)
Описание
Добавляет поле в текущей строке состояния, которое было ранее создано с помощью CreateStatusBar(). Каждое новое поле создается после предыдущего.

Параметры

'Width' ширина нового поля в пикселях. Если 'Width' указана как #PB_Ignore, то поле автоматически растянется, чтобы заполнить остающееся свободное пространство на строке состояния. Несколько полей могут иметь ширину #PB_Ignore, в этом случае свободное пространство будет разделено поровну между этими полями.

Следующие команды позволяют управлять содержанием поля индикаторной панели:
- StatusBarText()
- StatusBarImage()
- StatusBarProgress()

Пример использования AddStatusBarField () можно посмотреть в CreateStatusBar().


CreateStatusBar

CreateStatusBar()

Синтаксис

Result = CreateStatusBar(#StatusBar, WindowID)
Описание
Создает и добавляет пустой #StatusBar к окну WindowID. Если #PB_Any будет использоваться как параметр '#StatusBar', то номер новой строки состояния возвращается как 'Result'. Если 'Result' равен 0, создать StatusBar не удалось,в противном случае все в порядке. После создания StatusBar может использоваться AddStatusBarField() для настройки разделов строки.

Пример:
  If OpenWindow(0, 0, 0, 440, 50, "StatusBar", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
    If CreateStatusBar(0, WindowID(0))
      AddStatusBarField(90)
      AddStatusBarField(100)
      AddStatusBarField(#PB_Ignore) ; autosize this field
      AddStatusBarField(100)
    EndIf

    StatusBarText(0, 0, "Area normal")
    StatusBarText(0, 1, "Area borderless", #PB_StatusBar_BorderLess)
    StatusBarText(0, 2, "Area right & raised", #PB_StatusBar_Right | #PB_StatusBar_Raised)
    StatusBarText(0, 3, "Area centered", #PB_StatusBar_Center)

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


FreeStatusBar

FreeStatusBar()

Синтаксис

FreeStatusBar(#StatusBar)
Описание
Очищает и освобождает StatusBar.

Примечание: все остающиеся строки состояния автоматически освобождаются, если программа заканчивается.


IsStatusBar

IsStatusBar()

Синтаксис

Result = IsStatusBar(#StatusBar)
Описание
Проверяет, является ли указанный номер #StatusBar действительным и должным образом инициализирован в строке состояния. Эта функция может быть использована с любым значением. Если 'Result' не равен нулю, то объект действителен и инициализирован, в противном случае возвращается нуль.


StatusBarHeight

StatusBarHeight()

Синтаксис

Result = StatusBarHeight(#StatusBar)
Описание
Возвращает высоту #StatusBar в пикселях. Это полезно для правильного вычисления высоты окна, если строка состояния используется.


StatusBarID

StatusBarID()

Синтаксис

StatusBarID = StatusBarID(#StatusBar)
Описание
Возвращает уникальный системный идентификатор #StatusBar.

Этот результат иногда также известен как 'Handle'. Смотрите дополнительную главу Handles and IDs для более подробной информации.


StatusBarImage

StatusBarImage()

Синтаксис

StatusBarImage( #StatusBar, Field, ImageID [, Appearance] )
Описание
Добавляет или заменяет изображение в указанной области. 'ImageID' может быть получен с помощью LoadImage() или ImageID(). Параметр 'Appearance' является дополнительным и может использоваться со следующими значениями, чтобы изменить вид поля:
  #PB_StatusBar_Raised    : возвышенные края
  #PB_StatusBar_BorderLess: без краев
  #PB_StatusBar_Center    : выровнять по центру значок в поле
  #PB_StatusBar_Right     : выровнять значок по правому краю поля

Пример:

  If OpenWindow(0, 0, 0, 340, 50, "StatusBarImage", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
    If CreateStatusBar(0, WindowID(0))
      AddStatusBarField(120)
      AddStatusBarField(170)
    EndIf

    If LoadImage(0, "cube16.ico")     ; change path/filename to your own image (or icon)
      StatusBarImage(0, 0, ImageID(0))
      StatusBarImage(0, 1, ImageID(0), #PB_StatusBar_Right|#PB_StatusBar_Raised)
    EndIf

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


StatusBarProgress

StatusBarProgress()

Синтаксис

StatusBarProgress( #StatusBar, Field, Value [, Appearance [, Min, Max]] )
Описание
Представляет собой индикатор продвижения в данном поле 'Field' в указанном '#StatusBar'. Параметр 'Value' определяет текущее продвижение (относительно текущего минимума и максимума). Чтобы обновить это значение, вы просто вызываете эту команду еще раз с другим значением.

Параметр 'Appearance' является дополнительным и может использоваться, чтобы изменить вид поля со следующими значениями:
  #PB_StatusBar_Raised    : возвышенные края
  #PB_StatusBar_BorderLess: без краев
'Min' и 'Max' определяют границы полосы прогресса. Если они опущены, или если указан #PB_Ignore, тогда будут использованы предыдущие значения. Значения по умолчанию 'Min' и 'Max' для вновь создаваемых полей, соответственно 0 и 100.

Пример:

  If OpenWindow(0, 0, 0, 340, 50, "StatusBarProgress", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
    If CreateStatusBar(0, WindowID(0))
      AddStatusBarField(120)
      AddStatusBarField(170)
    EndIf

    StatusBarText(0, 0, "ProgressBar !")
    StatusBarProgress(0, 1, 25)

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


StatusBarText

StatusBarText()

Синтаксис

StatusBarText( #StatusBar, Field, Text$ [, Appearance] )
Описание
Определяет текст для указанного поля 'Field' в указанном '#StatusBar'. 'Appearance' является дополнительным и может использоваться, чтобы изменить вид поля со следующими значениями:
  #PB_StatusBar_Raised    : возвышенные края
  #PB_StatusBar_BorderLess: без краев
  #PB_StatusBar_Center    : выровнять по центру значок в поле
  #PB_StatusBar_Right     : выровнять значок по правому краю поля
Опции могут быть объединены вместе оператором '|' (или):
  #PB_StatusBar_BorderLess | #PB_StatusBar_Right : Borderless right aligned field.
CreateStatusBar() содержит пример, показывающий использование StatusBarText ().


String

PureBasic - String

Краткий обзор

Строки способ хранения списка символов. С функциями этой библиотеки, можно выполнять некоторые действия над строками.

Краткий перечень команд

Asc
Bin
Chr
CountString
FindString
Hex
InsertString
LCase
LSet
LTrim
Left
Len
Mid
RSet
RTrim
RemoveString
ReplaceString
ReverseString
Right
Space
Str
StrD
StrF
StrU
StringByteLength
StringField
Trim
UCase
Val
ValD
ValF


Asc

Asc()

Синтаксис

Ascii = Asc(String$)
Описание
String$ - это строка.
Возвращает значение первого символа строки в формате Ascii.

Пример:
  ValueASCII = Asc("!") ; 'ValueASCII' will get the value '33'

Примечание: также возможно получить значение ASCII символа (не всей строки) заключая их в одинарные кавычки.

Пример:
  ValueASCII = '!' ; 'ValueASCII' will get the value '33'

Примечание: Таблицу со всеми значениями Ascii смотрите здесь.


Bin

Bin()

Синтаксис

Result$ = Bin(Value.q [, Type])
Описание
Value.q - это число.
Преобразовывает числовые переменные типа quad в строку, в двоичном формате.

Пример:

  Debug Bin(32) ; Will display "100000"
  Debug Bin(1024*1024*1024*1024) ; Will display "10000000000000000000000000000000000000000"
Примечание: Если нужно выводить нули в начале строки, используйте функцию RSet():
  Debug RSet(Bin(32), 16, "0") ; Will display "0000000000100000"
Дополнительный параметр 'Type' может быть использован, если 'Value' должен рассматриваться в качестве еще одного типа.

'Type' может быть:
  #PB_Byte   : Значение байта число в диапазоне от 0 до 255
  #PB_Ascii  : Значение ASCII символ в диапазоне от 0 до 255
  #PB_Word   : Значение слова число в диапазоне от 0 до 65536
  #PB_Unicode: Значение символ Unicode, начиная от 0 до 65536
  #PB_Long   : значение составляет длинное число, начиная от 0 до 4294967296
  #PB_Quad   : Значение Quad число от 0 до 18446744073709551615
См. также Str(), Val() и Hex().


Chr

Chr()

Синтаксис

Text$ = Chr(ASCII-Value)
Описание
ASCII-Value - это значение ASCII.
Возвращает символ связанный с данным значением ASCII.

Пример:
  Debug Chr(33) ; Will display "!"

Примечание: Таблицу со всеми значениями Ascii смотрите здесь.


CountString

CountString()

Синтаксис

Result = CountString(String$, StringToCount$)
Описание
String$ - это строка.
StringToCount$ - это подстрока для поиска в указанной строке.
Ищет последовательность символов (подстроку) в строке и сообщает количество совпадений. В подстроке 'StringToCount$' можно указывать не только целое слово, но и отдельную последовательность символов. Пример смотрите ниже.
  Result = CountString("How many 'ow' contains Bow ?", "ow") ; Result will be 3


FindString

FindString()

Синтаксис

Position = FindString(String$, StringToFind$, StartPosition)
Описание
String$ - это строка.
StringToFind$ - это подстрока для поиска в строке.
StartPosition - стартовая позиция.
Ищет подстроку 'StringToFind$' в строке 'String$' начиная с указанной позиции 'StartPosition'. Если подстрока найдена, возвращается ее позиция (с учетом смещения, начиная с 1). Если строка не найдена, вернется 0.
  Position = FindString("PureBasic", "Bas", 1) ; 'Position' will get the value '5'


Hex

Hex()

Синтаксис

Result$ = Hex(Value.q [, Type])
Описание
Value.q - это число.
Преобразовывает числовые переменные типа quad в строку, в шестнадцатиричном формате.

Пример:
  Debug Hex(12) ; Will dipslay "C"
  Debug Hex(1234567890) ; Will display "0499602D2"
Примечание: Если нужно выводить нули в начале строки, используйте функцию RSet():
  Debug RSet(Hex(12), 4, "0") ; Will display "000C"

Дополнительный параметр 'Type' может быть использован, если 'Value' должен рассматриваться в качестве еще одного типа.

'Type' может быть:
  #PB_Byte   : Значение байта число в диапазоне от 0 до 255
  #PB_Ascii  : Значение ASCII символ в диапазоне от 0 до 255
  #PB_Word   : Значение слова число в диапазоне от 0 до 65536
  #PB_Unicode: Значение символ Unicode, начиная от 0 до 65536
  #PB_Long   : значение составляет длинное число, начиная от 0 до 4294967296
  #PB_Quad   : Значение Quad число от 0 до 18446744073709551615

Пример:
  Debug Hex(-1)
  Debug Hex(-1, #PB_Byte)
  Debug Hex(-1, #PB_Word)
  Debug Hex(-1, #PB_Long)
  Debug Hex(-1, #PB_Quad)    ; quad value is the standard
См. также Str(), Val() и Bin().


InsertString

InsertString()

Синтаксис

Result$ = InsertString(String$, StringToInsert$, Position)
Описание
Вставка 'StringToInsert$' в 'String$' для указаной 'Position'. Индекс 'Position' начинается с 1.

Пример:
  Debug InsertString("Hello !", "World", 7)  ; Will display "Hello World!"
  Debug InsertString("Hello !", "World", 1)  ; Will display "WorldHello !"


LCase

LCase()

Синтаксис

Result$ = LCase(String$)
Описание
String$ - это строка.
Преобразовывает символы указанной строки в нижний регистр. Поддерживается символ 'Й', после преобразования вернет 'й'.

Пример:
  Debug LCase("This is Art") ; Will display "this is art"


LSet

LSet()

Синтаксис

Result$ = LSet(String$, Length [, Character$])
Описание
String$ - это строка.
Length - указанное количество символов.
Character$ - это необязательный параметр. Указываются добавляемые символы.
Заполняет в левой части строку, и добавляет пробел, чтобы соответствовать указанной длинне.
Дополнительный параметр 'Character$' может применяться для замены пробела на указанные символы. Если указанная строка больше чем указанная 'Length', то она будет усечена на длину указанную в 'Length'.

Пример:
  Result$ = LSet("L", 8)          ; Result will be: "L       "
  Result$ = LSet("L", 8, "-")     ; Result will be: "L-------"
  Result$ = LSet("LongString", 4) ; Result will be: "Long"


LTrim

LTrim()

Синтаксис

Result$ = LTrim(String$ [, Character$])
Описание
Удаляет все пробелы в начале строки. Если дополнительный параметр 'Character$' задан то она удаляет все знаки 'Character$' расположенные в начале строки. 'Character$' должна быть строка, содержащая только символы.

Пример:
  Debug LTrim("     This is Art")  ; Will display "This is Art"
  Debug LTrim("!!Hello Word", "!") ; Will display "Hello World"


Left

Left()

Синтаксис

Result$ = Left(String$, Length)
Описание
String$ - это строка.
Length - указанное количество символов.
Возвращает количество символов, указанное в 'Length', начиная с левой части строки. Эта функция возвращает строку целиком, если длина превышает размер строки.

Пример:
  Debug Left("This is Art",4) ; Will display "This"


Len

Len()

Синтаксис

Length = Len(String$)
Описание
String$ - это строка.
Возвращает длинну указанной строки.

Пример:
  a = Len("This is Art") ; a will be 11


Mid

Mid()

Синтаксис

Result$ = Mid(String$, StartPosition [, Length])
Описание
Извлекает подстроку из указанной строки 'String$'. 'StartPosition' (минимальное значение = 1) определяет стартовую позицию для извлечения подстроки. 'Length' является дополнительным параметром, и определяет сколько символов нужно извлечь с начала подстроки. Если 'Length' не указан, символы извлекаются до конца строки.

Пример:
  Debug Mid("Hello", 2) ; Will display "ello"
  Debug Mid("Hello", 2, 1) ; Will display "e"


RSet

RSet()

Синтаксис

Result$ = RSet(String$, Length [, Character$])
Описание
String$ - это строка.
Length - указанное количество символов.
Character$ - это необязательный параметр. Указываются добавляемые символы.
Заполняет в правой части строку, и добавляет пробел, чтобы соответствовать указанной длинне.
Дополнительный параметр 'Character$' может применяться для замены пробела на указанные символы. Если указанная строка больше чем указанная 'Length', то она будет усечена на длину указанную в 'Length'.

Пример:
  Result$ = RSet("R", 8)          ; Result will be: "       R"
  Result$ = RSet("R", 8, "-")     ; Result will be: "-------R"
  Result$ = RSet("LongString", 4) ; Result will be: "Long"


RTrim

RTrim()

Синтаксис

Result$ = RTrim(String$ [, Character$])
Описание
String$ - это строка.
Удаляет все пробелы в конце строки. Если дополнительный параметр 'Character$' задан то она удаляет все знаки 'Character$' расположенные в конце строки. 'Character$' должна быть строка, содержащая только символы.

Пример:
  Debug RTrim("This is Art     ") ; Will display "This is Art"
  Debug RTrim("Hello Word!!", "!") ; Will display "Hello World"


RemoveString

RemoveString()

Синтаксис

String$ = RemoveString(String$, StringToRemove$ [, Mode [, StartPosition [, NbOccurences]]])
Описание
Находит последовательность символов указанных в 'StringToRemove$' в указанной строке 'String$' и удаляет их. 'StartPosition' является первым символом строки, с которой будет начато удаление. Первая позиция индекса символов равна 1. Если указан параметр 'NbOccurences' она удаляет только данную 'StringToRemove$' до позиции 'NbOccurences'.

'Mode' - это не обязательный параметр и может принимать значения:
  #PB_String_NoCase: Нечувствительность к регистру (удаляются A=a). По умолчанию, удаление зависит от регистра.
Пример:
  Debug RemoveString("This is Art", "is") ; Will display "Th  Art"
  Debug RemoveString("This is Art", "is", 0, 1, 1) ; Will display "Th is Art"


ReplaceString

ReplaceString()

Синтаксис

String$ = ReplaceString(String$, StringToFind$, StringToReplace$ [, Mode [, StartPosition]])
Описание
String$ - это строка.
StringToFind$ - это символ или последовательность символов которые нужно заменить (исходные значения).
StringToReplace$ - это символ или последовательность символов на замену (новые значения).
Ищет в указанной строке String$ символ или последовательность символов которые указаны в StringToFind$, и заменяет их символами указанными в StringToReplace$.
В дополнительном параметре 'StartPosition' указывается с какой позиции начинаемся замена символов. По умолчанию 'StartPosition' имеет значение 1.

Необязательный параметр 'Mode' может принимать следующие значения:
  #PB_String_NoCase : Нечувствительность к регистру (A=a). По умолчанию, результаты поиска зависят от регистра.
  #PB_String_InPlace: Строка заменяется непосредственно в памяти. 'StringToFind$' и 'StringToReplace$' должны иметь одинаковую длину!
                      Преимуществом является очень высокая скорость при замене.
Пример:
  Debug ReplaceString("This is Art", " is", " was") ; Will display "This was Art"
  Debug ReplaceString("Hello again, hello again", "HELLO", "oh no...", 1, 10) ; Will display "Hello again, oh no... again"

  test$ = "Bundy, Barbie, Buddy"
  ReplaceString(test$, "B", "Z", 2, 1)  ; all B gets changed to Z  (directly in memory, no valid return value here)
  Debug test$   ; Output of the changed string


ReverseString

ReverseString()

Синтаксис

Result$ = ReverseString(String$)
Описание
Меняет все символы в строке 'String$'. Последний символ становится первым символом, и наоборот.

Пример:
  Debug ReverseString("Hello")  ; Will display "olleH"


Right

Right()

Синтаксис

Result$ = Right(String$, Length)
Описание
String$ - это строка.
Length - указанное количество символов.
Возвращает указанное количество символов, указанное в 'Length', начиная с правой части строки. Эта функция возвращает строку целиком, если длина превышает размер строки.

Пример:
  Debug Right("This is Art", 3) ; Will display "Art"


Space

Space()

Синтаксис

Result$ = Space(Length)
Описание
Создает строку указанной дилины, заполненную пробелами.

Пример:
  Debug Space(5) ; Will display "     "


Str

Str()

Синтаксис

Result$ = Str(Value.q)
Описание
Value.q - это число.
Преобразовывает числовые переменные типа quad в строку

Примечание: переменные типа 'Floats' преобразовывают функцией StrF(), doubles с помощью StrD() и целые числа StrU().

Пример:
  Value.q = 100000000000000001
  Debug "Result: " + Str(Value)
See also Val(), Hex() and Bin().


StrD

StrD()

Синтаксис

Result$ = StrD(Value.d [, NbDecimal])
Описание
Value.d - это число.
Преобразовывает числовые переменные типа double в строку. Можно указать количество десятичных знаков которые нужно отобразить. Число будет округлено, если значение 'NbDecimal' меньше чем существующее количество десятичных знаков в 'Value.d'.

Примечание: целые числа со знаком должны быть преобразованы командой Str() и числа без знака командой StrU().

Пример:
  Value.d = 10.54
  Debug "Result: " + StrD(Value)    ; we don't use the 2nd parameter, so we get a full float number

  Debug "Result: " + StrD(Value, 2)  ; we want a result with two decimal places, no rounding needed as we have only two

  Debug "Result: " + StrD(Value, 0)  ; we want a result with no decimal places, so the value is rounded

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


StrF

StrF()

Синтаксис

Result$ = StrF(Value.f [, NbDecimal])
Описание
Value.f - это число.
Преобразовывает дробное число в строку. Можно указать максимальное количество десятичных знаков. Число будет округлено, если значение 'NbDecimal' меньше чем существующее количество десятичных знаков в 'Value.f'.

Примечание: целые числа со знаком должны быть преобразованы командой Str() и числа без знака командой StrU().

Пример:
  value.f = 10.54
  result$ = "Result: " + StrF(value)    ; we don't use the 2nd parameter, so we get a full float number
  Debug result$
  result$ = "Result: " + StrF(value,2)  ; we want a result with two decimal places, no rounding needed as we have only two
  Debug result$
  result$ = "Result: " + StrF(value,0)  ; we want a result with no decimal places, so the value is rounded
  Debug result$


StrU

StrU()

Синтаксис

Result$ = StrU(Value, Type)
Описание
Преобразовывает целое число в строку.

'Type' может принимать следующие значения:
  #PB_Byte   : Значение байта число в диапазоне от 0 до 255
  #PB_Ascii  : Значение ASCII символ в диапазоне от 0 до 255
  #PB_Word   : Значение слова число в диапазоне от 0 до 65536
  #PB_Unicode: Значение символ Unicode, начиная от 0 до 65536
  #PB_Long   : значение составляет длинное число, начиная от 0 до 4294967296
  #PB_Quad   : Значение Quad число от 0 до 18446744073709551615
Примечание: целые числа со знаком должны быть преобразованы командой Str() и числа без знака командой StrF() или StrD().

Пример:
  byte.b = 255
  Debug Str(byte) ; Will display -1
  Debug StrU(byte, #PB_Byte) ; Will display 255


StringByteLength

StringByteLength()

Синтаксис

Result = StringByteLength(String$ [, Format])
Описание
Возвращает количество байт указанного знака, в указанном формате. 'Format' может быть #PB_Ascii, #PB_UTF8 или #PB_Unicode.
Если 'Format' не указан будет использован режим исполняемого файла, в какой кодировке был скомпилирован исполняемый файл (unicode or ascii).

Примечание: Указанное количество байт не включает символ окончания строки (Null-Character). Размер символа Null-Character составляет 1 byte в Ascii и UTF8, и 2 bytes в Unicode.

Пример:
  a = StringByteLength("д", #PB_UTF8) ; will be 2


StringField

StringField()

Синтаксис

Result$ = StringField(String$, Index, Delimiter$)
Описание
String$ - это строка.
Index - это индекс.
Delimiter$ - символ используемый в качестве разделителя.
Разделяет строку на части, используя символы-разделители.
Укажите в 'Delimiter$' символ по которому нужно разделить строку. Первое значение 'Index' равно 1.

Пример:
  For k=1 To 6
    Debug StringField("Hello I am a split string", k, " ")
  Next


Trim

Trim()

Синтаксис

Result$ = Trim(String$ [, Character$])
Описание
Удаляет все пробелы расположенные в начале и в конце строки. Если дополнительный параметр 'Character$' задан то она удаляет все знаки 'Character$' расположенные в начале и в конце строки. 'Character$' должна быть строка, содержащая только символы.

Пример:
  Debug Trim("   Hello     ")  ; Will display "Hello"
  Debug Trim("!!Hello!!", "!") ; Will display "Hello"


UCase

UCase()

Синтаксис

Result$ = UCase(String$)
Описание
String$ - это строка.
Преобразовывает символы указанной строки в верхний регистр. Поддерживается символ 'й', после преобразования вернет 'Й'.

Пример:
  Debug UCase("This is Art") ; Will display "THIS IS ART"


Val

Val()

Синтаксис

Result.q = Val(String$)
Описание
String$ - это строка.
Преобразовывает строку в число (quad).
Строка должна содержать целое число в десятичном, шеснадцатиричном (с префиксом '$') или в двоичном (с префиксом '%') формате.
Примечание: Строки содержащие числа в формате floats в 32 bit, могут быть преобразованы с помощью ValF() и на 64 bit ValD().

Пример:
  Debug Val("1024102410241024") ; will print '1024102410241024'.
  Debug Val("$10FFFFFFFF")      ; will print '73014444031'.
  Debug Val("%1000")            ; will print '8'.
See also Str(), Hex() and Bin().


ValD

ValD()

Синтаксис

Result.d = ValD(String$)
Описание
String$ - это строка.
Преобразовывает строку в числовую переменную типа double. Строка должна содержать значение числа с десятичными знаками, типа double.

Примечание: Строки содержащие целые числа можно преобразовывать с помощию Val(), и floats на 32 bit с помощью ValF() (с меньшей точностью чем ValD()).

Пример:

  Result.d = ValD("10.000024") ; Result will be filled with 10.000024.

Поддерживаемые ОС

Windows, Linux, MacOS X (x86)


ValF

ValF()

Синтаксис

Result.f = ValF(String$)
Описание
String$ - это строка.
Преобразовывает строку в значение float.Строка должна содержать число с десятичными знаками.

Примечание: Строки содержащие целые числа можно преобразовывать с помощию Val() и floats на 64 bit с помощью ValD() (они обеспечивают большую точность чем ValF()).

Пример:

  Result.f = ValF("10.24") ; Result will be filled with 10.24.


SysTray

PureBasic - SysTray

Краткий обзор

SysTray - фрейм, расположенный справа от панели задач, Windows. Она содержит пиктограммы резидентных программ (антивирус.....) и часов. PureBasic управляет доступом к этому фрейму, и позволяет вам добавить какое-то количество пиктограмм.

Краткий перечень команд

AddSysTrayIcon
ChangeSysTrayIcon
IsSysTrayIcon
RemoveSysTrayIcon
SysTrayIconToolTip


AddSysTrayIcon

AddSysTrayIcon()

Синтаксис

Result = AddSysTrayIcon(#SysTrayIcon, WindowID, ImageID)
Описание
Добавляет значок в Systray. Если #PB_Any используется в качестве параметра '# SysTrayIcon ", то новый номер иконки в Systray будет возвращена как 'Result'. WindowID является системным идентификатором окна, полученный командой WindowID(). ImageID изображение предварительно загруженное с помощью LoadImage(). В Windows поддерживаются только изображения формата (.ico), в Linux используйте изображение в формате PNG (чтобы иметь прозрачный слой). ImageID может быть получен функцией ImageID().

Когда происходит событие на значке в области SysTray, возвращается событие #PB_Event_SysTray. EventGadget() может быть использовано, для определения какую SysTrayIcon использовали. EventType() обновляется этой командой.

Примечание: Все ваши изображения в SysTray автоматически удаляются, когда программа заканчивается.


ChangeSysTrayIcon

ChangeSysTrayIcon()

Синтаксис

ChangeSysTrayIcon(#SysTrayIcon, ImageID)
Описание
Изменяет значок в Systray. ImageID изображение предварительно загруженное с помощью LoadImage(). В Windows поддерживаются только изображения формата (.ico), в Linux используйте изображение в формате PNG (чтобы иметь прозрачный слой). ImageID может быть получен функцией ImageID().


IsSysTrayIcon

IsSysTrayIcon()

Синтаксис

Result = IsSysTrayIcon(#SysTrayIcon)
Описание
Проверяет, является ли номер #SysTrayIcon действителеным и правильно инициализированным. Данная функция может быть использована с любым значением. Если 'Result' не равен нулю, то этот объект является действительным. Это идеальная функция чтобы убедиться, что объект правильно инициализирован.


RemoveSysTrayIcon

RemoveSysTrayIcon()

Синтаксис

RemoveSysTrayIcon(#SysTrayIcon)
Описание
Удаляет указанный значок #SysTrayIcon.

Примечание: Все ваши изображения в SysTray автоматически удаляются, когда программа заканчивается.


SysTrayIconToolTip

SysTrayIconToolTip()

Синтаксис

SysTrayIconToolTip(#SysTrayIcon, Text$)
Описание
Ассоциирует указанный Text$ (желтый плавающий блок) с пиктограммой в SysTray. Он появляется когда курсор мыши, остаётся некоторое время неподвижен, над пиктограммой в SysTray.


Terrain

PureBasic - Terrain

Краткий обзор

Terrains are outdoor 3D scenes which simulate a realistic natural environment based on pre-calculated 2D maps. They are useful in many cases, for example 3D representations of land, simulation games and more. InitEngine3D() should be called successfully before using the Terrain functions.

Краткий перечень команд

CreateTerrain
TerrainHeight


CreateTerrain

CreateTerrain()

Синтаксис

CreateTerrain(Filename$, MaterialID, [ScaleX, ScaleY, ScaleZ, [Precision]])
Описание
Creates a new 3D terrain from the given 2D picture file. The picture can be in either JPEG, PNG or TGA format and has to be in 256 color mode (grayscale). Each pixel of the picture will be interpreted as the height of the terrain at this point. A fully black (R,G,B=0.0,0) pixel will be at a height of 0 and a full-scale white (R,G,B=255,255,255) pixel will be at a height of 255. Therefore it is possible to have up to 256 levels of height. If required, the terrain can be scaled when it is created using the ScaleX, ScaleY and ScaleZ optional parameters. For performance reasons, it is not possible to resize a terrain in realtime, only when it is created.
The used picture must be a sqare, where x and y sizes are powers of 2 +1, with a minimum size of 65. Possible sizes can be 65x65, 129x129, 257x257 and so on. E.g. for a terrain with 64x64 grid of squares you need 65x65 pixels.

The specified material will be used by the terrain for rendering and can be easily got using the MaterialID() function. The material usually contains two texture layers: the first one is the texture which is applied globally to the terrain and the second layer is the detail texture, which is applied several times over the terrain (to get a more precise render). The example below shows the usual material setup for a terrain.

The last optional parameter controls the precision of rendering the terrain. As there are many calculations involved, this parameter has been introduced to tune the terrain display depending on the target computer. For example, you can set the rendering to be slower but more accurate on faster computers or faster but not as good looking for slower computers.

The terrain has to be created before any cameras.

Parameters

Filename$ - A string containing the name of the picture file to create the terrain from.

MaterialID - The ID of the material to render the terrain in, which can be got using the MaterialID() function.

ScaleX - The factor to scale the terrain by in the X direction. A value of 1 means to keep the same size. A value of 2 means to double the size, 3 to triple the size and so on. Fractional values between 0 and 1 will cause the terrain to be decreased in size.

ScaleY - The factor to scale the terrain by in the Y direction. Values are the same as the ScaleX parameter.

ScaleZ - The factor to scale the terrain by in the Z direction. Values are the same as the ScaleX parameter.

Precision - This is optional, but can only be set if the Scale parameters have been used. Precision for the rendering of the terrain. Possible values range from 1 (best, but slowest) to 20 (fastest but suffers from polygon displacement when close up).

Return value

Example:
  CreateMaterial  (0, LoadTexture(0, "Global.jpg"))    ; First layer is global
  AddMaterialLayer(0, LoadTexture(1, "Detail.jpg"), 1) ; Second layer is detail


TerrainHeight

TerrainHeight()

Синтаксис

Height = TerrainHeight(x, z)
Описание
Returns the height value at the specified position in the terrain. The origin for terrain coordinates is (0,0) and is located at the top/left of the 2D picture. This function is mainly used to handle collision with the ground.

Параметры

x - The horizontal position of the point from which to read the height

z - The depth of the point from which to read the height

Return value

Height - The height value at the specified position of the terrain.


Texture

PureBasic - Texture

Краткий обзор

Textures are useful to have realistic looking meshes. It's possible to create a texture on fly (with regular 2DDrawing functions) or load it from disk. InitEngine3D() should be called successfully before using the Texture functions.

Краткий перечень команд

CreateTexture
FreeTexture
IsTexture
LoadTexture
TextureHeight
TextureID
TextureWidth


CreateTexture

CreateTexture()

Синтаксис

Result = CreateTexture(#Texture, Width, Height)
Описание
Creates a new blank #Texture with the specified dimension (in pixels). If #PB_Any is used as '#Texture' parameter, the new texture number will be returned as 'Result'.

It's strongly recommended to make the texture square and with power of 2 width/height: 64x64, 128x128, 256x256... Old GFX cards can have limitation, so if possible limit the texture size to 256x256.

If the 'Result' is 0, the texture creation has failed. If the #Texture was already created, it is automatically freed and replaced by the new one.

Example:
  CreateTexture(0, 256, 256) ; Creates a new 256x256 texture


FreeTexture

FreeTexture()

Синтаксис

FreeTexture(#Texture)
Описание
Frees the specified #Texture. All its associated memory is released and this object can't be used anymore.

Note: all remaining textures are automatically freed when the program ends.


IsTexture

IsTexture()

Синтаксис

Result = IsTexture(#Texture)
Описание
Tests if the given #Texture is a valid and correctly initialized texture.

This function is bullet-proof and can be used with any value. If the 'Result' is not zero then the object is valid and initialized, else it returns zero. This is the correct way to ensure that a texture is ready to use.


LoadTexture

LoadTexture()

Синтаксис

Result = LoadTexture(#Texture, Filename$)
Описание
Loads a new #Texture from the disk. If #PB_Any is used as '#Texture' parameter, the new texture number will be returned as 'Result'. Before loading a texture, an archive has to be specified with Add3DArchive().

Texture format can be in PNG, TGA or JPG. It's strongly recommended to make the texture dimension square and with power of 2 width/height: 64x64, 128x128, 256x256... Old GFX cards can have limitation, so if possible limit the texture size to 256x256.

If the 'Result' is 0, the texture can't be loaded. If the #Texture was already created, it is automatically freed and replaced by the new one.


TextureHeight

TextureHeight()

Синтаксис

Height = TextureHeight(#Texture)
Описание
Returns the height (in pixels) of the specified #Texture.


TextureID

TextureID()

Синтаксис

TextureID = TextureID(#Texture)
Описание
Returns the TextureID of the specifiec #Texture. This is the unique texture identifier needed by other functions: AddMaterialLayer(), CreateMaterial().


TextureWidth

TextureWidth()

Синтаксис

Width = TextureWidth(#Texture)
Описание
Returns the width (in pixels) of the specified #Texture.


Thread

PureBasic - Thread

Краткий обзор

Поток - это часть программы, которая выполняется асинхронно, в фоне этой программы (паралельно с ней). Это значит, можно выполнять длительные операции (сжатие данных, обработку изображений, и т.д.) не останавливая всю программу, позволяя пользователю продолжать делать другие операции. Поток выполняется внутри вашей программы, это не другой процесс. Когда главная программа завершается, все потоки уничтожаются. В PureBasic поток это просто процедура, вызываемая асинхронно. Поток выполняется пока процедура не завершится.

Потоки могут быть полезны например когда в вашей программе имеются операции с разным временем отклика, например обработка данных и интерфейс пользователя (вы готовы подождать, пока данные обработается, но интерфейс пользователя при этом должен всегда откликаться).

У PureBasic есть особая настройка компилятора для создания потокобезопасного исполняемого файла. (ключ командной строки /THREAD или "создать потокобезопасный исполняемый файл" в настройках компилятора в IDE). Без этого режима некоторые функции (а также работа со строками) выполняются быстрее, но небезопасно при использовании в потоках. Создавать потоки без этого режима всё равно возможно, но не рекомендуется, так как даже что-нибудь простое вроде доступа к строке текста может быть опасно и должно быть защищено. Включение этой опции делает эти вещи безопасными внутри потоков, но ценой некоторого уменьшения скорости. Поэтому решение использовать потоки или нет следует принимать с осторожностью, а режим потоков следует использовать только там, где он действительно нужен.

Примечание: Потоки нужно использовать осторожно, потому что у вас может быть ситуация множественного доступа к разделяемым ресурсам (памяти, переменным, файлам, и т.д.) и вам нужно обеспечить гарантии отсутствия проблем из-за этого. Для синхронизации доступа к таким разделяемым ресурсам можно использовать функции работы с мьютексами этой библиотеки.

С помощью ключевого слова Threaded можно создавать потокоориентированные обьекты (переменные, массивы, связанные списки, карты).

Примечание: Не используйте DirectX (команды работы со спрайтами) внутри потоков (ограничение MS Windows)! Если вам нужно отобразить графику в потоках, используйте библиотеки Images и 2DDrawing.

Краткий перечень команд

CreateMutex
CreateSemaphore
CreateThread
FreeMutex
FreeSemaphore
IsThread
KillThread
LockMutex
PauseThread
ResumeThread
SignalSemaphore
ThreadID
ThreadPriority
TryLockMutex
TrySemaphore
UnlockMutex
WaitSemaphore
WaitThread


CreateMutex

CreateMutex()

Синтаксис

Mutex = CreateMutex()
Описание
Создаёт новый объект мьютекс . Мьютекс изначально разблокирован.

Главная цель функции работы с мьютексами синхронизация потоков. Эти функции не создают слишком много издержек, но они работают только внутри программы, не по всей системе. Мьютекс это объект (разновидность семафора), которым одновременно, может управлять только один поток, поэтому он используется для защиты разделяемых ресурсов. Только владеющий мьютексом поток имеет доступ к данному файлу, области памяти, ...
Смотрите пример блокировки мьютекса в описании функций LockMutex() и UnlockMutex().

Пример:

  ; Run this code once as it is. You will see that the lines printed are
  ; mixed from between the threads. Now uncomment the Mutex functions and
  ; the strings are printed in order, because only one thread at a time
  ; has the right to execute the printing functions.
  ;
  Procedure WithoutMutex(*Number)
    Shared Mutex

    For a = 1 To 5
      ;LockMutex(Mutex)    ; uncomment this to see the difference

      PrintN("Thread "+Str(*Number)+": Trying to print 5x in a row:")
      For b = 1 To 5
        Delay(50)
        PrintN("Thread "+Str(*Number)+" Line "+Str(b))
      Next b

      ;UnlockMutex(Mutex) ; uncomment this to see the difference
    Next a
  EndProcedure

  OpenConsole()
  Mutex = CreateMutex()

  thread1 = CreateThread(@WithoutMutex(), 1)
  Delay(25)
  thread2 = CreateThread(@WithoutMutex(), 2)
  Delay(25)
  thread3 = CreateThread(@WithoutMutex(), 3)

  WaitThread(thread1)
  WaitThread(thread2)
  WaitThread(thread3)

  Input()


CreateSemaphore

CreateSemaphore()

Синтаксис

Semaphore = CreateSemaphore([InitialCount])
Описание
Создаёт новый объект семафор. Необязательный параметр 'InitialCount' должен содержать положительное значение, задающее начальное значение счётчика семафора. Если он не задан, начальное значение счётчика равно 0.

Семафор это объект синхронизации потоков, содержащий внутренний счётчик. Он имеет два вида операций: signal и wait. Операция ожидания уменьшает счётчик семафора на единицу. Если счётчик был равен 0, операция ожидания заблокирует поток пока не придёт вызов сигнала. Операция сигнал увеличивает счётчик на единицу, освобождая заблокированный поток если такой есть. Семафор позволяет установить минимум и максимум для счётчика, например для того, чтобы очередь не опустела или не переполнилась.

В отличие от mutex, объект семафор не "принадлежит" конкретному потоку, что означает, что вызовы сигнал/ожидание не обязательно должны быть из одного и того же потока, как в случае функций LockMutex() и UnlockMutex(). Фактически, типичное использование объектов семафоров: один поток делает вызовы функции SignalSemaphore(), а другой делает все вызовы функции WaitSemaphore() реализуя шаблон производитель/потребитель.

Пример:

Этот пример показывает поток "производитель", заполняющий очередь элементами, и главный поток, читающий их. Семафор используется чтобы гарантировать, что очередь никогда не опустеет. Заметьте, того же можно добиться с помощью только мьютекса и операций ожидания/опроса очереди вперемежку с вызовами функции Delay() , но команды семафора реализуют более эффективное ожидание (возвращаясь сразу из вызова функции SignalSemaphore() , а не в следующий раз, когда цикл опроса проверит очередь).
Global Semaphore = CreateSemaphore()
Global Mutex     = CreateMutex()
Global NewList Queue()

Procedure Producer(Total)

  For i = 1 To Total
    Delay(Random(750) + 250)

    ; The queue access still needs a normal mutex lock to be threadsafe
    LockMutex(Mutex)
      LastElement(Queue())
      AddElement(Queue())
      Queue() = i
    UnlockMutex(Mutex)

    ; Signal that there is a new queue element
    SignalSemaphore(Semaphore)
  Next i

EndProcedure

If CreateThread(@Producer(), 30)

  For i = 1 To 30
    ; wait for one element to be available
    WaitSemaphore(Semaphore)

    ; display the queue state
    LockMutex(Mutex)
      Queue$ = "Queue:"
      ForEach Queue()
        Queue$ + " " + Str(Queue())
      Next Queue()
      Debug Queue$

      ; remove head element from the queue
      FirstElement(Queue())
      DeleteElement(Queue())
    UnlockMutex(Mutex)

  Next i

EndIf


CreateThread

CreateThread()

Синтаксис

Thread = CreateThread(@ProcedureName(), *Value)
Описание
Создаёт новый поток, выполняющийся в фоне приложения. Если поток создан корректно, функция вернёт номер потока, который будет использоватся другими функциями, работающими с потоками, такими как функции KillThread(), PauseThread(), и т.д. Процедура, которую вы используете в качестве потока, должна принимать один параметр и не может ничего возвращать. Аргумент '*Value' функции CreateThread() передаётся как параметр этой процедуры. Если вы попытаетесь возвратить значение из вашего потока, оно просто потеряется.

Параметры

@procedurename()- Адрес процедуры, которую вы хотите использовать как код нового потока. Не забудьте поставить символ @ впереди имени и скобки () после, чтобы получить адрес процедуры.

*Value - Это значение передаётся коду потока как параметр вашей функции. Вам решить, для чего это значение использовать.

Возвращаемое значение

Номер созданного потока, или ноль если новый поток создать невозможно. Этот номер необходим, если вы хотите контролировать поток с помощью других функций этой библиотеки.

Пример:

Пример ниже показывает простейший способ создать поток, хотя в данном случае он ничего не делает.

  Procedure YourProcedure(*Value)
    ; The variable '*Value' will contain 23
  EndProcedure

  CreateThread(@YourProcedure(), 23)


FreeMutex

FreeMutex()

Синтаксис

FreeMutex(Mutex)
Описание
Удаляет объект мьютекс и освобождает занятую им память.

Объект мьютекс должен быть разблокирован на момент удаления и не может быть использован после удаления. Чтобы гарантировать это следует удалять мьютекс только после того, как все использующие его потоки или завершились, или как-то иначе гарантировано неиспользовали мьютекс впредь.


FreeSemaphore

FreeSemaphore()

Синтаксис

FreeSemaphore(Semaphore)
Описание
Уничтожает данный объект Семафор и освобождает все использовавшиеся им ресурсы.


IsThread

IsThread()

Синтаксис

Result = IsThread(Thread)
Описание
Проверяет, соответствует ли данному номеру потока корректный поток, созданный с помощью функции CreateThread() , и выполняется ли он. Функция возвращает 0 если это не корректный поток, или если он уже завершился.


KillThread

KillThread()

Синтаксис

KillThread(Thread)
Описание
Немедленно убивает заданный поток, ранее созданный с помощью функции CreateThread(). Эта функция очень опасна и должна использоваться как можно реже. Проблема в том, что поток немедленно убивается и не получает шанса выполнить какой-либо код завершения (например освободить память, удалить элементы, освободить собственный стек).

По возможности следует использовать флаг в виде глобальной переменной чтобы сказать потоку заканчивать выполнение (при этом производятся нужные завершающие действия), и только если это невозможно по какой-то причине следует использовать эту функцию.

Параметры

Thread - Номер потока, который вы хотите убить. Это значение возвращает функция CreateThread().

Пример:

  ; A procedure/thread which will never exit. Not good, but it
  ; shows how KillThread works
  Procedure PrintStuff(*Interval)
    Repeat
      PrintN(".")
      Delay(*Interval)
    ForEver
  EndProcedure

  If OpenConsole()
    thread = CreateThread(@PrintStuff(), 500)
    If thread
      For i=0 To 10
        PrintN("A")
        Delay(999)

        If i=5
          KillThread(thread)
        EndIf
      Next
    EndIf
  EndIf


LockMutex

LockMutex()

Синтаксис

LockMutex(Mutex)
Описание
Ждёт пока объект мьютекс не освободится (от блокировки другим потоком) и затем блокирует объект, так, что никакой другой поток не может его заблокировать.

По возвращении из этой функции гарантируется, что этот поток единственный обладает блокировкой мьютекса. Теперь поток может свободно работать с разделяемым ресурсом, защищаемым данным мьютексом, так как он единственный обладает исключительным доступом к мьютексу.

Если другой поток вызовет функцию LockMutex() пока этот поток удерживает блокировку, он будет ждать внутри функции LockMutex(), пока этот поток не вызовет функцию UnlockMutex() чтобы снять свою блокировку с мьютекса.

Примечание: Поскольку функция LockMutex() ждёт освобождения мьютекса, она легко может завести в тупиковые ситуации если не сделан вызов функции UnlockMutex().

Пример кода смотрите в описании функции CreateMutex().


PauseThread

PauseThread()

Синтаксис

PauseThread(Thread)
Описание
Приостанавливает выполнение заданного потока, ранее созданного с помощью функции CreateThread(). Этот поток можно возобновить с помощью функции ResumeThread().

Параметры

Thread - Номер потока, который вы хотите приостановить. Это значение возвращает функция CreateThread().

Пример:

  Procedure PrintStuff(*Dummy)
    For i = 0 To 10
      PrintN(".")
      Delay(200)
    Next
  EndProcedure

  If OpenConsole()
    thread = CreateThread(@PrintStuff(), 0)
    If thread
      Delay(100)
      PauseThread(thread)
      For i = 0 To 10
        PrintN("A")
        Delay(50)
      Next

      ; Resume thread and give it enough time to complete
      ResumeThread(thread)
      Delay(3000)
    EndIf
  EndIf


ResumeThread

ResumeThread()

Синтаксис

ResumeThread(Thread)
Описание
Возобновляет выполнение заданного потока, ранее приостановленное с помощью функции PauseThread().

Параметры

Thread - Номер потока, который вы хотите возобновить. Это значение возвращает функция CreateThread().

Смотрите пример кода в описании функции PauseThread().


SignalSemaphore

SignalSemaphore()

Синтаксис

SignalSemaphore(Semaphore)
Описание
Увеличивает внутренний счётчик семафора на единицу, освобождая ожидающий поток, если таковой есть.

Примечание: Счётчик семафора ограничен знаковым 32bit value, поэтому можно сделать максимум 2147483647 вызовов функции SignalSemaphore() не перемежающихся вызовами функции WaitSemaphore().

Пример кода смотрите в описании функции CreateSemaphore().


ThreadID

ThreadID()

Синтаксис

ThreadID = ThreadID(Thread)
Описание
Возвращает уникальный идентификатор, который идентифицирует данный поток 'Thread' в операционной системе. Эта функция очень полезна, когда другой библиотеке нужна ссылка на поток.

Возвращаемый результат иногда называют дескриптором ('Handle'). Больше информации вы найдёте в приложении Handles and Numbers.


ThreadPriority

ThreadPriority()

Синтаксис

OldPriority = ThreadPriority(Thread, Priority)
Описание
Изменяет приоритет заданного потока и возвращает прежний приоритет.

Значение приоритета может быть от 1 до 32. 1 это самый низкий доступный приоритет, 16 это обычный приоритет и 32 это приоритет "время имеет решающее значение" (time critical priority) (наивысший, пожалуйста, не используйте его если не знаете что делаете).

Если параметр Priority равен 0, приоритет не изменяется (полезно только для получения приоритета потока без его изменения). Все потоки создаются с обычным приоритетом.

В типичном случае вы задаёте для потока, который постоянно работает (например, поток обработки изображения) приоритет, который не превышает приоритет любого другого потока в вашей системе. Основание так поступить в том, что если поток постоянно работает и имеет высокий приоритет, то никакой другой поток не получит шанса выполниться. Если поток должен быстро реагировать, но проводит много времени в ожидании события, вам стоит рассмотреть задание ему повышенного приоритета.

Windows управляет потоками (выбирает, какой будет работать в следующий короткий интервал времени) используя стратегию вытесняющих приоритетов, с закольцованной очередью внутри каждого уровня приоритета. Это означает, что если пришло время выполнять другой поток (также называется переключение контекста), то следующим на выполнение станет поток с наивысшим приоритетом среди ожидающих. Если среди ожидающих выполнения потоков более одного с наивысшим приоритетом, то последующие переключения контекстов переберут каждый поток.

Параметры

Thread - Номер потока, которому вы хотите изменить приоритет. Это значение возвращается из функции CreateThread().
Priority - Новый приоритет, который вы хотите назначить потоку. Значение приоритета может быть 0 (означает не менять приоритет) или в диапазоне от 1 (низший приоритет) до 32 (наивысший приоритет). 16 это обычный приоритет. Windows не поддерживает 32 разных уровня приоритета, вот соответствующая таблица:
  - 1: низший
  - от 2 до 15: ниже обычного
  - 16:  нормальный
  - от 17 до 30: выше обычного
  - 31: высший
  - 32: время имеет решающее значение

Возвращаемое значение

Эта функция возвращает приоритет потока, каким он был до вызова этой функции. Это может быть полезно, если вы хотите только на короткое время повысить приоритет потока, а затем вернуть его на прежний уровень. Возвращаемое значение не обязательно то самое, которое устанавливалось с помощью функции ThreadPriority(), так как оно зависит от группирования приоритетов системой.

Пример:

  ; Procedure which always runs (note, no Delay function as
  ; this would cause the thread to stop running while it was
  ; being delayed
  Procedure PrintStuff(*Interval)
    For i = 0 To 1000000000
      ; Nasty busy wait
    Next
  EndProcedure

  If OpenConsole()
    thread = CreateThread(@PrintStuff(), 500)
    If thread
      ; Increase the priority above the main thread
      ; You should notice a delay before the print function
      ; is executed. Now change the 17 to 15 (lower than normal priority)
      ; and see that the print executes immediately
      ThreadPriority(thread, 17)
      PrintN("Waits for higher priority thread to finish")
    EndIf

    PrintN("Press return to exit")
    Input()
  EndIf

Поддерживаемые ОС

Windows


TryLockMutex

TryLockMutex()

Синтаксис

Result = TryLockMutex(Mutex)
Описание
Пробует заблокировать заданный мьютекс. В отличие от функции LockMutex(), эта функция не приостанавливает выполнение до освобождения мьютекса. Она немедленно возвращается, а возвращаемое значение показывает, была попытка блокировка успешна или нет. Это полезно в ситуациях, когда поток вместо того что бы ждать освобождения мьютекса, должен выполнять какие то другие операции.

Возвращаемое значение

Возвращает не ноль, если мьютекс был успешно заблокирован, и ноль, если блокировка не удалась.

Note: Если блокировка была успешна, следует вызвать функцию UnlockMutex() чтобы освободить мьютекс для других потоков. Если этого не сделать, это легко может привести в тупиковую ситуацию.

Пример:

  Procedure ThreadProcedure(*Value)
    Shared Mutex

    Repeat
      If TryLockMutex(Mutex)
        PrintN("Mutex successfully locked.")

        UnlockMutex(Mutex)
        Break ; quit the loop and thread
      Else
        PrintN("Still waiting for mutex access...")
        Delay(200)
      EndIf
    ForEver
  EndProcedure

  OpenConsole()

  Mutex = CreateMutex()
  LockMutex(Mutex) ; main program has the mutex locked at first
  Thread = CreateThread(@ThreadProcedure(), 0)

  Delay(4000)
  UnlockMutex(Mutex) ; now release the mutex, so the thread can get it

  Input()


TrySemaphore

TrySemaphore()

Синтаксис

Result = TrySemaphore(Semaphore)
Описание
Уменьшает внутренний счётчик семафора на единицу только если его значение больше 0. Это то же, что и операция WaitSemaphore(), но без блокировки если счётчик достиг 0.

Возвращаемое значение

Возвращает не ноль если счётчик семафора был уменьшен, или 0 если счётчик невозможно уменьшить, потому что он уже равен нулю.


UnlockMutex

UnlockMutex()

Синтаксис

UnlockMutex(Mutex)
Описание
Разблокирует мьютекс, ранее заблокированный функцией LockMutex(). После этого мьютекс снова доступен для блокировки другими потоками.

Note: Разблокировать мьютекс может только тот поток, который заблокировал его.

Смотрите пример кода в описании функции CreateMutex().


WaitSemaphore

WaitSemaphore()

Синтаксис

WaitSemaphore(Semaphore)
Описание
Уменьшает внутренний счётчик семафора на единицу, блокируя выполнение потока если счётчик достиг нуля. Заблокированный поток возобновляется как только другой поток вызовет функцию SignalSemaphore().

Примечание: счётчик семафора ограничен знаковым 32bit value, поэтому можно сделать максимум 2147483647 вызовов функции WaitSemaphore(), не перемежающихся вызовами функции SignalSemaphore().

Пример кода смотрите в описании функции CreateSemaphore().


WaitThread

WaitThread()

Синтаксис

Result = WaitThread(Thread [, Timeout])
Описание
Приостанавливает выполнение программы до завершения заданного потока 'Thread', или до истечения времени, заданного необязательным параметром Timeout (в миллисекундах). Если поток уже завершился, функция немедленно возвращается.

Параметры

Thread - Номер потока, завершения которого вы хотите подождать. Это значение возвращает функция CreateThread().
Timeout - необязательное время ожидания в миллисекундах.

Возвращаемое значение

Если поток завершился, возвращаемое значение не ноль. Если вышло время ожидания возвращается ноль.

Пример:

  Procedure PrintStuff(*Interval)
    For i = 0 To 10
      PrintN(".")
      Delay(*Interval)
    Next
  EndProcedure

  If OpenConsole()
    thread = CreateThread(@PrintStuff(), 500)
    If thread
      ; Wait for thread to finish before we continue
      ; Try commenting the WaitThread function out and seeing what happens
      WaitThread(thread)

      For i = 0 To 10
        PrintN("A")
        Delay(1000)
      Next
    EndIf
  EndIf


ToolBar

PureBasic - ToolBar

Краткий обзор

Панели инструментов ( маленькие иконки ) используются для быстрого доступа к некоторым функциям приложения. PureBasic позволяет создавать и использовать любое количество панелей инструментов.

Краткий перечень команд

CreateToolBar
DisableToolBarButton
FreeToolBar
GetToolBarButtonState
IsToolBar
SetToolBarButtonState
ToolBarHeight
ToolBarID
ToolBarImageButton
ToolBarSeparator
ToolBarStandardButton
ToolBarToolTip


CreateToolBar

CreateToolBar()

Синтаксис

Result = CreateToolBar(#ToolBar, WindowID)
Описание
Создает пустую панель инструментов с номером '#ToolBar' в окне WindowID. Если #PB_Any будет использоваться как параметр '#Toolbar' , то номер инструментальной панели будет возвращено как 'Result'. WindowID может быть получен с помощью функции WindowID().

Эта инструментальная панель становится заданной по умолчанию инструментальной панелью для вновь создаваемых элементов. Вы можете использоватьToolBarStandardButton(), ToolBarImageButton() и ToolBarSeparator() для создания этих элементов.

Если 'Result' = 0, панель инструментов, не может быть создана.

Распознавание событий на инструментальных панелях подобно распознаванию меню, и следовательно требует команду EventMenu().

Пример:
  If OpenWindow(0, 0, 0, 150, 25, "ToolBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
    EndIf
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Menu
        Debug "ToolBar ID: "+Str(EventMenu())
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


DisableToolBarButton

DisableToolBarButton()

Синтаксис

DisableToolBarButton(#ToolBar, ButtonID, State)
Описание
Включает или выключает кнопку ButtonID на панели инструментов #ToolBar : 'State' = 0 включает, State = 1 выключает.

Пример:
  If OpenWindow(0, 0, 0, 150, 60, "ToolBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
      DisableToolBarButton(0, 1, 1) : Disabled = #True
    EndIf

    ButtonGadget(0, 20, 30, 110, 20, "Enable OpenFile")

    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget
        If EventGadget() = 0
          If Disabled = #True
            DisableToolBarButton(0, 1, 0)
            SetGadgetText(0,"Disable OpenFile")
            Disabled = #False
          Else
            DisableToolBarButton(0, 1, 1)
            SetGadgetText(0,"Enable OpenFile")
            Disabled = #True
          EndIf
        EndIf
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


FreeToolBar

FreeToolBar()

Синтаксис

FreeToolBar(#Toolbar)
Описание
Освобождает (убирает) панель инструментов под номером #Toolbar.

Примечание: все оставшиеся панели инструментов автоматически освобождаются, когда программа завершается.


GetToolBarButtonState

GetToolBarButtonState()

Синтаксис

State = GetToolBarButtonState(#ToolBar, ButtonID)
Описание
Получает состояние указанного переключателя ButtonID на панели инструментов #ToolBar: если 'State' = 1 кнопка нажата, если 'State' = 0, кнопка отпущена.

Поддерживаемые ОС

Windows, Linux


IsToolBar

IsToolBar()

Синтаксис

Result = IsToolBar(#ToolBar)
Описание
Проверяет, существует ли указанный #ToolBar. Данная функция может получить с любое значение. Если Result не =0, то панель инструментов существует.


SetToolBarButtonState

SetToolBarButtonState()

Синтаксис

SetToolBarButtonState(#ToolBar, ButtonID, State)
Описание
Устанавливает состояние указанного переключателя ButtonID на панели инструментов #ToolBar в положение вкл./выкл: если 'State' = 1 кнопка нажата, если 'State' = 0, кнопка отпущена.

Поддерживаемые ОС

Windows, Linux


ToolBarHeight

ToolBarHeight()

Синтаксис

Result = ToolBarHeight(#ToolBar)
Описание
Возвращает высоту #ToolBar в пикселях. Это полезно для правильного вычисления высоты окна, при использовании панели инструмента.


ToolBarID

ToolBarID()

Синтаксис

ToolBarID = ToolBarID(#ToolBar)
Описание
Возвращает уникальный идентификатор #ToolBar панели инструментов.

Этот результат также известен как 'Handle'. Смотрите Handles and Numbers для более подробной информации.


ToolBarImageButton

ToolBarImageButton()

Синтаксис

ToolBarImageButton(#ButtonID, ImageID [, Mode])
Описание
Добавляет изображение ImageID для #ButtonID на панели инструментов. Нужно вызвать CreateToolBar() пережде, чем использовать эту функцию.

'ImageID' может быть легко определено с помощью ImageID() из библиотеки изображений. Это может быть изображение, загруженное LoadImage() или созданное в памяти с CreateImage(). Чтобы иметь реальный прозрачный фон, используйте значок формата (.ico) в Windows, или значок формата (.PNG) в Linux/MacOS X.

С помощью дополнительного параметра 'Mode' можно быть скорректировать,будет ToolBarImageButton действовать как переключатель или кнопка. Для этого может использоваться одна из следующих констант:
  #PB_ToolBar_Normal: будет действовать как стандартная кнопка (настройка по умолчанию)
  #PB_ToolBar_Toggle: будет действовать как выключатель
Команды GetToolBarButtonState() и SetToolBarButtonState() позволяют узнать состояние кнопки.

Распознавание событий на инструментальных панелях подобно распознаванию меню, и следовательно требует команду EventMenu().

Пример:
  If OpenWindow(0, 0, 0, 150, 25, "ToolBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CreateImage(0,16,16)
    StartDrawing(ImageOutput(0))
      Box(0,0,16,16,RGB(255,255,255))
      Box(4,4,8,8,RGB(255,0,0))
    StopDrawing()
    CreateImage(1,16,16)
    StartDrawing(ImageOutput(1))
      Box(0,0,16,16,RGB(255,0,0))
      Box(4,4,8,8,RGB(255,255,255))
    StopDrawing()
    If CreateToolBar(0, WindowID(0))
      ToolBarImageButton(0,ImageID(0))
      ToolBarImageButton(1,ImageID(1))
    EndIf
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


ToolBarSeparator

ToolBarSeparator()

Синтаксис

ToolBarSeparator()
Описание
Добавляет вертикальный разделитель к создаваемой инструментальной панели. CreateToolBar() нужно вызвать прежде, чем использовать эту функцию.

Пример:
  If OpenWindow(0, 0, 0, 150, 25, "ToolBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarSeparator()
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarSeparator()
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
      ToolBarSeparator()
      ToolBarSeparator()
    EndIf
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Menu
        Debug "ToolBar ID: "+Str(EventMenu())
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf


ToolBarStandardButton

ToolBarStandardButton()

Синтаксис

ToolBarStandardButton(#ButtonID, #ButtonIcon [,Mode])
Описание
Добавляет стандартные кнопки на создаваемой инструментальной панели. CreateToolBar() нужно вызвать прежде, чем использовать эту функцию. Стандартные значки для кнопок доступны в операционной системе. Параметр '#ButtonIcon' должен быть одним из следующих констант:
  #PB_ToolBarIcon_New
  #PB_ToolBarIcon_Open
  #PB_ToolBarIcon_Save
  #PB_ToolBarIcon_Print
  #PB_ToolBarIcon_PrintPreview
  #PB_ToolBarIcon_Find
  #PB_ToolBarIcon_Replace

  #PB_ToolBarIcon_Cut
  #PB_ToolBarIcon_Copy
  #PB_ToolBarIcon_Paste
  #PB_ToolBarIcon_Undo
  #PB_ToolBarIcon_Redo

  #PB_ToolBarIcon_Delete
  #PB_ToolBarIcon_Properties
  #PB_ToolBarIcon_Help

С помощью дополнительного параметра 'Mode' можно быть скорректировать,будет ToolBarImageButton действовать как переключатель или кнопка. Для этого может использоваться одна из следующих констант:
  #PB_ToolBar_Normal: будет действовать как стандартная кнопка (настройка по умолчанию)
  #PB_ToolBar_Toggle: будет действовать как выключатель
Команды GetToolBarButtonState() и SetToolBarButtonState() позволяют узнать состояние кнопки.

Распознавание событий на инструментальных панелях подобно распознаванию меню, и следовательно требует команду EventMenu().

Пример:
  If OpenWindow(0, 0, 0, 150, 25, "ToolBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
    EndIf
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Menu
        Debug "ToolBar ID: "+Str(EventMenu())
      EndIf
    Until Event = #PB_Event_CloseWindow
  EndIf

Поддерживаемые ОС

Windows, Linux


ToolBarToolTip

ToolBarToolTip()

Синтаксис

ToolBarToolTip(#ToolBar, ButtonID, Text$)
Описание
Связывает указанный Text$ как подсказку для ButtonID на инструментальной панели #ToolBar. Текст Tooltip - это текст, который показывается (в маленьком желтом блоке), если указатель мыши остается довольно долго неподвижен над кнопкой.

Пример:
  If OpenWindow(0, 0, 0, 150, 60, "ToolBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
      ToolBarToolTip(0, 0, "New document")
      ToolBarToolTip(0, 1, "Open file")
      ToolBarToolTip(0, 2, "Save file")
    EndIf
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf


Window

PureBasic - Window

Краткий обзор

Windows являются важными компонентами современных интерфейсов. PureBasic обеспечивает полный доступ к ним.

Краткий перечень команд

AddKeyboardShortcut
AddWindowTimer
CloseWindow
DisableWindow
EventGadget
EventMenu
EventTimer
EventType
EventWindow
GetActiveWindow
GetWindowColor
GetWindowState
GetWindowTitle
HideWindow
IsWindow
OpenWindow
RemoveKeyboardShortcut
RemoveWindowTimer
ResizeWindow
SetActiveWindow
SetWindowCallback
SetWindowColor
SetWindowState
SetWindowTitle
SmartWindowRefresh
StickyWindow
WaitWindowEvent
WindowBounds
WindowEvent
WindowHeight
WindowID
WindowMouseX
WindowMouseY
WindowOutput
WindowWidth
WindowX
WindowY


AddKeyboardShortcut

AddKeyboardShortcut()

Синтаксис

AddKeyboardShortcut(#Window, Shortcut, Event)
Описание
Добавляет или изменяет быстрые сочетания клавиш в указанном #Window. Сочетание клавиш генерируют событие меню (подобно пункту меню), поскольку большинство из них используются вместе с меню. 'Event' - это число возвращаемое функцией EventMenu(). Значение 'Event' имеет ограниченный диапазон, от 0 до 64000. По умолчанию, окно уже содержит #PB_Shortcut_Tab и для быстрых переходов #PB_Shortcut_Tab|#PB_Shortcut_Shift, что позволяет работать с tab и shift-tab перемещаясь по гаджет. Сочетание клавиш можно удалить с помощью RemoveKeyboardShortcut().

Параметр 'Shortcut' может содержать одну из следующих констант:
  #PB_Shortcut_Back
  #PB_Shortcut_Tab
  #PB_Shortcut_Clear
  #PB_Shortcut_Return
  #PB_Shortcut_Menu
  #PB_Shortcut_Pause
  #PB_Shortcut_Print
  #PB_Shortcut_Capital
  #PB_Shortcut_Escape
  #PB_Shortcut_Space
  #PB_Shortcut_Prior
  #PB_Shortcut_Next
  #PB_Shortcut_End
  #PB_Shortcut_Home
  #PB_Shortcut_Left
  #PB_Shortcut_Up
  #PB_Shortcut_Right
  #PB_Shortcut_Down
  #PB_Shortcut_Select
  #PB_Shortcut_Execute
  #PB_Shortcut_Snapshot
  #PB_Shortcut_Insert
  #PB_Shortcut_Delete
  #PB_Shortcut_Help
  #PB_Shortcut_0
  #PB_Shortcut_1
  #PB_Shortcut_2
  #PB_Shortcut_3
  #PB_Shortcut_4
  #PB_Shortcut_5
  #PB_Shortcut_6
  #PB_Shortcut_7
  #PB_Shortcut_8
  #PB_Shortcut_9
  #PB_Shortcut_A
  #PB_Shortcut_B
  #PB_Shortcut_C
  #PB_Shortcut_D
  #PB_Shortcut_E
  #PB_Shortcut_F
  #PB_Shortcut_G
  #PB_Shortcut_H
  #PB_Shortcut_I
  #PB_Shortcut_J
  #PB_Shortcut_K
  #PB_Shortcut_L
  #PB_Shortcut_M
  #PB_Shortcut_N
  #PB_Shortcut_O
  #PB_Shortcut_P
  #PB_Shortcut_Q
  #PB_Shortcut_R
  #PB_Shortcut_S
  #PB_Shortcut_T
  #PB_Shortcut_U
  #PB_Shortcut_V
  #PB_Shortcut_W
  #PB_Shortcut_X
  #PB_Shortcut_Y
  #PB_Shortcut_Z
  #PB_Shortcut_LeftWindows
  #PB_Shortcut_RightWindows
  #PB_Shortcut_Apps
  #PB_Shortcut_Pad0
  #PB_Shortcut_Pad1
  #PB_Shortcut_Pad2
  #PB_Shortcut_Pad3
  #PB_Shortcut_Pad4
  #PB_Shortcut_Pad5
  #PB_Shortcut_Pad6
  #PB_Shortcut_Pad7
  #PB_Shortcut_Pad8
  #PB_Shortcut_Pad9
  #PB_Shortcut_Multiply
  #PB_Shortcut_Add
  #PB_Shortcut_Separator
  #PB_Shortcut_Subtract
  #PB_Shortcut_Decimal
  #PB_Shortcut_Divide
  #PB_Shortcut_F1
  #PB_Shortcut_F2
  #PB_Shortcut_F3
  #PB_Shortcut_F4
  #PB_Shortcut_F5
  #PB_Shortcut_F6
  #PB_Shortcut_F7
  #PB_Shortcut_F8
  #PB_Shortcut_F9
  #PB_Shortcut_F10
  #PB_Shortcut_F11
  #PB_Shortcut_F12
  #PB_Shortcut_F13
  #PB_Shortcut_F14
  #PB_Shortcut_F15
  #PB_Shortcut_F16
  #PB_Shortcut_F17
  #PB_Shortcut_F18
  #PB_Shortcut_F19
  #PB_Shortcut_F20
  #PB_Shortcut_F21
  #PB_Shortcut_F22
  #PB_Shortcut_F23
  #PB_Shortcut_F24
  #PB_Shortcut_Numlock
  #PB_Shortcut_Scroll
Выше упомянутые клавиши можно объединить с одной из следующих констант:
  #PB_Shortcut_Shift
  #PB_Shortcut_Control
  #PB_Shortcut_Alt
  #PB_Shortcut_Command
Примечание: константа #PB_Shortcut_Command используется на MacOS X и позволяет использовать клавишу 'Apple' (левую или правую) для создания быстрых клавиш. Эта константа поддерживается другими OS (для улучшения переностимость), но будет работать как #PB_Shortcut_Control.

Пример:
  AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_ShortCut_F, 15) ; Will create a keyboard shortcut CTRL+F on the window 0
                                                                    ; which will fires a menu event '15'


AddWindowTimer

AddWindowTimer()

Синтаксис

AddWindowTimer(#Window, Timer, Timeout)
Описание
Добавляет новый таймер на окне #Window. Это будет периодически генерировать события типа #PB_Event_Timer в WindowEvent() или WaitWindowEvent(). RemoveWindowTimer() функция может быть использована для удаления таймера.

Параметры

Параметр #Window определяет окно для таймера. Таймер присоединенный к окну будет удален, если окно закроется.

Параметр Timer - определяемое пользователем число, которое идентифицирует этот таймер. Таймеры в разных окнах могут иметь перекрывающиеся номера. Это значение вернётся от EventTimer(), если будет получено событие #PB_Event_Timer. Она может быть использована для удаления окна с таймером RemoveWindowTimer().

Timeout параметр определяет время в миллисекундах между событиями #PB_Event_Timer.

Примечание: события таймера генерируются только тогда, когда нет другого события, таймеры являются событиями с низким приоритетом. Это означает, что они относительно мало точны, и что одинаковое время прошедшее между двумя событиями того же таймера может меняться. Они не предназначены для определения точного времени, а скорее для выполнения периодических задач, таких как обновление гаджета.

Пример:

  If OpenWindow(0, 0, 0, 400, 100, "Timer Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    ProgressBarGadget(0, 10, 10, 380, 20, 0, 100)
    AddWindowTimer(0, 123, 250)

    Value = 0
    Repeat
      Event = WaitWindowEvent()

      If Event = #PB_Event_Timer And EventTimer() = 123
        Value = (Value + 5) % 100
        SetGadgetState(0, Value)
      EndIf

    Until Event = #PB_Event_CloseWindow
  EndIf


CloseWindow

CloseWindow()

Синтаксис

CloseWindow(#Window)
Описание
Закрывает указанное окно.

Примечание: Все остальные окна закрываются автоматически при выходе из программы.


DisableWindow

DisableWindow()

Синтаксис

DisableWindow(#Window, State)
Описание
Разрешает или блокирует пользовательский ввод в указанное окно.

'State' может иметь следующие значения:
  1: Окно disabled (заблокировано).
  0: Окно enabled (разрешено).


EventGadget

EventGadget()

Синтаксис

GadgetNumber = EventGadget()
Описание
После события типа #PB_Event_Gadget (возвращаемый WindowEvent() или WaitWindowEvent()), используйте эту функцию, чтобы определить, какой гаджет был активирован. Это возвращает номер #Gadget.


EventMenu

EventMenu()

Синтаксис

MenuItem = EventMenu()
Описание
После события типа #PB_Event_Menu (возвращаемое WindowEvent() или WaitWindowEvent()), используйте эту функцию, чтобы определить, какой пункт меню был вызван (возвращает номер #MenuItem).

Эта функция также проверяет выбранный пункт в toolbar созданый CreateToolBar().

События toolBar похожи на события меню (как сочетание клавиш для пунктов меню). Таким образом, если у кнопок toolbar и меню тот же самый ID, тогда та же операция может быть выполнена на обеих и без дополнительного кода.


EventTimer

EventTimer()

Синтаксис

Timer = EventTimer()
Описание
После события типа #PB_Event_Timer (возвращаемое WindowEvent() или WaitWindowEvent()), используйте эту функцию, чтобы определить таймер, который вызвал событие. Возвращаемое значение - то же самое, которое использовалось в AddWindowTimer(), чтобы создать таймер.


EventType

EventType()

Синтаксис

EventType = EventType()
Описание
После функций WindowEvent() или WaitWindowEvent(), используйте эту функцию, чтобы определить какое произошло событие. Следующие значения возможны, если происходят события типа #PB_Event_Gadget (библиотека Gadget) или #PB_Event_SysTray (библиотека Systray):
  #PB_EventType_LeftClick       : кликните левой кнопкой мыши
  #PB_EventType_RightClick      : кликните правой кнопкой мыши
  #PB_EventType_LeftDoubleClick : дважды кликните левой кнопкой мыши
  #PB_EventType_RightDoubleClick: дважды правой кнопкой мыши
  #PB_EventType_Focus           : Получение фокуса.
  #PB_EventType_LostFocus       : Потеря фокуса.
  #PB_EventType_Change          : содержание не изменилось.
  #PB_EventType_DragStart       : пользователь пытался запустить Drag & Drop.
Следующие гаджеты поддерживают EventType ():

- ExplorerListGadget()
- ExplorerTreeGadget()
- ImageGadget()
- ListViewGadget()
- ListIconGadget()
- MDIGadget()
- SpinGadget()
- StringGadget()
- WebGadget() - У WebGadget есть специальный набор событий.

(Более полную информацию смотрите в описании каждого гаджета.)

Пример:
  If OpenWindow(0, 0, 0, 230, 120, "Eventtypes example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
     ListIconGadget(1, 10, 10, 150, 100, "ListIcon", 140, #PB_ListIcon_GridLines)
     For a = 1 To 4
       AddGadgetItem(1, -1, "Line "+Str(a))
     Next

     Repeat
       Event = WaitWindowEvent()

       Select Event

         Case #PB_Event_Gadget
           Select EventGadget()
             Case 1
               Select EventType()
                 Case #PB_EventType_LeftClick        : Debug "Click with left mouse button"
                 Case #PB_EventType_RightClick       : Debug "Click with right mouse button"
                 Case #PB_EventType_LeftDoubleClick  : Debug "Double-click with left mouse button"
                 Case #PB_EventType_RightDoubleClick : Debug "Double-click with right mouse button"
               EndSelect
           EndSelect

       EndSelect
     Until Event = #PB_Event_CloseWindow
  EndIf


EventWindow

EventWindow()

Синтаксис

WindowNumber = EventWindow()
Описание
После функций WindowEvent() или WaitWindowEvent(), используйте эту функцию, чтобы определить в каком окне произошло событие.


GetActiveWindow

GetActiveWindow()

Синтаксис

WindowNumber = GetActiveWindow()
Описание
Возвращает номер окна PB, которое имеет фокус (активно) в настоящий момент времени.

Фокус на окне можно установить функцией SetActiveWindow().


GetWindowColor

GetWindowColor()

Синтаксис

Color = GetWindowColor(#Window)
Описание
Возвращает цвет фона указанного окна, который был установлен функцией SetWindowColor().

Если цвет не был установлен, то вернется -1.


GetWindowState

GetWindowState()

Синтаксис

State = GetWindowState(#Window)
Описание
Проверяет состояние указанного окна: normally, maximized или minimized.

Возвращается одно из следующих значений:
  #PB_Window_Normal  : окно не развёрнуто, не свёрнуто.
  #PB_Window_Maximize: окно развёрнуто.
  #PB_Window_Minimize: окно свёрнуто.
Статус окна можно изменить функцией SetWindowState().


GetWindowTitle

GetWindowTitle()

Синтаксис

Result$ = GetWindowTitle(#Window)
Описание
Возвращает в 'Result$' текст заголовка окна, который отображается в указанном #Window's.
  If OpenWindow(2, 100, 100, 200, 100, "My cool title")
    Title$ = GetWindowTitle(2)  ; Will return "My cool title"
  EndIf
Зоголовок окна можно изменить с помощью функции SetWindowTitle().


HideWindow

HideWindow()

Синтаксис

HideWindow(#Window, State)
Описание
Полностью скрывает или отображает указанное окно PB, HideWindow имеет два значения:
  1: #Window скрыто
  0: #Window отображено


IsWindow

IsWindow()

Синтаксис

Result = IsWindow(#Window)
Описание
Эта функция проверяет уникальный идентификатор указанного #Window, а так же является ли указанное целое неотрицательное число корректным и правильно инициализированным. Функция возвращает не нулевой результат, если есть открытый окно с таким идентификатором. Если окно с таким идентификатором нет, будет возвращён нулевой результат. Обычно эту функцию используют, чтобы узнать готово ли окно к работе.


OpenWindow

OpenWindow()

Синтаксис

Result = OpenWindow(#Window, x, y, InnerWidth, InnerHeight, Title$ [, Flags [, ParentWindowID]])
Описание
Открывает новое окно согласно указанным параметрам. Если в качестве параметра '#Window' поставить #PB_Any, то универсальный идентификатор (id) будет возвращен в качестве 'Result'.

Вновь созданное окно становится активным, и нет необходимости использовать SetActiveWindow() (если окно не создано как invisible). Если 'Result' возвращает 0, то окно не может быть открыто.

'InnerWidth' и 'InnerHeight' определяют размер окна (без границ и украшений), для Windows XP, AmigaOS и Linux skinning compatibility. 'x' и 'y' определяют позицию окна. (если не используются флаги). Если один из них #PB_Ignore, то OS определяет позицию самостоятельно.

'ParentWindowID' - дополнительный параметр, который определяет какому окно принадлежит вновь созданное окно. Значение 'ParentWindowID' можно получить функцией WindowID().

Возможные опции:
  #PB_Window_SystemMenu    : Добавляется системное меню на полосе заголовка.
  #PB_Window_MinimizeGadget: Добавляется пиктограмма свернуть на полосе заголовка. #PB_Window_SystemMenu добавляется автоматически.
  #PB_Window_MaximizeGadget: Добавляется пиктограмма развернуть на полосе заголовка. #PB_Window_SystemMenu добавляется автоматически.
  #PB_Window_SizeGadget    : Добавляется возможность изменения размера окна.
  #PB_Window_Invisible     : Создает окно, но не отображает. Не поддерживается на AmigaOS.
  #PB_Window_TitleBar      : Создает окно с полосой заголовка.
  #PB_Window_Tool          : Создает окно с меньшим заголовком и нет панели задач.
  #PB_Window_BorderLess    : Создает окно без края.
  #PB_Window_ScreenCentered: Центр окна в центре экрана.  Параметры X, Y, игнорируются.
  #PB_Window_WindowCentered: Центр окна в центре родительского окна ( 'FenetreMereID' должна быть указано). Параметры X, Y, игнорируются.
  #PB_Window_Maximize      : Открывает окно развернутым. (Примечание: под Linux, некоторые оконные менеджеры не поддерживают это)
  #PB_Window_Minimize      : Открывает окно в свернутом режиме.
  #PB_Window_NoGadgets     : препятствует созданию GadgetList. UseGadgetList() может быть использован, чтоб сделать это позже.
Если параметр Flags не будет указан, то будет использоваться #PB_Window_SystemMenu.

Все события в окне отслеживаются функциями WindowEvent() и WaitWindowEvent(). В особых случаях для обратных вызовов используется функция SetWindowCallback(). На Windows, высота и ширина окна с titlebar не может быть меньше чем 100 pixels. Для открытия окна меньшего размера нужно использовать флаг "#PB_Window_BorderLess".

Примечание: При октрытии окна в параллельном потоке thread, в этом же потоке нужно вызвать в цикле функции WindowEvent() или WaitWindowEvent(), для обработки событий этого окна, поскольку события окна не передаются в другие потоки!


RemoveKeyboardShortcut

RemoveKeyboardShortcut()

Синтаксис

RemoveKeyboardShortcut(#Window, Shortcut)
Описание
Удаляет сочетание клавиш, ранее созданные функцией AddKeyboardShortcut(). Для получения полного списка используйте функцию AddKeyboardShortcut(). Если в 'Shortcut' установить #PB_Shortcut_All, то все сочетания клавиш будут удалены.


RemoveWindowTimer

RemoveWindowTimer()

Синтаксис

RemoveWindowTimer(#Window, Timer)
Описание
Удаляет таймер Timer в окне #Window. Timer должно иметь такое же значение, что было использовано в AddWindowTimer() для создания таймера. После этого не будет никаких событий, полученных от этого таймера.


ResizeWindow

ResizeWindow()

Синтаксис

ResizeWindow(#Window, x, y, Width, Height)
Описание
Перемещает и изменяет данное окно в нужную позицию, и необходимый размер. Если нужно проигнорировать любой из параметров (не изменять), то установите #PB_Ignore.


SetActiveWindow

SetActiveWindow()

Синтаксис

SetActiveWindow(#Window)
Описание
Устанавливает фокус на определенном окне. Функция устанавливает фокус в пределах программы. Эта функция не может перемещать окно на передний план, если фокус установлен на друго программе.


SetWindowCallback

SetWindowCallback()

Синтаксис

SetWindowCallback(@ProcedureName() [, #Window] )
Описание
Функция поддерживается только Microsoft Windows OS.

Стандартные события должны обрабатываться WaitWindowEvent() или WindowEvent().

Эта функция создает обратный вызов, позволяя обрабатывать события во всех открытых окнах. Все события перехваченные данным вызовом могуд быть обработаны. Чтобы установить обратный вызов для определенного окна, можно использовать опциональный параметр для передачи номера окна PB.

Для удаления предыдущего Callback вызовите SetWindowCallback(0 [, #Window]).

Предупреждение: этот способ работает на низком уровне. Неправильная обработка сообщений в обратном вызове может вмешаться в собственную обработку сообщений PB.

У процедуры callback должно быть 4 параметра. Вот пример кода, как делать правильно обратный вызов:
  Procedure MyWindowCallback(WindowID, Message, wParam, lParam)
    Result = #PB_ProcessPureBasicEvents
    ;
    ; you code here
    ;
    ProcedureReturn Result
  EndProcedure
В этом примере проверяются некоторые параметры окна (используются константы Windows API):
  Procedure WinCallback(hWnd, uMsg, wParam, lParam)
    ; Windows fills the parameter automatically, which we will use in the callback...

    If uMsg = #WM_SIZE
      Select wParam
        Case #SIZE_MINIMIZED
          Debug "Window was minimized"
        Case #SIZE_RESTORED
          Debug "Window was restored"
        Case #SIZE_MAXIMIZED
          Debug "Window was maximized"
      EndSelect
    EndIf

    ProcedureReturn #PB_ProcessPureBasicEvents
  EndProcedure

  If OpenWindow(0, 0, 0, 200, 100, "Messages", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget)

    SetWindowCallback(@WinCallback())    ; activate the callback

    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          End
      EndSelect
    ForEver

  EndIf

Поддерживаемые ОС

Windows


SetWindowColor

SetWindowColor()

Синтаксис

SetWindowColor(#Window, Color)
Описание
Изменяет цвет фона указанного окна.

RGB() можно использовать для получения допустимого цвета. Таблица с общими цветами доступна здесь.

Используйте -1 как 'Color' для восстановления цвета по умолчанию.

Фактический цвет окна можно получить функцией GetWindowColor().


SetWindowState

SetWindowState()

Синтаксис

SetWindowState(#Window, State)
Описание
Изменяет minimized/maximized определенного окна.

'State' может иметь следующие значения:
  #PB_Window_Normal  : окно не развёрнуто, не свёрнуто.
  #PB_Window_Maximize: окно развёрнуто.
  #PB_Window_Minimize: окно свёрнуто.
Фактический статус окна можно получить функцией GetWindowState().


SetWindowTitle

SetWindowTitle()

Синтаксис

SetWindowTitle(#Window, Title$)
Описание
Изменение текста, который в настоящее время отображается в строке заголовка #Window's.

Пример:
  If OpenWindow(2, 100, 100, 200, 100, "My cool title")
    SetWindowTitle(2, "Even cooler title !")

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
Нынешнее название окна может быть получено с помощью GetWindowTitle().


SmartWindowRefresh

SmartWindowRefresh()

Синтаксис

SmartWindowRefresh(#Window, State)
Описание
Обновляет указанное окно, что позволяет уменьшить мерцание при изменении его размеров. Если окно не неизменяемого размера, то эта функция не нужна. Эта функция только уменьшает мерцание, но польностью не решает эту проблему. Для проверки эффективности работы функции нужно проводить испытание для каждого конкретного случая. Если 'State' 0, то обновление заблокировано, иначе разрешено.

Поддерживаемые ОС

Windows


StickyWindow

StickyWindow()

Синтаксис

StickyWindow(#Window, State)
Описание
Размещает указанное окно поверх всех открытых окон (и по отношению к другим программам), даже если у него нет фокуса.

'State' может иметь следующие значения:
  1: окно отображается поверх всех остальных окон.
  0: окно не отображается поверх всех оконо, пока у него нет фокуса.


WaitWindowEvent

WaitWindowEvent()

Синтаксис

Event = WaitWindowEvent([Timeout])
Описание
Возвращает событие. Это - таже самая функция что и WindowEvent(), но блокирует выполнение программы, что очень важно в многозадачной среде.

Опционально можно установить таймер (в милисекундах), что позволяет вернуть функцию в работу после указанного количества времени ожидания, если никакие события не произошли.

По возможности нужно использовать эту функцию вместо WindowEvent(). Для получения дополнительной информации см. WindowEvent().

Примечание:
При открытии окна из потока нужно в цикле вызывать WindowEvent() или WaitWindowEvent() для обработки событий этого окна, поскольку события этого окна не обрабатываются в других потоках.

WaitWindowEvent() нужно вызывать в цикле один раз, иначе часть событий будет утеряна (каждое событие можно обработать только один раз, при повторном цикле оно больше не доступно).

Basic пример:
  If OpenWindow(0, 0, 0, 230, 90, "Event handling example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

   ButtonGadget  (1, 10, 10, 200, 20, "Click me")
   CheckBoxGadget(2, 10, 40, 200, 20, "Check me")

   If CreateMenu(0, WindowID(0))
     MenuTitle("Menu")
     MenuItem(1, "Item 1")
     MenuItem(2, "Item 2")
     MenuItem(3, "Item 3")
   EndIf

   Repeat
     Event = WaitWindowEvent()

     Select Event

       Case #PB_Event_Gadget
         Select EventGadget()
           Case 1 : Debug "Button 1 clicked!"
           Case 2 : Debug "Button 2 clicked!"
           Case 3 : Debug "Button 3 clicked!"
         EndSelect

       Case #PB_Event_Menu
         Select EventMenu()
           Case 1 : Debug "Menu item 1 clicked!"
           Case 2 : Debug "Menu item 2 clicked!"
           Case 3 : Debug "Menu item 3 clicked!"
         EndSelect

     EndSelect
   Until Event = #PB_Event_CloseWindow
 EndIf


WindowBounds

WindowBounds()

Синтаксис

WindowBounds(#Window, MinimalWidth, MinimalHeight, MaximalWidth, MaximalHeight)
Описание
Устанавливает ограничения на максимальное и минимальное изменение размеров указанного #Window (в пикселах). Можно использовать #PB_Ignore для сохранения текущих значений.

Пример:
  If OpenWindow(0, 0, 0, 300, 300, "Resize me !", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
    WindowBounds(0, 200, 200, 400, 400)

    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


WindowEvent

WindowEvent()

Синтаксис

Event = WindowEvent()
Описание
Отслеживает события в любом из открытых окон.

WindowEvent() возвращает следующее событие из очереди событий и возвращает 0, если событий больше нет. В отличии от WaitWindowEvent(), эта функция не ждет следующего события, а возвращает всегда немедленно.

Это полезно для циклов событий окна, где нужно зделать обработку не дожидаясь события (например Network транзакции) и поэтому WaitWindowEvent() не может использоваться.

Это нужно использовать с осторожностью, поскольку в отличии от WaitWindowEvent(), эта функция не выделяет процессорное время другим программам при ожидании события, поэтому использует всю мощь CPU. В этом случае нужно применять Delay(), встраивая задержку где-нибуть в цикле или использовать WaitWindowEvent() с минимальным значением таймера.

Для получения значения окна, в котором произошло событие, используйте функцию EventWindow().

Возможные события:
  #PB_Event_Menu           : было выбрано menu
  #PB_Event_Gadget         : был нажат gadget
  #PB_Event_SysTray        : иконка в systray была нажата
  #PB_Event_Timer          : timer достигает своего срока (таймаут)
  #PB_Event_CloseWindow    : нажали пиктограмму закрытия
  #PB_Event_Repaint        : все или часть содержимого окна было разрушено и должно быть восстановлено (полезно для 2D graphics operations)
  #PB_Event_SizeWindow     : изменение размеров окна
  #PB_Event_MoveWindow     : окно было перемещено
  #PB_Event_MinimizeWindow : окно минимизировано
  #PB_Event_MaximizeWindow : окно развёрнуто
  #PB_Event_RestoreWindow  : окно было восстановлено до нормальных размеров (из минимального или максимального размера)
  #PB_Event_ActivateWindow : окно было активировано (получило фокус)
  #PB_Event_WindowDrop     : Drag & Drop операция была завершена на окне
  #PB_Event_GadgetDrop     : Drag & Drop операция была завершена на gadget
Основной пример по обработке событий можно найти в описании WaitWindowEvent().

После события #PB_Event_WindowDrop или #PB_Event_GadgetDrop, можно применять функции из библиотеки Drag & Drop library.

Примечание: При открытии окна из потока нужно в цикле вызывать WindowEvent() или WaitWindowEvent() для обработки событий этого окна, поскольку события этого окна не обрабатываются в других потоках.

Пример правильной обработки цикла функцией WindowEvent():
  Repeat
    Event = WindowEvent()

    If Event    ; An event was in the queue so process it
      ....
    Else
      Delay(1)  ; No event, let the others apps get some CPU time too !
    EndIf
  Until Event = #PB_Event_CloseWindow
Примечание: Не нужно применять 'Delay' после каждого события, поскольку при возникновении большого количества событий (обновление окна с большим количеством гаджетов) приложение будет ждать 20 ms (по крайней мере на окнах) между каждым событием. Таким образом задержку нужно делать в случае не получения события. Иначе нужно использовать функцию WaitWindowEvent() с минимальной задержкой таймера.


WindowHeight

WindowHeight()

Синтаксис

Height = WindowHeight(#Window)
Описание
Возвращает высоту данного окна в пикселах.

Для получения высоты десктопа, нужно использовать DesktopHeight() из библиотеки Desktop.


WindowID

WindowID()

Синтаксис

WindowID = WindowID(#Window)
Описание
Возвращает уникальный ID, который идентифицирует указанное '#Window' в операционной системе. Эта функция полезна когда другая библиотека нуждается в ссылке на это окно

Этот результат иногда называют "хендл" ('Handle'). Дополнительную информацию смотрите в Handles and Numbers.


WindowMouseX

WindowMouseX()

Синтаксис

x = WindowMouseX(#Window)
Описание
Возвращает X координату положения курсора мыши во внутренней области окна. Если курсор будет за пределами окна, то вернется -1.

Для получения абсолютной координаты X положения курсора мыши на десктопе, используйте функцию DesktopMouseX().
  If OpenWindow(0, 0, 0, 300, 30, "Window mouse monitor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget(0, 10, 6, 200, 20, "")

    Repeat
      Event = WaitWindowEvent(20) ; return at least every 20ms for an update

      SetGadgetText(0, "Window mouse position: " + Str(WindowMouseX(0)) + "," + Str(WindowMouseY(0)))
    Until Event = #PB_Event_CloseWindow
  EndIf


WindowMouseY

WindowMouseY()

Синтаксис

y = WindowMouseY(#Window)
Описание
Возвращает Y координату положения курсора мыши во внутренней области окна. Если курсор будет за пределами окна, то вернется -1.

Для получения абсолютной координаты Y положения курсора мыши на десктопе, используйте функцию DesktopMouseY().
  If OpenWindow(0, 0, 0, 300, 30, "Window mouse monitor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    TextGadget(0, 10, 6, 200, 20, "")

    Repeat
      Event = WaitWindowEvent(20) ; return at least every 20ms for an update

      SetGadgetText(0, "Window mouse position: " + Str(WindowMouseX(0)) + "," + Str(WindowMouseY(0)))
    Until Event = #PB_Event_CloseWindow
  EndIf


WindowOutput

WindowOutput()

Синтаксис

OutputID = WindowOutput(#Window)
Описание
Возвращает OutputID данного окна, для выполнения 2D rendering операций. Это используетсмя PureBasic библиотекой 2DDrawing (см. StartDrawing()).

Примечание: Содержание, нарисованное на окне, будет стерто, как только окно или его часть будет покрыта другим окном, перемещено за пределамы экрана или когда окно сворачивается или разворачивается. Чтобы сохранить видимое содержание, обязательно его повторно нарисовать после каждого события #PB_Event_Repaint. Более удобный способ для отображения рисунка на окне, состоит в том, чтобы использовать изображение ImageOutput() и отобразить это как ImageGadget() которое возможно обновить SetGadgetState(). Этим путем вся необходимая регенерация будет обработана ImageGadget.

Поддерживаемые ОС

Windows, Linux


WindowWidth

WindowWidth()

Синтаксис

Width = WindowWidth(#Window)
Описание
Возвращает ширину данного окна в пикселах.
Для получения высоты десктопа, нужно использовать DesktopWidth() из библиотеки Desktop из библиотеки.


WindowX

WindowX()

Синтаксис

x = WindowX(#Window)
Описание
Возвращает левую позицию определенного окна.


WindowY

WindowY()

Синтаксис

y = WindowY(#Window)
Описание
Возвращает верхнюю позицию определенного окна в пикселах.


Window3D

PureBasic - Window3D

Краткий обзор

The Window3D library allows to create complex Graphical User Interface (GUI) directly over the screen area, using the 3D engine. This is mainly intended for game or application which needs user inputs while running in fullscreen mode. This library is is based on the regular PureBasic window library, and offer similar syntax and behaviour. The GUI engine used is CEGUI, which offer some nice options like skinning, good speed and a lot of build-in gadgets. More information about CEGUI can be found here: http://www.cegui.org.uk.

It uses the 3D engine, so InitEngine3D() has to be called succesfully before using these functions.

Краткий перечень команд

CloseWindow3D
DisableWindow3D
EventGadget3D
EventType3D
EventWindow3D
GetActiveWindow3D
GetWindowTitle3D
HideWindow3D
IsWindow3D
OpenWindow3D
ResizeWindow3D
SetActiveWindow3D
SetWindowTitle3D
WindowEvent3D
WindowHeight3D
WindowID3D
WindowWidth3D
WindowX3D
WindowY3D


CloseWindow3D

CloseWindow3D()

Синтаксис

CloseWindow3D(#Window3D)
Описание
Close the specified window.

Note: all remaining opened windows are automatically closed when the program ends.


DisableWindow3D

DisableWindow3D()

Синтаксис

DisableWindow3D(#Window3D, State)
Описание
Enables or disables user input to the specified Window.

'State' can take the following values:
  1: The window is disabled.
  0: The window is enabled.


EventGadget3D

EventGadget3D()

Синтаксис

GadgetNumber = EventGadget3D()
Описание
After an event of type #PB_Event3D_Gadget (returned by WindowEvent3D()), use this function to determine which gadget has been triggered. It returns the #Gadget3D number.


EventType3D

EventType3D()

Синтаксис

EventType = EventType3D()
Описание
After a WindowEvent3D() function, use this function to determine of which type the event is. The following values are possible, if an event of the type #PB_Event3D_Gadget (library Gadget3D) occurs:
  #PB_EventType3D_Focus    : Get the focus.
  #PB_EventType3D_LostFocus: Lose the focus.
  #PB_EventType3D_Change   : Content change.
The following gadgets support EventType3D():

- SpinGadget3D()
- StringGadget3D()

(See the gadget definition to see which events are supported.)


EventWindow3D

EventWindow3D()

Синтаксис

WindowNumber = EventWindow3D()
Описание
After a WindowEvent3D() function, use this function to determine on which window the event has occurred.


GetActiveWindow3D

GetActiveWindow3D()

Синтаксис

WindowNumber = GetActiveWindow3D()
Описание
Returns the PB Number of the window which currently has the keyboard focus.

A window can be activated (set the focus on it) with the SetActiveWindow3D() function.


GetWindowTitle3D

GetWindowTitle3D()

Синтаксис

Result$ = GetWindowTitle3D(#Window3D)
Описание
Returns the text which is currently displayed in the specified #Window3D's title bar.

The title of a window can be changed with SetWindowTitle3D().


HideWindow3D

HideWindow3D()

Синтаксис

HideWindow3D(#Window3D, State)
Описание
Hides or shows the specified #Window3D. 'State' can take the following values:
  1: the #Window3D is hidden
  0: the #Window3D is shown


IsWindow3D

IsWindow3D()

Синтаксис

Result = IsWindow3D(#Window3D)
Описание
Tests if the given #Window3D is a valid and correctly initialized window.

This function is bullet-proof and can be used with any value. If the 'Result' is not zero then the object is valid and initialized, else it returns zero. This is the correct way to ensure that a window is ready to use.


OpenWindow3D

OpenWindow3D()

Синтаксис

Result = OpenWindow3D(#Window3D, x, y, InnerWidth, InnerHeight, Title$ [, Flags])
Описание
Opens a new window on the current screen according to the specified parameters. If #PB_Any is used as '#Window3D' parameter, the new window number will be returned as 'Result'.

The new window becomes the active window, it's not needed to use SetActiveWindow3D() (unless the window is created as invisible). If the 'Result' is 0, the window can't be opened.

'InnerWidth' and 'InnerHeight' specify the required client area (without borders and window decorations). 'x' and 'y' specify the initial position of the window. (unless one of the center flags is used.) If one of them is #PB_Ignore, the OS will choose a position for the window.

Possible flags are:
  #PB_Window3D_SizeGadget : Adds the sizeable feature to a window.
  #PB_Window3D_Invisible  : Creates the window but don't display it.
  #PB_Window3D_BorderLess : Creates a window without any borders.
All possible events in a window are handled with WindowEvent3D().


ResizeWindow3D

ResizeWindow3D()

Синтаксис

ResizeWindow3D(#Window3D, x, y, Width, Height)
Описание
Move and resize the given window to the given position and size. If any of the parameters should be ignored (not be changed) #PB_Ignore can be passed at this place.


SetActiveWindow3D

SetActiveWindow3D()

Синтаксис

SetActiveWindow3D(#Window3D)
Описание
Activate the specified window, which means the focus has been put on this window. The function will only change the focus within the program. It can not bring the program to the foreground when another program has the focus.


SetWindowTitle3D

SetWindowTitle3D()

Синтаксис

SetWindowTitle3D(#Window3D, Title$)
Описание
Changes the text which is currently displayed in the specified #Window3D's title bar.

The actual window title can later be get with GetWindowTitle3D().


WindowEvent3D

WindowEvent3D()

Синтаксис

Event = WindowEvent3D()
Описание
Check if an event has occured on any of the opened windows.

WindowEvent3D() returns the next event from the event queue and returns zero when there are no more events. It doesn't wait for the next event - it always returns immediately.

To get the window number in which the event occurred, use the EventWindow3D() function.

Possible Events are :
  #PB_Event3D_Gadget         : a Gadget3D has been pushed
  #PB_Event3D_CloseWindow    : the window close gadget has been pushed
  #PB_Event3D_SizeWindow     : the window has been resized
  #PB_Event3D_MoveWindow     : the window has been moved
  #PB_Event3D_ActivateWindow : the window has been activated (got the focus)


WindowHeight3D

WindowHeight3D()

Синтаксис

Height = WindowHeight3D(#Window3D)
Описание
Returns the height, in pixels, of the given window.


WindowID3D

WindowID3D()

Синтаксис

WindowID = WindowID3D(#Window3D)
Описание
Returns the unique ID which identifies the given '#Window3D' in the operating system. This function is very useful when another library needs a window reference.


WindowWidth3D

WindowWidth3D()

Синтаксис

Width = WindowWidth3D(#Window3D)
Описание
Return the width, in pixels, of the given window.


WindowX3D

WindowX3D()

Синтаксис

x = WindowX3D(#Window3D)
Описание
Returns the left position on the screen, in pixels, of the given window.


WindowY3D

WindowY3D()

Синтаксис

y = WindowY3D(#Window3D)
Описание
Returns the top position on the screen, in pixels, of the given window.


XML

PureBasic - XML

Краткий обзор

Библиотеки XML имеет ряд функций для синтаксического анализа и возможностью создания XML. Она основана на expat XML parser, под лицензией MIT (лицензия находится здесь).

ВАЖНО: Expat лицензия требует, чтобы уведомление об авторском праве и сам текст лицензии были интегрированы в любое программное обеспечение, которое включает в себя анализатор.

В PureBasic Expat функция может быть использована как и любые другие функции API (с символом "подчеркивание" в конце имени функции). Это также позволяет использовать Expat функции, которые не предоставляются в библиотеке. Константы и структуры, определенные в expat.h, также напрямую доступны в PureBasic. Версия Expat unicode выбирается автоматически если используется Compiler-Switch. Для получения подробной информации о функциях Expat, см. документацию на http://expat.sourceforge.net/

This library has partial support for Document Type Definitions (DTD) and Namespaces. The goal is to keep the commandset very simple while still allowing this library to handle any XML compliant document.

The expat parser is a non-validating parser. This means it checks the parsed documents for errors in the markup (a document must be well-formed according to the XML specification), but it does not validate the document against a DTD. When parsing a document, this library places DTDs inside a special node in the XML tree with the type #PB_XML_DTD. The content of this node is the full DOCTYPE tag. This way it can be easily accessed and manipulated but is also save to ignore if this information is not needed. The tag is simply written back when exporting/saving the document.

Namespaces do not get resolved when parsing a document. This means that in a document using namespaces, the namespace declarations are accessible as normal node attributes, and node/attribute names using namespaces will be visible as "namespace:tagname". This allows a document using namespaces to be read and also saved back like any other document without destroying its structure. To make working with namespaces simpler, the functions ResolveXMLNodeName() and ResolveXMLAttributeName() are provided to resolve names inside documents that use namespaces.

The PureBasic Debugger provides the possibility to examine #XML objects during runtime with the Library Viewer tool.

The official specification of XML and XML Namespaces by the W3C can be found here:
XML specification
XML Namespaces
Various translations of XML related documents

Also the Wikipedia article on XML provides a good starting point for people new to XML.

Command Index

CatchXML
ChildXMLNode
CopyXMLNode
CreateXML
CreateXMLNode
DeleteXMLNode
ExamineXMLAttributes
ExportXML
ExportXMLSize
FormatXML
FreeXML
GetXMLAttribute
GetXMLEncoding
GetXMLNodeName
GetXMLNodeOffset
GetXMLNodeText
GetXMLStandalone
IsXML
LoadXML
MainXMLNode
MoveXMLNode
NextXMLAttribute
NextXMLNode
ParentXMLNode
PreviousXMLNode
RemoveXMLAttribute
ResolveXMLAttributeName
ResolveXMLNodeName
RootXMLNode
SaveXML
SetXMLAttribute
SetXMLEncoding
SetXMLNodeName
SetXMLNodeOffset
SetXMLNodeText
SetXMLStandalone
XMLAttributeName
XMLAttributeValue
XMLChildCount
XMLError
XMLErrorLine
XMLErrorPosition
XMLNodeFromID
XMLNodeFromPath
XMLNodePath
XMLNodeType
XMLStatus


CatchXML

CatchXML()

Синтаксис

Result = CatchXML( #XML, *Address, Length [, Flags [, Encoding]] )
Описание
Создает новое дерево XML из XML-данных в данной зоне памяти. Разметку можно анализировать блоками, многократно вызывая данную функцию, например если данные поступают из network. Если #PB_Any будет использоваться как параметр '#XML', то новый номер дерева XML будет возвращен как 'Result'.

Параметры

'*Address' и 'Length' определяют ячейку в памяти. Если 'Flags' не установлен, то ячейка будет содержить все XML-данные. Для парсирования XML блоков во множество ячеек необходимо установить следующие флаги:
  #PB_XML_StreamStart: Начинаем разбор первого блока
  #PB_XML_StreamNext : Продолжаем разбор следующего блока
  #PB_XML_StreamEnd  : Окончание разбора блоков
При вызове этой функции с #PB_XML_StreamStart или #PB_XML_StreamEnd, параметр 'Length' может равнятся 0, что позволяет начать\закончить парсинг фактически без обработки данных.

Примечание: парсированные блоки XML-данных становятся доступными для отображения до вызова #PB_XML_StreamEnd.

Опциональный параметр 'Encoding' устанавливает кодировку, с которой должен работать парсер (Это изменяет задекларированную XML кодировку). Возможные значения #PB_Ascii, #PB_Unicode or #PB_UTF8. Этот параметр должен использоваться когда не указана кодировка в XML документе, или кодировка указана за пределами XML документа.

Возвращаемое значение

Эта функция возвращает 0 при ошибках в работе памяти или неправильно установленных флагах. Для проверки ошибок сантаксиса используется функция XMLStatus(). В случае возникновения ошибки при парсинге, все данные доступны до места возникновения ошибки в XML-дереве.


ChildXMLNode

ChildXMLNode()

Синтаксис

*Result = ChildXMLNode(*Node [, Index])
Описание
Возвращает указатель pointer на дочернюю вершину данного XML узла. Если 'Index' не задан, то возвращается значение первого узла и корневой узел.

Возвращаемое значение

Возвращает указатель на дочернюю вершину или 0, если нет потомков или узел находится выше.


CopyXMLNode

CopyXMLNode()

Синтаксис

*Result = CopyXMLNode(*Node, *ParentNode [, *PreviousNode] )
Описание
Копирует данный XML узел с содержащимся текстом и потомками в новое местоположение. Эта функция может использоваться для копирования узлов в другие XML деревья. Для перемещения полного узла в новое местоположение можно использовать MoveXMLNode().

Параметры

'*Node' определяет узел для копирования.
'*ParentNode' это узел который требуется вставить в новый узел. Для вставки нового узла в корень дерева можно использовать RootXMLNode().
'*PreviousNode' определяет дочернюю вершину '*ParentNode' после которой должен быть вставлен новый узел. Если значение равно нулю или не указано, то новый узел будет вставлен как первый потомок родительского элемента. Если значение равно -1, то узел будет вставлен последним в список потомков в родительском элементе.

Для успешного копирования необходимо придерживаться следующих правил:
- Нельзя копировать корневой узел root node
- *ParentNode не может иметь тип #PB_XML_Comment или #PB_XML_CData
- *PreviousNode должен быть прямым потомком *ParentNode (если указано)
- Если у XML-дерева уже есть главный узел main node, то узлы #PB_XML_Normal и #PB_XML_CData вставлять нельзя

Возвращаемое значение

При успешном копировании возвращает указатель pointer на новый XML узел или ноль в противном случае.


CreateXML

CreateXML()

Синтаксис

Result = CreateXML(#XML [, Encoding] )
Описание
Создает новое XML-дерево с #XML номером. Если #PB_Any будет использоваться как параметр '#XML', то новый номер XML-дерева будет возвращен как 'Result'. 'Encoding' определяет кодировку для указанного дерева. Можно применять кодировки #PB_Ascii, #PB_Unicode или #PB_UTF8. (#PB_UTF8 установлена по умолчанию)

У нового дерева будет только корневой узел, к которому можно обращаться с помощью RootXMLNode(). CreateXMLNode() используется для добавления новых узлов.

Пример:

  ; Create xml tree
  xml = CreateXML(#PB_Any)
  mainNode = CreateXMLNode(RootXMLNode(xml))
  SetXMLNodeName(mainNode, "Zoo")

  ; Create first xml node (in main node)
  item = CreateXMLNode(mainNode)
  SetXMLNodeName(item, "Animal")
  SetXMLAttribute(item, "id", "1")
  SetXMLNodeText(item, "Elephant")

  ; Create second xml node (in main node)
  item = CreateXMLNode(mainNode)
  SetXMLNodeName(item, "Animal")
  SetXMLAttribute(item, "id", "2")
  SetXMLNodeText(item, "Tiger")

  ; Save the xml tree into a xml file
  SaveXML(xml, "demo.xml")


CreateXMLNode

CreateXMLNode()

Синтаксис

*Result = CreateXMLNode(*ParentNode [, *PreviousNode [, Type]] )
Описание
Создает новый узел XML и вставляет его в данный родительский узел.

Параметры

'*ParentNode' это узел который вставляется в новый узел. Для вставки нового узла в корень дерева используется RootXMLNode().
'*PreviousNode' определяет дочернюю вершину '*ParentNode', после которой нужно вставить новый узел. Если значение равно нулю или не указано, то новый узел будет вставлен как первый потомок родительского элемента. Если значение равно -1, то узел будет вставлен последним в список потомков в родительском элементе.
'Type' определяет тип type для нового узла. Значение по умолчанию #PB_XML_Normal. После создания узла, его тип изменять нельзя.

Для успешной вставки нужно следовать следующим правилам:
- *ParentNode НЕ может иметь тип #PB_XML_Comment или #PB_XML_CData
- *PreviousNode должен быть прямым потомком *ParentNode (если указано)
- Узел типа #PB_XML_Root нельзя создавать вручную
- Если у XML-дерева уже есть главный узел main node, то узлы #PB_XML_Normal и #PB_XML_CData вставлять нельзя

Возвращаемое значение

При успешном создании узла, возвращает указатель pointer на новый XML узел или ноль в противном случае.


DeleteXMLNode

DeleteXMLNode()

Синтаксис

DeleteXMLNode(*Node)
Описание
Удаляет данный XML узел и всех его потомков в XML дереве.

Примечание: корневой узел root node удалить нельзя.


ExamineXMLAttributes

ExamineXMLAttributes()

Синтаксис

Result = ExamineXMLAttributes(*Node)
Описание
Исследует атрибуты данного XML узла.

Возвращаемое значение

Возвращает ненулевое значение, если узел имеет тип type #PB_XML_Normal или в противном случае ноль (у узлов как таковых не может быть атрибутов).


ExportXML

ExportXML()

Синтаксис

Result = ExportXML(#XML, *Address, Length [, Flags] )
Описание
Записывает разметку XML дерева в указанную область памяти memory buffer.

Созданная XML разметка не форматирована. Записывает в том виде в котором была парсирована или создана. Длинна строки, количество свободного места, находящаяся между тегами, сохраняется в 'text' каждого XML узла. (см. GetXMLNodeText(). Для переформатирования XML разметки перед сохранением, 'text' для каждого XML узла можно изменить или применить FormatXML(), что позволит применить общие переформатировщики для дерева.

Параметры

'Flags' может иметь комбинацию из следующих значений (оператор '|'):
  #PB_XML_StringFormat : Включает метку порядка байтов. см. WriteStringFormat().
  #PB_XML_NoDeclaration: Не декларирует XML.
Примечание: Согласно спецификации XML, можно не указывать кодировку XML, если документ хранится в формате UTF-8 или UTF-16, а так же если информация о кодировке приходит через протокол. Даже в этом случае желательно указывать кодироку в документе.

Возвращаемое значение

Возвращает значение не равное нулю, если 'Length' больше чем выделенная область памяти. ExportXMLSize() можно использвать для определения необходимого размера буфера памяти.


ExportXMLSize

ExportXMLSize()

Синтаксис

Result = ExportXMLSize( #XML [, Flags] )
Описание
Возвращает размер в байтах. Размер необходим для экспорта данного XML дерева в буфер памяти memory buffer или для сохранения в файле. Эта функция должна используется для определения буфера памяти необходимого для функции ExportXML().

Параметр 'Flags' используется для установки опций, которые идентичны опциям установленным в ExportXML(). Это применяется при вычислении размера.


FormatXML

FormatXML()

Синтаксис

FormatXML( #XML, Flags [, IndentStep] )
Описание
Очищает или переформатирует XML дерево в необходимый вид при exporting/saving. Это используется для придания компактности, при передаче данных или придания читабельного вида.

Форматирование XML документа сохраняется в поле 'text' и 'offset' для каждого узла в дереве (см. GetXMLNodeText() и GetXMLNodeOffset()).

Параметры

'Flags' может иметь комбинацию из следующих значений (используйте оператор '|'):
  #PB_XML_WindowsNewline: Изменение всех строк в CRLF
  #PB_XML_LinuxNewline  : Изменение всех строк в LF
  #PB_XML_MacNewline    : Изменение всех строк в CR

  #PB_XML_CutNewline    : удаление всех строк
  #PB_XML_ReduceNewline : удаление всех пустых строк

  #PB_XML_CutSpace      : удаляет все пробелы
  #PB_XML_ReduceSpace   : удаление всех многочисленных пробелов

  #PB_XML_ReFormat      : Полное переформатирование структуры дерева
  #PB_XML_ReIndent      : Изменение отступа линии
Для #PB_XML_ReFormat и #PB_XML_ReIndent параметр 'IndentStep' определяет величину отступа (сдвига), который добавляется к каждому уровню.

Примечание: Не переформатируются данные в разделах CData и инструкциях по обработке (Processing Instructions), за исключением новых сторок, поскольку пробелы содержащиеся в этих разделах могут быть важными, в зависимости от того что они содержат.

Примечание: Поскольку в MacOSX обозначение конца стороки CR стало менее распространенным чем новое обозначение LF используемое в unix systems. Поэтому #PB_XML_MacNewline представлена для полноты, но обычно лучше использовать #PB_XML_LinuxNewline даже на MacOSX.


FreeXML

FreeXML()

Синтаксис

FreeXML(#XML)
Описание
Очищает XML дерево и все данные которые оно содержит.

Примечание: все остальные xml объекты автоматически удаляются по завершении программы.


GetXMLAttribute

GetXMLAttribute()

Синтаксис

Result$ = GetXMLAttribute(*Node, Attribute$ )
Описание
Возвращает атрибуты данного XML узла. Если атрибут не существует, то возвращается пустая строка.

Только узлы type #PB_XML_Normal могут иметь атрибуты. Для всех остальных типов узлов возвращается пустая сторока.


GetXMLEncoding

GetXMLEncoding()

Синтаксис

Result = GetXMLEncoding(#XML)
Описание
Возвращает кодировку текста, которая используется для экспорта/сохранения данного XML дерева.

Возвращаемое значение

Вернёт #PB_Ascii, #PB_Unicode (= UTF16) или #PB_UTF8.


GetXMLNodeName

GetXMLNodeName()

Синтаксис

Result$ = GetXMLNodeName(*Node)
Описание
Возвращает имя тега данного XML узла. Если узел не type #PB_XML_Normal или #PB_XML_Instruction, то возвращается пустая строка.


GetXMLNodeOffset

GetXMLNodeOffset()

Синтаксис

Result = GetXMLNodeOffset(*Node)
Описание
Возвращает символьное значение смещения данного узла в пределах его родительского элемента.

Возвращаемое значение представляет собой количество символов в text data родительских узлов, которые лежат между этим узлом и предыдущим дочерним узлом. Так если этот узел непосредственно следует за предыдущим, то возвращаемое значение будет равно 0.


GetXMLNodeText

GetXMLNodeText()

Синтаксис

Result$ = GetXMLNodeText(*Node)
Описание
Возвращает текст в данном XML узле.

Для узла type #PB_XML_Normal, это весь текст и свободное место в пределах узла, который не содержится в пределах дочернего узла.
Для корневого узла root node это все свободное пространство за пределами главного узла. (за пределами главного узла никакой текст находится не может).
Для узлов #PB_XML_Comment или #PB_XML_CData, это - весь текст содержащийся в узле.


GetXMLStandalone

GetXMLStandalone()

Синтаксис

Result = GetXMLStandalone(#XML)
Описание
Возвращает значение атрибута "standalone" из объявления XML документа.

Возвращаемое значение

Возвращает одно из следующих значений:
  #PB_XML_StandaloneYes  : документ в автономном режиме
  #PB_XML_StandaloneNo   : документ не в автономном режиме
  #PB_XML_StandaloneUnset: автономный режим, не указан в декларации


IsXML

IsXML()

Синтаксис

Result = IsXML(#XML)
Описание
Если #XML ссылается на существующее XML дерево, то возвращается ненулевой результат.


LoadXML

LoadXML()

Синтаксис

Result = LoadXML( #XML, Filename$ [, Encoding] )
Описание
Загружает XML дерево из указанного файла. The tree can later be accessed trough the #XML value. Если #PB_Any использовать как параметра '#XML', то новое значение XML дерева вернется как 'Result'.

Дополнительный параметр 'Encoding' устанавливает кодировку для синтаксического анализатора. (Это перезаписывает кодировку установленную в XML декларации!) Возможные значения #PB_Ascii, #PB_Unicode или #PB_UTF8. Этот параметр нужно использовать когда не задекларирована XML кодировка документа, или информация о кодировке указана за пределами XML документа.

Возвращаемое значение

Возвращает ненулевое значение, если файл нельзя открыть и прочитать. Отметьте что XML файл имел правильный синтаксис. Для проверки синтаксиса применяется функция XMLStatus(). В случае ошибки парсинга, все данные разобранные до появления ошибки будут доступны.


MainXMLNode

MainXMLNode()

Синтаксис

*Result = MainXMLNode(#XML)
Описание
Возвращает главный узел XML дерева. У правильно оформленного XML документа должен быть один "main" или "document" узел, который содержит все остальные узлы. Кроме этого узла может быть еще коментарий к первому уровню, расположенному ниже корневого узла root node. Тип type этого узла #PB_Xml_Normal.

Возвращаемое значение

Возвращает указатель pointer на главный узел, или 0 если дерево не имеет основного узла. (это случается если дерево пустое или главный узел удален).


MoveXMLNode

MoveXMLNode()

Синтаксис

Result = MoveXMLNode( *Node, *ParentNode [, *PreviousNode] )
Описание
Перемещает данный XML узел со всем содержащимся текстом и потомков в новое местоположение. Эта функция используется для перемещения узла в другое XML дерево. Для копирования полного узла в новое местоположение можно использовать функцию CopyXMLNode().

Параметры

'*Node' определяет узел который нужно переместить.
'*ParentNode' узел в который включается узел. Для вставки узла в корень дерева используется функция RootXMLNode().
'*PreviousNode' определяет дочерний узел '*ParentNode', после которого вставляется узел. Если значение равно нулю или не определено, узел вставляется как перевый потомок его родителя. Если значение равно -1, то узел вставляется как последний потомок его родителя.

Для успешного перемещения надо придерживаться следующих правил:
- Корневой узел дерева root node перемещать нельзя
- *ParentNode не может бить типа #PB_XML_Comment или #PB_XML_CData
- *PreviousNode должен быть прямым потомком *ParentNode (если это определено)
- *Node и *PreviousNode не могут быть равными.
- *ParentNode не может быть равным, или потомок *Node ( узел не может быть перемещен сам в себя)
- Если у XML дерева уже есть главный узел main node, то только узлы кроме #PB_XML_Normal и #PB_XML_CData могут быть вставлены на корневом уровне.

Возвращаемое значение

Возвращает значение отличное от нуля, если перемещение было успешным или ноль, если узел не был перемещен.


NextXMLAttribute

NextXMLAttribute()

Синтаксис

Result = NextXMLAttribute(*Node)
Описание
Перемещение по атрибутам данного XML узла. Данная функция должна вызываться после ExamineXMLAttributes().

Возвращаемое значение

Возвращает ноль, если атрибутов нет или значение отличное от нуля, если атрибуты есть.


NextXMLNode

NextXMLNode()

Синтаксис

*Result = NextXMLNode(*Node)
Описание
Возвращает следующий XML узел после данного (внутри своего родительского узла).

Возвращаемое значение

Возвращает указатель pointer узла на следующий узел или ноль, если нет больше узлов после данного.


ParentXMLNode

ParentXMLNode()

Синтаксис

*Result = ParentXMLNode(*Node)
Описание
Возвращает родительский XML узел. Каждый XML узел имеет родителя, кроме корневого узла root node.

Возвращаемое значение

Возвращает указатель pointer родительского узла или 0, если '*Node' является кореневым узлом.


PreviousXMLNode

PreviousXMLNode()

Синтаксис

*Result = PreviousXMLNode(*Node)
Описание
Возвращает предыдущий XML узел относительно данного (внутри своего родительского узла).

Возвращаемое значение

Возвращает указатель pointer на предыдущий узел или 0, если данные узел был первым потомком у своих родителей.


RemoveXMLAttribute

RemoveXMLAttribute()

Синтаксис

RemoveXMLAttribute( *Node, Attribute$ )
Описание
Удаляет атрибут из данного XML узла.

Только узлы типа type #PB_XML_Normal могут иметь атрибуты. Все другие типы узлов эта функция игнорирует.


ResolveXMLAttributeName

ResolveXMLAttributeName()

Синтаксис

Result$ = ResolveXMLAttributeName( *Node, Attribute$ [, Separator$] )
Описание
Возвращает расширенное имя атрибута данного XML узла в документе, который использует пространства имен в XML. Расширенное имя состоит из имен uri (если такие имеются) и локальное название атрибутов, разделенных символом разделителем который указываеся в 'Separator$'. По умолчанию символом разделителем является "/".

Примечание: В отличии от имен узлов node names, по умолчанию имена не распространяются на имена атрибутов, которые не имеют префиксов пространства имен. Такие имена атрибутов без префикса пространства имен просто возвращают свои местные названия.

Возвращаемое значение

При использовании в документе пространства имен, возвращается расширенное имя атрибута, если оно правильно решено или пустая строка, если пространство имен используется но нигде не объявлено (что недопустимо).

В документе без имен возвращается имя своего атрибута.


ResolveXMLNodeName

ResolveXMLNodeName()

Синтаксис

Result$ = ResolveXMLNodeName( *Node [, Separator$] )
Описание
Возвращает расширенное имя данного узла в документе, который использует пространство XML имен. Расширенное имя состоит из имен uri (если таковые имеются) и локального имени узла, разделенных символом разделителем который указан в 'Separator$'. По умолчанию символом разделителем является "/".

Возвращаемое значение

При использовании в документе пространства имен, возвращается расширенное имя узла, если оно правильно решено или пустая строка, если пространство имен используется но нигде не объявлено (что недопустимо).

В документе без имен возвращается имя своего узла.


RootXMLNode

RootXMLNode()

Синтаксис

*Result = RootXMLNode(#XML)
Описание
Возвращает указатель pointer на корневой узел XML дерева. Этот узел всегда присутствует. Он представляет собой непосредственно XML-дерево. text содержащийся в этом узле представляет собой пробел за пределами какого-либо узла XML (текст не может быть вне узлов). Потомки этого узла - это главный узел main node и любые коментарии вне главного узла. Тип type этого узла #PB_Xml_Root.

Возвращаемое значение

Always returns a valid XML node pointer if #XML is an existing XML tree.


SaveXML

SaveXML()

Синтаксис

Result = SaveXML( #XML, Filename$ [, Flags] )
Описание
Сохраняет #XML дерево в данном файле.

Созданная XML разметка не переформатируется. Она записывается так как была парсирована или создана. Количество строк и свободное пространство, записанного между тегами, записывается в 'text' каждого XML узла. (для получения дополнительной информации см. GetXMLNodeText()) Для переформатирования XML разметки перед сохранении, можно изменить 'text' для каждого узла или применитьFormatXML() для общего переформатирования XML дерева.

Параметры

'Flags' могут быть комбинацией следующих значений (с оператором '|'):
  #PB_XML_StringFormat : Пишет спецификации. См. WriteStringFormat() для более подробной информации.
  #PB_XML_NoDeclaration: Декларация XML не включена.
Примечание: Согласно спецификации XML, XML декларация может быть опущена, если документ хранится в кодировке UTF-8 или UTF-16, или информация о кодировке передается из внешних источников. Даже при этих условиях желательно кодировку указывать.

Возвращаемое значение

Возвращает ненулевое значение, если файл был сохранен, и ноль в противном случае.


SetXMLAttribute

SetXMLAttribute()

Синтаксис

SetXMLAttribute(*Node, Attribute$, Value$)
Описание
Устанавливает значение атрибута на данном XML узле. Если атрибут не существует, он будет добавлен.

Только узлы типа type #PB_XML_Normal могут иметь атрибуты. Для всех других типов узлов эта функция игнорируется.


SetXMLEncoding

SetXMLEncoding()

Синтаксис

SetXMLEncoding(#XML, Encoding)
Описание
Изменяет кодировку текста. Используется для экспорта или сохранения данного XML дерева. Возможные типы кодировок #PB_Ascii, #PB_Unicode (= UTF16) или #PB_UTF8.

Примечание: Это влияет только на кодировку сохраненого дерева exporting/saving". Данные в объекте #XML всегда хранятся в формате PB (Ascii или Unicode, в зависитости от установленных опций, установленных на вкладке compiler option). Таким образом выполняемая программа в юникоде может записать в кодировке #PB_Ascii при этом не выгружая XML дерево из памяти.


SetXMLNodeName

SetXMLNodeName()

Синтаксис

SetXMLNodeName( *Node, Name$ )
Описание
Изменяет тег данного XML узла. Если узел не имеет тип type #PB_XML_Normal или #PB_XML_Instruction, то эта функция игнорируется.


SetXMLNodeOffset

SetXMLNodeOffset()

Синтаксис

SetXMLNodeOffset(*Node, Offset)
Описание
Изменяет символьное смещение данного XML узла, в пределах текстовых данных text data родительских узлов. Для получения дополнительной информации смотрите GetXMLNodeOffset().


SetXMLNodeText

SetXMLNodeText()

Синтаксис

SetXMLNodeText( *Node, Text$ )
Описание
Изменяет текст в пределах данного XML узла. Для получения дополнительной информации смотрите GetXMLNodeText().

Примечание: Если узел содержит потомков, то при изменении содержащегося в нем текста возможно потребуется настройка значений смещения offset values дочерних вершин.


SetXMLStandalone

SetXMLStandalone()

Синтаксис

SetXMLStandalone(#XML, Standalone)
Описание
Изменяют атрибут "standalone" XML документа при экспорте или сохранении.

'standalone' может иметь одно из следующих значений:
  #PB_XML_StandaloneYes  : Автономный режим документа
  #PB_XML_StandaloneNo   : Не автономный режим документа
  #PB_XML_StandaloneUnset: Автономный режим не указан в декларации
Примечание: Так как эта библиотека не проверяет правильность описания структуры документа (DTDs), то значение этого атрибута не имеет никакого эффекта на парсинг или сохранение с этой библиотекой за исключением того, что это записывается и читается в XML документах. Это значение однако важно при работе с XML документами которые предназначены для проверки парсеров.


XMLAttributeName

XMLAttributeName()

Синтаксис

Result$ = XMLAttributeName(*Node)
Описание
После вызова ExamineXMLAttributes() и NextXMLAttribute() эта функция возвращает название атрибута который исследуется в настоящий момент времени на данном XML узле.


XMLAttributeValue

XMLAttributeValue()

Синтаксис

Result$ = XMLAttributeValue(*Node)
Описание
После вызова ExamineXMLAttributes() и NextXMLAttribute() эта функция возвращает значение атрибута который исследуется в настоящий момент времени на данном XML узле.


XMLChildCount

XMLChildCount()

Синтаксис

Result = XMLChildCount(*Node)
Описание
Возвращает количество дочерних узлов в данном XML узле.


XMLError

XMLError()

Синтаксис

Result$ = XMLError(#XML)
Описание
В случае ошибки при парсировании XML данных, эта функция возвращает сообщение об ошибке с ее описанием. XMLStatus() может использоваться, чтобы обнаружить ошибки при парсинге.

Для получения более подробной информации можно использовать XMLErrorLine() или XMLErrorPosition().


XMLErrorLine

XMLErrorLine()

Синтаксис

Result = XMLErrorLine(#XML)
Описание
В случае ошибки при парсинге XML данных, эта функция возвращает строку которая вызвала ошибку (one based). XMLStatus() может использоваться, чтобы обнаружить ошибки при парсинге.

Для получения позиции в пределах строки, в которой возникла ошибка, можно использовать XMLErrorPosition().

Поддерживаемые ОС

All


XMLErrorPosition

XMLErrorPosition()

Синтаксис

Result = XMLErrorPosition(#XML)
Описание
В случае ошибки при парсинге эта функция возвращает позицию в предлах строки возвращенной XMLErrorLine(). (Первый символ в строке находится в позиции 1) XMLStatus() может использоваться, чтобы обнаружить ошибки при парсинге.


XMLNodeFromID

XMLNodeFromID()

Синтаксис

*Result = XMLNodeFromID(#XML, ID$)
Описание
В валидном XML документе, если у узла есть атрибут "ID", то значение этого атрибута должно быть уникальным в пределах данного XML документа. Эта функция используется для поиска узлов в XML документе основанных на ID атрибуте.

Возвращаемое значение

Возвращает указатель pointer узла на узел с данным ID или 0, если нет таких узлов внутри дерева.


XMLNodeFromPath

XMLNodeFromPath()

Синтаксис

*Result = XMLNodeFromPath(*ParentNode, Path$)
Описание
Возвращает XML узел внутри *ParentNode, по отношению к *ParentNode, который описывается через 'Path$'. XMLNodePath() используется для получения такого пути для узла.

Параметры

Path$ содержит список имен узлов которые разделены '/', чтобы указать путь следования от родителя к целевому узлу. Например "childtag/subchildtag" определяет первый узел с именем "subchildtag" в первом узле с именем "childtag" внутри *ParentNode.

Имя узла может иметь индекс (основной), чтобы определить какой из нескольких тегов потомка с тем же именем должет быть выбран. "childtag/subchildtag[3]" определяет 3-ий "subchildtag" внутри первого "childtag" от *ParentNode.

Другие правила:
- Если путь начинается с '/', то это относительно корневого узла. Независимо от того какой узел *ParentNode укажет.
- Шаблон "*" можно использовать вместо имени тега, что позволяет выбирать теги с любым именем.
- Узел коментария имеет тег "#comment"
- Узел CData имеет тег "#cdata"
- Узел DTD имеет тег "#dtd"
- Узел Processing Instruction имеет тег "#instruction"

Несколько примеров правильных путей:
  "/mainnode/#comment[4]" - the 4th comment inside the "mainnode" node inside the root of the tree
  "*[10]"                 - the 10th node (of any type) inside *ParentNode
  "*/*/*"                 - the 1st node 3 levels below *ParentNode independent of its type
  "node[3]/*[3]/#cdata"   - the first CData section inside the 3rd node of any kind inside the 3rd "node" node inside *ParentNode
Примечание: Эта команда не реализует спецификацию XPath. Синтаксис реализуемый в этой команде, является только малым подмножеством XPath. Это означает что путь возвращаемый из XMLNodePath() является допустимым запросом XPath, но эта команда понимает синтаксис описанный только здесь.

Возвращаемое значение

Возвращает указатель pointer целевого узла или 0, если путь не ведет к валидному узлу.


XMLNodePath

XMLNodePath()

Синтаксис

Result$ = XMLNodePath( *Node [, *ParentNode] )
Описание
Возвращает строку, представляющую соотношение между *Node и *ParentNode. Если *ParentNode указан, то он должен быть родителем или прародителем *Node. Если он не указан, то используется корневой узел дерева.

Описание о возвращении пути строки смотрите в XMLNodeFromPath().


XMLNodeType

XMLNodeType()

Синтаксис

Result = XMLNodeType(*Node)
Описание
Возвращает тип данного XML узла. Он может принимать одно из следующих значений:

#PB_XML_Root
Это узел корня дерева. Это дерево представляет сам документ. Этот узел нельзя создавать или удалять вручную. Внутри корневого узла может быть только один узел типа #PB_XML_Normal а так же никакого обычного текста (это должен быть хорошо сформированным XML документом)
#PB_XML_Normal
Это нормальный узел в дереве. Он может иметь перечень атрибутов и содержать текст и/или дочерние узлы.
Пример: <node attribute="hello"> contained text </node>
#PB_XML_Comment
Этот узел представляет собой комментарий. Его текст представляет собой содержание комментария.
Пример: <!-- comment text -->
#PB_XML_CData
Это раздел CData. Раздел CData содержит только текст. Его текст не интерпритируется синтаксическим онализатором, так что он может содержать неэкранированные символы, например "<" и ">". Раздел CData можно использовать для включения других видов разметки или кода в документ, при этом не избегая всех символов которые могут быти интерпретированы как XML.
Пример: <![CDATA[ cdata content ]]>
#PB_XML_DTD
Это объявление типа документа (DTD). Эта билиотека не использует парсер на проверку валидности данного типа документов, таким образом они фактически игнорируются. Для того чтобы сохранить их корректно обратно, они содержаться в пределах таких DTD узлов.Текстовое содержание узла это весь тег DTD. Его можно прочитать и изменить функциями типа SetXMLNodeText() и будет записан в документ при экспорте или сохранении без изменений. Функция SetXMLStandalone() будет также полезна при работе с DTDs.
Пример: <!DOCTYPE name SYSTEM "external dtd uri">
#PB_XML_Instruction
Этот узел представляет собой инструкцию обработки (Processing Instruction). Инструкция по обработке содержит информацию которая должна быть интерпритирована/выполнена целевым приложением. У нее есть имя name чтобы определить содержимое инструкции и данные инструкции, к которым можно обратится с помощью GetXMLNodeText().
Пример: <?php if (...) ... ?>
(здесь "php" является именем узла, а остальное до "?>" является текстом узла.)


XMLStatus

XMLStatus()

Синтаксис

Result = XMLStatus(#XML)
Описание
Возвращает состояние последней операции парсинга сделанном на этом XML дереве (с помощью LoadXML() или CatchXML()). Эта функция должна вызываться после каждого вызова LoadXML() или CatchXML(), чтобы гарантировать, что парсинг выполнен успешно. Строковое содержание о разборе стороки (т.е. читаемые сообщения об ошибке) возвращает функция XMLError().

Return value

Значение 0 (#PB_XML_Success) указыват на успешное парсирование, все другие значения указывают на различные условия ошибки.

Возможны следующие возвращаемые значения:
  #PB_XML_Success             : нет ошибки
  #PB_XML_NoMemory            : недостаточно памяти
  #PB_XML_Syntax              : синтаксическая ошибка
  #PB_XML_NoElements          : ни один элемент не найден
  #PB_XML_InvalidToken        : неправильный документ (неправильный тег)
  #PB_XML_UnclosedToken       : отсутствует закрывающий тег
  #PB_XML_PartialCharacter    : частичный символ
  #PB_XML_TagMismatch         : несоответствие тега
  #PB_XML_DublicateAttribute  : дублирование атрибута
  #PB_XML_JunkAfterDocElement : ошибка после элемента документа
  #PB_XML_ParamEntityRef      : неправельный параметр в ссылке
  #PB_XML_UndefinedEntity     : неопределенный объект
  #PB_XML_RecursiveEntityRef  : рекурсивные объекты ссылки
  #PB_XML_AsyncEntity         : асинхронный объект
  #PB_XML_BadCharacterRef     : ссылка на недействительный номер символа
  #PB_XML_BinaryEntityRef     : ссылка на бинарный субъект
  #PB_XML_AttributeExternalEntityRef: ссылка на внешний объект в атрибуте
  #PB_XML_MisplacedXML        : XML или текстовое объявление не в начале объекта
  #PB_XML_UnknownEncoding     : неизвестная кодировка
  #PB_XML_IncorrectEncoding   : кодирование, определенное в объявлении XML, является неправильным
  #PB_XML_UnclosedCDataSection: не закрытый раздел CDATA
  #PB_XML_ExternalEntityHandling: ошибка в обработке внешней справочной информации объекта
  #PB_XML_NotStandalone       : документ не является автономным
  #PB_XML_UnexpectedState     : неожиданное состояние анализатора
  #PB_XML_EntityDeclaredInPE  : объект объявляется в объекте параметра
  #PB_XML_FeatureRequiresDTD  : требуемая функция требует поддержки  XML_DTD в Expat
  #PB_XML_CantChangeFeatures  : Невозможно изменить параметры для интерпретации
  #PB_XML_UnboundPrefix       : несвязанный префикс
  #PB_XML_UndeclaringPrefix   : префикс может быть необъявлен
  #PB_XML_IncompletePE        : неполный тег в объекте параметра
  #PB_XML_XMLDeclaration      : не правильно построенное объявление XML
  #PB_XML_TextDeclaration     : не правильно построенное объявление текста
  #PB_XML_PublicID            : illegal character(s) in public id
  #PB_XML_Suspended           : синтаксический анализатор приостанавливается
  #PB_XML_NotSuspended        : синтаксический анализатор, не приостановленный
  #PB_XML_Aborted             : синтаксический анализ прерывался
  #PB_XML_Finished            : синтаксический анализ закончился
  #PB_XML_SuspendedPE         : cannot suspend in external parameter entity
  #PB_XML_ReservedPrefixXML   : reserved prefix (xml) must not be undeclared or bound to another namespace name
  #PB_XML_ReservedPrefixXMLNS : reserved prefix (xmlns) must not be declared or undeclared
  #PB_XML_ReservedNamespaceURI: prefix must not be bound to one of the reserved namespace names


AudioCD

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

XP_Menu_Lib library

О библиотеке

Библиотека XP_Menu_Lib v 1.9 предназначена для модернизации стилей стандартного меню. Доступны стили "Стандартный", "Офис XP" и "Офис 2003".
При необходимости можно создавать свои стили. Подробнее об этом можно узнать прочитав описание функций XP_GetMenuStructure и XP_SetMenuStructure

Библиотека выполнена в виде надстройки и подключается к уже существующему меню.
Единственое что возможно понадобится - заменить и исходном коде разрабатываемой программы, функцию GetMenuItemText (если она используется) на XP_GetMenuItemText

Библиотека предназначена для программы PureBasic версии 4.30

Вот несколько скриншотов, демонстрирующих возможности библиотеки

Стандартный стиль со значками

Стиль "Офис XP"

Стиль "Офис 2003"

Фиолетовый стиль

Чёрный стиль

_____________________________________

Автор библиотеки - Высочанский Пётр
E - mail purik4.0@rambler.ru

Лицензию можно прочитать здесь
Обсудить данную библиотеку можно на форуме http://pbasic.spb.ru/phpBB2/viewtopic.php?t=596

Список функций

XP_MenuRegister
XP_Menu_CB
XP_EnableDrawTitleBar
XP_GetMenuStyle
XP_SetMenuStyle
XP_GetMenuItemText
XP_SetMenuFont
XP_SetMenuIcon
XP_GetMenuStructure
XP_SetMenuStructure
XP_SetSideText_CB
XP_UpdateStyleMenuItem

Пример

StyleMenu.xp_menudata
Procedure GlavWindowCallback(WindowID, Message, wParam, lParam)
Protected Result=#PB_ProcessPureBasicEvents

XP_Menu_CB(WindowID, Message, wParam, lParam)

ProcedureReturn Result
EndProcedure

Procedure SetSideText_CB(*DIS.DRAWITEMSTRUCT, *SideText.Xp_SideText)
Shared FontID_Text, FontID_Text_1, FontID_Text_2
Protected Result.c=0
*SideText\y=2
*SideText\x=2
*SideText\FontID=FontID_Text
*SideText\Color=RGB(147, 2, 108)

If  *SideText\MenuType=0 ; Главное меню

 Select *SideText\TitlePopupMenu
  Case "Файл"
   *SideText\Text="Работа с файлами"
   Result=1

  Case "Недавние файлы"
   *SideText\Text="Недавно открытые файлы"
   Result=1

  Case "Правка"
   *SideText\Text="Правка файлов"
   Result=1

  Case "Инструменты"
   *SideText\FontID=FontID_Text_2
   *SideText\Text="Всякие примочки"
   *SideText\Color=RGB(82, 147, 65)
   Result=1

 EndSelect

ElseIf  *SideText\MenuType=2 ; Системное меню
 *SideText\FontID=FontID_Text_1
 *SideText\Color=RGB(254, 25, 21)
 *SideText\Text="Это системное меню"
 *SideText\x=4
 *SideText\y=10
   Result=1

EndIf

ProcedureReturn Result
EndProcedure

OpenWindow(4,0,0,480,200,"Работа XP_Menu_Lib",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible|#PB_Window_SizeGadget)
CreateGadgetList(WindowID(4))

CheckBoxGadget(0,10,20,200,15,"XP стиль основного меню")    : SetGadgetState(0,1)
CheckBoxGadget(1,10,50,200,15,"XP стиль контекстного меню") : SetGadgetState(1,1)
CheckBoxGadget(2,10,80,200,15,"XP стиль системного меню")   : SetGadgetState(2,1)
CheckBoxGadget(3,10,110,200,15,"XP стиль меню в трее")      : SetGadgetState(3,1)

TextGadget(4,10,140,80,15, "Стиль меню")
ComboBoxGadget(5,80,136,100,100)
 AddGadgetItem(5,-1,"Обычный")
 AddGadgetItem(5,-1,"XP")
 AddGadgetItem(5,-1,"2003")
 AddGadgetItem(5,-1,"Фиолетовый")
 AddGadgetItem(5,-1,"Чёрный")
 AddGadgetItem(5,-1,"Серый")
 AddGadgetItem(5,-1,"Зелёный")
SetGadgetState(5,2)

;ImageGadget(7,250,0,10,10,0)

   If CreateMenu(2,WindowID(4))
      MenuTitle("Файл")
    MenuItem(1,"Новый"+Chr(9)+"Ctrl+N")
    MenuItem(2,"Открыть..."+Chr(9)+"Ctrl+N") : DisableMenuItem(2,2,1)
    MenuItem(47,"Открыть заново"+Chr(9)+"Ctrl+N") : SetMenuItemState(2,47,1)
    MenuItem(3,"Сохранить"+Chr(9)+"Ctrl+N")
    MenuItem(4,"Сохранить как..."+Chr(9)+"Ctrl+N") : DisableMenuItem(2,4,1) : SetMenuItemState(2,4,1)
    MenuItem(46,"Сохранить всё"+Chr(9)+"Ctrl+N")
    MenuItem(15,"Закрыть закладку"+Chr(9)+"Ctrl+N")
    MenuItem(41,"Индивидуальные настройки"+Chr(9)+"Ctrl+N")

    MenuBar()
    MenuItem(5,"Настройки программы")
    MenuBar()
    OpenSubMenu("Недавние файлы")
     MenuItem(20,"1)    1")
     MenuItem(21,"2)    2")
     MenuItem(22,"3)    3")
     MenuItem(23,"4)    4")
     MenuItem(24,"5)    5")
     MenuItem(25,"6)    6")
     MenuItem(26,"7)    7")
     MenuItem(27,"8)    8")
     MenuItem(28,"9)    9")
     MenuItem(29,"10)  10")
    CloseSubMenu()
    ; Разделитель между пунктами.
    MenuBar()
    MenuItem(6,"Выход")
       MenuTitle("Правка")
    MenuItem(7, "Отменить")
    MenuItem(8,"Повторить")
    MenuBar()
    OpenSubMenu("Внутренний буфер")
      MenuItem(42, "Вырезать")
      MenuItem(43, "Копировать")
      MenuItem(44, "Вставить")
      MenuBar()
      MenuItem(45, "Очистить буфер")
       OpenSubMenu("Вложеное меню")
         MenuItem(42, "Пункт 1")
           OpenSubMenu("Ещё вложеное меню")
             MenuItem(44, "Пункт")
             MenuBar()
             MenuItem(45, "Ещё пункт")
           CloseSubMenu()
         MenuItem(44, "Пункт 2")
       CloseSubMenu()
    CloseSubMenu()
    MenuBar()
    MenuItem(9, "Вырезать")
    MenuItem(10, "Копировать")
    MenuItem(11, "Вставить")
    MenuItem(12, "Удалить")
    MenuBar()
    MenuItem(13,"Выделить всё")
    OpenSubMenu("Выделенный текст")
       MenuItem(52, "Найти")
       MenuItem(36, "Дублировать в новой строке")
       MenuBar()
       MenuItem(31, "Сделать комментарием")
       MenuItem(32, "Удалить комментарий")
       MenuBar()
       MenuItem(33, "В новый файл")
       MenuBar()
       MenuItem(34, "Перевести в верхний регистр")
       MenuItem(35, "Перевести в нижний регистр")
    CloseSubMenu()
    MenuBar()
    MenuItem(16,"Найти/Заменить")
    MenuItem(18,"Расширенный поиск")
       MenuTitle("Переход")
    MenuItem(38,"Закладка")
    MenuItem(39,"Строка")
    MenuItem(40,"Найти курсор")
    MenuItem(51,"Предыдущая строка")
    MenuBar()
    MenuItem(48,"Открыть папку содержащую файл")
       MenuTitle("Инструменты")
    MenuItem(17,"Отступы")
    MenuItem(37,"Конвертер систем исчисления")
    MenuItem(49,"Просмоторщик переменных...")
    MenuItem(70,"Конвертер для HD44780")
    OpenSubMenu("Строки")
      MenuItem(72,"Ограничение длины строк")
      MenuItem(75,"Удаление строк")
    CloseSubMenu()
    MenuItem(78,"Справочник")
    MenuBar()
    MenuItem(73,"Генератор библиотек")
    MenuBar()
    OpenSubMenu("Дополнительная панель")
      MenuItem(71,"Отображать панель") : SetMenuItemState(2,71,1)
      MenuItem(74,"Скрывать при неактивности") : SetMenuItemState(2,74,1)
                                                 DisableMenuItem(2,74,1)
    CloseSubMenu()

      MenuTitle("Справка")
      MenuItem(2,"О программе")
      MenuBar()
      OpenSubMenu("Вложеное меню №1")
      For i=2 To 8
      MenuItem(1,"Пункт")
      OpenSubMenu("Вложеное меню №"+Str(i))

      Next

      CloseSubMenu()
      CloseSubMenu()
      CloseSubMenu()
      CloseSubMenu()
      CloseSubMenu()
      CloseSubMenu()
      CloseSubMenu()
      CloseSubMenu()
      MenuItem(73,"Генератор")

      ;MenuTitle("?")
      ;RGB(149, 195, 251) MenuItem(2,"О программе")

    EndIf

  If  CreatePopupMenu(8)
   MenuItem(1,"Открыть")
   MenuItem(2,"Сохранить как...")
  EndIf

   If  CreatePopupMenu(10)
   MenuItem(1,"О программе")
   MenuItem(2,"Выход")
  EndIf

  ExtractIcon_(0,GetSystemDirectory()+"\sendmail.dll",0)
  AddSysTrayIcon(0,WindowID(4),ExtractIcon_(0,GetSystemDirectory()+"\sendmail.dll",0) )
  SysTrayIconToolTip(0,"Робота XP_Menu_Lib")

SetWindowCallback(@GlavWindowCallback(),4)

XP_MenuRegister(MenuID(2), #XP_RegMenu, #XP_RegGeneralMenu,WindowID(4)) ; Регистрация главного меню
XP_MenuRegister(MenuID(8), #XP_RegMenu, #XP_RegPopupMenu)  ; Регистрация контекстного меню
XP_MenuRegister(GetSystemMenu_(WindowID(4),0), #XP_RegMenu, #XP_RegSysMenu) ; Регистрация системного меню
XP_MenuRegister(GetSystemMenu_(WindowID(4),0), #XP_DelMenu, #XP_RegSysMenu) ; Регистрация системного меню
XP_MenuRegister(GetSystemMenu_(WindowID(4),0), #XP_RegMenu, #XP_RegSysMenu) ; Регистрация системного меню
XP_MenuRegister(MenuID(10), #XP_RegMenu, #XP_RegPopupMenu) ; Регистрация контекстного меню в трее

XP_SetMenuIcon(MenuID(2),1,ExtractIcon_(0,GetSystemDirectory()+"\sendmail.dll",0) )
XP_SetMenuIcon(MenuID(2),2,ExtractIcon_(0,GetSystemDirectory()+"\shell32.dll",19) )
XP_SetMenuIcon(MenuID(2),3,ExtractIcon_(0,GetSystemDirectory()+"\shell32.dll",38) )

;XP_SetMenuStyle()

FontID_Text=LoadFont(4, "MS Sans Serif", 10,#PB_Font_Bold)
FontID_Text_1=LoadFont(5, "MS Sans Serif", 8)
FontID_Text_2=LoadFont(6, "Verdana", 12,#PB_Font_Bold)

XP_SetSideText_CB(@SetSideText_CB()) ; Обработчик событий от меню. Используется для отображения текста в области значков

HideWindow(4,0)

; Debug XP_GetMenuItemText(MenuID(2), 2)
; Debug XP_GetMenuItemText(MenuID(2), 47)

;Debug MenuID(2)
Repeat
 Event=WaitWindowEvent()
 Gadget=EventGadget()
 Type=EventType()
 Menu=EventMenu()

    If Event=#WM_RBUTTONUP
     DisplayPopupMenu(8, WindowID(4))
    EndIf

    If Event=#PB_Event_SysTray
      If Type=#PB_EventType_RightClick
       DisplayPopupMenu(10, WindowID(4))
      EndIf
    EndIf

    If Event = #PB_Event_Gadget
     Select Gadget
      Case 0
       If XP_GetMenuStyle()=#XP_StyleNormal
        XP_MenuRegister(MenuID(2), GetGadgetState(0), #XP_RegGeneralMenu)
       Else
        XP_MenuRegister(MenuID(2), GetGadgetState(0), #XP_RegGeneralMenu, WindowID(4))
       EndIf
      Case 1
       XP_MenuRegister(MenuID(8), GetGadgetState(1), #XP_RegPopupMenu)
      Case 2
       XP_MenuRegister(GetSystemMenu_(WindowID(4),0),GetGadgetState(2), #XP_RegSysMenu)
      Case 3
       XP_MenuRegister(MenuID(10), GetGadgetState(3), #XP_RegPopupMenu)
      Case 5 ; Стиль меню
       If Type=1

      ;XP_GetMenuStructure(StyleMenu)

       Select GetGadgetState(5)
        Case 0
         XP_SetMenuStyle(#XP_StyleNormal)
         XP_EnableDrawTitleBar(WindowID(4), 1)
        Case 1
         XP_SetMenuStyle(#XP_StyleXP)
         XP_EnableDrawTitleBar(WindowID(4), 1)
        Case 2
         XP_SetMenuStyle(#XP_Style2003)
         XP_EnableDrawTitleBar(WindowID(4), 1)
        Case 3
         XP_SetMenuStyle(#XP_StyleViolet)
         XP_EnableDrawTitleBar(WindowID(4), 1)
        Case 4
         XP_SetMenuStyle(#XP_StyleBlack)
         XP_EnableDrawTitleBar(WindowID(4), 1)
        Case 5
         XP_SetMenuStyle(#XP_StyleGray)
         XP_EnableDrawTitleBar(WindowID(4), 1)
        Case 6
         XP_SetMenuStyle(#XP_StyleGreen )
         XP_EnableDrawTitleBar(WindowID(4), 1)
       EndSelect
      EndIf
     EndSelect
    EndIf

Until Event=#PB_Event_CloseWindow


XP_EnableDrawTitleBar()

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

XP_EnableDrawTitleBar()

Синтаксис

XP_EnableDrawTitleBar(WindowID, State)

Описание

Эта функция разрешает или запрещает менять стиль заголовка главного меню.

WindowID	- Системный идентификатор окна, который можно получить с помощью встроеной функции WindowID

State		- 0 - заголовок меню имеет стандартный стиль; 1 - заголовок имеет выбраный стиль


XP_GetMenuItemText()

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

XP_GetMenuItemText()

Синтаксис

XP_GetMenuItemText(MenuID, Item)

Описание

Чтение текста из пункта меню.
Рекомендуется использовать в место встроеной GetMenuItemText
поскольку как показала практика последняя работает нестабильно когда активна эта библиотека.

MenuID - Системный идентификатор меню, который можно получить с помощью MenuID

Item	  -  Идентификатор пункта меню


XP_GetMenuStructure()

XP_GetMenuStructure()

Синтаксис

XP_GetMenuStructure(*Str.Xp_MenuData)

Описание

Копирование свойств меню в структуру Xp_MenuData

Приложение должно предоставить функции указатель на структуру,
а функция в свою очередь скопирует туда основные данные,
используемые для построения меню.
Далее можно модифицировать некоторые данные и вернуть их в
библиотеку с помощью XP_SetMenuStructure

Вот сама структура

Structure Xp_MenuData

; Заголовок меню
    TitleColorStart.l; Начальный (верхний) цвет выдделеной части ЗАГОЛОВКА
    TitleColorEnd.l  ; Конечный (нижний) цвет выдделеной части ЗАГОЛОВКА
     TitleColorStart_OpenMenu.l  ; Начальный (верхний) цвет выделеной части заголовка главного меню, когда меню ОТКРЫТО
    TitleColorEnd_OpenMenu.l    ; Конечный (нижний) цвет выделеной части заголовка главного меню, когда меню ОТКРЫТО
    FrameTitleColor.l           ; Цвет окантовки заголовка главного меню, когда меню ЗАКРЫТО
    FrameTitleColor_OpenMenu.l  ; Цвет окантовки заголовка главного меню, когда меню ОТКРЫТО
    TitleColor.l                ; Цвет заголовка главного меню. Если его раскрашивать не нужно, тогда запишите в переменную -1
    TitleTextSelectColor.l      ; Цвет текста выбраного пункта ЗАГОЛОВКА меню
    TitleTextNormalColor.l      ; Цвет текста НЕ выбраного пункта ЗАГОЛОВКА меню
    TitleTextColor_OpenMenu.l   ; Цвет текста заголовка когда меню ОТКРЫТО
    TitleFrameState.c              ; 0 - стандартная (с четырёх сторон) окантовка пункта заголовка меню меню когда оно открыто  ; 1- нестандартная октановка (с трёх сторон) используется совместно и обрамлением меню

; Пункты меню
     ItemColorStart.l; Начальный (верхний) цвет выдделеной части пункта
    ItemColorEnd.l  ; Конечный (нижний) цвет выдделеной части пункта
    FrameAllMenuColor.l         ; Цвет окантовки меню. Если она не нужна, то запишите -1
    MenuShadeState.c            ; Тень от меню. 0 - теней нет; 1 - тени есть
 FrameColor.l                                              ; Цвет окантовки пункта
  FrameTitleColor_OpenMenu.l                  ; Цвет окантовки заголовка главного меню, когда меню открыто
 BackgroundColor.l                                    ; Фоновый цвет меню
 TextSelectColor.l                                      ; Цвет текста выбраного пункта меню
 TextNormalColor.l                                     ; Цвет текста НЕ выбраного пункта меню
 TextSelectTABColor.l                               ; Цвет текста выбраного пункта находящегося после табулятора
 TextNormalTABColor.l                              ; Цвет текста НЕ выбраного пункта находящегося после табулятора
 SeparatorColor.l                                        ; Цвет разделителя
 HeightItem.c                                              ; Высота пункта меню в пикселях
 IconBarSize.c                                             ; Ширина обсласти значков
IconBar_IconAutoSize.c ; 0 - авто коррекция размера значков выключена. В этом случае из размер автоматически изменяется только при возможности использовать иконки, с размерами 24, 32, 48 и 64;
                                ; 1 -  авто коррекция размера значков включена
 IconBarGradientStartColor.l                       ; Начальный (левый) цвет градиента области значков
 IconBarGradientEndColor.l                        ; Конечный (правый) цвет градиента области значков
 MenuFontID.l                                              ; Идентификатор используемлго шрифта для пункта меню
 MenuFontTitleID.l   			   ; Идентификатор используемлго шрифта в заголовке главного меню

 ; Галочка
 CheckBoxEnableActive_CHECK_Color.l  ; Цвет ГАЛОЧКИ когда пункт активен и на него наведён курсор мышки
 CheckBoxEnable_CHECK_Color.l            ; Цвет ГАЛОЧКИ когда пункт активен и на него НЕ наведён курсор мышки
 CheckBoxDisableActive_CHECK_Color.l ; Цвет ГАЛОЧКИ когда пункт пассивен и на него наведён курсор мышки
 CheckBoxDisable_CHECK_Color.l           ; Цвет ГАЛОЧКИ когда пункт пассивен и на него НЕ наведён курсор мышки
 CheckBoxEnableActive_BACK_Color.l    ; Цвет ФОНА галочки когда пункт активен и на него наведён курсор мышки
 CheckBoxEnable_BACK_Color.l              ; Цвет ФОНА галочки когда пункт активен и на него НЕ наведён курсор мышки
 CheckBoxDisableActive_BACK_Color.l    ; Цвет ФОНА галочки когда пункт пассивен и на него наведён курсор мышки
 CheckBoxDisable_BACK_Color.l              ; Цвет ФОНА галочки когда пункт пассивен и на него НЕ наведён курсор мышки
 CheckBoxEnableActive_FRAME_Color.l  ; Цвет ОБРАМЛЕНИЯ галочки когда пункт активен и на него наведён курсор мышки
 CheckBoxEnable_FRAME_Color.l            ; Цвет ОБРАМЛЕНИЯ галочки когда пункт активен и на него НЕ наведён курсор мышки
 CheckBoxDisableActive_FRAME_Color.l ; Цвет ОБРАМЛЕНИЯ галочки когда пункт пассивен и на него наведён курсор мышки
 CheckBoxDisable_FRAME_Color.l           ; Цвет ОБРАМЛЕНИЯ галочки когда пункт пассивен и на него НЕ наведён курсор мышки
EndStructure

Примечание:
Если нужна прозрачность фона галки или её обрамления, используйте в константу #XP_TRANSPARENT


XP_GetMenuStyle()

XP_GetMenuStyle()

Синтаксис

XP_GetMenuStyle()

Описание

Узнаём текущий стиль меню

Результатом будет следующее:
#XP_StyleNormal  -  стиль  "Офис  2000"
#XP_StyleXP         -  стиль "Офис  XP"
#XP_Style2003     -   стиль "Офис  2003"
#XP_StyleViolet
#XP_StyleBlack
#XP_StyleGray
#XP_StyleGreen

Установить новый стиль можно с помощью XP_SetMenuStyle


XP_Menu_CB()

XP_Menu_CB()

Синтаксис

XP_Menu_CB(hWnd,Msg,wParam,lParam)

Описание

Обработчик событий библиотеки  XP_Menu_Lib
Он должен находиться в процедуре, вызываемой с помощью SetWindowCallback
Без этой функции, библиотека нормально работать не может!
Так что она обязательна.

Пример
Procedure GlavWindowCallback(WindowID, Message, wParam, lParam)
Protected Result=#PB_ProcessPureBasicEvents
 XP_Menu_CB(WindowID, Message, wParam, lParam) ; Обработчик событий библиотеки  XP_Menu_Lib
ProcedureReturn Result
EndProcedure
; остальная часть программы


XP_MenuRegister()

XP_MenuRegister()

Синтаксис

XP_MenuRegister(HandeMenu, State, MenuType [, WindowID])

Описание

Эта функция регистрирует в библиотеке или удаляет регистрацию конкретного меню.
Её следует вызывать после создания меню.
Поддерживается до восьми вложеных меню.

HandeMenu   -  Системный идентификатор меню, который можно получить с помощью MenuID

State		-  Если нужно зарегестрировать меню, следует использовать константу #XP_RegMenu,
           а если нужно отменить регистрацию, то используйте #XP_DelMenu

MenuType	-  Тип меню. Если регистрируется главное меню, используйте константу #XP_RegGeneralMenu.
           Для контекстного меню испольуйте #XP_RegPopupMenu, а для систмного (то, у  заголовка окна) #XP_RegSysMenu

WindowID	- Системный идентификатор окна  Это необязательный аргумент, он нужен только при регистрации главного меню

Примечание:
По умолчанию будет установлен стиль "Офис 2003".
Если требуется другой, используйте функцию XP_SetMenuStyle или пару функций XP_GetMenuStructure и XP_SetMenuStructure

XP_Menu_Lib - index


XP_SetMenuFont()

XP_SetMenuFont()

Синтаксис

XP_SetMenuFont(FontID, State)

Описание

Выбор шрифта, используемого в меню.

FontID - Системный идентификатор шрифта, который можно получить с помощью встроеной функции LoadFont

State	- #XP_FontItem - шрифт пункта;
#XP_FontTitle - шрифт заголовка главного меню


XP_SetMenuIcon()

XP_SetMenuIcon()

Синтаксис

XP_SetMenuIcon(MenuID, itemID, IconID)

Описание

Добавление иконки к пункту меню.

MenuID - Сиситемный идентификатор меню, который можно получить с помощью функции MenuID

itemID   - Идентификатор пункта меню

IconID    - Системный идентификатор иконки, который можно получить с помощью функции IconID


XP_SetMenuStructure()

XP_SetMenuStructure()

Синтаксис

XP_SetMenuStructure(*Str.Xp_MenuData)

Описание

Установка свойств меню из структуры Xp_MenuData

Эта функция совместно с XP_GetMenuStructure позволяет управлять стилем меню, путём изменения настроек самой библиотеки.

Допустим нам нужно изменить цвет текста выделеного пункта.
Делаем это так:

StyleMenu.Xp_MenuData ; Объявляем структуру и присваеваем ей имя StyleMenu
  XP_GetMenuStructure(StyleMenu) ; Считываем текущие сведения о стиле
    StyleMenu\TextSelectColor=RGB(254, 4, 1) ; Цвет текста выбраного пункта меню
    StyleMenu\TextSelectTABColor=RGB(254, 4, 1) ; Цвет текста выбраного пункта находящегося после табулятора
  XP_SetMenuStructure(StyleMenu) ; Отправляем библиотеке изменёные сведения о стиле


XP_SetMenuStyle()

XP_SetMenuStyle()

Синтаксис

XP_SetMenuStyle(Style)

Описание

Установка текущего стиля меню.

Style  -  Стиль меню.
#XP_StyleNormal  -  стиль  "Офис  2000"
#XP_StyleXP         -  стиль "Офис  XP"
#XP_Style2003     -   стиль "Офис  2003"
#XP_StyleViolet
#XP_StyleBlack
#XP_StyleGray
#XP_StyleGreen

Примечание:
Стиль меню зависит от данных в структуре Xp_MenuData и его легко можно изменить в своём приложении.
Подробнее можно узнать ознакомившись с описанием пары функций XP_GetMenuStructure и XP_SetMenuStructure


XP_SetSideText_CB()

XP_SetSideText_CB()

Синтаксис

XP_SetSideText_CB(*AddressProcedure_CB)

Описание

Регистрация процедуры, добавляющей текст в область значков.

В этой процедуре нужно будет обрабатывать сообщения библиотеки, которые передаются через структуры DRAWITEMSTRUCT и Xp_SideText.
Первая это системная структура и она выступает в роли вспомагательной.
Вот какие данные в ней могут быть:
CtlType	Тип органа управления. Для меню принимает значение #ODT_MENU
CtlID		Идентификатор органа управления. Для меню не используется
itemID		Идентификатор строки меню
itemAction	Действия, которые необходимо выполнить при изображении строки меню. Определен в виде отдельных битовых флагов:
        #ODA_DRAWENTIRE - требуется перерисовать всю строку;
        #ODA_FOCUS  этот бит устанавливается в 1, если строка меню получила или потеряла фокус ввода, новое состояние строки можно узнать, проанализировав содержимое поля itemState;
        #ODA_SELECT  изменилось состояние строки меню, для уточнения состояния необходимо использовать поле itemState
itemState	Вид, в котором необходимо изобразить строку меню. Определен в виде отдельных битовых флагов:
        #ODS_CHECKED  выбрана строка меню;
        #ODS_DISABLED - строка неактивна;
        #ODS_FOCUS  строка получила фокус ввода;
        #ODS_GRAYED  строка меню должна быть изображена серым цветом;
        #ODS_SELECTED - строка выбрана
hwndItem	Идентификатор меню
hDC		Контекст устройства, который необходимо использовать для рисования строки меню
rcItem	 	Прямоугольные границы, внутри которых необходимо нарисовать строку (это вложеная структура RECT)
itemData	Содержит 32-битовое значение, полученное через параметр lpNewItem функций AppendMenu, InsetMenu, ModifyMenu

---------------------------------------------------------------------------------------------------------------------------

Структура Xp_SideText имеет такой вид:

Structure  Xp_SideText
; Данные передаваемые библиотекой в процедуру
 hMenu.l 		; Идентификатор меню (или ноль если не удалось его определить)
 MenuType.c 		; Тип меню (0 - главного меню; 1- контекстное меню; 2 - системное меню) или 255 если неопределён идентификатор меню
 TitlePopupMenu.s 	; Заголовок всплывающего меню
 OpenGeneralMenu.c ; 1 - главное меню закрыто; 0 - главное меню открыто или прорисовывается заголовок меню

; Данные передаваемые из процедуры в библиотеку
 Text.s			; Текст, который нужно отобразить в области значков меню
 X.c			; Положение текста по горизонтали считая от левого края меню
 Y.c			; Положение текста во вертикали считая от НИЖНЕГО края меню
 FontID.l		; Системный идентификатор шрифта
 Color.l		; Цвет текста
EndStructure

Для того чтобы текст отобразился в области значков, процедура должна сообщить об этом, возвратив в качестве результата число 1, или 0 если текст отображать на нужно.

Пример
Procedure GlavWindowCallback(WindowID, Message, wParam, lParam)
Protected Result=#PB_ProcessPureBasicEvents

XP_Menu_CB(WindowID, Message, wParam, lParam)

ProcedureReturn Result
EndProcedure

Procedure SetSideText_CB(*DIS.DRAWITEMSTRUCT, *SideText.Xp_SideText)
Shared FontID_Text, FontID_Text_1, FontID_Text_2
Protected Result.c=0
*SideText\y=2
*SideText\x=2
*SideText\FontID=FontID_Text
*SideText\Color=RGB(147, 2, 108)

If  *SideText\MenuType=0 ; Главное меню

 Select *SideText\TitlePopupMenu
  Case "Файл"
   *SideText\Text="Работа с файлами"
   Result=1

  Case "Недавние файлы"
   *SideText\Text="Недавно открытые файлы"
   Result=1

  Case "Правка"
   *SideText\Text="Правка файлов"
   Result=1

  Case "Инструменты"
   *SideText\FontID=FontID_Text_2
   *SideText\Text="Всякие примочки"
   *SideText\Color=RGB(82, 147, 65)
   Result=1

 EndSelect

ElseIf  *SideText\MenuType=2 ; Системное меню
 *SideText\FontID=FontID_Text_1
 *SideText\Color=RGB(254, 25, 21)
 *SideText\Text="Это системное меню"
 *SideText\x=4
 *SideText\y=10
   Result=1

EndIf

ProcedureReturn Result
EndProcedure

OpenWindow(4,0,0,300,100,"Робота XP_Menu_Lib",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible)
CreateGadgetList(WindowID(4))

If CreateMenu(2,WindowID(4))
      MenuTitle("Файл")
    MenuItem(1,"Новый"+Chr(9)+"Ctrl+N")
    MenuItem(2,"Открыть..."+Chr(9)+"Ctrl+N") : DisableMenuItem(2,2,1)
    MenuItem(47,"Открыть заново"+Chr(9)+"Ctrl+N") : SetMenuItemState(2,47,1)
    MenuItem(3,"Сохранить"+Chr(9)+"Ctrl+N")
    MenuItem(4,"Сохранить как..."+Chr(9)+"Ctrl+N") : DisableMenuItem(2,4,1) : SetMenuItemState(2,4,1)
    MenuItem(46,"Сохранить всё"+Chr(9)+"Ctrl+N")
    MenuItem(15,"Закрыть закладку"+Chr(9)+"Ctrl+N")
    MenuItem(41,"Индивидуальные настройки"+Chr(9)+"Ctrl+N")

    MenuBar()
    MenuItem(5,"Настройки программы")
    MenuBar()
    OpenSubMenu("Недавние файлы")
     MenuItem(20,"1)    1")
     MenuItem(21,"2)    2")
     MenuItem(22,"3)    3")
     MenuItem(23,"4)    4")
     MenuItem(24,"5)    5")
     MenuItem(25,"6)    6")
     MenuItem(26,"7)    7")
     MenuItem(27,"8)    8")
     MenuItem(28,"9)    9")
     MenuItem(29,"10)  10")
    CloseSubMenu()
    ; Разделитель между пунктами.
    MenuBar()
    MenuItem(6,"Выход")
       MenuTitle("Правка")
    MenuItem(7, "Отменить")
    MenuItem(8,"Повторить")
    MenuBar()
    OpenSubMenu("Внутренний буфер")
      MenuItem(42, "Вырезать")
      MenuItem(43, "Копировать")
      MenuItem(44, "Вставить")
      MenuBar()
      MenuItem(45, "Очистить буфер")
       OpenSubMenu("Вложеное меню")
         MenuItem(42, "Пункт 1")
           OpenSubMenu("Ещё вложеное меню")
             MenuItem(44, "Пункт")
             MenuBar()
             MenuItem(45, "Ещё пункт")
           CloseSubMenu()
         MenuItem(44, "Пункт 2")
       CloseSubMenu()
    CloseSubMenu()
    MenuBar()
    MenuItem(9, "Вырезать")
    MenuItem(10, "Копировать")
    MenuItem(11, "Вставить")
    MenuItem(12, "Удалить")
    MenuBar()
    MenuItem(13,"Выделить всё")
    OpenSubMenu("Выделенный текст")
       MenuItem(52, "Найти")
       MenuItem(36, "Дублировать в новой строке")
       MenuBar()
       MenuItem(31, "Сделать комментарием")
       MenuItem(32, "Удалить комментарий")
       MenuBar()
       MenuItem(33, "В новый файл")
       MenuBar()
       MenuItem(34, "Перевести в верхний регистр")
       MenuItem(35, "Перевести в нижний регистр")
    CloseSubMenu()
    MenuBar()
    MenuItem(16,"Найти/Заменить")
    MenuItem(18,"Расширенный поиск")
       MenuTitle("Переход")
    MenuItem(38,"Закладка")
    MenuItem(39,"Строка")
    MenuItem(40,"Найти курсор")
    MenuItem(51,"Предыдущая строка")
    MenuBar()
    MenuItem(48,"Открыть папку содержащую файл")
       MenuTitle("Инструменты")
    MenuItem(17,"Отступы")
    MenuItem(37,"Конвертер систем исчисления")
    MenuItem(49,"Просмоторщик переменных...")
    MenuItem(70,"Конвертер для HD44780")
    OpenSubMenu("Строки")
      MenuItem(72,"Ограничение длины строк")
      MenuItem(75,"Удаление строк")
    CloseSubMenu()
    MenuItem(78,"Справочник")
    MenuBar()
    MenuItem(73,"Генератор библиотек")
    MenuBar()
    OpenSubMenu("Дополнительная панель")
      MenuItem(71,"Отображать панель") : SetMenuItemState(2,71,1)
      MenuItem(74,"Скрывать при неактивности") : SetMenuItemState(2,74,1)
                                                 DisableMenuItem(2,74,1)
    CloseSubMenu()

      MenuTitle("Справка")
      MenuItem(2,"О программе")
      MenuBar()
      OpenSubMenu("Вложеное меню №1")
      For i=2 To 8
      MenuItem(1,"Пункт")
      OpenSubMenu("Вложеное меню №"+Str(i))

      Next

      CloseSubMenu()
      CloseSubMenu()
      CloseSubMenu()
      CloseSubMenu()
      CloseSubMenu()
      CloseSubMenu()
      CloseSubMenu()
      CloseSubMenu()
      MenuItem(73,"Генератор")

    EndIf

SetWindowCallback(@GlavWindowCallback(),4)

XP_MenuRegister(MenuID(2), #XP_RegMenu, #XP_RegGeneralMenu,WindowID(4)) ; Регистрация главного меню
XP_MenuRegister(GetSystemMenu_(WindowID(4),0), #XP_RegMenu, #XP_RegSysMenu) ; Регистрация системного меню

FontID_Text=LoadFont(4, "MS Sans Serif", 10,#PB_Font_Bold)
FontID_Text_1=LoadFont(5, "MS Sans Serif", 8)
FontID_Text_2=LoadFont(6, "Verdana", 12,#PB_Font_Bold)

XP_SetSideText_CB(@SetSideText_CB()) ; Обработчик событий от меню. Используется для отображения текста в области значков

HideWindow(4,0)

Repeat
 Event=WaitWindowEvent()
 Gadget=EventGadget()
 Type=EventType()
 Menu=EventMenu()

Until Event=#PB_Event_CloseWindow


XP_UpdateStyleMenuItem()

XP_UpdateStyleMenuItem()

Синтаксис

XP_UpdateStyleMenuItem(MenuID, Item)

Описание

Обновление стиля пункта меню. Использовать после SetMenuItemText

MenuID - Системный идентификатор меню, который можно получить с помощью MenuID

Item	  -  Идентификатор пункта меню


XP_Menu_Lib library license

XP_Menu_Lib library license

This purebasic user library is provided 'as-is', without any express or implied warranty.
In no event will the author be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, including commercial
applications, and redistribute it freely.


Order

Order

PureBasic is a low-cost programming language. In buying PureBasic you will ensure that development will go further and faster. For personal use (i.e.: not used by a commercial organization) the updates are unlimited, unlike most other software out there. This means than when you buy PureBasic you will get all future updates for free, on the web site. Better still, you get the three versions of PureBasic (Amiga, Linux and Windows) for the same price! For ease of ordering, you can safely use our secure online method. Thanks a lot for your support!

The demo-version of PureBasic is limited as shown below:

- No DLL can be created
- you can't use the whole external Win32 API support
- no development kit for external libraries
- maximum number of source lines: 800

Full version of PureBasic:

Price for full version: 79 Euros

Payment by cheque (France only, to 'Frederic Laboureur') :

    Fantaisie Software
    10, rue de Lausanne
    67640 Fegersheim
    France

If you live in Germany or German-speaking country and prefer paying to bank account you can also send your registration to German team member. In this case please send your order to following address:

    Andrй Beer
    Siedlung 6
    09548 Deutschneudorf
    Germany
    e-mail: andre@purebasic.com

    Bank Account:
    Deutsche Kreditbank
    Account 15920010 - Bank code 12030000
    (For transactions from EU countries: IBAN: DE03120300000015920010 - BIC/Swift-Code: BYLADEM1001)

Online Ordering

Payment online (www.purebasic.com) is available and very secure.

Delivering of the full version

A full version will be sent via e-mail or snail mail on immediate receipt. Please indicate your preference. If you want to use this order form click here (or here when ordering at Andrй) then print it. Please mail to the address shown above.


Contact

Contact

Please send bug reports, suggestions, improvements, examples of source coding, or if you just want to talk to us, to any of the following addresses:

Frйdйric 'AlphaSND' Laboureur

Fred 'AlphaSND' is the founder of Fantaisie Software and the main coder for PureBasic. All suggestions, bug reports, etc. should be sent to him at either address shown below:

s-mail :

Frйdйric Laboureur
10, rue de Lausanne
67640 Fegersheim
France

e-mail : fred@purebasic.com

Richard Andersson

Richard is a very talented coder who has helped Fred to develop the strong and powerful assembler sub-libraries needed for PureBasic (mainly for the Amiga version). Need a new library? Get in touch with him at:

e-mail : richard@purebasic.com

Andrй Beer

Andrй is responsible for the complete German translation of the PureBasic manual and website. PureBasic can be ordered in Germany also directly at him.

e-mail : andre@purebasic.com

Benny 'Berikco' Sels

Benny is the main coder for the Visual Designer. The Visual Designer updates and history can be found at his website: http://www.purebasic.be. All suggestions,bug reports, etc. about the Visual Designer should be sent to him at the address shown below:

e-mail : berikco@purebasic.com


Acknowledgements

Acknowledgements

We would like to thank the many people who have helped in this ambitious project. It would not have been possible without them !

- All the registered users: To support this software... Many Thanks !

Coders

- Timo 'Fr34k' Harter: For the IDE, Debugger, many commands and the great ideas. PureBasic wouldn't be the same without him !

- Benny 'Berikco' Sels: To provide an amazing first class Visual Designer for PureBasic.. That's great to have such kind of help !

- Danilo Krahn: To have done an huge work on the editor and on the core command set, without forget the tons of nice suggestions about code optimization and size reduction... Thanks a lot.

- Sebastion 'PureFan' Lackner: For the very nice OnError library, which adds professional error handling for final executables and several other commands !

- Siegfried Rings: Also for the very nice OnError library, as its a two men work :)

- Marc Vitry: To have kindly shared its SerialPort library sources which helped a lot for the native PureBasic library.

- Stefan Moebius: To have sent its DX9 subsystem sources, which have been the basis of the current DX9 subsystem for PureBasic.

Miscellaneous

- Roger Beausoleil: The first to believe in this project, and his invaluable help with the main design and layout of PureBasic.

- Andre Beer: To spend time to translate all the guides into German. Big thanks.

- Francis G. Loch: To have corrected all the mistakes in the English guides ! Thanks again.

- Steffen Haeuser: For giving his valuable time, and assistance. For his invaluable explanations regarding aspects of PPC coding, and his very useful tips.

- Martin Konrad: A fantastic bug reporter for the Amiga version. To have done the forthcoming Visual Environment for PureBasic and some nice games..

- James L. Boyd: To have found tons of bugs in the x86 version and gave us tons of work :). Keep up the bug hunt !

- Les: For editing the English Fantaisie Software Web site & and this guide. This looks much better!

- NAsm team: To have done an incredible x86 assembler used to develop the PureBasic libraries

- Tomasz Grysztar: For FAsm, an excellent optimized x86 assembler currently used by PureBasic. http://flatassembler.net/

- Pelle Orinius: For the very good linker and resource compiler (from PellesC) currently used by PureBasic, and the invaluable and instant help when integrating the new linker in the PureBasic package. Thank you !

- Jacob Navia: For the linker (from the Lcc32 package) which was used in previous PureBasic versions

- Thomas Richter: For creating "PoolMem." A patch that decreases the compilation time by a factor of 2-3! Many thanks for allowing it to be added to the main archive.

- Frank Wille: For allowing the use of your excellent assemblers: "pasm," and "PhxAss". For all your tips, and invaluable assistance, in their usage. To help us a lot about debugging PowerPC executables..

- Rings, Paul, Franco and MrVain/Secretly: For extensive bug reports and help us to have a compiler as reliable and bug free as possible.

- David 'Tinman' McMinn: To enhance greatly the help and give the opportunity to the world to really discover PureBasic !

- Leigh: To have created and hosted the first PureBasic forums during 2 years. It has been a great amount of work, especially when the community started to grow. Thanks again !


History

History

1st December 2009 : Version 4.40

- Added: Native Linux x64 support
- Added: Build-in Map library for hash tables
- Added: 'Threaded' Keyword for thread-local variables
- Added: Structure assignment copies the structure (a.point = b.point)
- Added: ClearStructure()
- Added: AESEncoder(), AESDecoder(), StartAESCipher(), AddCipherBuffer(), FinishCipher()
- Added: Dylib support for OS X
- Added: Joystick library for OS X
- Added: Systray library for OS X
- Added: Trim/LTrim/RTrim() got an optional character to trim
- Added: #PB_Function, #PB_OSFunction, #PB_Map to Defined()
- Added: ReverseString(), InsertString(), RemoveString()
- Added: Blob support to databases
- Added: UsePostgreSQLDatabase(): native PostgreSQL support
- Added: Peephole optimizer to 64 bit versions to produce better code
- Added: '.a' (ascii) and '.u' (unicode) native type to provide native unsigned byte and word.
- Added: FileBuffersSize() - #PB_Default support change the buffersize to the next opened files
- Added: #PB_URL_Protocol to Get/SetURLPart()
- Added: #PB_Shadow_TextureAdditive
- Added: FTPDirectoryEntryRaw(), FillMemory()
- Added: Global, Protected, Threaded, Shared and Static now accept a type to affect all default variable declaration.
- Added: AddWindowTimer(), RemoveWindowTimer(), EventTimer()
- Added: #PB_Window_Tool to create tool windows
- Added: ShortcutGadget(), StatusBarProgress()
- Added: StatusBarImage() now supports normal images (not just icons)
- Added: #PB_Checkbox_ThreeState flag to create a 3 state checkbox
- Added: CreateImageMenu(), CreatePopupImageMenu() for OSX
- Added: Full alphachannel support for all GUI elements that display images
- Added: Full alphachannel support for Image lib
- Added: New drawing modes for 2DDrawing in ImageOutput()
- Added: LinearGradient(), BoxedGradient(), CircularGradient(), EllipsicalGradient(), ConicalGradient()
- Added: CustomGradient(), GradientColor(), ResetGradientColors(), CustomFilterCallback()
- Added: DrawAlphaImage() for all outputs on all OS
- Added: DrawAlphaImage() has a new transparency parameter and can be used to draw non-alpha images part transparent
- Added: QuickDraw subsystem for WindowOutput() on OSX
- Added: Sprite/ScreenOutput for OpenGL (all OS)
- Added: DrawingFont() works for SDL output
- Added: OutputWidth(), OutputHeight(), OutputDepth() for 2DDrawing
- Added: GrabDrawingImage(), DrawRotatedText(), RGBA(), Alpha(), AlphaBlend()
- Added: #PB_PixelFormat_ReversedY - for pixel buffers that are stored upside-down (Windows ImageOutput or OpenGl)
- Added: #PB_OS_Windows_7, #PB_OS_MacOSX_10_6 for OSVersion()

- Updated: OGRE to 1.6.2, sqlite 3.6.14.2, PCRE to 7.9

- Changed: Call(C)Function(Fast) parameters have been changed from 'Any' to 'Integer'.
- Changed: OpenScreen() now accepts FlipMode and RefreshRate
- Changed: FlipBuffers() doesn't take an optional parameter anymore

- Removed: #PB_Image_DisplayFormat is now deprecated (value set to 24 to have 24bit as default)
- Removed: SetRefreshRate() has been removed, the parameter is in OpenScreen() now

- Fixed: Image Decoders are now threadsafe
- Fixed: Quite some bugs in libraries and in the compiler

PureBasic IDE:
- Added: Full project management
- Added: Highlight matching keyword for keyword under cursor (tied to BraceMatching color setting)
- Added: Edit->Goto matching keyword
- Added: PB_TOOL_Preferences Environment variable for IDE tools
- Added: Theme management to customize menu icons
- Added: New 'Silk' theme based on the Iconsset by Mark James
- Added: Autocomplete scans implicit variable declaration and respects scope
- Added: Structure item autocomplete

- Changed: moved encoding/newline setting from compiler options to file menu

PureBasic Debugger:
- Optimized: greatly improved VariableViewer update speeds
- Added: progressbar display if VariableViewer update takes long
- Added: column sort capability to VariableViewer (Windows only)

3rd June 2009 : Version 4.31

- Fixed: Many compiler and libraries related bugs

16th December 2008 : Version 4.30

- Added: Full 64 bits version of PureBasic (Windows)
- Added: MacOS X x86 support
- Added: 'JPEG 2000' library
- Added: 'Node' library
- Added: 'Gadget3D' library
- Added: 'Window3D' library
- Added: 'Sound3D' library
- Added: Full unicode support to the engine3d
- Added: MacOS X support for engine3d
- Added: Absolute/relative rotation for all engine3d rotate commands
- Added: Absolute move for engine3d physic body
- Added: EntityID(), EntityLookAt()
- Added: CameraProjectionX(), CameraProjectionY(), WorldDebug(), Sun()
- Added: MousePick(), PointPick(), PickX/Y/Z(), CreateWater(), AntialiasingMode()
- Added: CatchModule(), ArraySize(), WindowBounds(), DesktopX(), DesktopY()
- Added: FinishDatabaseQuery(), DatabaseID()
- Added: CreateSemaphore(), FreeSemaphore(), SignalSemaphore(), WaitSemaphore(), TrySemaphore()
- Added: '.i' native type for 32/64 bits integer size
- Added: Read/WriteInteger(), Read/WritePreferenceInteger(), PeekI(), PokeI()
- Added: Language support for compiler and debugger
- Added: Style parameter to FontRequester()
- Added: Support for 'And/Or' in CompilerIf statements
- Added: #PB_Event_MinimizeWindow, #PB_Event_MaximizeWindow, #PB_Event_RestoreWindow
- Added: #PB_Ignore support to AddStatusBarField()
- Added: #PB_Explorer_DisplayMode to ExplorerListGadget()
- Added: Multiple joystick support
- Added: #PB_Compiler_FilePath compiler constant

- Enhanced: Major rework of OnError library (crossplatform)
- Enhanced: InitScintilla(), parameter is now optional
- Enhanced: Complete debugger rewrite for support of the new platforms

- Optimized: XML library to handle very big files quickly
- Optimized: LinkedList library to use memory efficiently

- Changed: 'Read' keyword now requiers a type (Read.l, Read.q etc.) to avoid 64 bits migration problems
- Changed: CountList() to ListSize()
- Changed: ClearGadgetItemList() to ClearGadgetItems()
- Changed: CameraProjection() to CameraProjectionMode()
- Changed: AddElement() and such now return a pointer to the start of data
- Changed: ComboBoxGadget() height is now the real gadget height
- Changed: #Long, #Byte, #Word etc. to #PB_Long, #PB_Byte, #PB_Word etc. for consistency
- Changed: RotateEntity(), RotateCamera() and RotateBillboard() x,y rotation axis
- Changed: CameraFOV() angle from radian to degree
- Changed: Array and list parameter now requiers the 'List' or 'Array' keyword

- Removed: StrQ(), HexQ(), BinQ(), ValQ()
- Removed: ChangeListIconDisplay(), replaced by a gadget attribute
- Removed: ButtonImageGadget() backward compatibility
- Removed: CreateGadgetList(), now automatically done in OpenWindow()
- Removed: CopyTexture(), TextureOutput()
- Removed: Removed CPU monitor from the IDE, as all OS provide the same functionality

- Fixed: DX9 subsystem on Windows
- Fixed: Many compiler and libraries related bugs

23th May 2008 : Version 4.20

- Added: Mail library
- Added: Ftp library
- Added: RegularExpression library
- Added: Http library
- Added: SerialPort library
- Added: FLAC library
- Added: SQLite library
- Added: DirectX 9 subsystem
- Added: Sound Streaming for OGG and FLAC
- Added: #PB_Sound_MultiChannel support for the sound library
- Added: CreateImageMenu(), CreatePopupImageMenu(), SHA1FingerPrint(), SHA1FileFingerPrint()
- Added: CRC32FileFingerprint(), ExamineMD5FingerPrint(), ExamineSHA1FingerPrint(),
- Added: NextFingerPrint(), FinishFingerPrint(), IsFingerPrint()
- Added: Hexadecimal and binary support for Val() and ValQ()
- Added: #PB_Compiler_Procedure compiler constant
- Added: #PB_Round_Nearest support for Round()
- Added: 'XOr' drawing support for Linux/SDL and MacOS X
- Added: New "Profiler" tool for the Debugger menu to monitor how often lines are called in the code
- Added: Debugger can now evaluate expressions (see Debug output)
- Added: The Memory Viewer can accept any expression as the start/end address
- Added: Adding a "+" at the "end address" field of the Memory viewer makes the end address relative
- Added: Placing the mouse over a Variable will display its value while the program runs.
- Added: Selecting a more complex expression and placing the mouse over it will evaluate the expression in the running program (if possible)

- Changed: Mid() has now the Len() parameter optional

- Optimized: Compiler source processing speed (up to 8x faster)
- Optimized: The whole commandset by using a better C compiler (Windows only)

- Fixed: Quite some bugs related to the commands and compiler

4th November 2007 : Version 4.10

- Added: XML library
- Added: Drag & Drop library
- Added: Vista compatibility (fully comptiable with UAC), except for Sprite library (planned for 4.20)
- Added: ModPlug support for module replaying (removed MIDAS)
- Added: ScintillaGadget(), TruncateFile()
- Added: EnableASM and DisableASM compiler directives
- Added: #PB_OS_Windows_Vista and #PB_OS_Windows_Server_2008 for OSVersion()
- Added: Lots of new fetaures for the WebGadget()
- Added: many new small improvement to the IDE (New compiler communication protocol, Vista compliance, brace markers, faster coloring etc.)
- Added: synchronized release between Windows, Linux and MacOS X !

- Changed: InitDatabase() to UseODBCDatabase()
- Changed: On Windows the IDE and PB tools preferences are now stored in the user applicationdata folder

- Removed: The SmartUpdate tool is no longer supported

- Fixed: lots of bugs related to the commands and compiler

18th December 2006 : Version 4.02 (Merry Christmas !)

- Fixed: Macros issues
- Fixed: LoadImage() with plugins in unicode mode
- Fixed: ExplorerListGadget() with over 4GB file
- Fixed: ExaminePreferenceKeys() didn't list the first key
- Fixed: ExamineDirectory() didn't handle patterns properly
- Fixed: Several IDE problems
- Fixed: Some IDE and Debugger problems
- Fixed: Several compiler bugs

1st November 2006 : Version 4.01

- Changed: CreateThread() doesn't returns an OS thread handle anymore (use ThreadID() instead)

- Fixed: Several important quad and unicode issues
- Fixed: Threadsafe mode wasn't properly working in some cases
- Fixed: Nested compiler directives in macros
- Fixed: GetFileDate() and DirectoryEntryDate() now uses local time
- Fixed: OpenFileRequester() could fail with a lot of selected files
- Fixed: Many minors bugs

8th May 2006 : Version 4.00

As PureBasic 4 is a quite big release in both terms of changes and enhancements, a document which sum up all the modifications about the libraries commands since the last stable release is available: click here.

- Added: Native unicode support
- Added: Subsystems support
- Added: Unlimited length strings in both ascii and unicode mode
- Added: Thread safe commandset and strings
- Added: Character type (.c)
- Added: Double type (.d)
- Added: Quad type (.q)
- Added: 'XOr' and 'Not' logicals operators
- Added: Fixed string type (String${#Number})
- Added: Macro/EndMacro - single and complex mode
- Added: With/EndWith for cleaner code
- Added: Assign possibility to Static (quite important), Protected and Global: "Global a = 5"
- Added: It's now possible to create a linkedlist of pointer
- Added: Support for Global, Protected, Static and Shared arrays and linkedlist: "Global NewList MyList.l()". NewList alone does not make the list global anymore
- Added: #PB_Compiler_File, #PB_Compiler_Line, #PB_Compiler_Version, #PB_Compiler_Home, #PB_Compiler_Debugger, #PB_Compiler_ThreadSafe, #PB_Compiler_Unicode
- Added: CompilerError "Message" directive
- Added: @procedure()and ?Label support in Data.l directive
- Added: optional parameters for procedures, interfaces methods, and prototypes
- Added: /CONSTANT Test=Value switch to declare constants on the compiler line
- Added: Swap keyword to quickly swap 2 variables or elements (Swap a,b).
- Added: multiple 'Case' for Select/EndSelect: Case 1, 2, 6 To 20
- Added: 'Prototype' keyword to declare functions pointers easily
- Added: 'ProcedureC' keyword to declare cdecl procedure easily
- Added: Procedure parameters can now have the same name than a global variable (automatically protected)
- Added: EnableExplicit/DisableExplicit: variables must be declared with Define, Global, Protected, Shared or Static.
- Added: Defined(Name, Type) compiler function. Type can be #PB_Constant, #PB_Variable, #PB_Array, #PB_LinkedList, #PB_Structure, #PB_Interface
- Added: ReDim for single and multi-dimensionned arrays
- Added: Import/ImportC/EndImport to import functions and variables from external .lib
- Added: LinkedList and Arrays can now be passed as procedure parameters
- Added: /LINKER flags to provide a command file directly to the linker
- Added: PseudoTypes: p-ascii, p-unicode, p-variant, p-utf8 and p-bstr
- Added: Assembler and Linker errors for CLI compiler are now directly displayed
- Added: OpenGL subsystem for multimedia applications (can be combined with NT4 one)
- Added: full alphachannel support for Sprite3D library (trough PNG and TIFF)
- Added: Subsystem() compiler directive to check if a subsystem is in use
- Added: exponent form for constant float: 123.5e-20
- Added: local variables aliases are generated when using '!' raw assembly to ease their referencing (in form p.v_variable)
- Added: 'Step over' and 'Step out' features to the debugger
- Added: Process library

- Updated: NT4 support is now done trough a subsystem (DirectX 3)
- Updated: Resident files now supports quad, double, macros and prototypes
- Updated: Many library commands
- Updated: OGRE engine to 1.0.7 version
- Updated: The french documentation has been greatly enhanced

- Optimized: Smaller executable footprint: 1.5 kb instead of 2.5 kb for the smallest one
- Optimized: Faster float and litteral numeric mixing
- Optimized: File library completely rewritten and now handle a read/write cache for very fast performances. Also support for 64 bits files.
- Optimized: Procedures are now as small as possible, which should give some speed increase

- Changed: Console library commands can now fully redirected (ie: possible to use them for CGI for example)
- Changed: When a numeric parameter is expected, it's not possible to pass a string anymore
- Changed: Temporary purebasic.exe name aren't random anymore, because it could cause slowdown with some firewalls
- Changed: 'DefType' renamed to 'Define'

- Fixed: Internal system functions no more trash reserved registers
- Fixed: Mouse is automatically released in windowed mode when the window loose focus
- Fixed: KeyboardInkey() now handle shift/alt modifiers correctly
- Fixed: IsScreenActive() works correctly for windowed mode as well
- Fixed: A lot of small/medium issues which have arosen since the last version

16 August 2005 : Version 3.94

- Added: Brand a new IDE and 3 Debuggers (!)
- Added: Resource file support to the compiler and IDE (/RESOURCE compiler switch)
- Added: Version support for executables and DLL (trough resource)
- Added: #PB_Event_ActivateWindow event support
- Added: #PB_Web_Mozilla flag to use the Mozilla ActiveX for the WebGadget()
- Added: GetToolBarButtonState() and SetToolBarButtonState()
- Added: Full documentation for the IDE and Debuggers

- Fixed: 32x32 bitmaps in ListIconGadget() with big icon display mode
- Fixed: OpenScreen()/CloseScreen() could fail when using sprite3D
- Fixed: MovieLength() and MovieInfo() were incorrect with WMV format (thanks to Traumatic ;-)
- Fixed: ToolBar disable bug when mixing image and icon with XP skins
- Fixed: Possible crash when closing a window with a free'ed statusbar or toolbar
- Fixed: ImageGadget() and ButtonImageGadget() couldn't be used with AnimateWindow_()
- Fixed: ImageGadget() bug when using DisableGadget()
- Fixed: LineXY() didn't release memory correctly
- Fixed: Line() and LineXY() affected the DrawText() position
- Fixed: SortList() could crash with big already sorted lists
- Fixed: SetMenuItemState() did change the disable state
- Fixed: Editable combobox created with #PB_Any didn't handle TAB correctly
- Fixed: OpenFileRequester() fails if the default filename wasn't correct
- Fixed: Compiler bug with string concatenation and procedures
- Fixed: Alignment problem in procedure which could makes API call fails in some case

28th February 2005 : Version 3.93

- Added: SortStructuredArray(), SortList(), SortStructuredList()
- Added: Conditional directives to LibraryMaker
- Added: KeyboardMode() (wasn't in the doc)
- Added: Optional 'Color' parameter for ColorRequester() and FontRequester()
- Added: SetGadgetText() can now be used on an editable ComboBoxGadget()
- Added: #PB_Default support to ClipSprite() to remove the clipping
- Added: #PB_FileSystem_Force to CopyDirectory()
- Added: #PB_OS_Windows_Server_2003 support to OSVersion()
- Added: Base64Decoder(), GetGadgetFont()
- Added: ResizeImage() now support a 'Mode' parameter to choose the resize algorythm
- Added: Event when a splitter is moved or resized so the children can be agenced
- Added: Realtime debugger check for Plot(x,y,Color) with ScreenOutput() and SpriteOutput()
- Added: Debugger check to DirectoryEntrySize/Name/Attributes()
- Added: IDE enhancements by Tinman

- Updated: Interface Importer and DirectX9 interfaces in residents (thanks to Traumatic !)
- Updated: Uses of Kale's icons for the IDE
- Updated: French documentation spellchecked and reworked by trasfract

- Optimized: Debugger mode is smaller and allow big structured variables
- Optimized: Splitted Misc library
- Optimized: Faster Base64Encoder() function
- Optimized: Better code generation for string assignement and concatenation

- Changed: OffsetOf() syntax, to fit with the SizeOf() one (more consistent)

- Fixed: A bug in ImageGadget() with XP skin activated and 32 bits bitmaps
- Fixed: ExplorerListGadget() didn't displayed .ico and .lnk files correctly
- Fixed: ButtonImageGadget() was loosing its picture in rare case with XP skins
- Fixed: No more 'ding' (windows sound) on click in fullscreen when ExamineMouse() wasn't used
- Fixed: When using ALT+TAB with a fullscreen application, the icon is correctly displayed
- Fixed: Sprites are now correctly restored when switching back from multitask
- Fixed: CopyDirectory() modified the input string in some case
- Fixed: ListIndex() was broken in some rare cases
- Fixed: RemoveString() and CRC32FingerPrint() couldn't be used in expressions
- Fixed: SetGadgetItemText() was broken for ListView() gadget
- Fixed: ExamineDirectory() with an uninitialized string variable
- Fixed: CalendarGadget() bug when multiple calendars were initialized on the same window
- Fixed: RSet() returned wrong result in some rare cases
- Fixed: CreateFile() failed on hidden files
- Fixed: ZeroMemory_(), FillMemory_(), MoveMemory_() and CopyMemory_() wasn't recognized
- Fixed: #PB_Event_MoveWindow is now correctly recognized
- Fixed: #PB_EventType_LostFocus wasn't sent if 2 stringgadgets were side by side.
- Fixed: Gadget's tooltips wasn't correctly displayed on NT4 when the window was always on top
- Fixed: OGG Plugin wasn't working anymore and sometimes songs were cut. It's also faster to decode.
- Fixed: ResizeImage() doesn't change the image anymore if the same dimensions are used.
- Fixed: TAB in an EditorGadget() doesn't give the focus to others gadgets anymore but insert a Tab
- Fixed: LCase() didn't handled the 'Я' german character correctly
- Fixed: SetGadgetState() wasn't working correctly for OptionGadget()
- Fixed: Debugger's code listing window dimensions are now saved like other windows
- Fixed: EditorGadget() while using AddGadgetItem() with blank strings and -1 position
- Fixed: SortArray() could crash on big already sorted arrays and is now thread safe
- Fixed: ReceiveNetworkFile() didn't handle long filename correctly
- Fixed: Display issues with ButtonImageGadget() and toogle mode (with API)
- Fixed: SpriteWidth() and SpriteHeight() returned wrong values when ClipSprite() was used
- Fixed: MessageRequester() over a console window sent the console window to the back
- Fixed: SetGadgetState() for ListIconGadget() stealed the current focus
- Fixed: Base64Encoder() produced wrong output sometimes
- Fixed: Refresh problem with Frame3DGadget() and #PB_Frame3D_Single/Double flags
- Fixed: GDI resource leak in ButtonImageGadget() and ImageGadget()
- Fixed: RotateSprite3D was using a wrong angle
- Fixed: DisableMenuItem() didn't work with #PB_Any
- Fixed: GadgetWidth() didn't work correctly for SpinGadget()
- Fixed: Date() returned wrong result for the 1970,1,1,0,0,0 case
- Fixed: CallFunctionFast() accepted only 17 parameters instead of 20
- Fixed: OpenWindowedScreen() with AutoStretch mode missed some pixels
- Fixed: Some refresh bug with PanelGadget()
- Fixed: Transparent color error with 32 bits screen and 'texture' sprites
- Fixed: Some small bugs in the IDE
- Fixed: Several compiler bugs (string concatenation, interfaces in procedures)

25th October 2004 : Version 3.92

- Added: CalendarGadget() and DateGadget(), thanks to Fr34k !
- Added: LibraryID(), SwapElements()
- Added: SaveSprite() now have an optional 'Flags' parameter and can now save 8 bits sprite/screen
- Added: Doubleclick on windows background now generate an event (Thanks to Rings)

- Optimized: ListCount() and ListIndex() are now very fast (it doesn't iterate each element of the list anymore).

- Changed: DeleteElement() now always goes back to the previous element (can be outside the list if
it was the first element), to be fully compatible with ForEach. An optional flag has been added
to preserve previous behaviour.
- Changed: the application current directory isn't anymore touched by any PureBasic command to conform
to Windows rules.

- Fixed: CloseWindow() bug when using the 'ParentWindow' OpenWindow() parameter
- Fixed: IsSound() wasn't available in NT4 mode
- Fixed: AddDate() could fail depending of the computer time zone
- Fixed: Memory leak with linkedlists, arrays and local variables when using a structure which contained strings
- Fixed: SaveSprite() default value for JPEG saving is now '7'.
- Fixed: DisplayPalette() failed on XP systems (1st and last color remained unchanged)
- Fixed: ImageGadget() now supports ToolTips and bitmap/icon live switching
- Fixed: ImageButtonGadget() now supports skinning and bitmap/icon live switching
- Fixed: SetGadgetItemText() for ListViewGadget() destroyed the item user data
- Fixed: CopyImage() failed on WinNT4 under some conditions
- Fixed: A memory leak in SendNetworkFile(). Now, it returns 1 on success or 0 on failure.
- Fixed: StatusBarText() didn't refresh the statusbar with the 'Borderless' flag
- Fixed: CatchImage() with #PB_any
- Fixed: the PNG decoder nows handle corrupted PNG safely
- Fixed: the JPEG encoder with quality value inferior to 3 could lead to a crash
- Fixed: a little TreeGadget() bug when checkboxes were activated
- Fixed: Packer compression routine was sometimes hanging on some files
- Fixed: OnError library wasn't useable in a DLL (thanks to Rings)
- Fixed: Litteral string concatenation were wrong in some cases
- Fixed: The compiler didn't returned a non zero exit code if an error occured
- Fixed: Several compiler bugs

4th July 2004 : Version 3.91

- Added: Desktop library
- Added: IsDatabase(), IsFile(), IsFont(), IsDirectory(), IsGadget(), IsImage(), IsLibrary(), IsMenu(), IsModule(),
IsMovie(), IsPalette(), IsSprite(), IsSprite3D(), IsStatusBar(), IsSysTrayIcon(), IsToolBar(), IsWindow()
- Added: Manifest file (for XP skins) is now included in the exe
- Added: 'Main source' support in the IDE for multifile projects
- Added: Debugger check for empty list element access

- Changed: WindowMouseX() and WindowMouseY() now returns the coordinates in the window client area (DesktopMouseX() now replaces the old behaviour).
- Changed: the LCC resource compiler and linker to PellesC one

- Fixed: AddDate() bug
- Fixed: MDIGadget resize when a StatusBar was added after the MDI creation
- Fixed: InputPathRequester() which could crash on Win98 in some circonstances
- Fixed: OpenWindowedScreen() position when used within container gadgets
- Fixed: Trim() in expression
- Fixed: a crash which could randomly occurs at the very end of the program when OpenHelp() was used.
- Fixed: a bug in PlayMovie() which could hide the movie on some configuration
- Fixed: Compiler bug when accessing a deeply nested structure array.

12th April 2004 : Version 3.90

- Added: #PB_Any support (dynamic numbering) for DataBase, File, Font, FileSystem, Gadget, Image, Library,
Module, Movie, Palette, Sprite, Sprite3D, SysTray, ToolBar, StatusBar and Window
- Added: CountString(), KeyboardInkey(), GetWindowTitle(), SetWindowTitle(), ElapsedMilliseconds()
- Added: RemoveGadgetColumn(), SetGadgetAttribute(), GetGadgetAttribute(), SetGadgetItemAttribute(), GetGadgetItemAttribute()
- Added: MDIGadget() by Fr34k
- Added: VerticalBlank support for FlipBuffers() (and works in windowedmode too)
- Added: Autosize for StatusBar and ToolBar (no more callback needed)
- Added: New size handler by Fr34k which allow realtime window sizing (with #PB_Event_SizeWindow) without callback !
- Added: New 'z' optional parameter to TransformSprite3D()
- Added: Several new flags for SplitterGadget() for better flexibility
- Added: SetGadgetAttribute() support for ScrollAreaGadget() to resize the inner area.
- Added: Joystick and Module support for NT4 compatibility mode
- Added: Hexadecimal display, clear-copy-save debug output and window position saving to the debugger
- Added: Support for different depth icons for the default program icon
- Added: IDE features: Interface viewer, new MS SDK support, find in files, line numbering
- Added: 'Static' keyword for local variables (in procedures) which need to be persistent
- Added: Last FAsm (assembler) version, which has some speed improvement and fix a bug on big sources
- Added: QuickHelp support in the Purebasic IDE for most of the API functions !

- Changed: no more #Memory ID and flag for AllocateMemory()
- Changed: CDAudioName() doesn't need an ID anymore, as stated in the docs.

- Optimiert: splitted CDAudio, Database, File, Network, StatusBar and Systray libraries

- Removed: UpdateStatusBar(), UseMemory(), MemoryID()

- Fixed: French documentation is now perfectly up to date
- Fixed: NT4 (DirectX 3) support for Sprite, Palette, Sound, Keyboard and Mouse libraries
- Fixed: Bug in CreateSprite3D(), the width and height was 1 pixel wider
- Fixed: Bug with SpritePixelCollision if the same sprite was used for both collisions.
- Fixed: Bug in the debugger with win98 (application window was in background)
- Fixed: OpenWindowedScreen() didn't take the menu height in count (if any)
- Fixed: IsFilename() missed some checks
- Fixed: Several expression parser bugs in the compiler
- Fixed: SizeOf() when used with extended structures
- Fixed: NewPrinterPage() bug on Win98
- Fixed: CloseScreen() when used with Sprite3D library
- Fixed: Several paths problems when using the compiler in console mode
- Fixed: All requesters now locks all the opened windows

9th December 2003 : Version 3.81

- Added: DatabaseUpdate(), DatabaseError()
- Added: Play/Stop/Resume/PauseMovie() support for sprite rendered movies
- Added: 'Extends' support for 'Structure'
- Added: Icon support and live image resize for DrawImage()
- Added: 2, 16 and 256 colors BMP support for Catch/LoadSprite()
- Added: #PB_Default support for DrawingFont()
- Added: Added Japanese support for Gadget library, editor and Visual Designer
- Added: Excellent SmartUpdate tool from fr34k to update quicky any PureBasic version
- Added: Last version of the Visual Designer by Berikco

- Optimized: ExplorerGadgets are now 5x faster for directories scanning

- Changed: Labels are no more case-sensitive
- Changed: Default quality for SaveImage() and JPEG plugin is now '7'
- Changed: InitModule() and InitPalette() doesn't need the maximum parameter anymore
- Changed: PlayMovie() behaviour has changed for rendered movies

- Fixed: A memory leak in Sprite rendered movies
- Fixed: Requesters commands could lock other applications if no window were opened
- Fixed: Some interfaces definitions was wrong in the Residents
- Fixed: String constants with multiple constants items
- Fixed: KeyboardReleased(#PB_Key_All) wasn't working
- Fixed: Compiler bug with Interface in procedure and with string returns
- Fixed: ProcedureDLL bug when a string return type was specified
- Fixed: CopySprite() didn't work with Alpha-Sprites
- Fixed: Bug in the compiler optimizer with bytes and word in some very rare cases
- Fixed: JPEG and TIFF decoder bug in rare situation
- Fixed: Small EditorGadget() and SpinGadget() bugs

6th October 2003 : Version 3.80

- Added: ExplorerComboBoxGadget()
- Added: CameraProjection(), CameraBackColor() and CameraRange()
- Added: The modulo operand: '%'
- Added: ForEach command to iterate linkedlists quickly
- Added: Interface/EndInterface to support object function call ! Yes, COM and DX objects are now accessible natively in PureBasic...
- Added: Big residents files with all Windows/DirectX interfaces ready to use !
- Added: Break and Continue to modify the loops flow
- Added: Enumeration/EndEnumeration to quickly declare a lot of sequential constants
- Added: OffsetOf() to get the offset of a structure or interface field
- Added: SizeOf() now supports variables and Interfaces
- Added: Interface, Float and String constants support to the 'Resident' file format
- Added: Quality support for SaveImage() and the JPEG encoder
- Added: MessageRequester() 'Flags' is now an optionnal parameter
- Added: The Editor syntax coloring and structure viewer have been greatly enhanced

- Optimized: Removed many OGRE's dependencies resulting in a smaller Engine3D.DLL

- Changed: Constants are back real constants now (use Enumeration to have dynamic constants)

- Fixed: ASM registers display in the Debugger
- Fixed: IncludePath problems with IncludeBinary
- Fixed: Couldn't use TAB inside an editable ComboBoxGadget()
- Fixed: DeleteDirectory() failed with a read-only directory in 'Force' mode
- Fixed: TGA decoder bug for Top/Down and RLE pictures
- Fixed: Possible lock in the AddPackFile() and PackMemory() routines
- Fixed: the structure size when the structure was very big (over 32000 bytes)
- Fixed: Int(): a negative value could produce wrong results
- Fixed: A LinkedList issue when it was used in and outside a Procedure
- Fixed: Line() and LineXY() was not drawing the last point
- Fixed: debugger checks: InitEngine3D()
- Fixed: A bug in TextLength() when an empty string was used
- Fixed: ProcedureReturn bug when used in 'Select String$' expression
- Fixed: Sounds were limited to 50 when debugger was activated
- Fixed: ClipSprite() wasn't supported by DisplayAlphaSprite(), DisplayShowSprite(), DisplaySolidSprite() and DisplayTranslucideSprite()
- Fixed: A reserved keyword like 'Data' couldn't be used in a Structure
- Fixed: CreatePack(), SaveImage() and SaveSprite() didn't work with very long filename
- Fixed: Inkey() was halting the program flow
- Fixed: FileSize() returned wrong value on Win9x for root directories
- Fixed: An editor bug which caused panel tab inversion

13th July 2003 : Version 3.72

- Changed: SelectedFilePattern() and Open/SaveFileRequester pattern index is now '0' based instead of '1' based. Warning !
- Changed: ListIndex() is now '0' based instead of '1' based. Warning !

- Updated: IDE: find/replace updated, an '*' now identify a modified file
- Updated: Toolbar library has been split and optimized
- Updated: all missing libraries quickhelps (status bar of the editor)

- Fixed: ParseDate() when no separators were used in the date
- Fixed: ResizeImage() has now a nice quality resampling
- Fixed: several gadget events issue (Splitter, Panel)
- Fixed: PNG and JPEG decoder in some rare cases
- Fixed: the name of several functions (OnError library)
- Fixed: several compiler bugs

7th June 2003 : Version 3.70

- Added: Terrain library
- Added: Billboard library
- Added: Entity library
- Added: Material library
- Added: Particle library
- Added: OnError library
- Added: CameraLookAt(), CameraRenderMode(), CameraFOV(), Engine3DFrameRate(), CountRenderedTriangles()
- Added: CreateMesh(), SetMeshData()
- Added: ExamineLibraryFunctions(), NextLibraryFunction(), LibraryFunctionName(), LibraryFunctionAddress()
- Added: IsFunctionEntry(), CallCFunction(), CallCFunctionFast()
- Added: RenderMovieFrame(): Yes, you can play a movie on a sprite or on a screen !
- Added: OpenGadgetList(), ScrollBarGadget(), ScrollAreaGadget(), SplitterGadget()
- Added: HyperLinkGadget(), ContainerGadget(), EditorGadget()
- Added: TreeGadgetItemNumber(), ExplorerListGadget(), ExplorerTreeGadget()
- Added: #PB_FontRequester_Effects flag for the FontRequester()
- Added: PanelGadget() has been fully rewritten and is now XP theme compliant
- Added: TreeGadget() has been rewritten to support dynamic items (add, remove..)
- Added: AddGadgetItem() now support picture for the PanelGadget()
- Added: 'ParentID' optional parameter to OpenWindow()
- Added: CDecl support for PureFunctions and procedures (Added 'ProcedureCDLL' and 'DeclareCDLL' keyword)
- Added: End [ExitCode] optional parameter
- Added: More precise error message for Assembly and Linker errors
- Added: /LINENUMBERING compiler switch
- Added: Full debugger support for the 3D engine
- Added: ComboBox support for GetGadgetItemText() and SetGadgetItemText()
- Added: Many new functions for the Visual designer including Tab order, font selection, new gadgets and more..

- Changed: Mesh library, introduced a new Entity one (for more flexible control)
- Changed: ClosePanelGadget to CloseGadgetList()
- Changed: Inline assembly labels are now l_label instead of pLabel

- Optimized: and splitted the Movie library

- Fixed: SpriteCollision() and SpritePixelCollision() was 1 pixel wrong
- Fixed: Result code for CopyDirectory was wrong in some case
- Fixed: StrF(): if a digit number is specifed it rounds correctly
- Fixed: Several debugger warning was missing
- Fixed: Floats and integers were badly mixed in some case

25th March 2003 : Version 3.62

- Removed: FakeEndSelect

- Fixed: Several compiler bugs
- Fixed: Small bug in the PNG encoder and decoder
- Fixed: ProcedureReturn inside Select/EndSelect
- Fixed: Array allocation if no memory was available
- Fixed: Int(): broken since v3.60
- Fixed: Val(): now accepts any BASIC valid forms
- Fixed: AddPackFile() problem on some files
- Fixed: RunProgram() with very long paths

19th March 2003 : Version 3.61

- Fixed: Major compiler array bugs
- Fixed: Major MD5FileFingerprint() bug
- Fixed: Syntax Highlightning for command/procedure and Alt+V shortcut
- Fixed: 2 bugs in the Visual Designer
- Fixed: Sprite loading and image plugin (JPEG, PNG) in 16 bits mode
- Fixed: XOR inline asm keyword was no more recognized
- Fixed: TGA decoder on some file

17th March 2003 : Version 3.60

- Added: Powerful Visual Designer, to easily creates graphical applications
- Added: Many new optimizations in the compiler core, resulting in faster/smaller code (especially when dealing with arrays and structured variables)
- Added: Native JPEG, TIFF, PNG and TGA image/sprite decoder trough plugin
- Added: Native JPEG and PNG image/sprite encoder trough plugin
- Added: Native OGG sound decoder trough plugin
- Added: AvailableScreenMemory(), SelectedFilePattern(), DefaultPrinter()
- Added: Flags for LoadFont() to allow italic, bold and more
- Added: Multisource support for the debugger (Included files)
- Added: Array overflow debugger check
- Added: Data read overflow debugger check
- Added: Icon support for CatchImage()
- Added: MMX, 3DNOW, SSE and SSE2 optional support, with autoselect mode (to choose automatically the right routine at runtime, depending of the processor).
- Added: DLL Importer tool in the Library SDK

- Optimized: and splitted: Font, Gadget and Window libraries, for smaller executable (Thanks to Danilo)

- Removed: CatchJPEGSPrite() and LoadJPEGSprite() (replaced by plugins)

- Enhanced the PureBasic library format (new compressed format)
- Enhanced Inline ASM now accept FPU opcode
- Enhanced the editor: DoubleClik on (X)IncludeFile open the file, Inline Help works for all keywords (If/EndIf..) ASM syntax coloring, Inline ASM help

- Changed: SetGadgetFont() now takes 2 parameters, to allow runtime font change

- Fixed: SortArray() when sorting string in case insensitive mode
- Fixed: the RunProgram() command with 3 args
- Fixed: ImageOutput() problem with Windows 98
- Fixed: the 16bits sprite display problem with some old gfx cards which use 15 bits internally
- Fixed: some bugs in the compiler

13th January 2003 (Version 3.51)

- Updated: French documentation for v3.51

- Fixed: some bugs in the compiler and optimized a bit the output
- Fixed: IPString() and IPAddressField() was in the reversed order
- Fixed: and improved the InputRequester() by adding keyboard shortcut
- Fixed: ReadPreferenceLong/String/Float() to accept spaced keywords
- Fixed: MouseButton beep problem in full screen mode
- Fixed: Date() and ParseDate() when an invalid date was specified
- Fixed: the editor XP-Theme problem
- Fixed: the editor ProcedureBrowser (Thanks to Dominique and Plouf)
- Fixed: OpenWindow() dimension when no flag where specified

- Removed: the Gosub/Return check introduced in v3.50 (for flexibility reason)

6th January 2003 : Happy New Year ! (Version 3.50)

- Added: Engine3D Library: Add3DArchive(), AmbientColor(), Fog(), InitEngine3D(), LoadWord(), RenderWorld(), SkyBox(), SkyDome()
- Added: Camera Library: CameraLocate(), CameraX(), CameraY(), CameraZ(), CreateCamera(), FreeCamera(), MoveCamera(), RotateCamera()
- Added: Light Library: CopyLight(), CreateLight(), FreeLight(), HideLight(), LightColor(), LightLocate(), LightSpecularColor(), MoveLight()
- Added: Mesh Library: CopyMesh(), FreeMesh(), GetMeshAnimationTime(), MeshAnimation(), MeshAnimationLength(), MeshLocate(), MeshTexture(), MeshX(), MeshY(), MeshZ(), MoveMesh(), ResizeMesh(), RotateMesh(), ScaleMesh(), SetMeshAnimationTime()
- Added: Texture Library: CopyTexture(), CreateTexture(), FreeTexture(), LoadTexture(), TextureHeight(), TextureID(), TextureOutput(), TextureWidth()
- Added: WriteFloat(), ReadFloat(), MouseLocate(), MD5FileFingerprint()
- Added: STDCALL and ANY flags to PureLibraries. See SDK doc for more informations
- Added: TreeGadget checkboxes support for GetGadgetItemState()
- Added: SetGadgetState() now work for ButtonImageGadget()

- Updated: CallFunction() and CallFunctionFast(): Floats can be passed directly
- Updated: SetStatusBarText() 'Appareance' parameter is now optional
- Updated: Frame3DGadget() 'Flags' parameter is now optional

- Optimized: CallFunctionFast() (2x faster)
- Optimized: the code generation: Chr(#Constant) is now considered as a litteral string and some speed enhancements

- Changed: The assembler (FASM), resulting of better optimized code (PB editor is 6 kb smaller for example)
- Changed: LSet() by RSet() and RSet() by LSet() (was reversed compared to normal Basic functions)
- Changed: OpenTreeGadgetNode() and CloseTreeGadgetNode() (now need a parameter)
- Changed: ReleaseMouse() now takes one parameter

- Fixed: the game mouse support in windowed mode (could lead to computer lock)
- Fixed: SelectElement() was wrong when passing -1..
- Fixed: TreeGadget() when used several times on the same window
- Fixed: SaveImage() with 16bits and 8bits desktops
- Fixed: RSet() with 2 arguments
- Fixed: a little bug in ParseDate()
- Fixed: AddPackFile() and AddPackMemory(): buffer overflow in some rare cases
- Fixed: OpenFileRequester() with MultiSelection mode
- Fixed: a silly bug when using many images in the gadget items (TreeGadget, ListIconGadget...)
- Fixed: Cipher library

9th October 2002 : Version 3.40

- Changed: Structure names aren't case sensitive anymore (could produce difficult bug to look at)

- Added: Date library: Date(), Year(), Month(), Day(), DayOfWeek(), DayOfYear(), Hour(), Minute(), Second(), FormatDate(), AddDate(), ParseDate()
- Added: Hostname(), ExamineIPAddresses(), NextIPAddress(), IPString()
- Added: LSet(), RSet(), Bin(), RemoveString(), StringField()
- Added: ModuleVolume(), OSVersion(), WaitThread()
- Added: CopyDirectory(), DeleteDirectory(), IsFilename()
- Added: NextSelectedFilename(), InputRequester()
- Added: DrawingBuffer(), DrawingBufferPixelFormat(), DrawingBufferPitch(), FillArea()
- Added: #PB_Compiler_Date, #PB_Compiler_OS compiler buildin constants

- Optimized: Splitted libs: FileSystem, StringExtension, Date

- Updated: RunProgram() now has an optional WorkingDirectory$ parameter
- Updated: SetGadgetFont(#PB_Font_Default) now go back to default font
- Updated: OpenWindow() now accepts 2 news flags: #PB_Window_WindowCentered and #PB_Window_ScreenCentered
- Updated: GetGadgetItemText() and SetGadgetItemText() now works for TreeGadget()
- Updated: ReplaceString now have a new 'StartFrom' optionnal parameter
- Updated: SetGadgetState() can be used with ImageGadget() to change the current image
- Updated: Added 'Level' flag for PackMemory(), AddPackFile() and AddPackMemory() for faster compression
- Updated: when building a DLL, AttachProcess(), DetachProcess(), AttachThread() and DetachThread() must have an 'Instance' parameter
- Updated: no more '_' when creating a DLL

- Fixed: Debugger problem in the FileSystem library
- Fixed: ReadPreferenceLong() and ReadPreferenceFloat()
- Fixed: SpriteOutput() bug when using Plot()
- Fixed: CDAudioTrackLength(): last track returned always 0..
- Fixed: OpenWindowedScreen(): bad BottomOffset and RightOffset values
- Fixed: GetPathPart(), GetFilePart() and GetExtensionPart()
- Fixed: SetGadgetText() when used with a ComboBox and an empty string (clear the combobox content)
- Fixed: SetClipboardText(), now use the TEXT instead of OEM format.
- Fixed: Compiler didn't warn when a Global variable was used in Procedure parameter.
- Fixed: Compiler bugs in InlineASM : 'MOV eax, "String"' and 'MOV eax, #CONSTANT' were badly compiled.
- Fixed: Compiler bug when using negative float constant
- Fixed: Compiler bug when using float operations with API functions
- Fixed: Compiler bug when comparing string with numeric (now forbidden)
- Fixed: Compiler bug when using INCLUDEBINARY in DataSection
- Fixed: Compiler bug when DECLARE and PROCEDURE didn't match (no errors were generated)
- Fixed: Compiler bug when DEBUG was used in procedures with strings operations

- Editor enhanced (Multi files, Procedure browser, custom tools and more...) and source code released.. Thanks to Danilo !

16th August 2002 : Version 3.30

- This is a bug fixes and synchronization with Linux version release

- Added: HideMenu(), CreateSprite(), UseBuffer()
- Added: French help (fully translated)

- Updated: SortArray() now works with float arrays
- Updated: LoadSprite(), GrabSprite(), CopySprite(), CatchSprite(), LoadJPEGSPrite(), CatchJPEGSprite() have now an optionnal 'Mode' parameter
- Updated: GetFilePart(), GetPathPart() and GetExtensionPart() now remove the surrounding quote (") if any..
- Updated: SetGadgetItemState() and GetGadgetItemState() can now set/get the checkboxes state of a ListIconGadget() item

- Fixed: SetClipboardText(): failed in some cases
- Fixed: SpritePixelCollision(): failed if sprites were of different sizes
- Fixed: LoadJPEGSprite was ignoring the 'Mode' parameter (not good for 3D sprites)
- Fixed: Bug in AddGadgetItem() with ListIconGadget()
- Fixed: PokeF() was missing
- Fixed: MovieAudio(): wrong volume ramp (now based on decibels..)
- Fixed: ReleaseMouse() wasn't recognized
- Fixed: 2DDrawing bug (again...)
- Fixed: LoadSprite() failed with 16 bits and 32 bits BMP.
- Fixed: GetGadgetText() when used with an editable ComboBoxGadget()
- Fixed: ReadByte() and ReadWord() (with long/word variables)
- Fixed: FreeMenu(), GadgetX(), GadgetY()
- Fixed: DisplaySolidSprite() was missing
- Fixed: Debug routine missing for GadgetID()
- Fixed: Bug when several Movies were used (crash at program end)
- Fixed: ResizeImage()
- Fixed: PreferenceGroup()
- Fixed: ExamineMouse() returned always 0
- Fixed: PathRequester crashed with uninitialized DefaultPath
- Fixed: InitSprite3D() crashed when alone
- Fixed: Editor: ZoomSprite3D() didn't highlight

9th June 2002 : Version 3.20

WARNING! The window callback behavior have changed and will cause program lock if you used one ! See SetWindowCallback() doc for more info.

- Added: Cipher library: CRC32Fingerprint(), MD5Fingerprint(), DESFingerprint(), Base64Encoder()
- Added: AddKeyboardShortcut(), RemoveKeyboardShortcut(), SpinGadget(), WebGadget()
- Added: GetMenuItemState(), SetMenuItemState(), MenuHeight()
- Added: KeyboardReleased(), Trim(), Space()
- Added: SelectElement(), LineXY(), GetExtensionPart()
- Added: ! (XOR) and ~ (NOT) bitwise operands
- Added: Protected BASIC keyword
- Added: Shift+Tab keyboard shortcut to cycle gadget back
- Added: Debugger now detects when using a NULL pointer and a division by 0.

- Optimized: 2DDrawing, Keyboard, Mouse, Sound and Sprite libraries (Command split) !
- Optimized: Plot() command when used with ScreenOutput() is 40 times faster (DirectX)

- Updated: PokeS() and PeekS() now have an optionnal Length parameter
- Updated: KeyboardPushed() can now have #PB_Key_All as parameter for any pushed keys
- Updated: FileSize() now returns -2 if the file is a directory
- Updated: WindowID() can have an optionnal #Window paramater
- Updated: All gadgets commands (added a 'Flags' optionnal parameter) which allows a full control over their look ! (See the each Gadget doc for more information)
- Updated: Plot(), Line(), Box(), Circle(), Ellipse() have now an optional color parameter.
- Updated: Debugger has some bug fixed. When a program stop, or the debugger quit all is cleaned correctly. - This allows fullscreen game debugging easier as the screen close down before displaying the error.
- Updated: Sprite library debug routines.

- Changed: Renamed StripLead() and StripTrail() to RTrim() and LTrim() for other BASIC compatibility
- Changed: NetworkClientEvent(), CloseNetworkConnection()
- Changed: CreateToolBar(): added 'WindowID' paramater
- Changed: CreateMenu(): added 'WindowID' parameter
- Changed: NetworkClientEvent() and NetworkServerEvent(): no more 'String' event: could be a possible exploit..
- Changed: OpenWindowedScreen() x,y parameters take in count the window top and left border width.
- Changed: ResizeWindow(), WindowWidth() and WindowHeight() now use inner area width/height to work with new OpenWindow() and skin support

- Removed: AttachToolBar(), DetachToolBar(), AttachMenu(), ReceiveNetworkString()

- Fixed: Frame3DGadget() with other sunken and raised frames
- Fixed: ListViewGadget() events
- Fixed: FileSize()
- Fixed: StopDrawing(), display under win9x got corrupt after lot of calls
- Fixed: Debugger problems..
- Fixed: AddGadgetItem() with ListIconGadget() (-1 position wasn't working)
- Fixed: SpritePixelCollision() with clipped sprites
- Fixed: Possible bug in Random()
- Fixed: SpritePixelCollision(), only (0,0,0) transparent color worked
- Fixed: InitSprite(), InitSound(), InitPalette(), InitKeyboard() don't display system request anymore if DirectX 7+ isn't found.
- Fixed: RemoveGadgetItem() and ClearGadgetItemList when used with PanelGadget()
- Fixed: PathRequester() default path on Win9x systems
- Fixed: @linkedlist()with '.s' type now return correct list element pointer (instead of string pointer)
- Fixed: ReadPreferenceString() was faulty in some cases
- Fixed: Documentation: SaveImage(), ScreenID(), SelectedFontStyle() and SelectedFontColor() were missing

6th May 2002 : Version 3.10

- Added: Preference library: OpenPreferences(), CreatePreferences(), ReadPreferenceLong/Float/String(), WritePreferenceLong/Float/String() PreferenceComment(), PreferenceGroup()
- Added: Windows XP skinning support (See 'Compiler Options' window)
- Added: GadgetX(), GadgetY(), GadgetWidth(), GadgetHeight(), GetGadgetItemState(), SetGadgetItemState(), GetGadgetItemText(), SetGadgetItemText(), CountGadgetItems(), TrackBarGadget(), IPAddressGadget()
- Added: HideWindow(), RandomSeed(), MakeIPAddress(), IPAddressField()
- Added: MouseWheel(), CatchSprite(), SaveSprite()
- Added: RotateSprite3D(), ZoomSprite3D(), TransformSprite3D(), Sprite3DQuality(), Sprite3DBlendingMode()
- Added: EventType(): Return/Change/Focus can be detected in StringGadget(), ComboBox() and more
- Added: CatchImage(), CreatePack(), ClosePack(), NextPackFile(), AddPackFile(), AddPackMemory(), PackFileSize(), OpenPack()
- Added: DirectoryEntrySize(), DirectoryEntryAttributes()
- Added: Full compatibility with 'WindowBlinds' on WinXP which seems to broke the event handler !

- Optimized: PureLibraries (Only used commands included) : Image, Misc2, GadgetExtension, Requester, Sprite3D, Memory, Packer

- Updated: CompareMemoryString(): Added an optional 'Length' parameter.
- Updated: DisplayPopupMenu(): (x,y) are now optionnal
- Updated: ResizeGadget(): passing '-1' to one of the arguments make it ignored (very useful for resizeable GUI)
- Updated: GetGadgetText() and TextGadgetText() now works with TreeGadget() and ListIconGadget()
- Updated: AddGadgetItem() now have an optional Image parameter.
- Updated: OpenWindow(): now add the border size automatically, to fix skinning problem under XP
- Updated: FileSize() now returns size for every files, even locked one

- Removed: InitGadget(): no more needed.
- Removed: DoubleClick() and EventMouseButtons(): Use EventType() instead
- Removed: OpenDefaultConsole(). Now OpenConsole() detects automatically if the program is in 'Console' or 'Windows' format.
- Removed: AddListIconGadgetItem() and AddTreeGadgetItem(): AddGadgetItem() is now used
- Removed: ExpandTreeGadgetItem() and TreeGadgetItemState(): Set/GetGadgetItemState() is now used

- Fixed: Gadget events for ComboBox, ListIcon and Systray.
- Fixed: Possible memory leaks with strings in particular cases
- Fixed: Possible bug when using Procedures as callbacks
- Fixed: Create3DSprite(): size was 1 pixel less
- Fixed: Each window has now its own private class
- Fixed: PlaySound(): debugger routine missing and little glitch at the end of playback
- Fixed: ResizeGadget() with PanelGadget and some refresh problems
- Fixed: FindString() on Win9x
- Fixed: ExamineDirectory() bug on Win9x
- Fixed: Module library, playback should work everywhere now
- Fixed: SetGadgetText() for ListViewGadget()
- Fixed: SelectedFontColor()
- Fixed: Silly bug in DeleteElement()
- Fixed: NewList xxxx() alone produced a linker error
- Fixed: Bug when printing images
- Fixed: Random() command (again !)
- Fixed: ResizeImage() under Win9x
- Fixed: IncludeBinary bug (only absolute path worked)
- Fixed: Editor: Tab was badly handled. Little bug when pressing return. Minor coloring bug when pasting

4 April 2002 : Version 3.00

- Added: Library PureLibrary: OpenLibrary(), IsFunction(), CallFunction(), CloseLibrary()
- Added: Help PureLibrary: OpenHelp(), CloseHelp()
- Added: Clipboard PureLibrary: ClearClipboard(), GetClipboardText(), GetClipboardData(), SetClipboardData(), SetClipboardText()
- Added: ElseIf
- Added: If a condition (If/While...) isn't finished before ENDPROCEDURE, the compiler display an error.
- Added: ToolBarToolTip()
- Added: SpritePixelCollision()
- Added: Timer PureLibrary (Thanks to Danilo): StartTimer(), EndTimer(), GetMinTimerResolution(), GetMaxTimerResolution()
- Added: ComDX PureLibrary (Thanks to Danilo): CallCOM(), CallDX()
- Added: Printer PureLibrary: NewPrinterPage(), PrinterOutput(), PrintRequester(), StartPrinting(), StopPrinting(), PrinterPageWidth(), PrinterPageHeight()
- Added: Variable command argument for any function
- Added: Declare and DeclareDLL to declare procedures before declarate them
- Added: CopyMemoryString(), MemoryStringLength(), CompareMemory(), ReAllocateMemory(), CompareMemoryString()
- Added: CopyImage(), ResizeImage(), GrabImage()
- Added: MovieStatus(), MovieLength()
- Added: SoundVolume(), SoundPan(), SoundFrequency(), CatchSound()
- Added: FirstDatabaseRow(), PreviousDatabaseRow()
- Added: CreatePalette(), GetPaletteColor(), SetPaletteColor(), UsePalette()
- Added: RGB(), ReplaceString(), StrU(), StrF(), ValF()
- Added: HideGadget(), GadgetID()
- Added: Dutch catalog for the editor

- Updated: Brand new library architecture to allow to link ONLY needed commands to the final executable. For now, all the libraries aren't optimized to use it, but it will come, in a near future :). BTW, all libraries use the standard STDCALL format, so no argument reversed anymore. Old libraries are still fully compatiable.
- Updated: StopSound(): Passing '-1' will stop playing all sounds.
- Updated: PlaySound(): Flags parameter is now optionnal
- Updated: Sort(): now a range can be specified (ex: from elements 20 to 50 of the array)
- Updated: Resident file: #VK_xx constants added, some structures fixed.

- Changed: Internally, procedures parameters are now pushed in the right order. Warning, all the callback must be changed to reflect this. This also mean than DLL procedure parameters can be put in the right order.
- Changed: InitSound() doesn't require a maximum sound param anymore
- Changed: Renamed BackColour(), FrontColour() and TransparentSpriteColour() to BackColor(), FrontColor() and TransparentSpriteColor()

- Fixed: Compiler crash when using constant string, more check to the preprocessor
- Fixed: StartDrawing() bugs
- Fixed: Random(), to have more randomized numbers..
- Fixed: GetDatabaseString() when getting null values
- Fixed: ExamineDirectory(): Failure on Win9x systems on special cases
- Fixed: Resident problem. Now users residents are loaded.
- Fixed: Editor bug, which prevents to type special characters (characters over 128 in the ASCII table) and some minors other
- Fixed: A FPU bug which prevented OpenGL to work correctly
- Fixed: 'Debug' command: now accept float and string functions without problem.

- Removed: Mr Skunk PureLibraries, as some was bugged but we don't have the source code to fix them.

24 February 2002 : Version 2.95

Note: This is a bug fix release before the major 3.0 version. Very few changes.

- Added: HtmlHelp support for search in the help + other goodies. Old HTML files can be safely removed.

- Fixed: Compiler bugs (Float within structure array, XIncludeFile, 'a' constants in some rare case, Expression bug, constant duplication and Image library integration when using Sprite, Memory leaks in string procedures)
- Fixed: LoadJPGSprite bug
- Fixed: Editor colorize problem with normal text colour

27 January 2002 : Version 2.90

- Added: Dll Creation !
- Added: Constants can now be String or Float
- Added: Debug et DebugLevel commands with Debug window in the debugger.
- Added: Italian editor language by Yuri.

- Changed: Variables, Arrays, LinkedList and Constants are now case insensitive.

- Fixed: PathRequester(), OpenFileRequester(), SaveFileRequester()
- Fixed: ExamineDirectory() tiny bug
- Fixed: GetDatabaseFloat()
- Fixed: Compiler crashing bug on NT4 Sp6a.

13 January 2002 : Version 2.82

- Added: PeekF(), PokeF()
- Added: Math library: ACos(), ASin(), ATan(), Pow(), Log(), Log10(), Round(), Cos(), Sin(), Tan(), Abs(), Sqr(), Int()
- Added: SpriteOutput(): Allow to use the 2DDrawing command on any sprites !
- Added: #PB_WindowInvisible

- Fixed: compiler bugs (a.l = Pow(), a = -16/variable)
- Fixed: a bug in OpenDatabaseRequester() which prevents database opening with some ODBC drivers (MySQL...)
- Fixed: FrontColour() bug which caused DX and whole system crashes..
- Fixed: SaveImage(). Always save in 24 bits instead of 32 bits
- Fixed: ListViewGadget() now use the exact height gadget, not a rounded one
- Fixed: SysTrayIconToolTip() no more crash if specified text is over 64 characters
- Fixed: ListIconGadget(): Don't destroy the icons after FreeGadget()
- Fixed: ChangeListIconGadgetDiplay(): Refreshed automatically
- Fixed: Window background color under Windows XP

- Changed: StrF(Number) to StrF(Number, Precision)

01 January 2002 : Version 2.80 (Happy New Year Release)

Compiler:
- Updated: Rewrote from scratch the compiler core: complex expression compliant
- Updated: Optimized the code output
- Added: /REASM compiler flag to allow source code reassembly after hand modifications
- Added: Possibility to use floats with API call.
- Fixed: float support (comparison, procedure, Abs(), Sin() etc..)
- Fixed: all known bugs

Libraries:
- Added: Sprite3D library: Create3DSprite(), Display3DSprite(), Transform3DSprite(), Free3DSprite(), Start3D(), Stop3D()
- Added: SaveImage()
- Added: Debugger routine for all commands
- Fixed: ExamineDirectory()
- Fixed: OpenFile() (Read wasn't working)

Editor:
- Added: QuickHelp for almost all commands
- Added: Procedure direct jump support

28 November 2001 : Version 2.70

- Added: ChangeSysTrayIcon(), SysTrayIconToolIip(), ExpandTreeGadgetItem(), TreeGadgetItemState()
- Added: DisableMenuItem(), GadgetToolTip(), StatusBarIcon()
- Added: UseGadgetList(), TransparentSpriteColor(), ClipSprite(), CopySprite(), GrabSprite()
- Added: ProgramParameter()
- Added: Thread library
- Added: '!' support to include raw asm command in the code source (directly managed by NAsm)
- Added: Multilevel (100) Undo/Redo in the editor
- Added: Colored syntax when pasting (Yes ;-)

- Updated: StatusBarText(): 2 flags for alignement (Center & Right)
- Updated: ReadData() now returns the number of byte read
- Updated: The debugger is now an high priority thread (much more responsible)

- Changed: PlaySound(), Added a flag to play looping
- Changed: SetStatusBarText() -> StatusBarText()
- Changed: InitSprite(): removed the sprite parameter

- Fixed: DatabaseQuery(), GetPathPart(), LoadSprite() (Can now load sprite of any size)
- Fixed: CloseScreen(): can now switch FullScreen/Windowed without any problems. Cool.
- Fixed: Compiler bugs (MultiArray in Procedures, Read data in Procedures)
- Fixed: Flickering in the editor

5 November 2001 : Version 2.60

- Added: CopyMemory(), CatchJPEGSprite(), LoadJPEGSprite(), WindowMouseX(), WindowMouseY()
- Added: MovieSeek(), MovieInfo(), DrawImage(), ScreenOutput(), WindowOutput(), ImageOutput(), CreateImage()
- Added: Database library
- Added: Compressor library
- Added: Console library (By Sylvain)
- Added: Possibility to use the 2DDrawing library directly on Game screens
- Added: XOR and Fill/Outline mode for 2D Drawing functions
- Added: -1 feature to FreeMemory() to free all banks in one call.
- Added: New flag for RunProgram(): run synchronously and possibility to hide it.
- Added: Powerful Asm Monitor in the debugger (in a Basic language !)
- Added: Variable viewer in the debugger

- Changed: All old MemoryBank functions renamed.
- Changed: ReadMemory() and WriteMemory renamed -> ReadData(), WriteData() (For better logic with other commands)
- Changed: The purebasic library format (see the SDK for more info)
- Changed: DrawingOutput() has been renamed to StartDrawing() and doesn't take a WindowID() anymore (but WindowOutput(), ScreenOutput() or ImageOutput()
- Changed: Eof() take one parameter now..

- Fixed: StopModule() (Removed the #Module) parameter
- Fixed: A small compiler bug
- Fixed: PlayMovie()
- Fixed: Debugger while using ASM commands inside PureBasic
- Fixed: Clipboard PASTE within the editor doesn't change the font anymore

23 September 2001 : Version 2.50

- Added: Mouse library
- Added: Movie library
- Added: Sort library
- Added: Procedure address (@procedurename())
- Added: support for 'Console' executable format
- Added: DisplayTranslucideSprite(), DisplayAlphaSprite(), DisplayShadowSprite(), DisplayRGBFilter(), ChangeAlphaIntensity(), ClearScreen() OpenWindowedScreen(), DisplaySolidSprite(), CloseScreen(), SetFrameRate(), IsScreenActive(), StartSpecialFX(), StopSpecialFX(), ResizeGadget() JoystickAxisX(), JoystickAxisY(), ChangeGamma(), SetWindowCallback(), Red(), Green(), Blue()

- Changed: LoadSprite()
- Changed: DisplayPalette (Removed the screen argument)
- Changed: ExamineJoystick()
- Changed: OpenScreen (added Text$ parameter)
- Changed: FontRequester (added initial fontname and size)
- Changed: Frame3DGadget (Added a border style flag)

- Fixed: big bugs in DirectX routines (Sprite, Keyboard, Movie). Now it multitasks very well !
- Fixed: icon support for ToolBar and Image library
- Fixed: SelectedFontName()
- Fixed: ClearGadgetItemList() when used with TreeGadget()
- Fixed: LoadFont() (Incorrect YSize)

Editor:
- Added: optionnal autosave before compiling
- Added: Any font support
- Added: Enable/Disable syntax coloration
- Added: 2 new components for coloring: 'Normal Text' and 'Procedures/Commands'
- Added: Realtime language, font, color changing
- Added: new About window, much better ;-)

- Updated: ultra-fast syntax highlighting when loading the source file
- Updated: syntax highlightning behavior fixed and changed (much better)

1 August 2001 : Version 2.40

- Added: Data support commands: Read, Restore, Data, DataSection, EndDataSection
- Added: Float number support (early stage)
- Added: MemoryBank library
- Added: StatusBar library
- Added: Image library
- Added: Systray library
- Added: lot of new commands: EventlParam(), EventwParam(), ListIndex(), ListCount() and ChangeCurrentElement() ToolBarImageButton(), EventMouseButton(), UseDirectory()
- Added: CreatePopupMenu() and DisplayPopupMenu()
- Added: TreeGadget(), ImageGadget(), ButtonImageGadget(), AddTreeGadgetItem()
- Added: ListIconGadget(), AddListIconGadgetItem(), ChangeListIconGadgetDisplay(), AddGadgetColumn()

- Changed: the default type from 'Word' (16 bits) to 'Long' (32 bits)
- Changed: WaitWindowEvent()/WindowEvent() returns all Windows events !
- Changed: ComboBoxGadget(), PanelGadget() and ListViewGadget() (removed the useless Text$ parameter)
- Changed: ExamineDirectory() -> Number added to allow to examine several directories at the same time

- Fixed: CopyFile() (Overwrite doesn't work)
- Fixed: FrontColour() (Text colour doesn't change..)
- Fixed: GetGadgetState(), SetGadgetState() and RemoveGadgetItem() to support PanelGadget

- Removed: InitWindow(), InitRequester(), InitToolBar(), InitFont(), InitFile() and InitMenu() (No more needed...)

17 May 2001 : Version 2.30

- Added: to editor: Drag&Drop on the main window, auto registry support for .pb files, auto indent, Tab/Shift+Tab when a block is selected to indent easily
- Added: tons of new commands: GetGadgetState(), SetGadgetState(), AddGadgetItem(), RemoveGadgetItem(), ClearGadgetItemList() PanelGadget(), ClosePanelGadget(), TextGadget(), SpritesCollision(), Delay(), OptionGadget(), Frame3DGadget() Loc(), PeekW/B(), PokeW/B(), GetPathPart(), GetFilePart(), RunProgram(), DoubleClick(), PathRequester()
- Added: 'Tab' support on Gadget lib.
- Added: compiler directives: CompilerIf/Else/Endif, CompilerSelect/Case/Default/EndSelect
- Added: the CD-Audio library
- Added: the FileSystem library
- Added: a build-in ICON linker (no more need GoRC)

- Enhanced: Improved the debugger (step by step now works perfectly)
- Enhanced: Optimized the generated executable (smaller and faster)
- Enhanced: Full rewrite of the compiler expression processor core
- Enhanced: Reduced the compiler and editor size (90kb instead 148kb and 33kb instead of 96kb)
- Enhanced: Tons of little improvements and bug fixes too long to enumerate

- Fixed: some nasty bugs in the compiler

- Changed: LSR, LSR to << and >> respectively
- Changed: AddComboBoxItem and AddListViewItem() to AddGadgetItem()

25 March 2001 : Version 2.20

- Added: debugger runtime support for all pure libraries. A program no more crashs so easily. It's much easier now to catch up bugs !
- Added: NT4.0 support for multimedia libraries (Sprite, Palette, Sound & Keyboard), which allows the developpement of games or multimedia applications running on WinNT4 too !
- Added: some new functions : Lof(), ReadMemory(), WriteMemory(), PeekS(), PokeS(), NetworkClientEvent(), SetGadgetFont(), WaitWindowEvent(), FileSeek()
- Added: a brand new Module library to allow an easy replay of Protracker, Fastracker or Impulse tracker modules.
- Added: project settings save for each file (Executable name, Compiler options etc...)
- Added: preference window to customize the editor easily (color, default directory etc..)
- Added: multi-language support for the editor (english, french and german)
- Added: icon (.ico) support when creating an executable !
- Added: Win32 help support (when pressing F1 on a windows function)

- Bug fixed the compiler a lot, much reliable now.
- Updated the documentation

26 February 2001 : Version 2.10

- Added: the debugger to walk easy trough a program. It features step by step, stop, continue, quit (useful to quit an infine loop...) and can be invoqued and controlled via the source code with the following commands: CallDebugger, EnableDebugger, DisableDebugger
- Added: new commands: ListViewGadget(), AddListViewItem(), GetGadgetText(), SetGadgetText(), PeekS(), SizeOf()
- Added: Multilanguage to the editor (French, German, English)
- Added: Microsoft Windows © resident file containing all the constants and structures needed for easy OS programming under PureBasic.

- Improved the editor a lot: contextual help (F1 on a keyword), Goto, Compiler Options, much better syntaxe highlightning, '.prefs' file

- Fixed: lot of bugs and improved the whole stability

17 December 2000 : Version 2.00 - Final release

- Fixed: all know bugs, added the 2D Drawing library and some major enhancements

28 November 2000 : Version 2.00 PR 3

- Fixed: the DirectX related bugs
- Dedicated editor (syntax coloring and direct access to compiler !)
- Added: 2 new libraries (Requester and ToolBar)

12 November 2000 : Version 2.00 PR 2

- Numberous bugs have been fixed. Thanks to all bug reporters :)
- Added: 6 new libraries (Sprite, Joystick, Keyboard, Sound, Network and Palette)

22 October 2000 : Version 2.00 PR 1

- First public release of PureBasic x86. For testing purpose only


Examples

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2


2DDrawing.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 2DDrawing

;
; ------------------------------------------------------------
;
;   PureBasic - 2D Drawing example file
;
;    (c) 2005 - Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 200, 300, 200, "2D Drawing Test")

  ; Create an offscreen image, with a green circle in it.
  ; It will be displayed later
  ;
  If CreateImage(0, 300, 200)
    If StartDrawing(ImageOutput(0))
      Circle(100,100,50,RGB(0,0,255))  ; a nice blue circle...

      Box(150,20,20,20, RGB(0,255,0))  ; and a green box

      FrontColor(RGB(255,0,0)) ; Finally, red lines..
      For k=0 To 20
        LineXY(10,10+k*8,200, 0)
      Next

      DrawingMode(#PB_2DDrawing_Transparent)
      BackColor(RGB(0,155,155)) ; Change the text back and front colour
      FrontColor(RGB(255,255,255))
      DrawText(10,50,"Hello, this is a test")

      StopDrawing()
    EndIf
  EndIf

  ; Create a gadget to display our nice image
  ;
  ImageGadget(0, 0, 0, 0, 0, ImageID(0))

  ;
  ; This is the 'event loop'. All the user actions are processed here.
  ; It's very easy to understand: when an action occurs, the EventID
  ; isn't 0 and we just have to see what have happened...
  ;

  Repeat
    EventID = WaitWindowEvent()
  Until EventID = #PB_Event_CloseWindow  ; If the user has pressed on the window close button

EndIf

End   ; All the opened windows are closed automatically by PureBasic

ПРИМЕР №3 2DDrawingAlpha

;
; ------------------------------------------------------------
;
;   PureBasic - 2D Drawing example file (alpha channel demo)
;
;    (c) 2009 - Fantaisie Software
;
; ------------------------------------------------------------
;

UsePNGImageDecoder()

If OpenWindow(0, 0, 0, 800, 600, "Alphachannel demo", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  LoadFont(0, "Impact", 30)
  CatchImage(2, ?TestImage)

  ; Alphachannel output image
  ;
  If CreateImage(0, 800, 600, 32) And StartDrawing(ImageOutput(0))

    ; Make the whole image transparent

    ;
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0, 0, 800, 600, $00000000)

    ; The classic Circle-thing :)
    ;
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    Circle( 75,  75, 50, RGBA(255,   0,   0, 128))
    Circle(125,  75, 50, RGBA(  0, 255,   0, 128))
    Circle(100, 125, 50, RGBA(  0,   0, 255, 128))

    ; new DrawAlphaImage() capability
    DrawingMode(#PB_2DDrawing_Default)
    x = 20
    For Alpha = 255 To 0 Step -20
      DrawAlphaImage(ImageID(2), x, 210, Alpha)
      x + 20
    Next Alpha

    ; Some DrawText stuff
    ;
    DrawingFont(FontID(0))
    w = TextWidth("Alphachannel demo")
    h = TextHeight("Alphachannel demo")

    DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)

    ; draw the text semi-transparent
    DrawText(25, 275, "Alphachannel demo", $40FF0000)
    DrawText(50, 300, "Alphachannel demo", $80FF0000)
    DrawText(75, 325, "Alphachannel demo", $A0FF0000)

    ; Show the difference between the drawing modes
    ;
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    y = 400
    For i = 0 To 255 Step 4
      Line(25, y, 400, 1, RGBA(0, 0, 255, 255-i))
      y + 1
    Next i

    DrawingFont(#PB_Default)
    DrawText( 50, 380, "Default",      $FF000000, $00000000)
    DrawText(150, 380, "AlphaBlend",   $FF000000, $00000000)
    DrawText(250, 380, "AlphaClip",    $FF000000, $00000000)
    DrawText(350, 380, "AlphaChannel", $FF000000, $00000000)

    DrawingMode(#PB_2DDrawing_Default)
    DrawImage(ImageID(2), 50, 410)

    DrawingMode(#PB_2DDrawing_AlphaBlend)
    DrawImage(ImageID(2), 150, 410)

    DrawingMode(#PB_2DDrawing_AlphaClip)
    DrawImage(ImageID(2), 250, 410)

    DrawingMode(#PB_2DDrawing_AlphaChannel)
    DrawImage(ImageID(2), 350, 410)

    ; Now lets see the gradient drawing mode
    ; The gradient defined the color to draw, the color parameter of the commands is then ignored
    ;
    DrawingFont(FontID(0))
    DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent|#PB_2DDrawing_Gradient)
    LinearGradient(310, 10, 310+TextWidth("Alphachannel Gradient demo"), 10+TextHeight("Alphachannel Gradient demo"))
    GradientColor(0.0,  $80FF0000)
    GradientColor(0.25, $FF00FF00)
    GradientColor(0.50, $8000FFFF)
    GradientColor(0.75, $FF0000FF)
    GradientColor(1.0,  $80FF0000)
    DrawText(310, 10, "Alphachannel Gradient demo")

    DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Outlined)
    Box(350, 75, 400, 150, $FF0000FF)
    Circle(400, 125, 20,  $FF0000FF)
    Circle(600, 125, 20,  $FF0000FF)
    Circle(500, 175, 40,  $FF0000FF)
    Circle(700, 150, 40,  $FFFF0000)
    Box(430, 80, 15, 140, $FF0000FF)

    DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Gradient)
    ConicalGradient(550, 150, 0)
    ResetGradientColors()
    GradientColor(0.0,  $FF0000FF)
    GradientColor(0.25, $8000FF00)
    GradientColor(0.5,  $FFFF0000)
    GradientColor(0.75, $8000FFFF)
    GradientColor(1.0,  $FF0000FF)
    FillArea(360, 80, -1)

    StopDrawing()
  EndIf

  ; Solid image for display
  ;
  If CreateImage(1, 800, 600, 24) And StartDrawing(ImageOutput(1))

    ; create the background effect
    #box_size = 7

    Box(0, 0, 800, 600, $FFFFFF)
    For y = 0 To 600 Step #box_size*2
      For x = 0 To 800 Step #box_size*2
        Box(x, y, #box_size, #box_size, $C0C0C0)
        Box(x+#box_size, y+#box_size, #box_size, #box_size, $C0C0C0)
      Next x
    Next y

    ; draw the alpha image
    DrawAlphaImage(ImageID(0), 0, 0)

    StopDrawing()
  EndIf

  ImageGadget(0, 0, 0, 0, 0, ImageID(1))

  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

DataSection
  TestImage:
    Data.b $89,$50,$4E,$47,$0D,$0A,$1A,$0A,$00,$00,$00,$0D,$49,$48,$44,$52
    Data.b $00,$00,$00,$30,$00,$00,$00,$30,$08,$06,$00,$00,$00,$57,$02,$F9
    Data.b $87,$00,$00,$00,$09,$70,$48,$59,$73,$00,$00,$1C,$20,$00,$00,$1C
    Data.b $20,$01,$CD,$0F,$9B,$9E,$00,$00,$00,$07,$74,$49,$4D,$45,$07,$D6
    Data.b $0C,$1C,$15,$17,$0D,$B6,$53,$C9,$04,$00,$00,$0C,$9C,$49,$44,$41
    Data.b $54,$68,$DE,$D5,$99,$79,$8C,$5D,$D7,$5D,$C7,$3F,$E7,$9C,$7B,$EF
    Data.b $5B,$E6,$BD,$D9,$17,$CF,$E2,$78,$A9,$27,$09,$B6,$A2,$26,$71,$90
    Data.b $93,$8A,$2C,$60,$D2,$02,$6D,$54,$94,$96,$48,$24,$6D,$11,$55,$55
    Data.b $05,$A5,$40,$25,$4A,$04,$52,$A1,$82,$06,$A9,$8A,$10,$02,$A1,$A6
    Data.b $34,$40,$45,$CB,$2A,$0A,$51,$A0,$B4,$84,$2C,$4E,$52,$E3,$6C,$B6
    Data.b $C7,$F6,$64,$C6,$19,$7B,$16,$8F,$67,$5F,$DF,$BE,$DF,$77,$CF,$E1
    Data.b $8F,$7B,$66,$3C,$36,$89,$ED,$B1,$C7,$48,$1C,$E9,$E8,$5E,$DD,$27
    Data.b $BD,$FB,$FB,$9E,$DF,$F6,$FD,$FE,$AE,$62,$8B,$56,$4B,$3C,$2A,$9E
    Data.b $79,$F4,$A1,$96,$87,$F6,$DF,$D6,$11,$53,$2A,$32,$B6,$94,$52,$81
    Data.b $D6,$0E,$A0,$00,$B9,$61,$0B,$BB,$B9,$E4,$FE,$9A,$96,$D8,$22,$FB
    Data.b $C5,$F4,$23,$0F,$7E,$B9,$51,$D7,$FF,$D8,$F1,$5C,$29,$1C,$15,$18
    Data.b $29,$2B,$06,$72,$46,$90,$D1,$82,$4C,$A0,$C9,$D4,$B5,$49,$D7,$11
    Data.b $E9,$BA,$54,$99,$9A,$A3,$D2,$15,$A9,$D2,$45,$44,$2A,$A7,$4D,$7A
    Data.b $36,$5F,$4A,$1D,$3E,$37,$93,$7E,$73,$72,$B6,$70,$66,$25,$E5,$07
    Data.b $DA,$68,$60,$6D,$07,$F6,$7A,$63,$00,$9C,$79,$E2,$D1,$9B,$55,$A6
    Data.b $30,$50,$74,$DD,$06,$E3,$07,$18,$BF,$8E,$30,$06,$61,$C0,$51,$02
    Data.b $E5,$39,$38,$9E,$83,$F2,$5C,$1C,$C7,$C5,$95,$02,$19,$F8,$50,$2E
    Data.b $41,$AD,$82,$10,$E0,$7A,$11,$94,$E7,$82,$52,$B5,$74,$AE,$58,$D0
    Data.b $F9,$6A,$26,$55,$F5,$8F,$DC,$F9,$C3,$D7,$9E,$06,$E6,$81,$8C,$05
    Data.b $72,$D1,$72,$AE,$D7,$F8,$87,$6F,$DE,$A1,$A2,$E9,$FC,$B7,$A7,$CF
    Data.b $4F,$37,$68,$40,$1B,$83,$36,$60,$08,$37,$F6,$AA,$0D,$04,$1A,$02
    Data.b $6D,$D0,$08,$94,$1B,$C5,$69,$6A,$C2,$69,$6C,$42,$7A,$1E,$A2,$0A
    Data.b $C2,$57,$4C,$8D,$0C,$7A,$1D,$41,$AD,$75,$5F,$57,$57,$FC,$E1,$D7
    Data.b $DE,$01,$B8,$17,$78,$1D,$28,$DC,$10,$00,$7F,$76,$FF,$81,$2F,$2E
    Data.b $9C,$9D,$78,$C0,$6C,$74,$AB,$00,$63,$42,$F7,$5E,$78,$6E,$C2,$80
    Data.b $17,$20,$8D,$41,$FB,$15,$AA,$2B,$15,$CA,$2B,$4B,$61,$6C,$08,$45
    Data.b $C1,$D4,$89,$F9,$25,$F6,$DF,$B4,$DD,$FC,$C2,$91,$E3,$E9,$C9,$62
    Data.b $69,$9B,$B5,$B1,$F6,$7E,$C6,$63,$93,$EA,$9A,$D7,$D0,$AF,$3D,$BA
    Data.b $33,$37,$B3,$F0,$8D,$AA,$EF,$83,$31,$18,$13,$9A,$6B,$36,$A2,$31
    Data.b $1B,$1E,$08,$90,$02,$A4,$B4,$5B,$80,$14,$06,$25,$C0,$77,$14,$54
    Data.b $0A,$3C,$B0,$BD,$8F,$2F,$9D,$1A,$C9,$1F,$4B,$65,$97,$80,$53,$C0
    Data.b $00,$B0,$B8,$E5,$00,$6E,$EF,$68,$91,$D1,$E5,$D4,$B7,$B2,$D9,$6C
    Data.b $23,$18,$CC,$DA,$59,$6F,$30,$DE,$98,$0D,$BF,$58,$8F,$20,$D6,$C2
    Data.b $CB,$80,$08,$EF,$44,$43,$92,$62,$6E,$85,$7B,$BB,$B7,$F1,$17,$E7
    Data.b $E7,$4A,$FF,$3C,$35,$37,$0F,$BC,$03,$BC,$0C,$BC,$07,$14,$2F,$FE
    Data.b $E7,$2D,$00,$F0,$DC,$CF,$3F,$F0,$B9,$D4,$C2,$E2,$CF,$69,$63,$42
    Data.b $43,$0D,$18,$63,$CD,$5D,$F7,$C6,$C5,$EF,$34,$EF,$03,$D0,$4D,$B6
    Data.b $B0,$9C,$5A,$E4,$F6,$D6,$56,$4E,$94,$AB,$B5,$AF,$0D,$9D,$59,$02
    Data.b $4E,$00,$2F,$59,$0F,$64,$3F,$A8,$02,$61,$6B,$F4,$A6,$D7,$C0,$AF
    Data.b $7E,$AA,$A7,$3E,$33,$FF,$7C,$B1,$52,$89,$E9,$75,$E3,$2F,$24,$EE
    Data.b $7A,$F2,$1A,$61,$3D,$20,$2C,$B0,$8B,$81,$44,$92,$CD,$2C,$66,$D3
    Data.b $EC,$F0,$1C,$62,$8D,$8D,$C1,$27,$0F,$1F,$5D,$AE,$69,$3D,$08,$FC
    Data.b $27,$F0,$DF,$36,$74,$EA,$97,$B3,$65,$D3,$49,$BC,$2D,$1E,$95,$0D
    Data.b $CB,$A9,$3F,$9F,$CF,$64,$5B,$EB,$DA,$86,$87,$14,$08,$21,$C2,$E4
    Data.b $15,$62,$3D,$65,$8D,$08,$BD,$83,$30,$17,$9D,$BC,$30,$E0,$C5,$13
    Data.b $A4,$2A,$55,$9A,$B4,$4F,$7F,$4F,$AF,$B9,$FF,$D5,$37,$53,$85,$7A
    Data.b $7D,$14,$38,$04,$1C,$B1,$A5,$D3,$BF,$92,$3D,$9B,$06,$F0,$BD,$BB
    Data.b $6F,$DB,$51,$2A,$64,$9B,$DC,$98,$BB,$D4,$28,$44,$9B,$13,$68,$55
    Data.b $01,$7C,$24,$01,$10,$04,$9A,$7A,$50,$47,$23,$C2,$92,$23,$42,$4F
    Data.b $5C,$F4,$52,$2F,$42,$59,$45,$08,$52,$33,$7C,$64,$D7,$4E,$1E,$79
    Data.b $EB,$64,$F6,$5C,$A1,$34,$09,$FC,$D8,$EE,$F3,$B6,$F2,$DC,$90,$4E
    Data.b $DC,$00,$7C,$18,$F8,$B8,$14,$E2,$CE,$CE,$88,$D7,$D6,$1F,$75,$93
    Data.b $3B,$A3,$5E,$BC,$37,$EA,$C5,$BA,$63,$D1,$C8,$81,$F6,$D6,$86,$42
    Data.b $D5,$57,$75,$AD,$C1,$7A,$06,$04,$CA,$F5,$30,$DA,$40,$73,$27,$33
    Data.b $D3,$A3,$1C,$DC,$BE,$9D,$A7,$46,$27,$0B,$CF,$8E,$4D,$4E,$02,$AF
    Data.b $00,$CF,$DB,$F8,$CF,$7D,$50,$D2,$6E,$05,$00,$0F,$E8,$06,$3E,$64
    Data.b $AF,$4D,$76,$37,$02,$4D,$F7,$75,$B4,$DC,$FC,$F5,$5D,$7D,$3F,$5D
    Data.b $F1,$7D,$A9,$A5,$40,$08,$89,$10,$82,$68,$A2,$89,$B2,$72,$E9,$2E
    Data.b $67,$19,$CE,$64,$D8,$D7,$DE,$C1,$6B,$C5,$4A,$F9,$37,$8F,$0D,$CE
    Data.b $D8,$90,$79,$0E,$78,$13,$48,$5D,$2E,$69,$B7,$A2,$91,$F9,$C0,$1C
    Data.b $B0,$02,$44,$2C,$A0,$28,$10,$FB,$E8,$AE,$BE,$9D,$7F,$78,$53,$CF
    Data.b $F7,$D2,$B9,$9C,$34,$80,$D1,$06,$21,$34,$5E,$34,$46,$25,$92,$20
    Data.b $7D,$EE,$34,$BB,$3E,$B4,$C7,$FC,$D5,$E8,$54,$7E,$78,$7C,$2E,$B7
    Data.b $58,$A9,$AE,$00,$EF,$02,$2F,$DA,$7A,$9F,$DE,$8C,$F1,$D7,$0A,$C0
    Data.b $58,$10,$BE,$AD,$CF,$02,$E0,$B7,$EE,$DC,$1B,$FB,$62,$6F,$F7,$B3
    Data.b $53,$B3,$B3,$ED,$D2,$5A,$61,$0C,$08,$29,$50,$AD,$3D,$4C,$9F,$3D
    Data.b $C9,$DD,$BB,$76,$F3,$C4,$C0,$70,$EE,$D0,$D2,$EA,$14,$30,$04,$0C
    Data.b $5B,$00,$A7,$80,$A5,$0F,$6A,$56,$5B,$0A,$E0,$C4,$E7,$7F,$B1,$AF
    Data.b $AB,$BD,$E5,$EE,$B9,$7C,$31,$FF,$97,$C7,$4E,$9F,$FD,$F6,$D1,$A1
    Data.b $55,$A0,$FE,$1B,$7B,$76,$FE,$C9,$FC,$EC,$DC,$4F,$79,$9E,$8B,$D6
    Data.b $10,$18,$83,$36,$86,$78,$F7,$2E,$46,$CE,$BE,$CB,$BE,$BE,$3E,$7E
    Data.b $F7,$BD,$F1,$FC,$CB,$0B,$4B,$D3,$B6,$44,$FE,$97,$6D,$52,$CB,$96
    Data.b $E7,$F8,$D7,$52,$D2,$37,$95,$03,$23,$8F,$7C,$7C,$77,$9B,$E7,$9F
    Data.b $90,$E5,$5A,$A3,$17,$8B,$E2,$C6,$63,$A6,$8C,$9C,$AF,$69,$31,$5D
    Data.b $5C,$4E,$1D,$F0,$A5,$C0,$AF,$07,$54,$FD,$80,$7A,$60,$50,$89,$36
    Data.b $06,$C7,$DE,$A3,$29,$1E,$E5,$B9,$D5,$5C,$F1,$EF,$C7,$26,$D7,$8C
    Data.b $FF,$37,$DB,$69,$53,$F6,$D4,$CD,$B5,$36,$D4,$AB,$F6,$C0,$67,$77
    Data.b $F7,$39,$CD,$75,$FF,$AF,$4B,$42,$37,$CA,$B6,$26,$F2,$42,$11,$18
    Data.b $21,$02,$4D,$4F,$63,$26,$D7,$D3,$D8,$D5,$46,$60,$04,$D5,$9A,$4F
    Data.b $B9,$E2,$83,$8C,$71,$6C,$6C,$94,$93,$B3,$73,$2C,$B5,$75,$54,$FE
    Data.b $69,$6C,$72,$19,$38,$69,$3B,$EC,$80,$35,$BE,$7E,$BD,$64,$F2,$6A
    Data.b $01,$88,$A7,$EF,$D8,$F7,$EB,$C2,$D1,$0F,$44,$3D,$17,$53,$AD,$13
    Data.b $51,$06,$A9,$1C,$8C,$00,$A7,$B3,$05,$E5,$44,$08,$0C,$18,$E9,$10
    Data.b $C8,$18,$D3,$B9,$22,$AB,$E9,$15,$5A,$1C,$C5,$1D,$1E,$D1,$5F,$BE
    Data.b $7F,$7F,$B7,$1B,$8D,$DC,$E1,$41,$09,$6D,$92,$43,$99,$DC,$C9,$3F
    Data.b $38,$75,$76,$32,$5D,$F3,$2B,$36,$7C,$D6,$44,$8B,$D9,$F2,$10,$1A
    Data.b $FD,$D4,$47,$F7,$36,$4B,$73,$54,$C4,$9C,$B8,$11,$21,$9D,$14,$CA
    Data.b $41,$48,$85,$54,$0A,$A9,$1C,$84,$0A,$63,$BF,$EA,$07,$94,$CB,$3E
    Data.b $E5,$9A,$8F,$89,$46,$A9,$6B,$4D,$10,$F8,$54,$4A,$45,$74,$21,$4F
    Data.b $BC,$52,$A0,$39,$E2,$12,$73,$5C,$DC,$48,$24,$8F,$1B,$19,$79,$FC
    Data.b $E8,$D0,$D7,$BE,$3F,$39,$3B,$68,$2B,$5B,$75,$4B,$3D,$F0,$D4,$87
    Data.b $6F,$F6,$9A,$D1,$DF,$51,$31,$27,$AE,$37,$E2,$5E,$A3,$CE,$6B,$47
    Data.b $A6,$0D,$C6,$08,$04,$02,$29,$15,$AE,$32,$D4,$7D,$8D,$A7,$5C,$DC
    Data.b $68,$03,$AD,$8D,$9D,$18,$2F,$8A,$69,$68,$24,$9D,$5A,$62,$F0,$D8
    Data.b $6B,$EC,$4D,$36,$25,$FF,$71,$75,$31,$FA,$FD,$C9,$D9,$7B,$AC,$E1
    Data.b $45,$DB,$81,$AF,$DA,$0B,$57,$62,$A3,$E2,$0B,$3B,$7B,$9F,$54,$51
    Data.b $79,$E0,$82,$02,$17,$17,$5F,$4D,$C8,$8F,$D7,$08,$1D,$58,$5E,$24
    Data.b $25,$42,$48,$A4,$08,$29,$85,$90,$0A,$57,$3A,$88,$62,$85,$F1,$63
    Data.b $6F,$B0,$23,$12,$E7,$07,$D9,$42,$E9,$F7,$4F,$BD,$07,$D0,$62,$8D
    Data.b $DE,$DA,$32,$3A,$F1,$B1,$03,$B7,$47,$A4,$F9,$AA,$72,$54,$28,$0B
    Data.b $85,$C4,$08,$19,$1A,$27,$25,$88,$D0,$48,$83,$E4,$02,$7B,$5E,$23
    Data.b $76,$12,$69,$F9,$90,$10,$E1,$30,$A2,$5E,$0F,$38,$79,$FC,$75,$7A
    Data.b $84,$66,$C4,$50,$FB,$CA,$C0,$F0,$32,$70,$06,$78,$1B,$18,$03,$CA
    Data.b $9B,$CD,$81,$CB,$D2,$E9,$A9,$72,$35,$98,$C9,$E5,$53,$A3,$4B,$E9
    Data.b $F6,$7A,$D5,$4F,$B6,$2B,$E5,$4A,$C7,$11,$D2,$71,$2D,$08,$15,$4A
    Data.b $AB,$90,$86,$A2,$8D,$08,$35,$B1,$D6,$68,$0D,$46,$48,$A4,$08,$F3
    Data.b $04,$E9,$70,$7A,$78,$80,$58,$3E,$4D,$D0,$D8,$58,$7F,$E4,$C8,$F1
    Data.b $45,$5F,$9B,$41,$E0,$47,$96,$C0,$CD,$5F,$4B,$2F,$B8,$2C,$80,$91
    Data.b $7C,$49,$1D,$5A,$CD,$55,$7F,$B8,$94,$CE,$7F,$F7,$FC,$C2,$6A,$A6
    Data.b $5C,$F3,$1E,$EC,$ED,$EC,$10,$9E,$7B,$E1,$F4,$CD,$05,$FA,$AC,$4D
    Data.b $28,$EA,$03,$1D,$0A,$FB,$50,$43,$4A,$A4,$72,$18,$9B,$38,$4B,$7D
    Data.b $69,$86,$8E,$CE,$8E,$E0,$13,$87,$8F,$AD,$14,$EA,$C1,$69,$CB,$FB
    Data.b $5F,$05,$A6,$AE,$96,$7D,$6E,$56,$D0,$68,$9B,$58,$B3,$BF,$D4,$DB
    Data.b $59,$FD,$C6,$5D,$7B,$3F,$EB,$25,$E3,$6E,$28,$50,$04,$06,$C9,$F8
    Data.b $CC,$2A,$A5,$89,$31,$DC,$6A,$99,$A0,$1E,$A0,$09,$E3,$5D,$5B,$50
    Data.b $42,$2A,$66,$16,$E6,$C9,$4C,$8D,$D2,$DF,$DB,$AD,$1F,$3A,$32,$90
    Data.b $5A,$A8,$54,$CF,$5A,$FE,$F3,$12,$30,$B1,$D9,$CA,$B3,$99,$2A,$54
    Data.b $07,$52,$5F,$BD,$75,$47,$ED,$4B,$BB,$B7,$FF,$43,$A4,$B1,$21,$A6
    Data.b $B5,$59,$D7,$B3,$73,$A9,$02,$93,$13,$A3,$F4,$75,$B5,$E9,$4F,$1E
    Data.b $3E,$91,$E9,$95,$54,$EE,$6B,$49,$AA,$FD,$AD,$4D,$89,$BD,$6D,$6D
    Data.b $71,$95,$68,$12,$2B,$5A,$B1,$30,$31,$CC,$1D,$7D,$3D,$E6,$D3,$EF
    Data.b $0C,$66,$CE,$17,$CB,$13,$F6,$D4,$5F,$B1,$C6,$57,$AE,$A7,$13,$5F
    Data.b $B1,$0F,$C4,$1D,$47,$4C,$FC,$CC,$FE,$67,$22,$ED,$6D,$8F,$6B,$A5
    Data.b $C2,$E1,$88,$10,$64,$2A,$9A,$A3,$43,$C3,$F4,$B4,$35,$99,$C7,$4F
    Data.b $9D,$4D,$BD,$97,$2B,$4E,$02,$A7,$ED,$00,$AA,$B9,$41,$A9,$AE,$FB
    Data.b $1A,$63,$DD,$B7,$34,$44,$DB,$13,$5E,$34,$FA,$1F,$A9,$5C,$F9,$64
    Data.b $26,$37,$03,$BC,$06,$FC,$00,$18,$04,$F2,$D7,$63,$FC,$55,$01,$98
    Data.b $3E,$B8,$FF,$B1,$44,$6B,$EB,$DF,$E2,$45,$84,$16,$60,$90,$54,$EA
    Data.b $F0,$C6,$F0,$08,$6E,$D4,$31,$5F,$1F,$9F,$CD,$0C,$A4,$B2,$E7,$AC
    Data.b $14,$3C,$64,$75,$6C,$12,$E8,$B2,$7A,$A1,$07,$E8,$B4,$EF,$1A,$03
    Data.b $0E,$5B,$E3,$B3,$9B,$A5,$CE,$9B,$0E,$A1,$33,$0F,$DC,$FE,$13,$89
    Data.b $64,$F2,$5B,$78,$AE,$08,$45,$79,$58,$65,$06,$C6,$26,$79,$7D,$7A
    Data.b $86,$F9,$D6,$B6,$CA,$C9,$74,$6E,$09,$38,$6A,$E3,$F9,$B8,$55,$53
    Data.b $CA,$6A,$84,$04,$D0,$6C,$05,$8F,$B4,$9D,$76,$CE,$9E,$FC,$75,$1B
    Data.b $7F,$D9,$24,$FE,$D7,$7B,$F6,$C5,$F7,$35,$35,$FE,$48,$26,$13,$3B
    Data.b $40,$AC,$CF,$73,$16,$6B,$01,$E7,$4B,$45,$2A,$F9,$02,$F7,$B4,$35
    Data.b $B9,$BF,$F7,$B3,$F7,$24,$1F,$DE,$DD,$A7,$3E,$D6,$D7,$99,$2E,$F9
    Data.b $C1,$F4,$78,$AE,$50,$B5,$B9,$53,$B1,$86,$AE,$02,$0B,$C0,$AC,$05
    Data.b $50,$B9,$DE,$B0,$B9,$62,$08,$25,$5C,$47,$4C,$1E,$BC,$EB,$59,$AF
    Data.b $B9,$E9,$0B,$5A,$CA,$0B,$E3,$12,$11,$56,$1F,$5F,$2A,$2A,$91,$08
    Data.b $99,$5C,$91,$F4,$EA,$2A,$D1,$5A,$95,$AE,$64,$03,$1D,$AD,$CD,$7E
    Data.b $C5,$98,$E3,$73,$85,$D2,$AB,$87,$E6,$96,$5F,$FC,$CA,$B1,$D3,$43
    Data.b $DA,$98,$D2,$86,$D1,$E0,$96,$19,$7E,$59,$00,$0B,$0F,$FE,$E4,$AF
    Data.b $24,$9B,$9B,$FE,$C6,$B8,$EE,$FA,$7C,$DB,$AC,$F9,$5C,$4A,$90,$2A
    Data.b $6C,$62,$42,$51,$AD,$6B,$2A,$8E,$4B,$BE,$54,$A2,$98,$CF,$E2,$94
    Data.b $8B,$B4,$7A,$2E,$2D,$89,$38,$28,$35,$BD,$5A,$2E,$BF,$7E,$26,$5B
    Data.b $78,$F9,$A9,$E1,$89,$1F,$BF,$B5,$9A,$5B,$B5,$1E,$A8,$6F,$55,$08
    Data.b $FD,$2F,$00,$E3,$07,$F7,$DF,$B6,$AD,$31,$F9,$86,$88,$46,$13,$21
    Data.b $CD,$11,$04,$98,$90,$2A,$0B,$81,$11,$21,$85,$40,$28,$8C,$0C,$AF
    Data.b $DA,$F6,$84,$5A,$3D,$C0,$F7,$5C,$8A,$7E,$8D,$4A,$B9,$08,$99,$14
    Data.b $4D,$D4,$69,$F2,$3C,$12,$B1,$48,$39,$5B,$AD,$BD,$3D,$57,$AA,$1C
    Data.b $7A,$7E,$6E,$E5,$C5,$3F,$1A,$99,$1A,$03,$D6,$BC,$A3,$AF,$D5,$3B
    Data.b $17,$01,$F8,$E6,$81,$7D,$D1,$CF,$B5,$37,$1D,$93,$89,$86,$7D,$C8
    Data.b $90,$BF,$84,$5F,$17,$2C,$00,$42,$00,$6B,$7B,$1D,$C8,$DA,$33,$04
    Data.b $DA,$EE,$40,$1B,$EA,$91,$18,$65,$61,$A8,$96,$F3,$04,$E9,$25,$12
    Data.b $A5,$3C,$CD,$8E,$43,$5B,$3C,$66,$AA,$5A,$8F,$2F,$55,$FD,$57,$07
    Data.b $73,$C5,$97,$7F,$67,$68,$FC,$8D,$B1,$42,$39,$6B,$BD,$13,$6C,$C6
    Data.b $3B,$97,$7A,$C0,$FB,$F2,$EE,$EE,$83,$77,$B5,$34,$3E,$79,$4F,$47
    Data.b $CB,$81,$6D,$89,$86,$98,$56,$2A,$F4,$F7,$06,$00,$7A,$23,$00,$29
    Data.b $31,$22,$FC,$8A,$A4,$C5,$5A,$87,$16,$68,$2C,$C9,$13,$12,$23,$25
    Data.b $81,$EB,$51,$F3,$5C,$CA,$A5,$0C,$F5,$EC,$32,$B1,$CC,$0A,$ED,$AE
    Data.b $43,$B3,$EB,$A1,$94,$93,$5B,$AD,$D5,$DF,$38,$5F,$AE,$BE,$F2,$77
    Data.b $53,$F3,$2F,$3D,$33,$3E,$7D,$DE,$32,$80,$FA,$95,$3C,$73,$69,$15
    Data.b $92,$6F,$A5,$0B,$FA,$B9,$F9,$D5,$EC,$37,$C7,$67,$B3,$43,$A9,$B4
    Data.b $1F,$0D,$02,$AF,$2F,$E2,$C5,$94,$72,$C2,$09,$95,$10,$F6,$1F,$C5
    Data.b $DA,$C4,$7F,$C3,$1B,$C4,$C6,$2F,$01,$17,$EE,$85,$44,$21,$88,$18
    Data.b $49,$C2,$4D,$10,$4D,$76,$22,$FA,$F6,$90,$8E,$27,$59,$74,$24,$2B
    Data.b $D9,$74,$24,$22,$D8,$B3,$3B,$16,$79,$70,$B4,$54,$6E,$7F,$69,$31
    Data.b $35,$67,$85,$7E,$79,$B3,$00,$B0,$BC,$64,$D9,$C0,$F9,$91,$42,$E5
    Data.b $DC,$BF,$CC,$AD,$4C,$7F,$67,$72,$6E,$39,$5D,$28,$D0,$2A,$45,$B4
    Data.b $D3,$73,$23,$46,$3A,$E1,$0C,$D4,$88,$F5,$CA,$64,$6C,$9D,$DD,$08
    Data.b $CE,$58,$70,$42,$08,$1B,$6E,$E1,$90,$4B,$4A,$85,$AB,$05,$0D,$5E
    Data.b $12,$65,$A2,$2C,$A4,$57,$91,$F9,$A2,$F9,$ED,$33,$13,$0B,$7F,$3A
    Data.b $3A,$BD,$68,$BB,$F9,$F4,$D5,$34,$3B,$F5,$3E,$33,$9F,$9A,$6D,$46
    Data.b $8B,$76,$46,$39,$5E,$0E,$F4,$B9,$B7,$33,$85,$73,$DF,$9D,$5A,$98
    Data.b $79,$61,$6E,$29,$67,$AA,$65,$D5,$E7,$AA,$78,$C2,$71,$94,$91,$CE
    Data.b $45,$A7,$7D,$61,$42,$BD,$E6,$A1,$B5,$9F,$2D,$ED,$DE,$00,$AC,$5A
    Data.b $2C,$30,$F9,$EE,$11,$3A,$74,$D5,$3C,$39,$36,$95,$FB,$F7,$B9,$95
    Data.b $05,$3B,$2B,$3A,$6A,$79,$52,$E9,$4A,$1E,$10,$57,$91,$23,$8E,$ED
    Data.b $AA,$2D,$96,$1A,$EC,$04,$FA,$A5,$10,$FD,$0F,$75,$35,$DF,$FA,$E9
    Data.b $9E,$AE,$5D,$F7,$76,$77,$B5,$39,$B1,$A4,$34,$8E,$67,$3D,$22,$D1
    Data.b $A8,$F5,$9C,$40,$2A,$BB,$43,$1D,$2D,$94,$43,$B9,$54,$60,$E6,$CC
    Data.b $00,$ED,$51,$C7,$3C,$71,$7A,$3C,$F3,$56,$2A,$37,$65,$47,$2E,$2F
    Data.b $00,$C7,$6C,$D3,$AB,$5F,$37,$17,$BA,$44,$7E,$BA,$76,$B8,$DB,$06
    Data.b $F4,$01,$BB,$81,$9B,$5B,$3D,$A7,$FF,$B1,$9E,$F6,$5B,$1E,$EA,$ED
    Data.b $DE,$BE,$B7,$BD,$3D,$59,$8F,$24,$D1,$D2,$59,$4F,$FA,$30,$D9,$D5
    Data.b $FA,$2E,$15,$73,$2C,$4C,$0C,$D3,$1C,$73,$F5,$E7,$07,$47,$D3,$43
    Data.b $21,$11,$3C,$6C,$F5,$C1,$89,$0D,$F3,$A2,$1B,$32,$DC,$15,$16,$4C
    Data.b $C4,$92,$B6,$4E,$E0,$26,$A0,$1F,$E8,$BF,$AD,$31,$7E,$CB,$67,$7A
    Data.b $3B,$F6,$3C,$D8,$DB,$D3,$DD,$92,$68,$F1,$EA,$91,$44,$28,$29,$A5
    Data.b $83,$91,$92,$42,$3E,$C3,$EA,$F4,$28,$B1,$58,$24,$F8,$CC,$C9,$91
    Data.b $D4,$B9,$62,$65,$C2,$7E,$85,$7C,$C1,$92,$BC,$CC,$66,$B4,$B1,$D8
    Data.b $82,$46,$B8,$31,$C4,$B6,$01,$BB,$80,$7E,$25,$44,$FF,$27,$BA,$9A
    Data.b $6F,$7D,$B8,$BB,$63,$D7,$47,$B6,$F5,$B4,$89,$78,$8B,$CC,$96,$4B
    Data.b $64,$17,$A6,$20,$E2,$06,$8F,$9E,$18,$59,$59,$A8,$D4,$C6,$AC,$36
    Data.b $78,$D1,$CE,$4A,$37,$CD,$50,$C5,$16,$D2,$92,$0F,$0C,$B1,$36,$CF
    Data.b $E9,$7F,$AC,$B7,$FD,$D6,$7D,$D1,$58,$EF,$8A,$31,$3C,$3D,$3E,$93
    Data.b $CD,$FA,$F5,$35,$E3,$5F,$B2,$33,$D2,$6B,$62,$A8,$82,$1B,$B3,$D4
    Data.b $25,$21,$B6,$03,$D8,$63,$C3,$AC,$CB,$36,$A9,$E3,$36,$69,$47,$6D
    Data.b $CD,$37,$5B,$C2,$85,$6E,$00,$59,$74,$80,$98,$D5,$05,$DB,$AC,$77
    Data.b $2A,$56,$C8,$CF,$5F,$CB,$28,$E5,$FF,$12,$C0,$A5,$21,$E6,$D8,$30
    Data.b $33,$37,$92,$62,$FF,$BF,$5A,$FF,$03,$14,$40,$F3,$DA,$D8,$5F,$19
    Data.b $B7,$00,$00,$00,$00,$49,$45,$4E,$44,$AE,$42,$60,$82
EndDataSection

ПРИМЕР №4 DirectScreenDrawing

;
; ------------------------------------------------------------
;
;   PureBasic - Drawing via Direct Screen Access (DSA)
;
;    (c) 2006 - Fantaisie Software
;
; ------------------------------------------------------------
;
; Note: disable the debugger to run at full speed !
;

#ScreenWidth  = 800  ; Feel free to change this to see the pixel filling speed !
#ScreenHeight = 600

If InitSprite() = 0 Or InitKeyboard()=0
  MessageRequester("Error","DirectX 7+ is needed.",0)
EndIf

Structure Pixel
  Pixel.l
EndStructure

Procedure.f GSin(angle.f)
  ProcedureReturn Sin(angle*(2*3.14/360))
EndProcedure

; Pre-calculated values are faster than realtime calculated ones...
; ... so we save them in an array before starting gfx operations
Dim CosTable(#ScreenWidth*2)
Dim ColorTable(255)

For i = 0 To #ScreenWidth*2
  CosTable(i) = GSin(360*i/320)* 32 + 32
Next

If OpenScreen(#ScreenWidth, #ScreenHeight, 32, "PB Plasma")

  Repeat

    Wave+6
    If Wave > 320 : Wave = 0 : EndIf

    If StartDrawing(ScreenOutput())
      Buffer      = DrawingBuffer()             ; Get the start address of the screen buffer
      Pitch       = DrawingBufferPitch()        ; Get the length (in byte) took by one horizontal line
      PixelFormat = DrawingBufferPixelFormat()  ; Get the pixel format.

      If PixelFormat = #PB_PixelFormat_32Bits_RGB
        For i = 0 To 255
          ColorTable(i) = i << 16 ; Blue is at the 3th pixel
        Next
      Else                        ; Else it's 32bits_BGR
        For i = 0 To 255
          ColorTable(i) = i       ; Blue is at the 1th pixel
        Next
      EndIf

      For y = 0 To #ScreenHeight-1
        pos1 = CosTable(y+wave)

        *Line.Pixel = Buffer+Pitch*y

        For x = 0 To #ScreenWidth-1
          pos2 = (CosTable(x+Wave) + CosTable(x+y) + pos1)
          *Line\Pixel = ColorTable(pos2) ; Write the pixel directly to the memory !
          *Line+4
        Next
      Next

      StopDrawing()
    EndIf

    ExamineKeyboard()

    FlipBuffers()

  Until KeyboardPushed(#PB_Key_Escape)

Else
  MessageRequester("Error","Can't open the screen !",0)
EndIf

End


AsmInline.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2

;
; ------------------------------------------------------------
;
;   PureBasic - Inlined asm example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;
; Don't forget to enable the 'Inline ASM support' feature in the compiler
; option window.
;

Value.l = 10  ; Declare our own variable

MOV Value, 20 ; Directly use the ASM keywords with PureBasic variable !
INC Value

MessageRequester("ASM Example", "Should be 21: "+Str(Value), 0)

End Џ


AudioCD.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 AudioCD.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Audio CD example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;
; 28/04/2001
;   First version. A full Audio-CD player with unlimited CDDrive support
;   coded in less than half an hour :-)
;

NbCDDrives = InitAudioCD()

If NbCDDrives = 0
  MessageRequester("Error", "No CD Audio drives found...", 0)
  End
EndIf

Global Null$

Procedure.s GetHourFormat(LengthInSeconds)
  Minutes = LengthInSeconds/60
  Seconds = LengthInSeconds-Minutes*60
  If Seconds < 10 : Null$ = "0" : Else : Null$ = "" : EndIf

  ProcedureReturn Str(Minutes)+":"+Null$+Str(Seconds)
EndProcedure

; Initialize constants for easier code reading
;
#GADGET_Play   = 0
#GADGET_Stop   = 1
#GADGET_Eject  = 2
#GADGET_Close  = 3
#GADGET_Select = 4
#GADGET_Status = 5
#GADGET_Time   = 6
#GADGET_AudioCDDrive = 7
#GADGET_SelectDrive  = 8

If OpenWindow(0, 100, 200, 265, 125, "PureBasic - AudioCD Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  ButtonGadget  (#GADGET_Play   ,  10, 10, 60 , 24, "Play")
  ButtonGadget  (#GADGET_Stop   ,  70, 10, 60 , 24, "Stop")
  ButtonGadget  (#GADGET_Eject  , 130, 10, 60 , 24, "Eject")
  ButtonGadget  (#GADGET_Close  , 190, 10, 60 , 24, "Close")
  ComboBoxGadget(#GADGET_Select ,  10, 43, 240, 21)
  TextGadget    (#GADGET_Status ,  10, 70, 180, 16, "Status: stopped")
  TextGadget    (#GADGET_Time   , 200, 70, 240, 16, "")

  TextGadget    (#GADGET_AudioCDDrive,  10, 94, 140,  24, "Select the CD-Audio drive :")
  ComboBoxGadget(#GADGET_SelectDrive , 150, 90,  40, 21)

  For k=1 To NbCDDrives
    UseAudioCD(k-1)
    AddGadgetItem(#GADGET_SelectDrive, -1, Left(AudioCDName(),2))
  Next
  SetGadgetState(#GADGET_SelectDrive, 0)
  UseAudioCD(0)

  If NbCDDrives = 1
    DisableGadget(#GADGET_SelectDrive, 1)
  EndIf

  Gosub RefreshCD

  Repeat
    Repeat
      EventID = WindowEvent()  ; This time we use the WindowEvent(), non-blocking command to allow time refreshing

      If EventID = #PB_Event_Gadget
        Select EventGadget()

          Case #GADGET_Play
            CurrentTrack = GetGadgetState(4)+1
            PlayAudioCD(CurrentTrack, CurrentTrack)

          Case #GADGET_Stop
            StopAudioCD()

          Case #GADGET_Eject
            EjectAudioCD(1)

          Case #GADGET_Close
            EjectAudioCD(0)

          Case #GADGET_SelectDrive
            UseAudioCD(GetGadgetState(#GADGET_SelectDrive))
            Gosub RefreshCD

        EndSelect

      Else
        If EventID = #PB_Event_CloseWindow : Quit = 1 : EndIf
      EndIf
    Until EventID = 0

    Delay(20) ; Wait 20 ms, which is a long period for the processor, to don't steal the whole CPU power
              ; for our little application :)

    CurrentTrack = AudioCDStatus()
    If CurrentTrack > 0
      SetGadgetText(#GADGET_Status, "Playing Track "+Str(CurrentTrack)+" (Length: "+GetHourFormat(AudioCDTrackLength(CurrentTrack))+")")
      SetGadgetText(#GADGET_Time, "Time: "+GetHourFormat(AudioCDTrackSeconds()))
      DisableGadget(#GADGET_Play, 1)
      DisableGadget(#GADGET_Stop, 0)
      DisableGadget(#GADGET_Select, 0)
    Else
      SetGadgetText(#GADGET_Status, "Status: Stopped")
      SetGadgetText(#GADGET_Time, "")
      DisableGadget(#GADGET_Play, 0)
      DisableGadget(#GADGET_Stop, 1)

      If CurrentTrack = -1 ; CD Drive not ready
        DisableGadget(#GADGET_Select, 1)
      Else
        DisableGadget(#GADGET_Select, 0)
      EndIf
    EndIf

  Until Quit = 1

EndIf

For k=0 To NbCDDrives-1    ; Stop all the CD drives, if some are playing together
  UseAudioCD(k)
  StopAudioCD()
Next

End

;-----------------------------------------------------------------
;  SubRoutines
;

RefreshCD:
  ClearGadgetItems(#GADGET_Select)

  NbAudioTracks = AudioCDTracks()
  For k=1 To NbAudioTracks
    AddGadgetItem(#GADGET_Select, -1, "Track "+Str(k))
  Next
  SetGadgetState(#GADGET_Select, 0)
Return


Billboard.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Billboard

;
; ------------------------------------------------------------
;
;   PureBasic - Billboard
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 10

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    ; First create our material, with a little rotate effect
    ;
    CreateMaterial(0, LoadTexture(0, "clouds.jpg"))
    RotateMaterial(0, 0.05, 1)

    ; Then create the billboard group and use the previous material
    ;
    CreateBillboardGroup(0, MaterialID(0), 10, 10)

    AddBillboard(0, 0,   0, 0, -40)
    AddBillboard(1, 0, -20, 0, -40)
    AddBillboard(2, 0,  20, 0, -40)

    CreateCamera(0, 0, 0, 100, 100)

    Repeat
      Screen3DEvents()

      ClearScreen(RGB(0, 0, 0))

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
      EndIf

      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Camera.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Camera.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Camera
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 10

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()
    AmbientColor(RGB(0,200,0))  ; Green 'HUD' like color

    CreateMaterial(0, LoadTexture(0, "r2skin.jpg"))
    CreateEntity(0, LoadMesh(0, "robot.mesh"), MaterialID(0))
    AnimateEntity(0, "Walk")

    CreateCamera(0, 0, 0, 100, 50)  ; Front camera
    CameraLocate(0,0,0,100)

    CreateCamera(1, 0, 50, 100, 50) ; Back camera
    CameraLocate(1,0,0,-100)
    RotateCamera(1,180,0,0)

    CameraRenderMode(1, #PB_Camera_Wireframe)  ; Wireframe for this camera

    Repeat
      Screen3DEvents()

      ClearScreen(RGB(0, 0, 0))

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
      EndIf

      RotateEntity(0, 0, 0.1, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RotateCamera(1, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (1, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Cipher.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Cipher.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Cipher example file
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;
;

MessageRequester("CRC32 Test", "Should be 352441C2 : "+Hex(CRC32Fingerprint(@"abc", 3)), 0)

MessageRequester("MD5 Test"  , "Should be ed50deb5bb795508b8a5c8e50dafa954 : "+MD5Fingerprint(@"PureBasic", Len("PureBasic")), 0)

MessageRequester("DES Test"  , "Should be FrfWXJ4yTjycc : "+DESFingerprint("1Fr", "Fr"), 0)

*OutputBuffer = AllocateMemory(100)
Base64Encoder(@"PureBasic", Len("PureBasic"), *OutputBuffer, 100)
MessageRequester("Base64 Test", "Should be UHVyZUJhc2lj : "+PeekS(*OutputBuffer), 0)


Clipboard.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Clipboard.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Clipboard example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

; Paste text to the clipboard..
SetClipboardText("PureBasic pasted text example.")

; Display the contents of the clipboard...
MessageRequester("Info", "Text in the clipboard"+#LF$+"'"+GetClipboardText()+"'", 0)

; Now paste an image...

If LoadImage(0, OpenFileRequester("Load a picture","","Bitmap (*.bmp)|*.bmp",0))
  If SetClipboardImage(0)

    MessageRequester("Info", "Image correctly pasted to the clipboard."+Chr(10)+"Open 'Paint' to test it !", 0)
  EndIf
EndIf


Console.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Console.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Console example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;
    text$  = "Feel the Power of PureBasic!"        ; just a small text$ string
    dlay   = 4000                                  ; delay will set to 4000

;
;-------- Open our Console --------
;

    OpenConsole()                                  ; First we must open a console
    ConsoleTitle ("PureBasic - Console Example:")  ; Now we can give the opened console a Titlename ;)
    EnableGraphicalConsole(1)

;
;-------- Ask and display the UserName --------
;

    ConsoleLocate (18,12)                          ; x y position
    Print ("Please enter your name:   ")           ; Ask for name
    name$=Input()                                  ; Wait for user input

    ClearConsole()                                 ; This will clean the ConsoleScreen

    ConsoleLocate (24,10)                          ; x y position
    PrintN ("Welcome "+name$)                      ; Print our text and the UserName
    ConsoleLocate (24,12)                          ; x y position
    PrintN (text$)                                 ; Print our text

    Delay (dlay)                                   ; Waits for moment

;
;-------- Cls and Cycle the Text-BG-Color 0 to 15 --------
;

    ClearConsole()                                 ; This will clean the ConsoleScreen
                                                   ; Info: Standard colors are (8 for text, 0 for backround)
    For i = 0 To 15
        ConsoleColor (0,i)                         ; Change BackGround text color (max 15) in every loop
        ConsoleLocate (24,4+i)                     ; x y position
        Print (text$)                              ; Print our text
    Next i

    Delay (dlay)                                   ; Waits for moment

;
;-------- Cls and Cycle the Text-FG-Color 0 to 15 --------
;

    ConsoleColor(0,0)                              ; Set back to black (0,0) for complete background...
    ClearConsole()                                 ; This will clean the ConsoleScreen
                                                   ; Info: Standard colors are (8 for text, 0 for backround)
    For i = 0 To 15
        ConsoleColor (i,0)                         ; Change ForGround text color (max 15) in every loop
        ConsoleLocate (24,4+i)                     ; x y position
        Print (text$)                              ; Print our text
    Next i

    Delay (dlay)                                   ; Waits for moment

;
;-------- Cls and Cycle the Background-Color 0 to 15 --------
;

    For a = 1 To 15
        ConsoleColor(a,a)                          ; Cycle background color...
        ClearConsole()                             ; This will clean the ConsoleScreen
        ;                                          ; Info: Standard colors are (8 for text, 0 for backround)
        For i = 0 To 15
            ConsoleColor (i,a)                     ; Change ForGround text color (max 15) in every loop
            ConsoleLocate (24,4+i)                 ; x y position
            Print (text$)                          ; Print our text
        Next i
        ;
        Delay(dlay/10)                             ; Waits for moment
    Next a

    ;-------- Exit --------

    CloseConsole()
End


Database.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Database.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Database example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

UseSQLiteDatabase()

Procedure CheckDatabaseUpdate(Database, Query$)
   Result = DatabaseUpdate(Database, Query$)
   If Result = 0
      Debug DatabaseError()
   EndIf

   ProcedureReturn Result
EndProcedure

DatabaseFile$ = GetTemporaryDirectory()+"/Database.sqlite"

If CreateFile(0, DatabaseFile$)
   CloseFile(0)

   If OpenDatabase(0, DatabaseFile$, "", "")

      CheckDatabaseUpdate(0, "CREATE TABLE food (name CHAR(50), weight INT)")

      CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('apple', '10')")
      CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('pear', '5')")
      CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('banana', '20')")

      If DatabaseQuery(0, "SELECT * FROM food WHERE weight > 7")

         While NextDatabaseRow(0)
            Debug GetDatabaseString(0, 0)
         Wend

         FinishDatabaseQuery(0)
      EndIf

      CloseDatabase(0)
   Else
      Debug "Can't open database !"
   EndIf
Else
   Debug "Can't create the database file !"
EndIf


Date.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Date.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Date example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

Date$ = FormatDate("%yyyy/%mm/%dd", Date())
Time$ = FormatDate("%hh:%ii:%ss", Date())

MessageRequester("PureBasic - Date Example", "Date: "+Date$+Chr(10)+"Time: "+Time$, 0)


Desktop.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Desktop.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Desktop example file
;
;    (c) 2004 - Fantaisie Software
;
; ------------------------------------------------------------
;

NbDesktops = ExamineDesktops()

MessageRequester("Information", "You have "+Str(NbDesktops)+" desktop(s)")

; Let's enumerate all the desktops found
;
For k=0 To NbDesktops-1

  Text$ = "Desktop n°"+Str(k+1)+#LF$+#LF$
  Text$ + "Size: "+Str(DesktopWidth(k))+"*"+Str(DesktopHeight(k))+#LF$
  Text$ + "Color depth: "+Str(DesktopDepth(k))+#LF$

  If DesktopFrequency(k) = 0
    Text$ + "Frequency: Default"+#LF$+#LF$
  Else
    Text$ + "Frequency: "+Str(DesktopFrequency(k))+" Hz"+#LF$+#LF$
  EndIf

  Text$ + "Name: "+DesktopName(k)

  MessageRequester("Information", Text$)

Next


DLLSample.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2

;
; ------------------------------------------------------------
;
;   PureBasic - DLL example file
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;
; This example is a skeleton to build easely a DLL using PureBasic
; The dll is created in the 'Compilers' directory, under the
; 'purebasic.dll' name. An associated '.lib' is generated to use
; with VisualC++.
;
;
; Rules to follow:
;   - Never write code outside a procedure, except for variables
;   or structure declaration.
;
;   - DirectX Init routines must not be initialized in the the
;   AttachProcess() procedure
;
;   - There is 4 procedures automatically called: AttachProcess(),
;   DetachProcess(), AttachThread() and DetachThread(). If you don't
;   need them, just remove them.
;

#TESTDLL = 0

CompilerIf #TESTDLL = 0

  CompilerIf #PB_Compiler_OS = #PB_OS_Windows

    ; These 4 procedures are Windows specific
    ;

    ; This procedure is called once, when the program loads the library
    ; for the first time. All init stuffs can be done here (but not DirectX init)
    ;
    ProcedureDLL AttachProcess(Instance)
    EndProcedure

    ; Called when the program release (free) the DLL
    ;
    ProcedureDLL DetachProcess(Instance)
    EndProcedure

    ; Both are called when a thread in a program call or release (free) the DLL
    ;
    ProcedureDLL AttachThread(Instance)
    EndProcedure

    ProcedureDLL DetachThread(Instance)
    EndProcedure

  CompilerEndIf

  ; Real code start here..
  ;
  ProcedureDLL EasyRequester(Message$)

    MessageRequester("EasyRequester !", Message$)

  EndProcedure

CompilerElse

  If OpenLibrary(0, "PureBasic.dll") Or OpenLibrary(0, "PureBasic.so")
    CallFunction(0, "EasyRequester", "Test")
  EndIf

CompilerEndIf


DragDrop.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 DragDrop.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Drag & Drop
;
;    (c) 2007 - Fantaisie Software
;
; ------------------------------------------------------------
;

#Window = 0

Enumeration    ; Images
  #ImageSource
  #ImageTarget
EndEnumeration

Enumeration    ; Gadgets
  #SourceText
  #SourceImage
  #SourceFiles
  #SourcePrivate
  #TargetText
  #TargetImage
  #TargetFiles
  #TargetPrivate1
  #TargetPrivate2
EndEnumeration

If OpenWindow(#Window, 0, 0, 760, 310, "Drag & Drop", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

  ; Create some images for the image demonstration
  ;
  CreateImage(#ImageSource, 136, 136)
  If StartDrawing(ImageOutput(#ImageSource))
    Box(0, 0, 136, 136, $FFFFFF)
    DrawText(5, 5, "Drag this image", $000000, $FFFFFF)
    For i = 45 To 1 Step -1
      Circle(70, 80, i, Random($FFFFFF))
    Next i

    StopDrawing()
  EndIf

  CreateImage(#ImageTarget, 136, 136)
  If StartDrawing(ImageOutput(#ImageTarget))
    Box(0, 0, 136, 136, $FFFFFF)
    DrawText(5, 5, "Drop images here", $000000, $FFFFFF)
    StopDrawing()
  EndIf

  ; Create and fill the source gadgets
  ;
  ListIconGadget(#SourceText,       10, 10, 140, 140, "Drag Text here", 130)
  ImageGadget(#SourceImage,        160, 10, 140, 140, ImageID(#ImageSource), #PB_Image_Border)
  ExplorerListGadget(#SourceFiles, 310, 10, 290, 140, GetHomeDirectory(), #PB_Explorer_MultiSelect)
  ListIconGadget(#SourcePrivate,   610, 10, 140, 140, "Drag private stuff here", 260)

  AddGadgetItem(#SourceText, -1, "hello world")
  AddGadgetItem(#SourceText, -1, "The quick brown fox jumped over the lazy dog")
  AddGadgetItem(#SourceText, -1, "abcdefg")
  AddGadgetItem(#SourceText, -1, "123456789")

  AddGadgetItem(#SourcePrivate, -1, "Private type 1")
  AddGadgetItem(#SourcePrivate, -1, "Private type 2")

  ; Create the target gadgets
  ;
  ListIconGadget(#TargetText,  10, 160, 140, 140, "Drop Text here", 130)
  ImageGadget(#TargetImage,    160, 160, 140, 140, ImageID(#ImageTarget), #PB_Image_Border)
  ListIconGadget(#TargetFiles, 310, 160, 140, 140, "Drop Files here", 130)
  ListIconGadget(#TargetPrivate1, 460, 160, 140, 140, "Drop Private Type 1 here", 130)
  ListIconGadget(#TargetPrivate2, 610, 160, 140, 140, "Drop Private Type 2 here", 130)

  ; Now enable the dropping on the target gadgets
  ;
  EnableGadgetDrop(#TargetText,     #PB_Drop_Text,    #PB_Drag_Copy)
  EnableGadgetDrop(#TargetImage,    #PB_Drop_Image,   #PB_Drag_Copy)
  EnableGadgetDrop(#TargetFiles,    #PB_Drop_Files,   #PB_Drag_Copy)
  EnableGadgetDrop(#TargetPrivate1, #PB_Drop_Private, #PB_Drag_Copy, 1)
  EnableGadgetDrop(#TargetPrivate2, #PB_Drop_Private, #PB_Drag_Copy, 2)

  Repeat
    Event = WaitWindowEvent()

    ; DragStart event on the source gadgets, initiate a drag & drop
    ;
    If Event = #PB_Event_Gadget And EventType() = #PB_EventType_DragStart
      Select EventGadget()

        Case #SourceText
          Text$ = GetGadgetItemText(#SourceText, GetGadgetState(#SourceText))
          DragText(Text$)

        Case #SourceImage
          DragImage(ImageID(#ImageSource))

        Case #SourceFiles
          Files$ = ""
          For i = 0 To CountGadgetItems(#SourceFiles)-1
            If GetGadgetItemState(#SourceFiles, i) & #PB_Explorer_Selected
              Files$ + GetGadgetText(#SourceFiles) + GetGadgetItemText(#SourceFiles, i) + Chr(10)
            EndIf
          Next i
          If Files$ <> ""
            DragFiles(Files$)
          EndIf

        ; "Private" Drags only work within the program, everything else
        ; also works with other applications (Explorer, Word, etc)
        ;
        Case #SourcePrivate
          If GetGadgetState(#SourcePrivate) = 0
            DragPrivate(1)
          Else
            DragPrivate(2)
          EndIf

      EndSelect

    ; Drop event on the target gadgets, receive the dropped data
    ;
    ElseIf Event = #PB_Event_GadgetDrop
      Select EventGadget()

        Case #TargetText
          AddGadgetItem(#TargetText, -1, EventDropText())

        Case #TargetImage
          If EventDropImage(#ImageTarget)
            SetGadgetState(#TargetImage, ImageID(#ImageTarget))
          EndIf

        Case #TargetFiles
          Files$ = EventDropFiles()
          Count  = CountString(Files$, Chr(10)) + 1
          For i = 1 To Count
            AddGadgetItem(#TargetFiles, -1, StringField(Files$, i, Chr(10)))
          Next i

        Case #TargetPrivate1
          AddGadgetItem(#TargetPrivate1, -1, "Private type 1 dropped")

        Case #TargetPrivate2
          AddGadgetItem(#TargetPrivate2, -1, "Private type 2 dropped")

      EndSelect

    EndIf

  Until Event = #PB_Event_CloseWindow
EndIf

End


Entity.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Entity.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Entity
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data"           , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/skybox.zip", #PB_3DArchive_Zip)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    LoadMesh   (0, "robot.mesh")

    CreateMaterial(0, LoadTexture(0, "clouds.jpg"))
    CreateMaterial(1, LoadTexture(1, "r2skin.jpg"))

    CreateEntity(0, MeshID(0), MaterialID(0))
    CreateEntity(1, MeshID(0), MaterialID(1), -60, 0, 0)
    CreateEntity(2, MeshID(0), MaterialID(1),  60, 0, 0)

    AnimateEntity(0, "Walk")

    SkyBox("desert07.jpg")

    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0,0,0,100)

    Repeat
      Screen3DEvents()

      ClearScreen(RGB(0, 0, 0))

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -1
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = 1
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -1
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = 1
        Else
          KeyY = 0
        EndIf

        If KeyboardPushed(#PB_Key_PageUp)
          RollZ = 3
        Else
          RollZ = 0
        EndIf

        If KeyboardPushed(#PB_Key_Add)
          Frame.f+0.005
        EndIf

      EndIf

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      RotateEntity(1, 0, 1, 0, #PB_Relative)
      RotateEntity(2, 0, 1, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


File.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 File.pb

;
; ------------------------------------------------------------
;
;   PureBasic - File example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

MessageRequester("PureBasic", "Welcome !"+Chr(13)+"PureBasic will write a file named: PureBasicTestFile.pb", 0)

If CreateFile(0, "PureBasicTestFile.txt")
  WriteStringN(0, "         This is a PureBasic file test")
  WriteString(0, "Now it's on ")
  WriteString(0, "the same line.")

  CloseFile(0)
Else
  MessageRequester("PureBasic", "Error: can't write the file", 0)
  End
EndIf

If ReadFile(0, "PureBasicTestFile.txt")

  First$ =  Trim(ReadString(0))
  MessageRequester("PureBasic", "Line read: "+First$, 0)

  CloseFile(0)
Else
  MessageRequester("PureBasic", "Error: Can't read the file", 0)
EndIf

End


FileSystem.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 FileSystem.pb

;
; ------------------------------------------------------------
;
;   PureBasic - FileSystem example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 200, 290, 200, "PureBasic - FileSystem Example")

  StringGadget  (0,  10, 10, 202, 24, GetHomeDirectory())
  ButtonGadget  (1, 220, 10, 60 , 24, "List")
  ListViewGadget(2,  10, 40, 270, 150)

  Repeat
    EventID = WaitWindowEvent()

    If EventID = #PB_Event_Gadget
      If EventGadget() = 1 ; Read

        ClearGadgetItems(2)  ; Clear all the items found in the ListView

        If ExamineDirectory(0, GetGadgetText(0), "*.*")

          While NextDirectoryEntry(0)

            FileName$ = DirectoryEntryName(0)
            If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
              FileName$ = "[DIR] "+FileName$
            EndIf

            AddGadgetItem(2, -1, FileName$)

          Wend

        Else
          MessageRequester("Error","Can't examine this directory: "+GetGadgetText(0),0)
        EndIf

      EndIf
    EndIf

  Until EventID = #PB_Event_CloseWindow

EndIf

End


Font.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Font.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Font example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;
; NOTE: This file doesn't compile with the demo version !
;

LoadFont (0, "Courier", 15)            ; Load Courrier Font, Size 15
LoadFont (1, "Arial", 30)              ; Load Arial Font, Size 30

;
;-------- Open our Window --------
;

If OpenWindow(0, 100, 200, 460, 148, "Font Test") = 0
    MessageRequester("Error", "Can't open Window", 0)
    End
EndIf

If CreateImage(0, 450, 130)

  If StartDrawing(ImageOutput(0))           ;
    Box(0, 0, 450, 130, RGB(255, 255, 255)) ; White background

    DrawingMode(1)                          ; Transparent TextBackground

    DrawingFont(FontID(0))                 ; Use the 'Courier' font

    DrawText(10,10, "Font: Courier - Size: 15")    ; Print our text

    DrawingFont(FontID(1))                 ; Use the Arial font

    DrawText(10,40, "Font: Arial - Size: 30")      ; Print our text

    StopDrawing()                          ; This is absolutely needed when the drawing operations are
  EndIf                                    ; finished !!! Never forget it !

EndIf

; Display the image on the window
;
ImageGadget(0, 5, 10, 450, 130, ImageID(0))

;
; This is the 'event loop'. All the user actions are processed here.
; It's very easy to understand: when an action occurs, the EventID
; isn't 0 and we just have to see what have happened...
;

Repeat

  EventID = WaitWindowEvent()

Until EventID = #PB_Event_CloseWindow    ; If the user has pressed on the close button

End                                      ; All the opened windows are closed automatically by PureBasic


Ftp.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Ftp.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Ftp example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

InitNetwork()

If OpenFTP(0, "127.0.0.1", "test", "test", 0)

  Result = SendFTPFile(0, OpenFileRequester("Choose a file to send", "", "*.*", 0), "purebasic_sent.file", 1)

  Repeat
    Debug FTPProgress(0)
    Delay(300)
  Until FTPProgress(0) = -3 Or FTPProgress(0) = -2

  Debug "finished"

Else
  MessageRequester("Error", "Can't connect to the FTP server")
EndIf


Gadget3D.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Gadget3D.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Gadget 3D
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 10

#MainWindow = 0
#CloseButton = 0

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/", #PB_3DArchive_FileSystem)
  Add3DArchive("GUI/", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/skybox.zip", #PB_3DArchive_Zip)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    SkyBox("desert07.jpg")

    CreateCamera(0, 0, 0, 100, 100)  ; Front camera
    CameraLocate(0,0,100,100)

    OpenWindow3D(#MainWindow, 100, 100, 300, 300, "Hello in 3D !")

            ButtonGadget3D(#CloseButton, 10, 260, 120, 25, "Close")

      ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor

    Repeat
      Screen3DEvents()

      If ExamineKeyboard()
        Input$ = KeyboardInkey()
      EndIf

      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed

        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left), Input$)
      EndIf

      ; Handle the GUI 3D events, it's similar to regular GUI events
      ;
      Repeat
          Event = WindowEvent3D()

          Select Event
              Case #PB_Event3D_Gadget
                If EventGadget3D() = #CloseButton
                  CloseWindow3D(#MainWindow)
                EndIf

          EndSelect
         Until Event = 0

      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf


Gadget.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Gadget.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Gadget example file
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#WindowWidth  = 390
#WindowHeight = 350

If OpenWindow(0, 100, 200, #WindowWidth, #WindowHeight, "PureBasic - Gadget Demonstration", #PB_Window_MinimizeGadget)

  Top = 10
  GadgetHeight = 24

  Frame3DGadget(#PB_Any, 10, Top, 370, 290, "Player...") : Top+20

  StringGadget(0,  20, Top, 200, GadgetHeight, "")
  ButtonGadget(1, 223, Top,  72, GadgetHeight, "Play")
  ButtonGadget(2, 295, Top,  72, GadgetHeight, "Stop")  : Top+35
  DisableGadget(2,1)

  GadgetToolTip(1,"Play the current song")

  PanelGadget(3, 20, Top, #WindowWidth-50, #WindowHeight-Top-60)
    AddGadgetItem(3, 0, "MP3 PlayList")
      ListViewGadget(4, 6, 10, 230, 148)

      For k=0 To 30
        AddGadgetItem(4, -1, "Music Song n° "+Str(k))
      Next

      ButtonGadget(5,  250, 10, 80, GadgetHeight, "Add")
      ButtonGadget(6,  250, 38, 80, GadgetHeight, "Remove")
      ButtonGadget(7,  250, 66, 80, GadgetHeight, "Select")
      GadgetToolTip(7, "Select the current song")

      TrackBarGadget(17, 10, 168, 310, 25, 0, 100)

    AddGadgetItem(3, 1, "Options")
      Top = 10
      CheckBoxGadget(10, 10, Top, 250, GadgetHeight, "Enable low-pass filter") : Top+30
      CheckBoxGadget(11, 10, Top, 250, GadgetHeight, "Enable visual plug-in")  : Top+30
      ComboBoxGadget(12, 10, Top, 250, 21) : Top+30
        AddGadgetItem(12, -1, "FireWorks")
        AddGadgetItem(12, -1, "OpenGL spectrum")
        AddGadgetItem(12, -1, "Bump bass")
      SetGadgetState(12,0)
      DisableGadget(12,1)

      OptionGadget(13, 10, Top, 80, GadgetHeight, "640*480") : Top+20
      OptionGadget(14, 10, Top, 80, GadgetHeight, "800*600") : Top+20
      OptionGadget(15, 10, Top, 80, GadgetHeight, "1024*768")
      SetGadgetState(13, 1)

      ButtonGadget(16, 150, Top, 80, GadgetHeight, "Info")
  CloseGadgetList()

  TextGadget  (9, 10, #WindowHeight-30, 250, 24, "PureBasic - Gadget demonstration")
  ButtonGadget(8, #WindowWidth-100, #WindowHeight-36, 80, 24, "Quit")

  SetGadgetState(3, 0)

  Repeat
    EventID = WaitWindowEvent()

    If EventID = #PB_Event_Gadget

      Select EventGadget()
        Case 0
          If EventType() = #PB_EventType_ReturnKey
            MessageRequester("Info", "Return key pressed", 0)
            SetActiveGadget(0)
          EndIf

        Case 1 ; Play
          DisableGadget(2,0)  ; Enable the 'Stop' gadget
          DisableGadget(1,1)  ; Disable the 'Play' Gadget

        Case 2 ; Stop
          DisableGadget(1,0)  ; Enable the 'Play' gadget
          DisableGadget(2,1)  ; Disable the 'Stop' Gadget

        Case 4
          If EventType() = 2
            SetGadgetText(0, GetGadgetText(4)) ; Get the current item from the ListView..
          EndIf

        Case 5 ; Add
          AddGadgetItem(4, -1, "New Item Added...")

        Case 6 ; Remove
          RemoveGadgetItem(4, GetGadgetState(4)) ; Remove the current element of the ListView

        Case 7 ; Select
          SetGadgetText(0, GetGadgetText(4)) ; Get the current item from the ListView..

        Case 8 ; Quit...
          EventID = #PB_Event_CloseWindow

        Case 11 ; Enable PlugIn..
          DisableGadget(12, 1-GetGadgetState(11))

        Case 16 ;
          If GetGadgetState(13) : Result$ = GetGadgetText(13) : EndIf
          If GetGadgetState(14) : Result$ = GetGadgetText(14) : EndIf
          If GetGadgetState(15) : Result$ = GetGadgetText(15) : EndIf

          MessageRequester("Info", "Selected screen mode: "+Result$, 0)

        Case 17
          SetGadgetText(0, Str(GetGadgetState(17)))

      EndSelect

    EndIf

  Until EventID = #PB_Event_CloseWindow

EndIf

End


Help.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Help.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Help example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

OpenHelp("..\..\PureBasic.chm", "MainGuide\history.html")

MessageRequester("Information", "Click to close the PureBasic help and open another old .hlp file", 0)
CloseHelp()

OpenHelp(OpenFileRequester("Choose an .hlp file", "", "WinHelp files (*.hlp)|*.hlp", 0), "")


Http.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Http.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Http example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

InitNetwork()

URL$ = "http://user:pass@www.purebasic.com:1024/subdirectory/index.php?year=2008&month=12&day=3"
Debug GetURLPart(URL$, "year")
Debug GetURLPart(URL$, #PB_URL_Site)
Debug GetURLPart(URL$, #PB_URL_Port)
Debug GetURLPart(URL$, #PB_URL_Parameters)
Debug GetURLPart(URL$, #PB_URL_Path)
Debug GetURLPart(URL$, #PB_URL_User)
Debug GetURLPart(URL$, #PB_URL_Password)

Debug "-------"
Debug SetURLPart(URL$, #PB_URL_Site, "forums.purebasic.fr")
Debug SetURLPart(URL$, #PB_URL_Port, "80")
Debug SetURLPart(URL$, #PB_URL_User, "bericko")
Debug SetURLPart(URL$, #PB_URL_Password, "password")


Image.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Image.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Image example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 100, 500, 300, "PureBasic - Image")

  If CreateImage(0, 255, 255)

    StartDrawing(ImageOutput(0))

    For k=0 To 255
      FrontColor(RGB(k,0, k))  ; a rainbow, from black to pink
      Line(0, k, 255, 0)
    Next

    DrawingMode(#PB_2DDrawing_Transparent)
    FrontColor(RGB(255,255,255)) ; print the text to white !
    DrawText(40, 50, "An image created easely...")

    StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !

  EndIf

  CopyImage(0, 1)
  ResizeImage(1, 100, 100)

  GrabImage(0, 2, 100, 60, 150, 40)

  Repeat
    EventID = WaitWindowEvent()

    If EventID = #PB_Event_Repaint
      StartDrawing(WindowOutput(0))
        DrawImage(ImageID(0), 20, 10)
        DrawImage(ImageID(1), 320, 80)
        DrawImage(ImageID(2), 320, 200)
      StopDrawing()
    EndIf

  Until EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button

EndIf

End   ; All the opened windows are closed automatically by PureBasic


ImagePlugin.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 ImagePlugin.pb

;
; ------------------------------------------------------------
;
;   PureBasic - ImagePlugin example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

; Enable all the decoders than PureBasic actually supports
;
UseJPEGImageDecoder()
UseTGAImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()

; Enable all the encoders than PureBasic actually supports
;
UseJPEGImageEncoder()
UsePNGImageEncoder()

If OpenWindow(0, 0, 0, 250, 130, "PureBasic - Image Converter", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  ImageGadget(0, 0, 28, WindowWidth(0), WindowHeight(0), 0, #PB_Image_Border)

  CreateToolBar(0, WindowID(0))
    ToolBarStandardButton(0, #PB_ToolBarIcon_Open)
    ToolBarStandardButton(1, #PB_ToolBarIcon_Save)
    DisableToolBarButton(0, 1, 1)    ; disable the save button

  Repeat
    EventID = WaitWindowEvent()

    If EventID = #PB_Event_Menu  ; ToolBar are acting as menu

      Select EventMenu()

        Case 0  ; Open

          Filename$ = OpenFileRequester("Choose a picture", "", "All Images Formats|*.bmp;*.jpg;*.png;*.tif;*.tga", 0)
          If Filename$

            If LoadImage(0, Filename$)
              SetGadgetState(0, ImageID(0))  ; change the picture in the gadget
              DisableToolBarButton(0, 1, 0)    ; enable the save button
              ResizeWindow(0, #PB_Ignore, #PB_Ignore, ImageWidth(0)+4, ImageHeight(0)+34)
            EndIf

          EndIf

        Case 1  ; Save

          Filename$ = SaveFileRequester("Save a picture", Left(Filename$, Len(Filename$)-Len(GetExtensionPart(Filename$))-1), "BMP Format|*.bmp|JPEG Format|*.jpg|PNG Format|*.png", 0)
          If Filename$

            Select SelectedFilePattern()

              Case 0  ; BMP
                ImageFormat = #PB_ImagePlugin_BMP
                Extension$  = "bmp"

              Case 1  ; JPEG
                ImageFormat = #PB_ImagePlugin_JPEG
                Extension$  = "jpg"

              Case 2  ; PNG
                ImageFormat = #PB_ImagePlugin_PNG
                Extension$  = "png"

            EndSelect

            If LCase(GetExtensionPart(Filename$)) <> Extension$
              Filename$ + "." + Extension$
            EndIf

            If SaveImage(0, Filename$, ImageFormat)
              MessageRequester("Information", "Image saved successfully", 0)
            EndIf

          EndIf

      EndSelect

    EndIf

  Until EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button

EndIf

End   ; All is automatically freed by PureBasic


Joystick.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Joystick.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Joystick example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

NbJoysticks = InitJoystick()

If NbJoysticks = 0
  MessageRequester("Error", "No joysticks are availables.", 0)
  End
EndIf

If OpenWindow(0, 100, 100, 300, 260, "PureBasic - Joystick Demo")

  MessageRequester("Information", "This will test the joystick in a window.", 0)

  x = WindowWidth(0)/2
  y = WindowHeight(0)/2-20

  Repeat

    Repeat
      Event = WindowEvent()
      If Event = #PB_Event_CloseWindow : Quit = 1 : EndIf
    Until Event = 0

    Delay(20) ; a little delay (20 milli seconds -> 50 fps)

    If ExamineJoystick(0)
      x+JoystickAxisX(0)
      y+JoystickAxisY(0)

      If JoystickButton(0, 1)
        MessageRequester("Info", "Button 1 has been pressed", 0)
      EndIf

      If JoystickButton(0, 2)
        MessageRequester("Info", "Button 2 has been pressed", 0)
      EndIf

      If StartDrawing(WindowOutput(0)) ; Set the drawing output to our window
        FrontColor(RGB(255,0,0))      ; Use the RED colour
        Box(x, y, 10, 10)         ; Draw a little box
        StopDrawing()             ;
      EndIf
    EndIf

  Until Quit = 1

EndIf

End


Keyboard.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Keyboard.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Keyboard example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitKeyboard() = 0 Or InitSprite() = 0
  MessageRequester("Error", "Can't initialize the sprite system.", 0)
  End
EndIf

MessageRequester("Information", "This will test the fast keyboard access..."+#LF$+"Press 'ESC' to quit!", 0)

If OpenScreen(640, 480, 16, "Keyboard")

  x = 100
  y = 100

  LoadSprite(0, "Data/PureBasic.bmp", 0)

  Repeat

    FlipBuffers()

    ClearScreen(RGB(0,0,0))

    ExamineKeyboard()

    If KeyboardPushed(#PB_Key_Left)
      x-1
    EndIf

    If KeyboardPushed(#PB_Key_Right)
      x+1
    EndIf

    If KeyboardPushed(#PB_Key_Up)
      y-1
    EndIf

    If KeyboardPushed(#PB_Key_Down)
      y+1
    EndIf

    For OffsetY=0 To 480 Step 70
      For OffsetX=0 To 640 Step 200
        DisplaySprite(0, OffsetX+x, y+OffsetY)
      Next

      For OffsetX=0 To 640 Step 200
        DisplaySprite(0, OffsetX+x+90, y+OffsetY+35)
      Next
    Next

  Until KeyboardPushed(#PB_Key_Escape)

Else
  MessageRequester("Error", "Impossible to open a 680*480 16 bit screen",0)
EndIf

End


Library.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Library.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Library
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

CompilerSelect #PB_Compiler_OS

  CompilerCase #PB_OS_Windows

      If OpenLibrary(0, "USER32.DLL")

        *MessageBox = GetFunction(0, "MessageBoxA")
        If *MessageBox
          CallFunctionFast(*MessageBox, 0, "Body", "Title", 0)
        EndIf

        CloseLibrary(0)
      EndIf

  CompilerCase #PB_OS_Linux

      If OpenLibrary(0, "libc.so")

        *MAlloc = GetFunction(0, "malloc")
        If *MAlloc
          *Buffer = CallCFunctionFast(*MAlloc, 128)
          If *Buffer
            Debug "Buffer allocated"

            CallCFunction(0, "free", *Buffer)

          EndIf
        EndIf

        CloseLibrary(0)
      EndIf

CompilerEndSelect


Light.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Light.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Light
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 10

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    LoadMesh   (0, "robot.mesh")
    LoadTexture(0, "r2skin.jpg")

    CreateEntity (0, MeshID(0), CreateMaterial(0, TextureID(0)))
    AnimateEntity(0, "Walk")

    CreateLight(0, RGB(0,0,255), 100.0, 0, 0)   ; Blue light
    CreateLight(1, RGB(255,0,0), -100.0, 0, 0)  ; Red light

    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0,0,0,100)

    Repeat
      Screen3DEvents()

      ClearScreen(RGB(0, 0, 0))

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
      EndIf

      RotateEntity(0, 0, 1, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


LinkedList.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 LinkedList.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Linked list example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

Structure BasicStructure
    Field1.b
    Field2.w
    Field3.l
EndStructure

Structure ComplexStructure
    Field1.b
   *Basic.BasicStructure              ; Pointer to a BasicStructure object
    Basic2.BasicStructure             ; Creation of the BasicStructure object inside this structure
   *Next.ComplexStructure             ; Pointer to another ComplexStructure object
EndStructure

NewList TestList.BasicStructure()

;
;-------- Add Elements and TestLists --------
;

AddElement(TestList())
TestList()\Field2 = 1

AddElement(TestList())
TestList()\Field2 = 2

AddElement(TestList())
TestList()\Field2 = 3

AddElement(TestList())
TestList()\Field2 = 4

;
;-------- MessageRequester("Number of elements in the list:", Str(TestList()\Field2), 0) --------
;

MessageRequester("Number of elements in the list:", Str(ListSize(TestList())), 0)

; First way to list all the elements
;
ResetList(TestList())               ; Reset the list index before the first element.

While NextElement(TestList())       ; Process all the elements...
  MessageRequester("List elements :", "Field2 value : "+Str(TestList()\Field2), 0)
Wend

; Second way, with the help of ForEach
;
ForEach TestList()       ; Process all the elements...
  MessageRequester("List elements :", "Field2 value : "+Str(TestList()\Field2), 0)
Next

SelectElement(TestList(), 2)  ; Go directly to the 3rd element
MessageRequester("3rd Element", "Field2 value : "+Str(TestList()\Field2), 0)

MessageRequester("Linked List - Example", "Finished", 0)

End

; ExecutableFormat=Windows
; EOF


Mail.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Mail.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Mail example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

InitNetwork()

If CreateMail(0, "fred@purebasic.com", "Hello !")

  SetMailBody(0, "Hello   "+Chr(10)+"This is a mail !")

  AddMailAttachment(0, "My description", "brook_3d.png")
  AddMailAttachment(0, "My description 2", "test.bmp")

  AddMailRecipient(0, "test@yourdomain.com", #PB_Mail_To)
  AddMailRecipient(0, "test2@yourdomain.com", #PB_Mail_Cc)

  Result = SendMail(0, "smtp.free.fr", 25, 1)

  Repeat
    Progress = MailProgress(0)
    Delay(300)
  Until Progress = #PB_Mail_Finished Or Progress = #PB_Mail_Error

  If Progress = #PB_Mail_Finished
    MessageRequester("Information", "Mail correctly sent !")
  Else
    MessageRequester("Error", "Can't sent the mail !")
  EndIf

EndIf


Map.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2


Material.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Material.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Material
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 10

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    AmbientColor(RGB(255,255,255))

    LoadMesh   (0, "robot.mesh")
    CreateMaterial(0, LoadTexture(0, "r2skin.jpg"))

    CreateMaterial(1, LoadTexture(1, "clouds.jpg"))
    MaterialBlendingMode(1, #PB_Material_AlphaBlend)  ; Alphablending for this texture

    CreateEntity  (0, MeshID(0), MaterialID(1))
    CreateEntity  (1, MeshID(0), MaterialID(0))

    MoveEntity(1, 100, 0, 0)

    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0,0,0,100)

    Repeat
      Screen3DEvents()

      ClearScreen(RGB(0, 0, 0))

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
      EndIf

      RotateEntity(0, 0, 1, 0, #PB_Relative)
      RotateEntity(1, 0, 0.5, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Math.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Math.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Math example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 200, 200, 400, 400, "Test")

  ImageGadget(0, 0, 0, 400, 400, 0)

  CreateImage(0, 400, 400)

  X.f = Random(80)
  Y.f = X

  Repeat
    Event = WaitWindowEvent(10)

    If Event = 0
      a.f+0.01

      If StartDrawing(ImageOutput(0))

        FrontColor(RGB(0, Random(255), Random(255)))

        x2.f = X*Cos(a) + Y*Sin(a)
        y2.f = X*Sin(a) - Y*Cos(a)

        Plot(200+x2, 200+y2)
        Plot(100+x2, 200+y2)

        Delay(10)

        StopDrawing()
      EndIf

      SetGadgetState(0, ImageID(0))
    EndIf

  Until Event = #PB_Event_CloseWindow

EndIf


MemoryBank.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 MemoryBank.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Memory example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

*MemoryID = AllocateMemory(1000)

*Pointer = *MemoryID
CopyMemoryString("Hello ", @*Pointer)
CopyMemoryString("World")

*NewMemoryID = ReAllocateMemory(*MemoryID, 2000) ; need more memory
If *NewMemoryID
  ; work with *NewMemoryID now with size 2000
  ;
  Debug "The old content is still here:"
  Debug PeekS(*NewMemoryID)
  FreeMemory(*NewMemoryID)
Else
  ; resizing failed, keep working with *MemoryID (size 1000)
  ;
  FreeMemory(*MemoryID)
EndIf


Menu.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Menu.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Menu example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

;
; We just have to open a window and see when an event happen on the menu
;

If OpenWindow(0, 100, 150, 195, 260, "PureBasic - Menu")

  ;
  ; Create the menu. The indent is very important here for a good lisibility
  ;

  If CreateMenu(0, WindowID(0))
    MenuTitle("File")
      MenuItem( 1, "&Load...")
      MenuItem( 2, "Save")
      MenuItem( 3, "Save As...")
      MenuBar()
      OpenSubMenu("Recents")
        MenuItem( 5, "Pure.png")
        MenuItem( 6, "Basic.jpg")
        OpenSubMenu("Even more !")
          MenuItem( 12, "Yeah")
        CloseSubMenu()
        MenuItem( 13, "Rocks.tga")
      CloseSubMenu()
      MenuBar()
      MenuItem( 7, "&Quit")

    MenuTitle("Edition")
      MenuItem( 8, "Cut")
      MenuItem( 9, "Copy")
      MenuItem(10, "Paste")

    MenuTitle("?")
      MenuItem(11, "About")

  EndIf

  DisableMenuItem(0, 3, 1)
  DisableMenuItem(0, 13, 1)

  ;
  ; This is the 'event loop'. All the user actions are processed here.
  ; It's very easy to understand: when an action occurs, the EventID
  ; isn't 0 and we just have to see what have happened...
  ;

  Repeat

    Select WaitWindowEvent()

      Case #PB_Event_Menu

        Select EventMenu()  ; To see which menu has been selected

          Case 11 ; About
            MessageRequester("About", "Cool Menu example", 0)

          Default
            MessageRequester("Info", "MenuItem: "+Str(EventMenu()), 0)

        EndSelect

      Case #PB_Event_CloseWindow
        Quit = 1

    EndSelect

  Until Quit = 1

EndIf

End

ПРИМЕР №3 PopupMenu.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Menu example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

;
; Create the popup menu. The indent is important here for a good lisibility
;

If CreatePopupMenu(0)
  MenuItem(1, "Cut")
  MenuItem(2, "Copy")
  MenuItem(3, "Paste")
  MenuBar()
  OpenSubMenu("Options")
    MenuItem(4, "Window...")
    MenuItem(5, "Gadget...")
  CloseSubMenu()
  MenuBar()
  MenuItem( 6, "Quit")
EndIf

;
; We just have to open a window and see when an event happen on the menu
;
If OpenWindow(0, 100, 100, 300, 260, "PureBasic - PopupMenu Example")

  ListIconGadget(0, 10, 10, 280, 240, "Tools", 200)
    AddGadgetItem(0, -1, "Hammer")
    AddGadgetItem(0, -1, "Screwdriver")

  Repeat

    Select WaitWindowEvent()

      Case #PB_Event_Gadget
        If EventGadget() = 0 And EventType() = #PB_EventType_RightClick
          DisplayPopupMenu(0, WindowID(0))
        EndIf

      Case #PB_Event_Menu

        Select EventMenu()  ; To see which menu has been selected

          Case 1 ; Cut
            MessageRequester("PureBasic", "Cut", 0)

          Case 2 ; Copy
            MessageRequester("PureBasic", "Copy", 0)

          Case 3 ; Paste
            MessageRequester("PureBasic", "Paste", 0)

          Case 6 ; Quit
            Quit = 1

        EndSelect

      Case #PB_Event_CloseWindow
        Quit = 1

    EndSelect

  Until Quit = 1

EndIf

End


Mesh.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Mesh.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Mesh (Skeleton Animation)
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

#RobotMesh    = 0
#RobotTexture = 0
#Robot        = 0

If InitEngine3D()

  Add3DArchive("Data", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    LoadMesh   (#RobotMesh   , "robot.mesh")
    LoadTexture(#RobotTexture, "clouds.jpg")

    CreateMaterial(0, TextureID(#RobotTexture))

    CreateEntity(#Robot, MeshID(#RobotMesh), MaterialID(0))
    EntityMaterial(#Robot, MaterialID(0))

    AnimateEntity(#Robot, "Walk")

    DisableMaterialLighting(0, 1)

    MaterialAmbientColor(0, RGB(100, 100, 100))
    MaterialSpecularColor(0, RGB(255, 255, 255))
    ScrollMaterial(0, 0.15, 0, 1)

    CreateLight(0, RGB(0,0,255), 100.0, 0, 0)
    LightSpecularColor(0, RGB(255, 0, 0))

    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0,0,0,100)
    ; CameraBackColor(0, RGB(0, 0, 255))

    Repeat
      Screen3DEvents()

      ClearScreen(RGB(0, 0, 0))

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -1
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = 1
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -1
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = 1
        Else
          KeyY = 0
        EndIf

        If KeyboardPushed(#PB_Key_PageUp)
          RollZ = 3
        Else
          RollZ = 0
        EndIf

        If KeyboardPushed(#PB_Key_Add)
          Frame.f+0.005
        EndIf

      EndIf

      If ExamineMouse()
        MouseX = -MouseDeltaX()/10
        MouseY = -MouseDeltaY()/10
      EndIf

      RotateEntity(#Robot, 0, 1, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Misc.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Misc.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Misc example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

a$ = "Speed'n'Compactness rulez !"
a.l = 10

PeekL(@a)

b$ = PeekS(@a$)  ; Note: this is useless to do a such thing, it's for example only

MessageRequester("PureBasic", "PeekS result: "+b$, 0)

End


Module.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Module.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Module example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSound() = 0
  MessageRequester("Error", "Sound system not available.") : End
EndIf

FileName$ = OpenFileRequester("","","Modules (*.mod, *.xm, *.it)|*.mod;*.xm", 0)
If FileName$
  If LoadModule(0, FileName$)
    PlayModule(0)
    MessageRequester("PureBasic - Module player", "Playing the module...")

    ; Now, perform a nice fading...
    ;
    For k=100 To 0 Step -1
      Delay(20)
      ModuleVolume(0, k)
    Next

  Else
    MessageRequester("Error", "Can't load the module or bad module format.")
  EndIf
EndIf


Mouse.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Mouse.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Mouse example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitMouse() = 0 Or InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Can't open DirectX 7", 0)
  End
EndIf

;
;-------- MessageReq and OpenScreen --------
;

MessageRequester("Information", "This will test the fast mouse access..."+Chr(10)+"Press any mouse button to quit!", 0)

If OpenScreen(800, 600, 16, "Mouse") = 0
  MessageRequester("Error", "Impossible to open a 800*600 16 bit screen",0)
  End
EndIf

;
;-------- Init and Load Stuff --------
;

x = 100
y = 100

LoadSprite(0, "Data/PureBasic.bmp", 0)   ; Load nice small Logo

;
;-------- MainLoop --------
;

Repeat
  FlipBuffers()                        ; Flip for DoubleBuffering
  ClearScreen(RGB(0,0,0))                   ; CleanScreen, black

  ExamineKeyboard()
  ExamineMouse()

  x = MouseX()                         ; Returns actual x pos of our mouse
  y = MouseY()                         ; Returns actual y pos of our mouse

  x+MouseWheel()*10

  If MouseButton(#PB_MouseButton_Middle)
    MouseLocate(400, 300)
  EndIf

  DisplaySprite(0, x-SpriteWidth(0)/2, y-SpriteHeight(0)/2)

Until MouseButton(#PB_MouseButton_Left) Or MouseButton(#PB_MouseButton_Right)

End


Movie.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Movie.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Movie example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitMovie() = 0
  MessageRequester("Error", "Can't initialize movie playback !", 0)
  End
EndIf

MovieName$ = OpenFileRequester("Choose the movie to play", "", "Movie/Audio files|*.avi;*.mpg;*.asf;*.mp3;*.wav|All Files|*.*", 0)
If MovieName$
  If LoadMovie(0, MovieName$)

    OpenWindow(0, 100, 150, MovieWidth(0), MovieHeight(0), "PureBasic - Movie")
    PlayMovie(0, WindowID(0))

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
  Else
    MessageRequester("Error", "Can't load the movie...", 0)
  EndIf
EndIf


NetworkClient.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 NetworkClient.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Network (Client) example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832

ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
  MessageRequester("PureBasic - Client", "Client connected to server...", 0)

  SendNetworkString(ConnectionID, "An hello from a client !!! :-)")

  MessageRequester("PureBasic - Client", "A string has been sent to the server, please check it before quit...", 0)

  CloseNetworkConnection(ConnectionID)
Else
  MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf

End

ПРИМЕР №3 NetworkServer.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Network (Server) example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832
*Buffer = AllocateMemory(1000)

If CreateNetworkServer(0, Port)

  MessageRequester("PureBasic - Server", "Server created (Port "+Str(Port)+").", 0)

  Repeat

    SEvent = NetworkServerEvent()

    If SEvent

      ClientID = EventClient()

      Select SEvent

        Case 1
          MessageRequester("PureBasic - Server", "A new client has connected !", 0)

        Case 2
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0)
          ReceiveNetworkData(ClientID, *Buffer, 1000)
          MessageRequester("Info", "String: "+PeekS(*Buffer), 0)

        Case 3
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0)
          ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")

        Case 4
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connection...", 0)
          Quit = 1

      EndSelect
    EndIf

  Until Quit = 1

  MessageRequester("PureBasic - Server", "Click to quit the server.", 0)

  CloseNetworkServer(0)
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf
End


Node.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Node.pb


OnError.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 OnError.pb

;
; ------------------------------------------------------------
;
;   PureBasic - OnError example file
;
;    (c) 2008 - Fantaisie Software
;
; ------------------------------------------------------------
;

Procedure ErrorHandler()

  ErrorMessage$ = "A program error was detected:" + Chr(13)
  ErrorMessage$ + Chr(13)
  ErrorMessage$ + "Error Message:   " + ErrorMessage()      + Chr(13)
  ErrorMessage$ + "Error Code:      " + Str(ErrorCode())    + Chr(13)
  ErrorMessage$ + "Code Address:    " + Str(ErrorAddress()) + Chr(13)

  If ErrorCode() = #PB_OnError_InvalidMemory
    ErrorMessage$ + "Target Address:  " + Str(ErrorTargetAddress()) + Chr(13)
  EndIf

  If ErrorLine() = -1
    ErrorMessage$ + "Sourcecode line: Enable OnError lines support to get code line information." + Chr(13)
  Else
    ErrorMessage$ + "Sourcecode line: " + Str(ErrorLine()) + Chr(13)
    ErrorMessage$ + "Sourcecode file: " + ErrorFile() + Chr(13)
  EndIf

  ErrorMessage$ + Chr(13)
  ErrorMessage$ + "Register content:" + Chr(13)

  CompilerSelect #PB_Compiler_Processor
    CompilerCase #PB_Processor_x86
      ErrorMessage$ + "EAX = " + Str(ErrorRegister(#PB_OnError_EAX)) + Chr(13)
      ErrorMessage$ + "EBX = " + Str(ErrorRegister(#PB_OnError_EBX)) + Chr(13)
      ErrorMessage$ + "ECX = " + Str(ErrorRegister(#PB_OnError_ECX)) + Chr(13)
      ErrorMessage$ + "EDX = " + Str(ErrorRegister(#PB_OnError_EDX)) + Chr(13)
      ErrorMessage$ + "EBP = " + Str(ErrorRegister(#PB_OnError_EBP)) + Chr(13)
      ErrorMessage$ + "ESI = " + Str(ErrorRegister(#PB_OnError_ESI)) + Chr(13)
      ErrorMessage$ + "EDI = " + Str(ErrorRegister(#PB_OnError_EDI)) + Chr(13)
      ErrorMessage$ + "ESP = " + Str(ErrorRegister(#PB_OnError_ESP)) + Chr(13)

    CompilerCase #PB_Processor_x64
      ErrorMessage$ + "RAX = " + Str(ErrorRegister(#PB_OnError_RAX)) + Chr(13)
      ErrorMessage$ + "RBX = " + Str(ErrorRegister(#PB_OnError_RBX)) + Chr(13)
      ErrorMessage$ + "RCX = " + Str(ErrorRegister(#PB_OnError_RCX)) + Chr(13)
      ErrorMessage$ + "RDX = " + Str(ErrorRegister(#PB_OnError_RDX)) + Chr(13)
      ErrorMessage$ + "RBP = " + Str(ErrorRegister(#PB_OnError_RBP)) + Chr(13)
      ErrorMessage$ + "RSI = " + Str(ErrorRegister(#PB_OnError_RSI)) + Chr(13)
      ErrorMessage$ + "RDI = " + Str(ErrorRegister(#PB_OnError_RDI)) + Chr(13)
      ErrorMessage$ + "RSP = " + Str(ErrorRegister(#PB_OnError_RSP)) + Chr(13)
      ErrorMessage$ + "Display of registers R8-R15 skipped."         + Chr(13)

    CompilerCase #PB_Processor_PowerPC
      ErrorMessage$ + "r0 = " + Str(ErrorRegister(#PB_OnError_r0)) + Chr(13)
      ErrorMessage$ + "r1 = " + Str(ErrorRegister(#PB_OnError_r1)) + Chr(13)
      ErrorMessage$ + "r2 = " + Str(ErrorRegister(#PB_OnError_r2)) + Chr(13)
      ErrorMessage$ + "r3 = " + Str(ErrorRegister(#PB_OnError_r3)) + Chr(13)
      ErrorMessage$ + "r4 = " + Str(ErrorRegister(#PB_OnError_r4)) + Chr(13)
      ErrorMessage$ + "r5 = " + Str(ErrorRegister(#PB_OnError_r5)) + Chr(13)
      ErrorMessage$ + "r6 = " + Str(ErrorRegister(#PB_OnError_r6)) + Chr(13)
      ErrorMessage$ + "r7 = " + Str(ErrorRegister(#PB_OnError_r7)) + Chr(13)
      ErrorMessage$ + "Display of registers r8-R31 skipped."       + Chr(13)

  CompilerEndSelect

  MessageRequester("OnError example", ErrorMessage$)
  End

EndProcedure

; Setup the error handler.
;
OnErrorCall(@ErrorHandler())

MessageRequester("OnError example", "Executing some code with errors. The debugger should be turned off.")

; Write to protected memory
;
PokeS(123, "The quick brown fox jumped over the lazy dog.")

; Division by zero
;
a = 0
a = 1 / a

; Generate an error manually
;
RaiseError(#PB_OnError_IllegalInstruction)

; This should not be displayed
;
MessageRequester("OnError example", "Execution finished normally.")
End


Packer.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Packer.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Compressor example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If ReadFile(0, OpenFileRequester("Choose a file to compress", "", "*.*", 0))
  FileLength = Lof(0)

  ; Allocate the 2 memory buffers needed for compression..
  ;
  *Source = AllocateMemory(FileLength)
  *Target = AllocateMemory(FileLength+8)
  If FileLength And *Source And *Target
    ReadData(0, *Source, FileLength) ; Read the whole file in the memory buffer

    ; Compress our file, which is in memory (and use a timer to see the time spend by compression..)
    ;
    CompressedLength = PackMemory(*Source, *Target, FileLength)
    If CompressedLength

      DecompressedLength = UnpackMemory(*Target, *Source)
      If DecompressedLength = FileLength
        MessageRequester("Info", "De/Compression succeded:"+#LF$+#LF$+"Old size: "+Str(FileLength)+#LF$+"New size: "+Str(CompressedLength))
      EndIf
    Else
      MessageRequester("Error", "Can't compress the file")
    EndIf

    FreeMemory(*Source)
    FreeMemory(*Target)

  EndIf

  CloseFile(0)
EndIf

End


Palette.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Palette.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Palette example file
;
;    (c) 2004 - Fantaisie Software
;
; ------------------------------------------------------------
;
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitPalette() = 0
  MessageRequester("Error", "Can't open DirectX 7 or later", 0)
  End
EndIf

If OpenScreen(640, 480, 8, "PureBasic - Palette Example")
  LoadSprite(0, "Data\AlphaChannel.bmp", 0)

  ; Build 256 precalculated palette to do a nice cycling effect !
  ;
  For Palette = 0 To 255
    CreatePalette(Palette)
      For Index = 1 To 255  ; Let the first color always Black
        Color = Index+Palette
        If Color > 255
          Color - 256
        EndIf

        SetPaletteColor(Palette, Index, Color << 8)
      Next
  Next

  Palette = 0
  Repeat
    FlipBuffers()                                 ; Flip for DoubleBuffering
    ClearScreen(RGB(0, 0, 0))

    DisplayPalette(Palette)
    DisplaySprite(0, 100, 100)

    Palette+1
    If Palette > 255 : Palette = 0 : EndIf

    ExamineKeyboard()
  Until KeyboardPushed(#PB_Key_Escape)
EndIf

End


Particle.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Particle.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Particle
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 10

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    LoadTexture(0, "flare.png")

    CreateMaterial(0, TextureID(0))
      DisableMaterialLighting(0, 1)
      MaterialBlendingMode   (0, #PB_Material_Add)

    CreateParticleEmitter(0, 10, 1, 1, 0)
      ParticleMaterial    (0, MaterialID(0))
      ParticleTimeToLive  (0, 2, 2)
      ParticleEmissionRate(0, 20)
      ParticleSize        (0, 30, 30)
      ParticleColorRange  (0, RGB(255,0,0), RGB(255,0,255))

    CreateParticleEmitter(1, 10, 1, 1, 0)
      ParticleMaterial    (1, MaterialID(0))
      ParticleTimeToLive  (1, 2, 2)
      ParticleEmissionRate(1, 20)
      ParticleSize        (1, 30, 30)
      ParticleColorRange  (1, RGB(255,255,0), RGB(0,255,0))

    MoveParticleEmitter(1, -50, 0, 0)

    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0,0,0,100)

    Repeat
      Screen3DEvents()

      ClearScreen(RGB(0, 0, 0))

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
      EndIf

      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()
      Screen3DStats()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Preference.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Preference.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Preference example file
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

If CreatePreferences("Preferences.prefs")
  PreferenceGroup("Global")
    WritePreferenceString("ApplicationName", "MP3 Player")
    WritePreferenceString("Version", "1.1b")

  PreferenceComment(" This is the Window dimension")
  PreferenceComment("")

  PreferenceGroup("Window")
    WritePreferenceLong ("WindowX", 123)
    WritePreferenceLong ("WindowY", 124)
    WritePreferenceFloat("WindowZ", -125.5)

  ClosePreferences()
EndIf

OpenPreferences("Preferences.prefs")

  PreferenceGroup("Window")
    Debug ReadPreferenceLong ("WindowX", 0)
    Debug ReadPreferenceLong ("WindowY", 0)
    Debug ReadPreferenceFloat("WindowZ", 0)

  PreferenceGroup("Global")
    Debug ReadPreferenceString("ApplicationName", "")
    Debug ReadPreferenceString("Version", "")

ClosePreferences()


Printer.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Printer.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Printer example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

If PrintRequester()

  If StartPrinting("PureBasic Test")

    LoadFont(0, "Arial", 30)
    LoadFont(1, "Arial", 100)

    If StartDrawing(PrinterOutput())

      DrawingFont(FontID(0))

      DrawText(100, 100, "PureBasic Printer Test")

      DrawingFont(FontID(1))

      DrawText(100, 400, "PureBasic Printer Test 2")

      If LoadImage(0, "Data/PureBasic.bmp")
        DrawImage(ImageID(0), 200, 600)
      Else
        MessageRequester("Error","Can't load the image")
      EndIf

      FrontColor(RGB(100,100,100))
      Box(200, 600, 100, 100)

      StopDrawing()
    EndIf

    StopPrinting()
  EndIf
EndIf


Process.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2


RegularExpression.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 RegularExpression.pb

;
; ------------------------------------------------------------
;
;   PureBasic - RegularExpression example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

; Will match every word of 3 letters, lowercase with a 'b' as middle letter
;
If CreateRegularExpression(0, "[a-z]b[a-z]")

  Dim Result$(0)

  a = ExtractRegularExpression(0, " abc it won't match abz", result$())

  MessageRequester("Info", "Nb strings found: "+Str(a))

  For k=0 To a-1
    MessageRequester("Info", Result$(k))
  Next

Else
  MessageRequester("Error", RegularExpressionError())
EndIf


Requester.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Requester.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Requester example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 200, 300, MenuHeight(), "PureBasic - Requesters example")

  If CreateMenu(0, WindowID(0))
    MenuTitle("Test")
      MenuItem(0, "Open")
      MenuItem(1, "Save")
      MenuItem(6, "Path")
      MenuBar()
      MenuItem(2, "Choose a color")
      MenuItem(3, "Choose a font")
      MenuBar()
      MenuItem(4, "Simple message")
      MenuBar()
      MenuItem(5, "Quit")
  EndIf

  Repeat
    Event = WaitWindowEvent()

    Select Event

      Case #PB_Event_Menu  ; A Menu item has been selected

        Select EventMenu()

          Case 0  ; OpenFileRequester
            File$ = OpenFileRequester("PureBasic - Open", "Pure.txt", "Text (*.txt)|*.txt;*.bat|(PureBasic (*.pb)|*.pb", 0)
            If File$+File$
              MessageRequester("Information", "Selected File: "+File$, 0);
            EndIf

          Case 1  ; SaveFileRequester
            File$ = SaveFileRequester("PureBasic - Save", "Basic.pb", "Text (*.txt)|*.txt|(PureBasic (*.pb)|*.pb", 1)
            If File$
              MessageRequester("Information", "Selected File: "+File$, 0);
            EndIf

          Case 2  ; ColorRequester
            Colour = ColorRequester()
            If Colour > -1
              MessageRequester("Info", "Colour choosen: Red: "+Str(Red(Colour))+", Green: "+Str(Green(Colour))+", Blue: "+Str(Blue(Colour)), 0);
            EndIf

          Case 3  ; FontRequester
            If FontRequester("Courier", -13, 0)
              MessageRequester("Info", "Selected font: "+SelectedFontName()+Chr(10)+"Font size: "+Str(SelectedFontSize()), 0)
            EndIf

          Case 4  ; MessageRequester
            MessageRequester("Information", "Simple Message"+Chr(13)+"Line 2"+Chr(13)+"Line 3", 0)

          Case 5  ; Quit
            Quit = 1

          Case 6
            Path$ = PathRequester("Choose a path...","C:\")
            If Path$
              MessageRequester("Information", "Selected Path: "+Path$, 0)
            EndIf

        EndSelect

      Case #PB_Event_CloseWindow  ; If the user has pressed on the close button
        Quit = 1

    EndSelect

  Until Quit = 1

EndIf

End   ; All the opened windows are closed automatically by PureBasic


Scintilla.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2


SerialPort.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 SerialPort.pb

;
; ------------------------------------------------------------
;
;   PureBasic - SerialPort example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  Port$ = "COM1"
CompilerElse
  Port$ = "/dev/ttyS0"
CompilerEndIf

If OpenSerialPort(0, Port$, 300, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)

    MessageRequester("Information", "SerialPort opened with success")

Else
    MessageRequester("Error", "Can't open the serial port: "+Port$)
EndIf


Sort (Numeric).pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Sort (Numeric).pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sort (Numerical) example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

; Change the number of elements here, to see the speed of the sort routine :)
;
#NbElements = 20

Dim Array.b(#NbElements)

For k=0 To #NbElements
  Array(k) = Random(10000)
Next

; Fill the array with lot of random number
;

For k=0 To #NbElements
  Debug Array(k)
Next

; Sort the whole array !
;
SortArray(Array(), #PB_Sort_Ascending)

Debug "----------------"

For k=0 To #NbElements
  Debug Array(k)
Next
MessageRequester("Sort Example", "Sort finished.")

ПРИМЕР №3 Sort (String).pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sort (String) example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

; Don't change the number of elements without add them in the data below !
;
#NbElements = 8

Dim Array.s(#NbElements)

For k=0 To #NbElements
  Read.s Array(k)
Next

For k=0 To #NbElements
  Debug Array(k)
Next

SortArray(Array(), #PB_Sort_Ascending | #PB_Sort_NoCase)

Debug "---------------------"

For k=0 To #NbElements
  Debug Array(k)
Next

MessageRequester("Information", "Sort finished !", 0)

End

DataSection
  Data.s "Hello", "This", "is", "a", "Nice", "test", "Isn't", "it ?", "Haha !"
EndDataSection


Sound3D.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Sound3D.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sound3D
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 15

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data"           , #PB_3DArchive_FileSystem)
  Add3DArchive("Data/skybox.zip", #PB_3DArchive_Zip)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    CreateMaterial(0, LoadTexture(0, "r2skin.jpg"))
    CreateEntity(0, LoadMesh(0, "robot.mesh"), MaterialID(0))

    SkyBox("desert07.jpg")

    LoadSound3D(0, "Roar.wav")
    SoundVolume3D(0, 50)
    SoundRange3D(0, 0, 1000)
    PlaySound3D(0, #PB_Sound_Loop)

    ; Create a node, so we can link the entity and the sound
    ;
    CreateNode(0)
      AttachNodeObject(0, SoundID3D(0), #PB_Node_Sound3D)
      AttachNodeObject(0, EntityID(0),  #PB_Node_Entity)

    CreateCamera(0,0,0,100,100)
    CameraLocate(0,0,0,100)

    Repeat
      Screen3DEvents()

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
      EndIf

      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Sound.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Sound.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sound example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSound() = 0
  MessageRequester("Error", "Sound system is not available",  0)
  End
EndIf

SoundFileName$ = OpenFileRequester("Choose a .wav file", "", "Wave files|*.wav",0)
If SoundFileName$
  If LoadSound(0, SoundFileName$)
    PlaySound(0, #PB_Sound_Loop)
    MessageRequester("Sound", "Playing the sound (loop)..."+#LF$+"Click to quit..", 0)
  Else
    MessageRequester("Error", "Can't load the sound.", 0)
  EndIf
EndIf
End


SoundPlugin.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 SoundPlugin.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sound example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSound() = 0
  MessageRequester("Error", "Can't open DirectX 7 or no sound card is available",  0)
  End
EndIf

UseOGGSoundDecoder()

SoundFileName$ = OpenFileRequester("Choose a sound file", "", "Wave or OGG files|*.wav;*.ogg",0)
If SoundFileName$
  If LoadSound(0, SoundFileName$)
    PlaySound(0,#PB_Sound_Loop)
    MessageRequester("Sound", "Playing the sound (loop)..."+Chr(10)+"Click to quit..", 0)
  Else
    MessageRequester("Error", "Can't load the sound.", 0)
  EndIf
EndIf
End


Sprite3D.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Sprite3D.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sprite example file
;
;    (c) 2002 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Sprite system can't be initialized", 0)
  End
EndIf

If InitSprite3D() = 0
  MessageRequester("Error", "Sprite3D system can't be initialized correctly", 0)
  End
EndIf

;
; Now, open a 640*480 - 16 bits (65000 colours) screen
;

If OpenScreen(640, 480, 16, "Sprite")

  ; Load our 16 bit sprite (which is a 24 bit picture in fact, as BMP doesn't support 16 bit format)
  ;
  LoadSprite(0, "Data/Geebee2.bmp", #PB_Sprite_Texture)
  CreateSprite3D(0, 0)
  CreateSprite3D(1, 0)
  CreateSprite3D(2, 0)

  Sprite3DQuality(1)

  TransparentSpriteColor(0, RGB(255, 0, 255)) ; Our pink is transparent :)

  Repeat

    ; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)

    FlipBuffers()

    ClearScreen(RGB(0,50,128))

    ; Draw our sprite
    ;
    If Start3D()
      DisplaySprite3D(0, 0, 30)
      DisplaySprite3D(0, x+100, 100, x)
      DisplaySprite3D(0, x*2, 100, x)

      ; Zoom..
      ;
      ZoomSprite3D(1, x, x)
      RotateSprite3D(1, x, 0)
      DisplaySprite3D  (1, 0, 100, x/2)
      DisplaySprite3D  (1, x*2, 100, x)
      DisplaySprite3D  (1, 0, 100, x/2)
      DisplaySprite3D  (1, x*2, 200+x, x)

      Stop3D()
    EndIf

    ExamineKeyboard()

    x+1
  Until KeyboardPushed(#PB_Key_Escape)

Else
  MessageRequester("Error", "Can't open a 640*480 - 16 bit screen !", 0)
EndIf

End


Sprite.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Sprite.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Sprite example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Sprite system can't be initialized", 0)
  End
EndIf

;
; Now, open a 640*480 - 16 bits (65000 colours) screen
;
If OpenScreen(640, 480, 16, "Sprite")

  ; Load our 16 bit sprite (which is a 24 bit picture in fact, as BMP doesn't support 16 bit format)
  ;
  LoadSprite(0, "Data/PureBasic.bmp", 0)
  CopySprite(0,1,0)

  Repeat

    ; Inverse the buffers (the back become the front (visible)... And we can do the rendering on the back)

    FlipBuffers()

    ClearScreen(RGB(0,0,0))

    ; Draw our sprite

    ClipSprite(0, 0, 0, x, x/8)

    DisplaySprite(0, x, 100)
    DisplaySprite(1, x, x)
    DisplaySprite(0, 600-x, x)

    x+1

    ExamineKeyboard()
  Until KeyboardPushed(#PB_Key_Escape)

Else
  MessageRequester("Error", "Can't open a 640*480 - 16 bit screen !", 0)
EndIf

End

ПРИМЕР №3 WindowedScreen.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Windowed Screen example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't open the sprite system", 0)
  End
EndIf

If OpenWindow(0, 0, 0, 340, 285, "Gadget and sprites!", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  ButtonGadget(1, 10,  10, 100, 25, "Grab input")
  ButtonGadget(2, 120,  10, 100, 25, "Button 2")
  ButtonGadget(3, 230,  10, 100, 25, "Button 3")
  TextGadget  (4, 10, 40, 300, 30, "Press 'F1' to ungrab keyboard and mouse")

  If OpenWindowedScreen(WindowID(0), 10, 70, 320, 200, 0, 0, 0)
    LoadSprite(0, "Data/PureBasicLogo.bmp")
  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
    End
  EndIf

EndIf

direction = 1
playerX = 1
playerY = 1

Repeat
  Repeat
    ; Always process all the events to flush the queue at every frame
    Event = WindowEvent()

    Select Event
      Case #PB_Event_CloseWindow
        Quit = 1

      Case #PB_Event_Gadget

        ; Do the normal application management here
        Gadget = EventGadget()

        Select Gadget
          Case 1
            InputReleased = 0
            ReleaseMouse(#False)
            SetGadgetText(4, "Press 'F1' to ungrab keyboard and mouse")

          Case 2, 3
            SetGadgetText(4, "Button "+Str(Gadget)+" pressed.")
        EndSelect

    EndSelect

  Until Event = 0 ; Quit the event loop only when no more events are available

  If InputReleased = 0

    ExamineMouse()

    ; do the sprite & screen management at every frame
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Up)    And playerY > 0   : playerY -3 : EndIf
    If KeyboardPushed(#PB_Key_Down)  And playerY < 280 : playerY +3 : EndIf
    If KeyboardPushed(#PB_Key_Left)  And playerX > 0   : playerX -3 : EndIf
    If KeyboardPushed(#PB_Key_Right) And playerX < 300 : playerX +3 : EndIf

    If KeyboardPushed(#PB_Key_F1)
      ReleaseMouse(#True)
      InputReleased = 1
    EndIf
  EndIf

  ; Clear the screen and draw our sprites
  ClearScreen(RGB(0,0,0))
  ClipSprite(0, 0, 0, x, x/8)
  DisplaySprite(0, x, 100)
  DisplaySprite(0, x, x)
  DisplaySprite(0, 300-x, x)
  DisplaySprite(0, playerX, playerY)

  x + direction
  If x > 300 : direction = -1 : EndIf   ; moving back to the left with negative value
  If x < 0   : direction =  1 : EndIf   ; moving to the right with positive value

  FlipBuffers()       ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back

Until  Quit Or KeyboardPushed(#PB_Key_Escape)


StatusBar.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 StatusBar.pb

;
; ------------------------------------------------------------
;
;   PureBasic - StatusBar example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 150, 300, 100, "PureBasic - StatusBar Example", #PB_Window_SystemMenu | #PB_Window_SizeGadget)

  If CreateStatusBar(0, WindowID(0))
    AddStatusBarField(100)
    AddStatusBarField(50)
    AddStatusBarField(100)
  EndIf

  StatusBarText(0, 0, "Area 1")
  StatusBarText(0, 1, "Area 2", #PB_StatusBar_BorderLess)
  StatusBarText(0, 2, "Area 3", #PB_StatusBar_Right | #PB_StatusBar_Raised)

  Repeat

  Until WaitWindowEvent() = #PB_Event_CloseWindow

EndIf


String.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 String.pb

;
; ------------------------------------------------------------
;
;   PureBasic - String example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

c$ = "Test"
a$ = Left(c$,1)
a$ = Mid(c$,3, 1)

a.l = Val("-121212")

MessageRequester("PureBasic", "Welcome: "+Mid(Str(a),2,3)+" "+a$, 0)


Systray.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Systray.pb

;
; ------------------------------------------------------------
;
;   PureBasic - SysTray example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 150, 300, 100, "PureBasic - SysTray Example", #PB_Window_SystemMenu)

  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    ; .ico format is available only on Windows
    IconName$ = "Data\CdPlayer.ico"
  CompilerElse
    IconName$ = "Data/Drive.bmp"
  CompilerEndIf

  AddSysTrayIcon(1, WindowID(0), LoadImage(0, IconName$))
  AddSysTrayIcon(2, WindowID(0), LoadImage(1, IconName$))
  SysTrayIconToolTip(1, "Icon 1")
  SysTrayIconToolTip(2, "Icon 2")

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_SysTray
      If EventType() = #PB_EventType_LeftDoubleClick
        MessageRequester("SysTray", "Left DoubleClick on SysTrayIcon "+Str(EventGadget()),0)

        ChangeSysTrayIcon (EventGadget(), LoadImage(0, IconName$))
        SysTrayIconToolTip(EventGadget(), "Changed !")
      EndIf

    EndIf
  Until Event = #PB_Event_CloseWindow

EndIf


Terrain.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Terrain.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Terrain
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 5

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
  Add3DArchive("Data", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    AmbientColor(RGB(255,255,255))

    CreateMaterial  (0, LoadTexture(0, "Terrain_Texture.jpg"))
    AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail.jpg"), #PB_Material_Add)

    CreateTerrain("terrain.png", MaterialID(0), 1, 1, 1, 4)

    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0, 128, 25, 128)

    SkyDome("clouds.jpg",10)

    Repeat
      Screen3DEvents()

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
      EndIf

      Height.f = TerrainHeight(CameraX(0), CameraZ(0))

      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, -CameraY(0)+Height+8, KeyY)

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Texture.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Texture.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Texture
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 10

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data", #PB_3DArchive_FileSystem)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    AmbientColor(RGB(255,255,255))

    LoadMesh   (0, "robot.mesh")
    CreateMaterial(0, LoadTexture(0, "r2skin.jpg"))

    CreateMaterial(1, LoadTexture(1, "clouds.jpg"))
    MaterialBlendingMode(1, #PB_Material_AlphaBlend)  ; Alphablending for this texture

    CreateEntity  (0, MeshID(0), MaterialID(1))
    CreateEntity  (1, MeshID(0), MaterialID(0))

    MoveEntity(1, 100, 0, 0)

    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0,0,0,100)

    Repeat
      Screen3DEvents()

      ClearScreen(RGB(0, 0, 0))

      If ExamineKeyboard()

        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf

        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf

      EndIf

      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
      EndIf

      RotateEntity(0, 0, 1, 0, #PB_Relative)
      RotateEntity(1, 0, 0.5, 0, #PB_Relative)

      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)

      RenderWorld()

      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End


Thread.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Thread.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Thread example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

Procedure AlertThread(Parameter)

  Repeat
    Debug "Alert !"
    Delay(3000)
  ForEver

EndProcedure

CreateThread(@AlertThread(), 154)

MessageRequester("Info", "It will display an alert every 3 seconds."+#LF$+"Click To finish the program", 0)


ToolBar.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 ToolBar.pb

;
; ------------------------------------------------------------
;
;   PureBasic - ToolBar example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 200, 195, 260, "ToolBar example", #PB_Window_SystemMenu | #PB_Window_SizeGadget)

  If CreateToolBar(0, WindowID(0))
    ToolBarStandardButton(0, #PB_ToolBarIcon_New)
    ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
    ToolBarStandardButton(2, #PB_ToolBarIcon_Save)

    ToolBarSeparator()

    ToolBarStandardButton(3, #PB_ToolBarIcon_Print)
    ToolBarToolTip(0, 3, "Print")

    ToolBarStandardButton(4, #PB_ToolBarIcon_Find)
    ToolBarToolTip(0, 4, "Find a document")

    ToolBarSeparator()

    CompilerIf #PB_Compiler_OS = #PB_OS_Windows
      ; The .ico format is available only on Windows
      ToolBarImageButton(5, LoadImage(0, "Data/CdPlayer.ico"))
    CompilerEndIf
  EndIf

  If CreateMenu(0, WindowID(0))
    MenuTitle("Project")
      MenuItem(0, "New")
      MenuItem(1, "Open")
      MenuItem(2, "Save")
  EndIf

  ;
  ; Attach our previously created ToolBar to this window
  ;

  DisableToolBarButton(0, 2, 1) ; Disable the button '2'

  ;
  ; The event loop. A ToolBar event is like a Menu event (as tools are shortcut for menu the most
  ; of the time). This is handy, as if the ToolBar buttons and the MenuItem have the same ID, then
  ; the same operation can be done on both action without any adds..
  ;

  Repeat
    Event = WaitWindowEvent()

    Select Event

      Case #PB_Event_Menu
        MessageRequester("Information", "ToolBar or Menu ID: "+Str(EventMenu()), 0)

      Case #PB_Event_CloseWindow  ; If the user has pressed on the close button
        Quit = 1

    EndSelect

  Until Quit = 1

EndIf

End   ; All the opened windows are closed automatically by PureBasic


Window3D.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Window3D.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Window 3D
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 10

#MainWindow = 0
#CloseButton = 0

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()

  Add3DArchive("Data/", #PB_3DArchive_FileSystem)
  Add3DArchive("GUI/", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/skybox.zip", #PB_3DArchive_Zip)

  InitSprite()
  InitKeyboard()
  InitMouse()

  If Screen3DRequester()

    SkyBox("desert07.jpg")

    CreateCamera(0, 0, 0, 100, 100)  ; Front camera
    CameraLocate(0,0,100,100)

    OpenWindow3D(#MainWindow, 100, 100, 300, 300, "Hello in 3D !")

            ButtonGadget3D(#CloseButton, 10, 260, 120, 25, "Close")

      ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor

    Repeat
      Screen3DEvents()

      If ExamineKeyboard()
        Input$ = KeyboardInkey()
      EndIf

      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed

        InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left), Input$)
      EndIf

      ; Handle the GUI 3D events, it's similar to regular GUI events
      ;
      Repeat
          Event = WindowEvent3D()

          Select Event
              Case #PB_Event3D_Gadget
                If EventGadget3D() = #CloseButton
                  CloseWindow3D(#MainWindow)
                EndIf

          EndSelect
         Until Event = 0

      RenderWorld()

      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf

Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf


Window.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Window.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Window example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;

;
; Open a window, and do some stuff with it...
;

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)

  MessageRequester("Information", "Click to move the Window", 0)
  ResizeWindow(0, 200, 200, #PB_Ignore, #PB_Ignore)   ; Move the window to the coordinate 200,200

  MessageRequester("Information", "Click to resize the Window", 0)
  ResizeWindow(0, #PB_Ignore, #PB_Ignore, 320, 200) ; Resize the window to 320,200

  ;
  ; This is the 'event loop'. All the user actions are processed here.
  ; It's very easy to understand: when an action occurs, the EventID
  ; isn't 0 and we just have to see what have happened...
  ;

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf

  Until Quit = 1

EndIf

End   ; All the opened windows are closed automatically by PureBasic


Xml.pb

Предложения,Замечания,Примеры( с коментариями ) присылайте: lakomet@rambler.ru
ПРИМЕР №1

Если у Вас есть хороший пример,с коментариями на русском языке, который будет понятен новичку, пришлите его мне, и в следующей версии он будет здесь.

ПРИМЕР №2 Xml.pb

;
; ------------------------------------------------------------
;
;   PureBasic - Xml
;
;    (c) 2007 - Fantaisie Software
;
; ------------------------------------------------------------
;

#Window     = 0
#TreeGadget = 0
#XML        = 0

; This procedure fills our TreeGadget, by adding the current node
; and then exploring all childnodes by recursively calling itself.
;
Procedure FillTree(*CurrentNode, CurrentSublevel)

  ; Ignore anything except normal nodes. See the manual for
  ; XMLNodeType() for an explanation of the other node types.
  ;
  If XMLNodeType(*CurrentNode) = #PB_XML_Normal

    ; Add this node to the tree. Add name and attributes
    ;
    Text$ = GetXMLNodeName(*CurrentNode) + " (Attributes: "

    If ExamineXMLAttributes(*CurrentNode)
      While NextXMLAttribute(*CurrentNode)
        Text$ + XMLAttributeName(*CurrentNode) + "=" + Chr(34) + XMLAttributeValue(*CurrentNode) + Chr(34) + " "
      Wend
    EndIf

    Text$ + ")"

    AddGadgetItem(#TreeGadget, -1, Text$, 0, CurrentSublevel)

    ; Now get the first child node (if any)
    ;
    *ChildNode = ChildXMLNode(*CurrentNode)

    ; Loop through all available child nodes and call this procedure again
    ;
    While *ChildNode <> 0
      FillTree(*ChildNode, CurrentSublevel + 1)
      *ChildNode = NextXMLNode(*ChildNode)
    Wend

  EndIf

EndProcedure

FileName$ = OpenFileRequester("Choose XML file...", "", "XML files (*.xml)|*.xml|All files (*.*)|*.*", 0)
If FileName$ <> ""

  If LoadXML(#XML, FileName$)

    ; Note:
    ;   The LoadXML() succeed if the file could be read. This does not mean that
    ;   there was no error in the XML though. To check this, XMLStatus() can be
    ;   used.
    ;
    ; Display an error message if there was a markup error
    ;
    If XMLStatus(#XML) <> #PB_XML_Success
      Message$ = "Error in the XML file:" + Chr(13)
      Message$ + "Message: " + XMLError(#XML) + Chr(13)
      Message$ + "Line: " + Str(XMLErrorLine(#XML)) + "   Character: " + Str(XMLErrorPosition(#XML))
      MessageRequester("Error", Message$)
    EndIf

    ; Note:
    ;   Even if there was an error in the XML, all nodes before the error position
    ;   are still accessible, so open the window and show the tree anyway.
    ;
    If OpenWindow(#Window, 0, 0, 500, 500, "XML Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
      TreeGadget(#TreeGadget, 10, 10, 480, 480)

      ; Get the main XML node, and call the FillTree() procedure with it
      ;
      *MainNode = MainXMLNode(#XML)
      If *MainNode
        FillTree(*MainNode, 0)
      EndIf

      ; Expand all nodes for a nicer view
      ;
      For i = 0 To CountGadgetItems(#TreeGadget) - 1
        SetGadgetItemState(#TreeGadget, i, #PB_Tree_Expanded)
      Next i

      ; Wait for the window close event.
      ;
      Repeat
        Event = WaitWindowEvent()
      Until Event = #PB_Event_CloseWindow
    EndIf

  Else
    MessageRequester("Error", "The file cannot be opened.")
  EndIf

EndIf


Changes

Changes

Changes by libraries from v3.94 to v4.00

Image

removed: UseImage() - change UseImage(#Image) to ImageID(#Image) where just the ID is needed.

added: CreateImage(#Image, Width, Height [, Depth]) - New Parameter
added: LoadImage(#Image, Filename$ [, Flags]) - New Parameter
added: CatchImage(#Image, Filename$ [, Length [, Flags]]) - New Parameters

changed: ImageDepth(#Image) - new parameter
changed: ImageHeight(#Image) - new parameter
changed: ImageWidth(#Image) - new parameter
changed: ImageID(#Image) - new parameter
changed: ImageOutput(#Image) - new parameter

String

added: StrD(Number [, NbDecimals])
added: StrQ()
added:
  HexQ()
added: BinQ()
added: StrU(): added a #PB_Quad flag
added: ValD(), ValQ()
added:
  StringByteLength() - to calculate the needed length of a string in the
  different encoding supported by PureBasic

Math

added: IntQ()

Thread

added: IsThread(Thread) - test if thread (still) exists.
added: CreateMutex() - create a mutex object
added: FreeMutex(Mutex) - destroy the object
added: LockMutex(Mutex) - wait until mutex is available and lock it
added: TryLockMutex(Mutex) - lock mutex if available, otherwise return 0 immediately
added: UnlockMutex(Mutex) - unlock the mutex so other threads can lock it

Process (New)

added: GetEnvironmentVariable(Name$) - get value of an en var
added: SetEnvironmentVariable(Name$, Value$) - set the value
added: RemoveEnvironmentVariable(Name$) - delete environment variable
added: ExamineEnvironmentVariables() - examine the currently set env variables
added: NextEnvironmentVariable() - get the next variable
added: EnvironmentVariableName() - get the variable name
added: EnvironmentVariableValue() - get the variable value
added: ProgramName() - get full path to executable
added: CountProgramParameters() - get parameters count
added: IsProgram(Program) - check if Program is a valid program created with RunProgram
added: ProgramID(Program) - get the ProcessID of the program
added: ProgramRunning(Program) - returns 1 if the program is still running
added: WaitProgram(Program [, Timeout]) - waits for the program to quit (with optional timeout) returns 1 if the program has ended
added: KillProgram(Program) - forcibly terminates the program
added: ProgramExitCode(Program) - get the exitcode of the program (only valid after program has ended)
added: CloseProgram(Program) - close the interaction with the program
added: AvailableProgramOutput(Program) - returns the number of bytes available for reading
added: ReadProgramString(Program) - read a string from the program output
added: ReadProgramData(Program, *Buffer, size) - read data from the output
added: ReadProgramError(Program) - read a message from STDERR
added: WriteProgramString(Program, String$) - write to the programs input (string)
added: WriteProgramData(Program, *Buffer, size)- write data to the programs input

changed: ProgramParameter([Index]) - get next (or at position index) parameter
changed: RunProgram() with new Flags:
  #PB_Program_Open    - open the program communicate/get information
  #PB_Program_Read    - allow to read the programs output (STDOUT)
  #PB_Program_Write   - allow to write to the programs input (STDIN)
  #PB_Program_Error   - allow to catch messages on standard error (STDERR)
  #PB_Program_Connect - connect another program's output to this program's input

File

added: FileBuffersSize(#File, Size) - Change the size of the buffers for the specified file.
added: FileID(#File) - Returns the unique ID which identifies the file in the operating system.
added: FlushFileBuffers(#File) - Ensure than all buffered operations are written to disk.
added: ReadChar(#File)
added: ReadQuad(#File)
added: ReadDouble(#File)
added: WriteChar(#File, Value)
added: WriteQuad(#File, Value)
added: WriteDouble(#File, Value)
added: ReadStringFormat(#File)
added: WriteStringFormat(#File, Format)

changed: FileSeek(#File, NewPosition) - new parameter
changed: WriteData(#File) - new parameter
changed: ReadData(#File) - new parameter
changed: Lof(#File) - new parameter
changed: Loc(#File) - new parameter
changed: ReadByte(#File) - new parameter
changed: ReadWord(#File) - new parameter
changed: ReadLong(#File) - new parameter
changed: ReadFloat(#File) - new parameter
changed: ReadString(#File [,Format]) - new parameter
changed: ReadData(#File) - new parameter
changed: WriteByte(#File, Data) - new parameter
changed: WriteWord(#File, Data) - new parameter
changed: WriteLong(#File, Data) - new parameter
changed: WriteFloat(#File, Data) - new parameter
changed: WriteString(#File, Data [,Format]) - new parameter
changed: WriteStringN(#File, Data [,Format]) - new parameter
changed: WriteData(#File, Data, Length) - new parameter

removed: UseFile() - change UseFile(#File) to FileID(#File) where just the ID is needed.

2DDrawing

added: DrawAlphaImage()
added: TextHeight(Text$) - returns the height required for the string with the current drawing font/output
added: FillArea(x, y, BorderColor [, Color]) - if BorderColor = -1, it fills the area with the same color as on (x,y)

changed: FrontColor(Color) - joined the red, green, blue to only one color value. (add RGB() for a quick adjustion of old code)
changed: BackColor(Color) - joined the red, green, blue to only one color value.
changed: NewX = DrawText(x, y, Text$ [, FrontColor [, BackColor]]) - added x/y coordinates and optional color values
changed: TextLength(Text$) -> TextWidth(Text$) - renamed

removed: Locate(x, y) - no longer useful.

Palette

removed: UsePalette()

changed: GetPaletteColor(#Palette, Index) - new Parameter
changed: SetPaletteColor(#Palette, Index, Color)
  - new Parameter

Module

changed: SetModulePosition(#Module, Position) - new Parameter
changed: GetModulePosition(#Module) - new Parameter
changed: GetModuleRow(#Module) - new Parameter
changed: StopModule(#Module) - new Parameter and -1 = stop all the modules

Database

changed: FirstDatabaseRow(#Database) - new Parameter
changed: PreviousDatabaseRow(#Database) - new Parameter
changed: NextDatabaseRow(#Database) - new Parameter
changed: GetDatabaseLong(#Database) - new Parameter
changed: GetDatabaseFloat(#Database) - new Parameter
changed: GetDatabaseString(#Database) - new Parameter
changed: DatabaseUpdate(#Database, Query$) - new Parameter
changed: DatabaseQuery(#Database, Query$) - new Parameter
changed: DatabaseColumnType(#Database, Column) - new Parameter
changed: DatabaseColumns(#Database) - new Parameter
changed: DatabaseColumnName(#Database, Column) - new Parameter

removed: UseDatabase()

Movie

changed: MovieAudio(#Movie) - new Parameter
changed: MovieHeight(#Movie) - new Parameter
changed: MovieWidth(#Movie) - new Parameter
changed: MovieInfo(#Movie) - new Parameter
changed: MovieLength(#Movie) - new Parameter
changed: RenderMovieFrame(#Movie) - new Parameter
changed: ResizeMovie(#Movie, x, y, Width, Height) - new Parameter
changed: ResumeMovie(#Movie) - new Parameter
changed: PauseMovie(#Movie) - new Parameter
changed: StopMovie(#Movie) - new Parameter
changed: MovieSeek(#Movie, Position) - new Parameter
changed: MovieStatus(#Movie) - new Parameter

removed: UseMovie()

FileSystem

added: FinishDirectory(#Directory)
added: DirectoryEntryType(#Directory)
added: DirectoryEntryDate(#Directory, DateType) - #PB_Date_Created, #PB_Date_Accessed, #PB_Date_Modified
added: GetFileDate(Filename$, DataType)
added: SetFileDate(Filename$, DataType)

changed: NextDirectoryEntry(#Directory) - new Parameter
changed: DirectoryEntryName(#Directory) - new Parameter
changed: DirectoryEntryAttributes(#Directory) - new Parameter
changed: DirectoryEntrySize(#Directory) - new Parameter

renamed: IsFilename() to CheckFilename() - function name changed

removed: UseDirectory()

Important notes: NextDirectoryEntry() no longer returns the type of entry (file/type). To be consistent with other Examine...()/Next...() functions in PB, it now only returns 0 or 1 (0 means no more objects). Use DirectoryEntryType() to find out the type of entry like you did before with the result of NextDirectoryEntry(). FinishDirectory() has to be called after each ExamineDirectory().

Menu

added: GetMenuItemText(#Menu, ItemID)
added: GetMenuTitleText(#Menu, ItemID)
added: SetMenuItemText(#Menu, ItemID, Text$)
added: SetMenuTitleText(#Menu, ItemID, Text$)

changed: DisableMenuItem(#Menu, ItemID, State) - new
  Parameter
changed: MenuID(#Menu) - new Parameter

Console

added: EnableGraphicalConsole(State)
added: RawKey()
added: Redirection and standard output support

changed: Inkey() - now returns only 1 char or nothing (instead of always 2), use RawKey() for the extra character

Note: the old console lib used a graphical console mode, which did not output to stdout correctly. (you could not call it from commandline like: myprogram.exe > test.txt) Now you have the choice with EnableGraphicalConsole(State), and if you do not explicitly set the graphical mode, the printed stuff should be properly sent to stdout, enabling you to write better console tools. This also applies to stdin and the Input() command.

AudioCD

changed: all function name from 'CDAudio' to 'AudioCD' (less french-english..)

Toolbar

added: ToolBarHeight(#ToolBar)
added: ToolBarID(#ToolBar)

changed: ToolBarTooltip(#ToolBar, Button, Text$) - New parameter
changed: DisableToolBarButton(#ToolBar, Button, State) - New parameter

Statusbar

added: StatusBarHeight(#StatusBar)
added: StatusBarID(#StatusBar)

Font

changed: FontID(#Font) - New parameter
changed: CloseFont() to FreeFont()

removed: UseFont()

Preferences

added: ability to add/change/delete keys to existing prefs files.
added: RemovePreferenceKey(Name$)
added: RemovePreferenceGroup(Name$)
added: ExaminePreferenceGroups() - get all the group names in the file
added: NextPreferenceGroup() - go to the next group name. (the group will be set as the current one)
added: PreferenceGroupName() - get the group name.
added: ExaminePreferenceKeys() - get all key names in the current group
added: NextPreferenceKey() - go to the next key.
added: PreferenceKeyName() - get key name
added: ReadPreferenceQuad(Key$, Default)
added: ReadPreferenceDouble(Key$, Default)
added: WritePreferenceQuad(Key$, Value)
added: WritePreferenceDouble(Key$, Value)

Sprite

added: SpriteID(#Sprite)
added: FlipBuffer() - added a flag, to have a CPU optimized synchro in fullscreen mode

renamed: DisplayTranslucideSprite() to DisplayTranslucentSprite()

changed: TransparentSpriteColor(#Sprite, R, G, B) to TransparentSpriteColor(#Sprite, Color)
changed: ClearScreen(R, G, B) to ClearScreen(Color)

Library

renamed: IsFunction() -> GetFunction()

Network

added: UDP support trough the flags #PB_Network_UDP and #PB_Network_TCP
added: GetClientIP()
added: GetClientPort()
added: EventServerNumber()

renamed: NetworkClientID() -> EventClient()

Keyboard

added: #PB_Keyboard_International and #PB_Keyboard_AllowSystemKeys flags to KeyboardMode()

Clipboard

changed: GetClipboardData(Type) to GetClipboardImage(#Image)
changed: SetClipboardData(Type, Data) to SetClipboardImage(#Image)

Memory

added: Unicode conversion support to PeekS() and PokeS() between ascii, UTF8 and UTF16
added: PeekC(), PeekD(), PeekQ()
added: PokeC(), PokeD(), PokeQ()
added: MemorySize() - return size of a memory block
added: MoveMemory()
added: CompareMemoryString(*Text1, *Test2 [Mode [, MaxLength [, Flags]]]) - New flags parameter for UTF16/UTF8/Ascii compare
added: MemoryStringLength() - New flags parameter for UTF16/UTF8/Ascii support

Note: The commands PeekS, PokeS, CompareMemoryString, MemoryStringLength now have a parameter that specifies the string format. Possible options are: #PB_Ascii, #PB_Unicode or #PB_UTF8. This allows you do work with strings in memory independent of the actual String mode the executable was compiled with (unicode or not).

Engine3D

changed: CreateMesh(#Mesh, MaximumVertex) - new parameter
changed: MaterialAmbientColor(#Matrix1, -1) - -1 new parameter

added: EntityRenderMode()
added: WorldShadows(#PB_Shadow_Additive)
added: ParticleEmitterDirection()
added: GetEntityMass
added: SetEntityMass
added: GetEntityFriction
added: SetEntityFriction
added: EntityPhysicBody
added: ExamineWorldCollisions
added: NextWorldCollision
added: CheckWorldCollisionEntity
added: FirstWorldCollisionEntity
added: SecondWorldCollisionEntity
added: WorldGravity
added: EnableWorldCollision
added: EnableWorldPhysics
added: Parse3DScripts

removed: RotateParticleEmitter() (was useless for now)

Window

added: GetActiveWindow() - returns the Window with the focus
added: DisableWindow(#Window, State) - disable user input to a window
added: GetWindowState(#Window) - get minimized/maximized state
added: SetWindowState(#Window, State)- set minimized/maximized state
added: StickyWindow(#Window, State) - make the window stay on top of all others even if disabled
added: SetWindowColor(#Window, Color)- set background color of the window
added: GetWindowColor(#Window) - get the current background color of the window
added: SmartWindowRefresh(#Window, State) - enable or disable the smart refresh feature

changed: OpenWindow(#Window, x, y, Width, Height, Title$ [, Flags [, ParentID]]) - flags are now at the end and optionals
changed: WaitWindowEvent([Timeout]) - added optional timeout value
changed: ResizeWindow(#Window, x, y, width, height) - '-1' parameters must be changed to #PB_Ignore
changed: SetWindowCallback(@procedure()[, #Window]) - added optional window parameter (to set callback for 1 window only)
changed: ResizeWindow(#Window, x, y, Width, Height) - now same as ResizeGadget()
changed: WindowID(#Window) - parameter no longer optional
changed: WindowHeight(#Window) - new parameter
changed: WindowWidth(#Window) - new parameter
changed: WindowX(#Window) - new parameter
changed: WindowY(#Window) - new parameter
changed: WindowMouseX(#Window) - new parameter
changed: WindowMouseY(#Window) - new parameter
changed: WindowOutput(#Window) - new parameter

renamed: EventWindowID() to EventWindow()
renamed: EventGadgetID() to EventGadget()
renamed: EventMenuID() to EventMenu()
renamed: ActivateWindow() to SetActiveWindow(#Window)

removed: MoveWindow()
removed: DetachMenu()
removed: UseWindow()
removed: Compatibility constants like #PB_EventCloseWindow (use the documented #PB_Event_CloseWindow instead)

Gadget

added: GetActiveGadget() - returns the currently active Gadget
added: GadgetType(#Gadget) - returns a constant that identifies what kind of Gadget this is
added: SetGadgetData(#Gadget, Value) - associate a value with the Gadget (works for all Gadgets.)
added: GetGadgetData(#Gadget) - read the associated value
added: SetGadgetItemData(#Gadget, Item, Value) - associate value with gadget item (works for specific gadgets only)
added: GetGadgetItemData(#Gadget, Item)
added: SetGadgetColor(#Gadget, ColorType, Color)
added: GetGadgetColor(#Gadget, ColorType)
added: SetGadgetItemColor(#Gadget, Item, ColorType, color [, Column])
added: GetGadgetItemColor(#Gadget, Item, ColorType [, Column])

changed: ActivateGadget(#Gadget) is now SetActiveGadget(#Gadget)
changed: ResizeGadget(#Gadget, x, y, width, height), -1 should now be changed to #PB_Ignore

removed: #PB_String_MultiLine

Individual Gadget changes:

CalendarGadget()
- supports SetGadgetColor() with the following colortypes:
#PB_Gadget_BackColor - background
#PB_Gadget_FrontColor - text to display days
#PB_Gadget_TitleBackColor - background of month title
#PB_Gadget_TitleFrontColor - text color of month title
#PB_Gadget_GreyTextColor - color for days not of the current month

ComboBoxGadget()
- Supports SetGadgetItemData()

ContainerGadget()
- supports SetGadgetColor() for backcolor

DateGadget()
- supports SetGadgetColor() with the same values as CalendarGadget to color the drop-down calendar
- the input area can not be colored at this time

EditorGadget()
- supports SetGadgetColor for front & backcolor
- new Flag: #PB_Editor_ReadOnly
- supports SetGadgetrAttribute() with #PB_Editor_ReadOnly to get/set the readonly flag

ExplorerListGadget()
- supports SetGadgetColor() for front & backcolor & #PB_Gadget_LineColor
- Supports GetGadgetItemAttribute(#Gadget, 0, #PB_Explorer_ColumnWidth, 2) ; return width of column 2
- Supports SetGadgetItemAttribute(#Gadget, 0, #PB_Explorer_ColumnWidth, 100, 2) ; set width of column 2 to 100
- Supports GetGadgetItemText(#Gadget, -1, 2) ; return header text for column 2
- Supports SetGadgetItemText(#Gadget, -1, "New Text", 2) ; change header text for column 2

ExplorerTreeGadget()
- supports SetGadgetColor() for front & backcolor & #PB_Gadget_LineColor

HyperLinkGadget()
- Supports SetGadgetColor() for frontcolor (background is always transparent)
- new Flag: #PB_Hyperlink_Underline - draw a line under the text (without the need for an underlined font)

ListIconGadget()
- Supports SetGadgetColor() for front and backcolor and #PB_Gadget_LineColor (for #PB_ListIcon_GridLines)
- Supports SetGadgetItemColor() for front and backcolor (can be set for each cell individually)
- Supports SetGadgetItemData()
- The event to detected a checkbox change is now #PB_EventType_Change
- Supports GetGadgetItemAttribute(#Gadget, 0, #PB_ListIcon_ColumnWidth, 2) ; return width of column 2
- Supports SetGadgetItemAttribute(#Gadget, 0, #PB_ListIcon_ColumnWidth, 100, 2) ; set width of column 2 to 100
- Supports GetGadgetItemText(#Gadget, -1, 2) ; return header text for column 2
- Supports SetGadgetItemText(#Gadget, -1, "New Text", 2) ; change header text for column 2

ListViewGadget()
- Supports SetGadgetColor() for front and backcolor (not for individual items)
- Supports SetGadgetItemData()
- new Flags:
#PB_ListView_Multiselect - allow multi selection
#PB_ListView_ClickSelect - multiselect + clicking an item selects/deselects it

MDIGadget()
- The child windows of the MDIGadget are no longer "GadgetItems", but real PB Windows. This means that you can use ANY command from the WindowLib with them (except StickyWindow()). This makes some of the MDIGadget features obsolete, therefore there are some changes:
- The Gadget no longer sends any events: all close, resize, activate events are received as Window events
- GetGadgetAttribute(), Get/SetGadgetItemAttribute, Get/SetGadgetItemState(), Get/SetGadgetItemText are all no longer supported. All this can be easily done through the Window lib commands.
- RemoveGadgetItem() no longer supported, use CloseWindow().

The Commands useable with MDIGadget now are only these: (+ the whole window lib!)
- ClearGadgetItemList() : closes all child windows
- CountGadgetItems() : get the number of child windows in the gadget
- GetGadgetState() : get the WindowID of the Window currently in the foreground of the gadget
- SetGadgetState() : set a specific window to the foreground or arrange the child windows (All like the old MDIGadget)
- AddGadgetItem() : create an MDI Child: works like this:
   AddGadgetItem(#MDI, #Window, Title$ [, ImageID [, Flags]])
     - #Window - Number for the new window (can be #PB_Any!)
     - Title$  - new window title
     - ImageID - Icon for the window (optional)
     - Flags   - Supports most of the flags for OpenWindow,
                 if none are specified, the default MDI flags are used.
   Unsupported Flags: #PB_Window_Borderless, #PB_Window_ScreenCentered, #PB_Window_WindowCentered
Note: you must now call CreateGadgetList() to add items to a MDI child, just like with normal windows.

- SetGadgetColor() can be used with #PB_Gadget_BackColor to set the MDI backcolor
- SetGadgetAttribute() can be used with #PB_MDI_Image to set a background image, #PB_MDI_TileImage can set the tile mode of the image on or off

PanelGadget()
- added GetGadgetAttribute() with #PB_Panel_ItemWidth, #PB_Panel_ItemHeight (readonly) (there must be at least 1 tab in the panel for this to work)

ProgressBarGadget()
- supports SetGadgetColor() for front & backcolor (not working with XP skins)
- supports SetGadgetAttribute() with #PB_ProgressBar_Minimum, #PB_ProgressBar_Maximum

ScrollAreaGadget()
- supports SetGadgetColor() for backcolor
- new Flag: #PB_ScrollArea_Center - when the inner size is smaller than the outer, the inner area will be centered automatically
- new options for SetGadgetAttribute(): #PB_ScrollArea_X/#PB_ScrollArea_Y to read/set the current scroll pos.
- now generates an event when being scrolled

ScrollBarGadget()
- Supports SetGadgetAttribute() with #PB_ScrollBar_Minimum, #PB_ScrollBar_Maximum, #PB_ScrollBar_PageLength

SpinGadget()
- supports SetGadgetColor for front & backcolor (to color the edit area)
- supports SetGadgetAttribute() with #PB_Spin_Minimum, #PB_Spin_Maximum
- New Flags:
#PB_Spin_ReadOnly - The StringGadget is not editable, the number is only changeable by the arrows
#PB_Spin_Numeric - The SpinGadget will automatically update the text with value of the state, so SetGadgetText is not needed.
- EventType values:
1 - the up button was pressed
-1 - the down button was pressed
#PB_EventType_Change - the text in the edit box was changed

SplitterGadget()
- new flags for Get/SetGadgetAttribute(): #PB_Splitter_FirstGadget, #PB_Splitter_SecondGadget
With GetGadgetAttribute(), they return the #Gadget Number of the stored Gadget
With SetGadgetAttribute(), you can place a new Gadget in the Splitter.

Note: The old Gadget will not be automatically freed! (it will be put out of the splitter and on the same window as the splitter) So if you do not want the old gadget to remain, remove it with FreeGadget() This allows you to switch Gadgets in a splitter without the need to re-create any of them.

Note: You cannot have a Gadget in 2 Splitters at once. So to move a Gadget from one splitter to another, replace it in the first splitter first, and then put it in the second one.

StringGadget()
- supports SetGadgetColor() for front and backcolor

TextGadget()
- Supports SetGadgetColor() for front and backcolor

TrackBarGadget()
- supports SetGadgetAttribute() with #PB_TrackBar_Minimum, #PB_TrackBar_Maximum

TreeGadget()
- Supports SetGadgetColor() for front & backcolor & #PB_Gadget_LineColor
- Supports SetGadgetItemColor() for front & backcolor
- changed management of items completly. There are no longer any nodes, just a continuous list where each item has a "sublevel". The sublevels of all items define the tree structure like this:
   + sublevel 0
   +-+ sublevel 1
   | | sublevel 1
   | +-+ sublevel 2
   | | sublevel 1
   | sublevel 0
- new parameter to AddGadgetItem: AddGadgetItem(#Gadget, Position, Text$ [, ImageID [, Flags]])
The "Flags" parameter is always required for TreeGadget and specifies the Sublevel in which to put this item.

To create the above tree, you do this:
   AddGadgetItem(#TreeGadget, -1, "sublevel 0", 0, 0)
   AddGadgetItem(#TreeGadget, -1, "sublevel 1", 0, 1)
   AddGadgetItem(#TreeGadget, -1, "sublevel 1", 0, 1)
   AddGadgetItem(#TreeGadget, -1, "sublevel 2", 0, 2)
   AddGadgetItem(#TreeGadget, -1, "sublevel 1", 0, 1)
   AddGadgetItem(#TreeGadget, -1, "sublevel 0", 0, 0)
- new GetGadgetItemAttribute() with #PB_Tree_SubLevel (readonly) to get the sublevel of any item
- removed: OpenTreeGadgetNode()
- removed: CloseTreeGadgetNode()
- removed: TreeGadgetItemNumber() - can be easily emulated by GadgetItemID() + a run trough the item list
- removed: CountTreeGadgetNodeItems() - can be easily emulated by comparing the sublevel of the items


License for the expat XML parser

License for the expat XML parser

Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
                               and Clark Cooper
Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


LGPL

LGPL

      GNU LIBRARY GENERAL PUBLIC LICENSE
           Version 2, June 1991

 Copyright (C) 1991 Free Software Foundation, Inc.
            59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

[This is the first released version of the library GPL.  It is
 numbered 2 because it goes with version 2 of the ordinary GPL.]

          Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.

  This license, the Library General Public License, applies to some
specially designated Free Software Foundation software, and to any
other libraries whose authors decide to use it.  You can use it for
your libraries, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if
you distribute copies of the library, or if you modify it.

  For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you.  You must make sure that they, too, receive or can get the source
code.  If you link a program with the library, you must provide
complete object files to the recipients so that they can relink them
with the library, after making changes to the library and recompiling
it.  And you must show them these terms so they know their rights.

  Our method of protecting your rights has two steps: (1) copyright
the library, and (2) offer you this license which gives you legal
permission to copy, distribute and/or modify the library.

  Also, for each distributor's protection, we want to make certain
that everyone understands that there is no warranty for this free
library.  If the library is modified by someone else and passed on, we
want its recipients to know that what they have is not the original
version, so that any problems introduced by others will not reflect on
the original authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that companies distributing free
software will individually obtain patent licenses, thus in effect
transforming the program into proprietary software.  To prevent this,
we have made it clear that any patent must be licensed for everyone's
free use or not licensed at all.

  Most GNU software, including some libraries, is covered by the ordinary
GNU General Public License, which was designed for utility programs.  This
license, the GNU Library General Public License, applies to certain
designated libraries.  This license is quite different from the ordinary
one; be sure to read it in full, and don't assume that anything in it is
the same as in the ordinary license.

  The reason we have a separate public license for some libraries is that
they blur the distinction we usually make between modifying or adding to a
program and simply using it.  Linking a program with a library, without
changing the library, is in some sense simply using the library, and is
analogous to running a utility program or application program.  However, in
a textual and legal sense, the linked executable is a combined work, a
derivative of the original library, and the ordinary General Public License
treats it as such.

  Because of this blurred distinction, using the ordinary General
Public License for libraries did not effectively promote software
sharing, because most developers did not use the libraries.  We
concluded that weaker conditions might promote sharing better.

  However, unrestricted linking of non-free programs would deprive the
users of those programs of all benefit from the free status of the
libraries themselves.  This Library General Public License is intended to
permit developers of non-free programs to use free libraries, while
preserving your freedom as a user of such programs to change the free
libraries that are incorporated in them.  (We have not seen how to achieve
this as regards changes in header files, but we have achieved it as regards
changes in the actual functions of the Library.)  The hope is that this
will lead to faster development of free libraries.

  The precise terms and conditions for copying, distribution and
modification follow.  Pay close attention to the difference between a
"work based on the library" and a "work that uses the library".  The
former contains code derived from the library, while the latter only
works together with the library.

  Note that it is possible for a library to be covered by the ordinary
General Public License rather than by this special one.

      GNU LIBRARY GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any software library which
contains a notice placed by the copyright holder or other authorized
party saying it may be distributed under the terms of this Library
General Public License (also called "this License").  Each licensee is
addressed as "you".

  A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.

  The "Library", below, refers to any such software library or work
which has been distributed under these terms.  A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language.  (Hereinafter, translation is
included without limitation in the term "modification".)

  "Source code" for a work means the preferred form of the work for
making modifications to it.  For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.

  Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it).  Whether that is true depends on what the Library does
and what the program that uses the Library does.

  1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.

  You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.

  2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) The modified work must itself be a software library.

    b) You must cause the files modified to carry prominent notices
    stating that you changed the files and the date of any change.

    c) You must cause the whole of the work to be licensed at no
    charge to all third parties under the terms of this License.

    d) If a facility in the modified Library refers to a function or a
    table of data to be supplied by an application program that uses
    the facility, other than as an argument passed when the facility
    is invoked, then you must make a good faith effort to ensure that,
    in the event an application does not supply such function or
    table, the facility still operates, and performs whatever part of
    its purpose remains meaningful.

    (For example, a function in a library to compute square roots has
    a purpose that is entirely well-defined independent of the
    application.  Therefore, Subsection 2d requires that any
    application-supplied function or table used by this function must
    be optional: if the application does not supply it, the square
    root function must still compute square roots.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.

In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library.  To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License.  (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.)  Do not make any other change in
these notices.

  Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.

  This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.

  4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.

  If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.

  5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library".  Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.

  However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library".  The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.

  When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library.  The
threshold for this to be true is not precisely defined by law.

  If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work.  (Executables containing this object code plus portions of the
Library will still fall under Section 6.)

  Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

  6. As an exception to the Sections above, you may also compile or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.

  You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License.  You must supply a copy of this License.  If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License.  Also, you must do one
of these things:

    a) Accompany the work with the complete corresponding
    machine-readable source code for the Library including whatever
    changes were used in the work (which must be distributed under
    Sections 1 and 2 above); and, if the work is an executable linked
    with the Library, with the complete machine-readable "work that
    uses the Library", as object code and/or source code, so that the
    user can modify the Library and then relink to produce a modified
    executable containing the modified Library.  (It is understood
    that the user who changes the contents of definitions files in the
    Library will not necessarily be able to recompile the application
    to use the modified definitions.)

    b) Accompany the work with a written offer, valid for at
    least three years, to give the same user the materials
    specified in Subsection 6a, above, for a charge no more
    than the cost of performing this distribution.

    c) If distribution of the work is made by offering access to copy
    from a designated place, offer equivalent access to copy the above
    specified materials from the same place.

    d) Verify that the user has already received a copy of these
    materials or that you have already sent this user a copy.

  For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it.  However, as a special exception,
the source code distributed need not include anything that is normally
distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.

  It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system.  Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.

  7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:

    a) Accompany the combined library with a copy of the same work
    based on the Library, uncombined with any other library
    facilities.  This must be distributed under the terms of the
    Sections above.

    b) Give prominent notice with the combined library of the fact
    that part of it is a work based on the Library, and explaining
    where to find the accompanying uncombined form of the same work.

  8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License.  Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License.  However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.

  9. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Library or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.

  10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all.  For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.

If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded.  In such case, this License incorporates the limitation as if
written in the body of this License.

  13. The Free Software Foundation may publish revised and/or new
versions of the Library General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number.  If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation.  If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.

  14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission.  For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this.  Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.

          NO WARRANTY

  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

         END OF TERMS AND CONDITIONS

           How to Apply These Terms to Your New Libraries

  If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change.  You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).

  To apply these terms, attach the following notices to the library.  It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

    <one line to give the library's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public
    License along with this library; if not, write to the Free
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  library `Frob' (a library for tweaking knobs) written by James Random Hacker.

  <signature of Ty Coon>, 1 April 1990
  Ty Coon, President of Vice

That's all there is to it!


License for the PCRE library (used by the RegularExpression library)

License for the PCRE library (used by the RegularExpression library)

PCRE LICENCE
------------

PCRE is a library of functions to support regular expressions whose syntax
and semantics are as close as possible to those of the Perl 5 language.

Release 7 of PCRE is distributed under the terms of the "BSD" licence, as
specified below. The documentation for PCRE, supplied in the "doc"
directory, is distributed under the same terms as the software itself.

The basic library functions are written in C and are freestanding. Also
included in the distribution is a set of C++ wrapper functions.

THE BASIC LIBRARY FUNCTIONS
---------------------------

Written by:       Philip Hazel
Email local part: ph10
Email domain:     cam.ac.uk

University of Cambridge Computing Service,
Cambridge, England.

Copyright (c) 1997-2007 University of Cambridge
All rights reserved.

THE C++ WRAPPER FUNCTIONS
-------------------------

Contributed by:   Google Inc.

Copyright (c) 2007, Google Inc.
All rights reserved.

THE "BSD" LICENCE
-----------------

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

    * Neither the name of the University of Cambridge nor the name of Google
      Inc. nor the names of their contributors may be used to endorse or
      promote products derived from this software without specific prior
      written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

End


         To: Fantaisie Software
             10, rue de Lausanne
             67640 Fegersheim
             France

     ********************************* PureBasic *********************************

            I would like to purchase the full version of PureBasic.

     Price per copy: 79 Euro

     Name:    _________________________________________________________

     Address: _________________________________________________________

              _________________________________________________________

              _________________________________________________________

     Country: _________________________________________________________

     Phone:   _________________________________________________________

     EMail:  _________________________________________________________

     All requested information is considered private and personal. It will not be
     distributed for any reason by Fantaisie Software.

     I am sending the shareware donation via (please mark as appropriate):-

       ( ) Euro cheque to 'Frederic Laboureur'. The safer/cheaper method for
           all European people.

       ( ) Other methods? Prior approval required via EMail. (Approvals will be
           kept as confirmation pending receipt of the registration form).

     Please send me the full program via (please mark as required):-

       ( ) EMail (Login and password to download the full version)

       ( ) Snail Mail (on CD-Rom)

     I have read the terms and conditions and agree to abide by them.

     __________________     ________________________________________

         Date                              Signature

     Notes about PureBasic:


Bitte senden an:                     == PureBasic - BESTELLFORMULAR v4 ==
----------------                      »» Feel the ... Pure ... Power ««
                                      *** * * *** *** **  *** *** ** ***
 PureBasic Team                       * * * * * * **  *** * * **  ** *
 Andrй Beer                           **  * * **  *   * * ***  ** ** *
 Siedlung 6                           *   *** * * *** **  * * *** ** ***
 09548 Deutschneudorf                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 Germany                             EMail:   andre@purebasic.com
                                     Support: http://www.purebasic.com
 -------------------------------------------------------------------------
|  => Meine Adresse (vollstдndige Angaben sind unbedingt erforderlich)    |
|                                                                         |
|                                                                         |
|  Vorname + Name:  ____________________________________________          |
|                                                                         |
|  StraЯe + Nr.:    ____________________________________________          |
|                                                                         |
|  PLZ + Ort:       ____________________________________________          |
|                                                                         |
|  Land:            ____________________________________________          |
|                                                                         |
|  Telefon:         ____________________________________________          |
|                                                                         |
|  EMail:           ____________________________________________          |
|                                                                         |
|                                                                         |
|  Hinweis:    Der Datenschutz fьr alle erbetenen Informationen wird      |
|              gewдhrleistet. Keinerlei Daten werden durch Fantaisie      |
|              Software weitergegeben.                                    |
|-------------------------------------------------------------------------|
| Ja, ich bestelle hiermit die aktuelle Vollversion von PureBasic - der   |
| neuen Basic-Programmiersprache fьr Windows 95/98/Me bzw. Win NT/2000/XP |
|                                                                         |
|      Preis pro Stьck:   79,00 Euro                                      |
|                                                                         |
|         O  per "Schneckenpost" (CDRom-Backup) "fьr alle ohne Internet"  |
|                                                                         |
|         O  per Download-Link   "fьr alle Ungeduldigen"                  |
|                                                                         |
| Hinweis: Beer Productions fungiert als deutsche Registrations-Site.     |
| Dies soll die Registrierung insbesondere fьr deutsche User vereinfachen |
| Wir leiten Bestellungen + Geld umgehend weiter. Sie erhalten Ihren      |
| Download-Link umgehend nach Geldeingang, die CD ggf. direkt vom Autor:  |
|  Frederic Laboureur, 10 rue de Lausanne, 67640 Fegersheim, Frankreich   |
|-------------------------------------------------------------------------|
| Zahlungsweise:     O  Betrag liegt in bar anbei  (auf eigenes Risiko)   |
|                    O  Betrag liegt als Euro-/EC-Scheck bei              |
|                    O  Betrag wurde ьberweisen auf  Konto 15 92 00 10,   |
|                       BLZ 120 300 00, Deutsche Kreditbank AG            |
|-------------------------------------------------------------------------|
| Ich habe die rechtlichen Erlдuterungen in der Anleitung gelesen und bin |
| mit ihnen einverstanden.                                                |
|                                                                         |
|   Datum: _______________     Unterschrift: ________________________     |
|-------------------------------------------------------------------------|
| Vorschlдge fьr PureBasic:                                               |
|                                                                         |
| _______________________________________________________________________ |
|                                                                         |
| _______________________________________________________________________ |
|                                                                         |
| _______________________________________________________________________ |
|                                                                         |
 -------------------------------------------------------------------------


Scintilla License

Scintilla License

License for Scintilla and SciTE

Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>

All Rights Reserved

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation.

NEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
OR PERFORMANCE OF THIS SOFTWARE.


License for the udis86 library

License for the udis86 library

Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 <vivek@sig9.com>
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


Table with ASCII-Codes their depending figures

Предложения,Замечания,Примеры(с коментариями)присылайте: lakomet@rambler.ru

Таблица с кодами ASCII их численное соответствие

Коды ASCII от 0 до 255 и их чиселенное значение

ASCII
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Figure
NUL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
TAB
LF
VT
FF
CR
SO
SI
DLE
DC1
DC2
DC3
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
US
ASCII
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Figure
Space
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
ASCII
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
Figure
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
ASCII
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
Figure
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
DEL
ASCII
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
Figure
Ђ
Ѓ
‚
ѓ
„
…
†
‡
€
‰
Љ
‹
Њ
Ќ
Ћ
Џ
ђ
‘
’
“
”
•
–
—

™
љ
›
њ
ќ
ћ
џ
ASCII
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
Figure
Ў
ў
Ј
¤
Ґ
¦
§
Ё
©
Є
«
¬

®
Ї
°
±
І
і
ґ
µ
¶
·
ё
№
є
»
ј
Ѕ
ѕ
ї
ASCII
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
Figure
А
Б
В
Г
Д
Е
Ж
З
И
Й
К
Л
М
Н
О
П
Р
С
Т
У
Ф
Х
Ц
Ч
Ш
Щ
Ъ
Ы
Ь
Э
Ю
Я
ASCII
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
Figure
а
б
в
г
д
е
ж
з
и
й
к
л
м
н
о
п
р
с
т
у
ф
х
ц
ч
ш
щ
ъ
ы
ь
э
ю
я

Расширенное описание самых важных управляющих символов (символы ASCII от 0 до 31)

ASCII | Description
0 | Нулевой символ, типично (и особенно в PureBasic) имеет обыкновение указывать конец строки.
1 | Начало заголовка. Указывает начало совокупности данных, или часть заголовка совокупности данных.
2 | Начало текста. Типично посылаемый как первый символ в блоке текста, во время передачи данных.
3 | Конец текста. Типично посылаемый как последний символ в блоке текста, во время связи передачи данных.
4 | Конец заголовка. Используемый, чтобы указать конец передачи данных.
5 | Запрос. Посылается в приёмник для того, чтобы получить ответ.
6 | Подтверждение.Посылается приемником чтобы указать, что он получил и/или понял запрос.
7 | Сигнал. Производит звуковой сигнал (обычно динамик персонального компьютера выводит 'beep')
8 | Backspace. Возврат на один символ в лево (удаляет символ слева перед перемещением)
9 | Tab. Горизонтальная табуляция, типично используемая, чтобы форматировать текст.
10 | Linefeed. Перевод строки.
11 | Vertical tab. Вертикальная табуляция. То же, что и горизонтальная табуляция, но перемещение осуществляется вниз.
12 | Перевод страницы. Используется чтобы указать принтеру (текстовый режим) переходить к следующий странице (листу)
13 | Возврат каретки.
14 | Переход на верхний регистр.
15 | Переход на нижний регистр.
16 | Переключение. Используется, чтобы указать, что следующий символ это данные, а не управляющий символ.
17 | Управление прибором 1. Используется, чтобы включить часть оборудования.
18 | Управление прибором 2. Используется, чтобы включить часть оборудования. Его действие зависит от контекста
19 | Управление прибором 3. Используется, чтобы выключить часть оборудования.
20 | Управление прибором 4. Используется, чтобы выключить часть оборудования. Его действие зависит от контекста.
21 | Отрицательное подтверждение. Используется, чтобы сигнализировать о не-включенных или не-полученных данных.
22 | Синхронизированное ожидание (простой). Речь идет о сигнале, посылаемом в регулярном интервале, чтобы показывать, что канал связи пуст, но еще активен.
23 | Конец передачи блока. Это не то же самое, что и конец ленты.
24 | Cancel. Отмена, это значит, что ранее посланные данные должны быть проигнорированы.
25 | Конец у средства информации. Используется, чтобы сообщить, например о конце лентопротяжного устройства.
26 | Замена. Символ, который используется для информирования о том, что символ был заменен.
27 | Escape. Символ выхода.
28 | Разделитель файла
29 | Разделитель группы
20 | Разделитель записей
31 | Разделитель модуля


Working with different number bases

Working with different number bases

(Примечание: Примеры на этой странице используют символ ^ - 'возведенный в степень' - это только для удобства в этом документе, у PureBasic в настоящее время, нет этого оператора! Используйте вместо этого функцию - Pow () из библиотеки "Math")

Введение - в конце страницы описание Зубкова С.В. 1999 Издательство «ДМК Пресс»

Система счисления представляет способ представить числа, используя определенное количество возможных символов. Наиболее распространенной является базовая 10 (десятичная система), использующая 10 цифр (от 0 до 9), и является понятной для большинства людей.

Цель этой главы, объяснить различные системы счисления, и как вы можете работать с ним. В отличие от десятичной системы, компьютер работает в двоичной (основание 2) и при определенных обстоятельствах, это поможет понять способ работы (например, при использовании логических операторов, масок и т.д.).

Обзор систем счисления

Десятичная система

Представьте себе десятичное число, и затем как они разбиты на отдельные цифры. Мы берем число 1234 как пример. Разбирание этого числа на отдельные цифры дает в итоге:
  1   2   3   4
Now think of what the headings for each column are. We know they are units, tens, hundreds and thousands, laid out like this:
  1000  100   10    1
     1    2    3    4
We can see that the number 1234 is made up out of
    1*1000=1000
  + 2* 100= 200
  + 3*  10=  30
  + 4*   1=   4
  Total   =1234
If we also look at the column headings, you'll see that each time you move one column to the left we multiply by 10, which just so happens to be the number base. Each time you move one column to the right, you divide by 10. The headings of the columns can be called the weights, since to get the total number we need to multiply the digits in each column by the weight. We can express the weights using indices. For example 10^2 means '10 raised to the power of two' or 1*10*10 (=100). Similarly, 10^4 means 1*10*10*10*10 (=10000). Notice the pattern that whatever the index value is, is how many times we multiply the number being raised. 10^0 means 1 (since we multiply by 10 no times). Using negative numbers shows that we need to divide, so for example 10^-2 means 1/10/10 (=0.01). The index values make more sense when we give each column a number - you'll often see things like 'bit 0' which really means 'binary digit in column 0'.
  In this example, ^ means raised to the power of, so 10^2 means 10 raised to the power of 2.
  Column number              3     2     1     0
  Weight (index type)     10^3  10^2  10^1  10^0
  Weight (actual value)   1000   100    10     1
  Example number (1234)      1     2     3     4
A few sections ago we showed how to convert the number 1234 into its decimal equivalent. A bit pointless, since it was already in decimal but the general method can be shown from it - so this is how to convert from any number to its decimal value:
  B = Value of number base

  1) Separate the number in whatever base you have into it's columns. For
     example, if we had the value 'abcde' in our fictional number base 'B',
     the columns would be:   a   b   c   d   e

  2) Multiply each symbol by the weight for that column (the weight being
     calculated by 'B' raised to the power of the column number):
       a * B^4 = a * B * B * B * B
       b * B^3 = b * B * B * B
       c * B^2 = c * B * B
       d * B^1 = d * B
       e * B^0 = e

  3) Calculate the total of all those values. By writing all those values in their
     decimal equivalent during the calculations, it becomes far easier to see the
     result and do the calculation (if we are converting into decimal).
Converting in the opposite direction (from decimal to the number base 'B') is done using division instead of multiplication:
  1) Start with the decimal number you want to convert (e.g. 1234).

  2) Divide by the target number base ('B') and keep note of the result and the
     remainder.

  3) Divide the result of (2) by the target number base ('B') and keep note of
     the result and the remainder.

  4) Keep dividing like this until you end up with a result of 0.

  5) Your number in the target number base is the remainders written in the order
     most recently calculated to least recent. For example, your number would be
     the remainders of the steps in this order 432.
More specific examples will be given in the sections about the specific number bases.

Binary System

Everything in a computer is stored in binary (base 2, so giving symbols of '0' or '1') but working with binary numbers follows the same rules as decimal. Each symbol in a binary number is called a bit, short for binary digit. Generally, you will be working with bytes (8 bits), words (16 bits) or longwords (32 bits) as these are the default sizes of PureBasic's built in types. The weights for a byte are shown:
  (^ means 'raised to the power of', number base is 2 for binary)
  Bit/column number         7     6     5     4     3     2     1     0
  Weight (index)          2^7   2^6   2^5   2^4   2^3   2^2   2^1   2^0
  Weight (actual value)   128    64    32    16     8     4     2     1
So, for example, if we had the number 00110011 (Base 2), we could work out the value of it like this:
    0 * 128
  + 0 *  64
  + 1 *  32
  + 1 *  16
  + 0 *   8
  + 0 *   4
  + 1 *   2
  + 1 *   1
  =      51
An example of converting back would be if we wanted to write the value 69 in binary. We would do it like this:
  69 / 2 = 34 r 1     ^
  34 / 2 = 17 r 0    /|\
  17 / 2 =  8 r 1     |
   8 / 2 =  4 r 0     |    Read remainders in this direction
   4 / 2 =  2 r 0     |
   2 / 2 =  1 r 0     |
   1 / 2 =  0 r 1     |
  (Stop here since the result of the last divide was 0)

  Read the remainders backwards to get the value in binary = 1000101
Another thing to consider when working with binary numbers is the representation of negative numbers. In everyday use, we would simply put a negative symbol in front of the decimal number. We cannot do this in binary, but there is a way (after all, PureBasic works mainly with signed numbers, and so must be able to handle negative numbers). This method is called 'twos complement' and apart from all the good features this method has (and won't be explained here, to save some confusion) the simplest way to think of it is the weight of the most significant bit (the MSb is the bit number with the highest weight, in the case of a byte, it would be bit 7) is actually a negative value. So for a two's complement system, the bit weights are changed to:
  (^ means 'raised to the power of', number base is 2 for binary)
  Bit/column number         7     6     5     4     3     2     1     0
  Weight (index)         -2^7   2^6   2^5   2^4   2^3   2^2   2^1   2^0
  Weight (actual value)  -128    64    32    16     8     4     2     1
and you would do the conversion from binary to decimal in exactly the same way as above, but using the new set of weights. So, for example, the number 10000000 (Base 2) is -128, and 10101010 (Base 2) is -86.

To convert from a positive binary number to a negative binary number and vice versa, you invert all the bits and then add 1. For example, 00100010 would be made negative by inverting -> 11011101 and adding 1 -> 11011110.

This makes converting from decimal to binary easier, as you can convert negative decimal numbers as their positive equivalents (using the method shown above) and then make the binary number negative at the end.

Binary numbers are written in PureBasic with a percent symbol in front of them, and obviously all the bits in the number must be a '0' or a '1'. For example, you could use the value %110011 in PureBasic to mean 51. Note that you do not need to put in the leading '0's (that number would really be %00110011) but it might help the readability of your source if you put in the full amount of bits.

Hexadecimal System

Hexadecimal (for base 16, symbols '0'-'9' then 'A'-'F') is a number base which is most commonly used when dealing with computers, as it is probably the easiest of the non-base 10 number bases for humans to understand, and you do not end up with long strings of symbols for your numbers (as you get when working in binary).

Hexadecimal mathematics follows the same rules as with decimal, although you now have 16 symbols per column until you require a carry/borrow. Conversion between hexadecimal and decimal follows the same patterns as between binary and decimal, except the weights are in multiples of 16 and divides are done by 16 instead of 2:
  Column number              3      2      1      0
  Weight (index)          16^3   16^2   16^1   16^0
  Weight (actual value)   4096    256     16      1
Converting the hexadecimal value BEEF (Base 16) to decimal would be done like this:
    B * 4096 = 11 * 4096
  + E *  256 = 14 *  256
  + E *   16 = 14 *   16
  + F *    1 = 15 *    1
  =                48879
And converting the value 666 to hexadecimal would be done like this:
  666 / 16 = 41 r 10    ^
   41 / 16 =  2 r  9   /|\    Read digits in this direction, remembering to convert
    2 / 16 =  0 r  2    |     to hex digits where required
  (Stop here, as result is 0)
  Hexadecimal value of 666 is 29A
The really good thing about hexadecimal is that it also allows you to convert to binary very easily. Each hexadecimal digit represents 4 bits, so to convert between hexadecimal and binary, you just need to convert each hex digit to 4 bits or every 4 bits to one hex digit (and remembering that 4 is an equal divisor of all the common lengths of binary numbers in a CPU). For example:
  Hex number          5        9        D        F           4E
  Binary value      0101     1001     1101     1111       01001110
When using hexadecimal values in PureBasic, you put a dollar sign in front of the number, for example $BEEF.

To finish this topic you find here a table with the numbers 0 till 255 in decimal, binary and hexadecimal format.

Двоичная система счисления

Практически все существующие сейчас компьютерные системы, включая Intel, используют для всех вычислений двоичную систему счисления. В их электрических цепях напряжение может принимать два значения, и эти значения назвали нулем и единицей. Двоичная система счисления как раз и использует только эти две цифры, а вместо степеней десяти, как в обычной десятичной системе, здесь используют степени двойки. Чтобы перевести двоичное число в десятичное, надо сложить двойки в степенях, соответствующих позициям, где в двоичном стоят единицы. Например:

10010110b = 1*27+0*26+0*25+1*24+0*23+1*22+1*21+0*20 =
= 128+16+4+2 = 150

Чтобы перевести десятичное число в двоичное, можно, например, просто делить его на 2, записывая 0 каждый раз, когда число делится на два, и 1, когда не делится (табл. 2).

 Остаток Разряд
150/2 = 75
75/2 = 37
37/2 = 18
18/2 = 9
9/2 = 4
4/2 = 2
2/2 = 1
1/2 = 0 		0
1
1
0
1
0
0
1 		0
1
2
3
4
5
6
7
Результат: 10010110b

Таблица 2. Перевод числа из десятичной системы в двоичную

Чтобы отличать двоичные числа от десятичных, в ассемблерных программах в конце каждого двоичного числа ставят букву «b».

Биты, байты и слова

Минимальная единица информации называется битом. Бит может принимать только два значения — обычно 0 и 1. На самом деле эти значения совершенно необязательны — один бит может принимать значения «да» и «нет», показывать присутствие и отсутствие жесткого диска, является ли персонаж игры магом или воином — важно лишь то, что бит имеет только два значения. Но далеко не все величины принимают только два значения, а значит, для их описания нельзя обойтись одним битом.

Рис. 1. Байт

Рис. 1. Байт

Единица информации размером восемь бит называется байтом. Байт — это минимальный объем данных, который реально может использовать компьютерная программа. Даже чтобы изменить значение одного бита в памяти, надо сначала считать байт, содержащий его. Биты в байте нумеруют справа налево, от нуля до семи, нулевой бит часто называют младшим битом, а седьмой — старшим.

Так как всего в байте восемь бит, байт может принимать до 28 = 256 разных значений. Байт используют для представления целых чисел от 0 до 255 (тип unsigned char в С), целых чисел со знаком от -128 до +127 (тип signed char в С), набора символов ASCII (тип char в С) или переменных, принимающих менее 256 значений, например для представления десятичных чисел от 0 до 99. Следующий по размеру базовый тип данных — слово. Размер одного слова в процессорах Intel — два байта.

Рис. 2. Слово

Рис. 2. Слово

Биты с 0 по 7 составляют младший байт слова, а биты с 8 по 15 — старший. В слове содержится 16 бит, а значит, оно может принимать до 216 = 65 536 разных значений. Слова используют для представления целых чисел без знака со значениями 0 — 65 535 (тип unsigned short в С), целых чисел со знаком со значениями от -32 768 до +32 767 (тип short int в С), адресов сегментов и смещений при 16-битной адресации. Два слова подряд образуют двойное слово, состоящее из 32 бит, а два двойных слова составляют одно учетверенное слово (64 бита). Байты, слова и двойные слова — основные типы данных, с которыми мы будем работать.

В компьютерах, использующих процессоры Intel, все данные хранятся так, что младший байт находится по младшему адресу, так что слова записываются задом наперед, то есть сначала (по младшему адресу) записывают последний (младший) байт, а потом (по старшему адресу) записывают первый (старший) байт. Если из программы всегда обращаться к слову как к слову, а к двойному слову как к двойному слову, это не оказывает никакого влияния. Но если вы хотите прочитать первый (старший) байт из слова в памяти, придется увеличить адрес на 1. Двойные и учетверенные слова записываются так же — от младшего байта к старшему.

Шестнадцатеричная система счисления

Главное неудобство двоичной системы счисления — это размеры чисел, с которыми приходится обращаться. На практике с двоичными числами работают, только если необходимо следить за значениями отдельных бит, а когда размеры переменных превышают хотя бы четыре бита, используется шестнадцатеричная система. Эта система хороша тем, что она гораздо более компактна, компактнее десятичной, и тем, что перевод в двоичную систему и обратно происходит очень легко. В шестнадцатеричной системе используется 16 «цифр»: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А, В, С. D, E, F, и номер позиции цифры в числе соответствует степени, в которую надо возвести число 16, так что:

96h = 9 * 16 + 6 = 150

Перевод в двоичную систему и обратно осуществляется крайне просто — вместо каждой шестнадцатеричной цифры подставляют соответствующее четырехзначное двоичное число:

9h = 1001b, 6h = 0110b, 96h = 10010110b

В ассемблерных программах при записи чисел, начинающихся с А, В, С, D, E, F, в начале приписывается цифра 0, чтобы нельзя было спутать такое число с названием переменной или другим идентификатором. После шестнадцатеричных чисел ставится буква «h» (см. табл. 3).

Десятичное Двоичное Шестнадцатиричное
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 		0000b
0001b
0010b
0011b
0100b
0101b
0110b
0111b
1000b
1001b
1010b
1011b
1100b
1101b
1110b
1111b
10000b 		00h
01h
02h
03h
04h
05h
06h
07h
08h
09h
0Ah
0Bh
0Ch
0Dh
0Eh
0Fh
10h

Таблица 3. Двоичные и шестнадцатеричные числа

Числа со знаком

Легко использовать байты, слова или двойные слова для представления целых положительных чисел — от 0 до 255, 65 535 или 4 294 967 295 соответственно. Чтобы использовать те же самые байты или слова для представления отрицательных чисел, существует специальная операция, известная как дополнение до двух. Для изменения знака числа выполняют инверсию, то есть заменяют в двоичном представлении числа все единицы нулями и нули единицами, а затем прибавляют 1. Например, пусть используются переменные типа слова:

150 = 0096h = 0000 0000 1001 0110b
инверсия дает: 1111 1111 0110 1001b
+1 = 1111 1111 0110 1010b = 0FF6Ah

Проверим, что полученное число на самом деле -150: сумма с +150 должна, быть равна нулю:

+150 + (-150) = 0096h + FF6Ah = 10000h ;

Единица в l6-м разряде не помещается в слово, и значит, мы действительно получили 0. В этом формате старший (7-й, 15-й, 31-й для байта, слова, двойного слова соответственно) бит всегда соответствует знаку числа 0 — для положительных и 1 — для отрицательных. Таким образом, схема с использованием дополнения до двух выделяет для положительных и отрицательных чисел равные диапазоны: -128 — +127 — для байта, -32 768 — +32 767 — для слов, -2 147 483 648 — +2 147 483 647 — для двойных слов.

Логические операции

Один из широко распространенных вариантов значений, которые может принимать один бит, — это значения «правда» и «ложь», используемые в логике, откуда происходят так называемые «логические операции» над битами. Так, если объединить «правду» и «правду» — получится «правда», а если объединить «правду» и «ложь» — «правды» не получится. В ассемблере нам встретятся четыре основные операции — И (AND), ИЛИ (OR), исключающее ИЛИ (XOR) и отрицание (NOT), действие которых приводится в таблице 4.

И ИЛИ ИСКЛЮЧАЮЩЕЕ ИЛИ НЕ
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1 		0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1 		0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0 		NOT 0 = 1
NOT 1 = 0

Таблица 4. Логические операции

Все эти операции побитовые, поэтому, чтобы выполнить логическую операцию над числом, надо перевести его в двоичный формат и выполнить операцию над каждым битом, например:

96h AND 0Fh = 10010110b AND 00001111b = 00000110b = 06h


Break : Continue

Break : Continue

Синтаксис
Break [Level]
Описание
Break применяется для выхода в любой момент из следующих циклов: Repeat, For, ForEach и While. Необязательный параметр 'level' указывает на количество циклов из которых следует выйти (если присутствуют несколько вложеных циклов). Без этого параметра Break обеспечивает выход только из текущего цикла.

Пример: Простой цикл

  For k=0 To 10
    If k=5
      Break  ; Will exit directly from the For/Next loop
    EndIf
    Debug k
  Next

Пример: Вложенные циклы

  For k=0 To 10
    Counter = 0
    Repeat
      If k=5
        Break 2 ; Will exit directly from the Repeat/Until and For/Next loops
      EndIf
      Counter+1
    Until Counter > 1
    Debug k
  Next

Синтаксис
Continue
Описание
Continue вызывает прекращение текущей итерации и переход к следующей, для циклов: Repeat, For, ForEach и While.

Пример:

  For k=0 To 10
    If k=5
      Continue  ; Will skip the 'Debug 5' and go directly to the next iteration
    EndIf
    Debug k
  Next


Using the command line compiler

Использование компилятора в консоли

Введение

Компилятор командной строки находится в подкаталоге 'Compilers\' папки PureBasic. Более простой способ добавить эту директорию в PATH, чтобы получить доступ к командам в этом каталоге. Различные параметры могут быть заданы при запуске компилятора:

Параметры командной строки

/? : Показывает краткий текст справки.

/COMMENTED : создать прокомментированный '.asm' выходной файл при создании исполняемого файла. Этот файл может быть повторно собран позже, когда будут сделаны необходимые изменения. Данная опция для опытых программистов.

/DEBUGGER : активизирует отладчик.

/EXE "Filename" : создать автономный исполняемый файл или DLL, с указанным именем и по указанному пути.

/ICON "IconName" : добавляет указанную iconName иконку в исполняемый файл.

/INLINEASM : Включить встроенные функции inline asm feature (подпрограммы ассемблера могут быть записаны непосредственно в исходном тексте BASIC).

/RESIDENT "Filename" : создать резидентный файл, с указанным именем.

/CONSOLE: создать выходной файл в формате Console. Заданный по умолчанию формат - Win32.

/DLL: создать выходной файл DLL.

/XP: добавляет поддержку стиля Windows XP.

/REASM: Повторно собирает файл PureBasic.asm в исполняемый файл. Это позволяет использовать функцию /COMMENTED, последующее модифицирование asm, и создает выполнимую программу снова.

/LINENUMBERING: Добавляет информацию об ошибках исходных файлов в исполняемые. Это позволяет OnError library сообщать о файле и о номере строки с ошибкой.

/QUIET: Отключить весь ненужный текстовый вывод, очень полезно при использовании другого редактора.

/STANDBY: Загружает компилятор в память и ждет внешние команды (редактор, скрипты...).

/MMX, /3DNOW, /SSE или /SSE2: создать выходной файл под указанный микропроцессор. Программа будет работать правильно только на компьютере с этим видом микропроцессора.

/DYNAMICCPU: создать выходной файл под используемый микропроцессор, который включает в себя все доступные процессору процедуры. При запуске программы, она динамически определяет тип процессора и выбирает наиболее подходящие процедуры. Создаёт большие, но быстрые программы.

/RESOURCE "Filename": добавить файл ресурсов (.rc) в исполняемый файл или DLL. Это должно быть не откомпилированным файлом ресурса, а ascii (текстовым) файлом с директивами. Определяет только один ресурс, но этот файл может включать другие описания ресурсов если нужно.

/LINKER "ResponseFile": Укажите файл, который содержит команды, которые передаются непосредственно компоновщику. В Windows, PureBasic использует PellesC linker (polink), больше информации о возможных опциях можно найти в соответствующей документации.

/IGNORERESIDENT "Filename": не загружает указанный резидентный файл, во время запуска компилятора. В основном полезно при обновлении программы, когда резидентный файл уже существует, поэтому она не будет загружать его.

/CONSTANT Name=Value: Создает указанную константу с данным выражением. Пример: 'pbcompiler test.pb /CONSTANT MyConstant=10'. Константа #MyConstant будет создана на лету со значением 10 прежде, чем программа будет откомпилирована.

/UNICODE: Использовать уникод вместо ascii для управления строками.

/THREAD: Использовать время выполнения потока для строк и общих подпрограмм.

/SUBSYSTEM "Name": Использует указанную подсистему, чтобы заменить ряд внутренних функций.

Следующие две опции транслятора необходимы для того, чтобы создать программы, работающие на Microsoft Vista OS. Оба варианта встроенного файла манифеста, поэтому они игнорируются в более ранних версиях windows. With none of these switches, the exe will run as a normal user as well, but with virtualisation turned on (i.e. registry and file redirection). It is recommended to use the /USER switch to turn of virtualisation for all programs that comply to the standard user priviledges, as it is only intended for compatibility for older programs. These options are also available in the IDE compiler options.
/ADMINISTRATOR: Will cause the program to request admin priviledges at start. The program will not run without it. This option is needed. Note: You can also debug programs with this flag, but only with the standalone gui debugger (as it must run in elevated mode as well).
/USER: программа будет работать с именем пользователя, который запустил ее. Виртуализация для exe отключена.

Пример:

  CLI> pbcompiler sourcecode.pb
The compiler will compile the source code and execute it.

  CLI> pbcompiler sourcecode.pb /DEBUGGER /INLINEASM
The compiler will compile the source code and execute it with debugger and inline asm support.
  CLI> pbcompiler "C:\Project\Source\DLLSource.pb" /EXE "C:\Project\project.dll" /DLL
The compiler will compile the source code (here with full path) and create the dll "project.dll" in the given directory.


Color table

Таблица цветов

Обзор

Ниже приводится таблица цветов представляющая набор из 216 различных цветов, в разных вариациях. Она дает обзор возможных цветов и их численных значений (в шестнадцатеричном формате!)

Значения цвета в приведенной ниже таблице, отображаются в формате RGB (красный, зеленый, синий). Например синий цвет в верхнем правом углу означает шестнадцатеричное значение '$0000FF', где два 'FF' голубая составляющая.

Для всех команд PureBasic, которые ожидают значение цвета, у вас есть две возможности:

1.) Используйте значения отображая их в порядке RGB() разделяя значение каждого компонента цвета на (R)ed (G)reen и (B)lue (красный, зеленый, синий):
  Plot(0, 0, RGB($00,$00,$FF))
2.) Используйте номер цвета как целое значение - но тогда красный и синий должны поменяться местами, так, чтобы цвет был в формате BGR. Например голубой цвет будет выглядеть так:
  Plot(0, 0, $FF0000))
Значение RGB высчитывается следующим образом: Цвет = R + G*256 + B*65536

Таблица цветов

000000 | 000033 | 000066 | 000099 | 0000CC | 0000FF

330000 | 330033 | 330066 | 330099 | 3300CC | 3300FF

660000 | 660033 | 660066 | 660099 | 6600CC | 6600FF

990000 | 990033 | 990066 | 990099 | 9900CC | 9900FF

CC0000 | CC0033 | CC0066 | CC0099 | CC00CC | CC00FF

FF0000 | FF0033 | FF0066 | FF0099 | FF00CC | FF00FF

003300 | 003333 | 003366 | 003399 | 0033CC | 0033FF

333300 | 333333 | 333366 | 333399 | 3333CC | 3333FF

663300 | 663333 | 663366 | 663399 | 6633CC | 6633FF

993300 | 993333 | 993366 | 993399 | 9933CC | 9933FF

CC3300 | CC3333 | CC3366 | CC3399 | CC33CC | CC33FF

FF3300 | FF3333 | FF3366 | FF3399 | FF33CC | FF33FF

006600 | 006633 | 006666 | 006699 | 0066CC | 0066FF

336600 | 336633 | 336666 | 336699 | 3366CC | 3366FF

666600 | 666633 | 666666 | 666699 | 6666CC | 6666FF

996600 | 996633 | 996666 | 996699 | 9966CC | 9966FF

CC6600 | CC6633 | CC6666 | CC6699 | CC66CC | CC66FF

FF6600 | FF6633 | FF6666 | FF6699 | FF66CC | FF66FF

009900 | 009933 | 009966 | 009999 | 0099CC | 0099FF

339900 | 339933 | 339966 | 339999 | 3399CC | 3399FF

669900 | 669933 | 669966 | 669999 | 6699CC | 6699FF

999900 | 999933 | 999966 | 999999 | 9999CC | 9999FF

CC9900 | CC9933 | CC9966 | CC9999 | CC99CC | CC99FF

FF9900 | FF9933 | FF9966 | FF9999 | FF99CC | FF99FF

00CC00 | 00CC33 | 00CC66 | 00CC99 | 00CCCC | 00CCFF

33CC00 | 33CC33 | 33CC66 | 33CC99 | 33CCCC | 33CCFF

66CC00 | 66CC33 | 66CC66 | 66CC99 | 66CCCC | 66CCFF

99CC00 | 99CC33 | 99CC66 | 99CC99 | 99CCCC | 99CCFF

CCCC00 | CCCC33 | CCCC66 | CCCC99 | CCCCCC | CCCCFF

FFCC00 | FFCC33 | FFCC66 | FFCC99 | FFCCCC | FFCCFF

00FF00 | 00FF33 | 00FF66 | 00FF99 | 00FFCC | 00FFFF

33FF00 | 33FF33 | 33FF66 | 33FF99 | 33FFCC | 33FFFF

66FF00 | 66FF33 | 66FF66 | 66FF99 | 66FFCC | 66FFFF

99FF00 | 99FF33 | 99FF66 | 99FF99 | 99FFCC | 99FFFF

CCFF00 | CCFF33 | CCFF66 | CCFF99 | CCFFCC | CCFFFF

FFFF00 | FFFF33 | FFFF66 | FFFF99 | FFFFCC | FFFFFF


Compiler Directives

Compiler Directives

Синтаксис
CompilerIf <constant expression>
  ...
[CompilerElse]
  ...
CompilerEndIf
Описание
Если результатом <constant expression> будет истина, то код в CompilerIf будет откомпилирован, иначе будет полностью проигнорирован. Это полезно при составлении Multi-OS программам, то есть, код предназначен для компиляции на разных операционных системах, чтобы вставить в код несколько программных секций, использующих специфические функции системы. Операторы And и Or могут использоваться в <constant expression> , чтобы комбинировать несколько условий.

Пример:

  CompilerIf #PB_Compiler_OS = #PB_OS_Linux And #PB_Compiler_Processor = #PB_Processor_x86
    ; some Linux and x86 specific code..
  CompilerEndIf

Синтаксис
CompilerSelect <numeric constant>
  CompilerCase <numeric constant>
    ...
  [CompilerDefault]
    ...
CompilerEndSelect
Описание
Работает как обычный Select : EndSelect, за исключением того, что разрешается использовать только одно числовое значение в каждом сравнении. Она сообщает компилятору, какой код должен быть откомпилирован. Это полезно при составлении Multi-OS программам, то есть, код предназначен для компиляции на разных операционных системах, чтобы вставить в код несколько программных секций, использующих специфические функции системы.

Пример:

  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_AmigaOS
      ; some Amiga specific code
    CompilerCase #PB_OS_Linux
      ; some Linux specific code
  CompilerEndSelect

Синтаксис
CompilerError <string constant>
Описание
Генерирует ошибку, так как если бы это была ошибка синтаксиса и отображает сообщение. Это может быть полезно при выполнении специализированных процедур и сообщать, что исходный код не подходит для данной операционной системы.

Пример:

  CompilerIf #PB_Compiler_OS = #PB_OS_AmigaOS
    CompilerError "AmigaOS isn't supported, sorry."
  CompilerElse
    CompilerError "OS supported, you can now comment me."
  CompilerEndIf

Синтаксис
EnableExplicit
DisableExplicit
Описание
Активирует (EnableExplicit) или дезактивирует (DisableExplicit) явный режим. Когда он активен, все variables, которые явно не были объявлены Define, Global, Protected или Static не будут приняты и компилятор сгенерирует ошибку. Это может помочь устранить орфографические ошибки при использовании переменных.

Пример:

  EnableExplicit

  Define a

  a = 20 ; Ok, as declared with 'Define'
  b = 10 ; Will raise an error here

Синтаксис
EnableASM
DisableASM
Описание
Включает (EnableASM) или выключает (DisableASM) встроенный ассемблер. Когда он активен, все команды ассемблера доступны в исходном коде. Для большей информации смотрите inline assembler.

Пример:

  ; x86 assembly example
  ;
  Test = 10

  EnableASM
    MOV dword [v_Test],20
  DisableASM

  Debug Test ; Will be 20

Зарезервированные Константы

У PureBasic есть несколько зарезервированных констант:
  #PB_Compiler_OS : Позволяет узнать, на какой платформе работает компилятор:
    - #PB_OS_Windows : Компилятор работает на Windows
    - #PB_OS_Linux   : Компилятор работает на Linux
    - #PB_OS_AmigaOS : Компилятор работает на AmigaOS
    - #PB_OS_MacOS   : Компилятор работает на Mac OS X

  #PB_Compiler_Processor : определяет тип процессора:
    - #PB_Processor_x86     : процессор архитектуры x86 (также называемой IA-32 или x86-32)
    - #PB_Processor_x64     : процессор архитектуры x86-64 (также называемой x64, AMD64 или Intel64)
    - #PB_Processor_PowerPC : архитектура процессора PowerPC
    - #PB_Processor_mc68000 : архитектура процессора Motorola 68000

  #PB_Compiler_Date     : дата в момент компилирования, формат PureBasic date.
  #PB_Compiler_File     : полный путь и имя компилируемого файла, полезно для debug.
  #PB_Compiler_FilePath : полный путь, полезно для debug.
  #PB_Compiler_Line     : номер строки компилируемого файла, полезно для debug.
  #PB_Compiler_Procedure: название текущей процедуры, если строка находится внутри procedure.
  #PB_Compiler_Version  : версия компилятора, целое '420' для версии 4.20.
  #PB_Compiler_Home     : полный путь к каталогу PureBasic, полезно для include files
  #PB_Compiler_Debugger : равно 1, если включен runtime debugger, в противном случае равно 0.
  #PB_Compiler_Thread   : равно 1, если выполнимая программа откомпилирована в безопасном режиме, в противном случае равно 0.
  #PB_Compiler_Unicode  : равно 1, если выполнимая программа откомпилирована в режиме unicode mode, в противном случае равно 0.


Compiler Functions

Compiler Functions

Синтаксис

Size = SizeOf(Type)
Описание
Команда SizeOf возвращает размер в байтах, любой сложной Structure (не работает с такими типами, как слово и с плавающей запятой), Interface или variables. Это полезно во многих случаях, особенно при использовании API команд.

Примечание: в режиме unicode символ занимает 2 байта, в Ascii символ занимает 1 байт.

Пример:

  Structure Person
    Name.s
    ForName.s
    Age.w
  EndStructure

  Debug "The size of my friend is "+Str(Sizeof(Person))+" bytes" ; will be 10 (4+4+2)

  John.Person\Name = "John"

  Debug SizeOf(John) ; will be also 10
Примечание: если переменные и структуры имеют одинаковое название, структура будет иметь приоритет над переменной.

Синтаксис
Index = OffsetOf(Structure\Field)
Index = OffsetOf(Interface\Function())
Описание
OffsetOf может использоваться, чтобы узнать индекс Structure или индекс Функции интерфейса. При применении с Interface, у индекса будет смещение в памяти, поэтому считается IndexOfTheFunction*4.

Пример:

  Structure Person
    Name.s
    ForName.s
    Age.w
  EndStructure

  Debug OffsetOf(Person\Age) ; will be 8 as a string is 4 byte in memory

  Interface ITest
    Create()
    Destroy(Flags)
  EndInterface

  Debug OffsetOf(ITest\Destroy()) ; will be 4

Синтаксис
Result = Subsystem(<constant string expression>)
Описание
Subsystem может использоваться, чтобы узнать, используется ли subsystem для компилируемой программы. Название подсистемы не чувствительно к регистру.

Пример:

  CompilerIf Subsystem("OpenGL")
    Debug "Compiling with the OpenGL subsystem"
  CompilerEndIf

Синтаксис
Result = Defined(Name, Type)
Описание
Defined проверяет, определен ли уже данный объект в пределах исходного кода как structure, interface, variables и т.д. или нет. Параметр 'Name' должен указываться без какого-либо дополнения (например, без '#' для constant, без '()' для array, linkedlist или map).

Параметр 'Type' может быть одним из следующих значений:
  #PB_Constant
  #PB_Variable
  #PB_Array
  #PB_LinkedList
  #PB_Map
  #PB_Structure
  #PB_Interface
  #PB_Procedure
  #PB_Function
  #PB_OSFunction

Пример:

  #PureConstant = 10

  CompilerIf Defined(PureConstant, #PB_Constant)
    Debug "Constant 'PureConstant' is already declared"
  CompilerEndIf

  Test = 25

  CompilerIf Defined(Test, #PB_Variable)
    Debug "Variable 'Test' is already declared"
  CompilerEndIf

Синтаксис
Result = ClearStructure(*Pointer, Structure)
Описание
ClearStructure освобождает область памяти занятую structured и устанавливает значение всех полей на ноль. 'Structure' имя структуры, которая должна быть очищена. Существующая внутренняя проверка не гарантирует, что структура находится в соответствующей области памяти. Эта функция только для опытных пользователей и должна использоваться с осторожностью.

Пример:

  Structure People
    Name$
    LastName$
    Age.l
  EndStructure

  Student.People\Name$ = "Paul"
  Student\LastName$ = "Morito"
  Student\Age = 10

  ClearStructure(@Student, People)

  ; Will print empty strings as the whole structure has been cleared. All other fields have been resetted to zero.
  ;
  Debug Student\Name$
  Debug Student\LastName$
  Debug Student\Age


Data

Data

Введение

PureBasic позволяет использовать Data, для хранения предварительно определеных блоков информации, в рамках вашей программы. Иногда полезно иметь значения по умолчанию (например, текстовые сообщения) или в игре, чтобы определить заранее путь для Sprite.

DataSection должен ставиться в начале блока данных. Это означает, что все метки, а также данные компонента будут храниться в этом разделе программы, доступ к которой быстрее, чем к коду раздела. Data будет использоваться, чтобы ввести данные. EndDataSection должен указываться, если после Data секции следует программный код. Одним из преимуществ является то, что вы можете поставить несколько полей одинаковых данных Data в различные части исходного кода. Restore и Read используються для извлечения данных.

Команды

Синтаксис
DataSection
Описание
Начало раздела данных.

Синтаксис
EndDataSection
Описание
Конец раздела данных.

Синтаксис
Data.Тип
Описание
Определяет данные. Тип может быть только простым basic type (integer, long, word, byte, ascii, unicode, float, double, quad, character, string). В строке может находиться любое количество данных, разделённых запятой ','.

Пример:

  Data.l 100, 200, -250, -452, 145
  Data.s "Hello", "This", "is ", "What ?"
Для опытных программистов: также возможно использовать procedure address или label address в Data если его тип устанавливается как целое число (.i). (Применение типа сохраняет точный адрес и на 32-битных и 64-разрядных средах.) Это может быть использовано например для создания таблиц виртуальных функций,.

Пример:

  Procedure Max(Number, Number2)
  EndProcedure

  Label:

  DataSection
    Data.i ?Label, @Max()
  EndDataSection

Пример:

  Interface MyObject
    DoThis()
    DoThat()
  EndInterface

  Procedure This(*Self)
    MessageRequester("MyObject", "This")
  EndProcedure

  Procedure That(*Self)
    MessageRequester("MyObject", "That")
  EndProcedure

  m.MyObject = ?VTable

  m\DoThis()
  m\DoThat()

  DataSection
    VTable:
      Data.i ?Procedures
    Procedures:
      Data.i @This(), @That()
  EndDataSection

Синтаксис
Restore label
Описание
Это ключевое слово позволяет поместить указатель начала блока для команды Read Все используемые метки, должны быть помещены в пределах DataSection, потому что данные при компиляции обрабатываются как отдельный от кода программы блок, и может быть отделена от метки, если она была сделана за пределами данного раздела.

Пример:

  Restore StringData
  Read.s MyFirstData$
  Read.s MySecondData$

  Restore NumericalData
  Read.l a
  Read.l b

  Debug MyFirstData$
  Debug a

  End

  DataSection
    NumericalData:
      Data.l 100, 200, -250, -452, 145

    StringData:
      Data.s "Hello", "This", "is ", "What ?"
  EndDataSection

Синтаксис
Read[.<type>] <variable>
Описание
Считывает следующие доступные данные. Следующие доступные данные могут изменяться посредством команды Restore. По умолчанию следующие доступные данные - это первые объявленные данные. Тип данных, определяется суффиксом типа, default type будет использоваться, если он не будет определен.


Debugger keywords in PureBasic

Debugger keywords in PureBasic

Overview

Полное описание всех функций отладчика, вы найдете в дополнительных главах Using the debugger или Using the debugging Tools.

Ниже приведены команды отладчика, которые вы можете использовать в исходном коде.

Синтаксис

  CallDebugger
Описание
Вызывает "debugger" и сразу же останавливает выполнение программы.

Синтаксис
  Debug <expression> [, DebugLevel]
Описание
Отображает окно DebugOutput и результат в нем. Выражение может быть любым правильным выражением PureBasic, от числового до строки. Важным моментом является то, что команда отладки и связанное с ней выражение полностью игнорируются, когда режим отладки отключен.

Примечание: так же не будет работать, если вы укажите за командной отладки Debug строки (например Debug LoadImage(1,"test.bmp")). Они не будут откомпилированы с отключеным отладчиком!

Это значит, что эта команда может использоваться, при тестировании программы и нет необходимости включать её при компилировании исполняемого файла.

'DebugLevel' уровень приоритета сообщения отладки. Все нормальные сообщения Debug (если не указан debug level) отображаются автоматически. Если указан уровень, то сообщение появляется только тогда, когда указанное значение DebugLevel (устанавливаемое с помощью команды DebugLevel) равно или превышает это значение. Это делает возможным проводить иерархический режим отладки, отображая более точную информацию используя функцию DebugLevel.

Синтаксис

  DebugLevel <constant expression>
Описание
Устанавливает текущий уровень, для сообщений отладки 'Debug' .

Примечание: уровень отладки устанавливается во времени компиляции, поэтому необходимо поместить команду DebugLevel перед любыми другими командами Debug, чтобы убедиться, что это затрагивает все команды Debug.

Синтаксис

  DisableDebugger
Описание
Отключает отладчик (проверку исходного кода), для конанд следующих после команды DisableDebugger.

Синтаксис

  EnableDebugger
Описание
Включает отладчик (проверку исходного кода), для конанд следующих после команды EnableDebugger (если отладчик был ранее выключен командой DisableDebugger).

Примечание: EnableDebugger не имеет никакого эффекта, если отладчик полностью выключен в IDE (смотрите Compiler settings).


Define

Define

Синтаксис
Define.<type> [<variable> [= <expression>], <variable> [= <expression>], ...]
Описание
Если не указываются никакие переменные величины <variables>, Define используется, чтобы изменить заданный по умолчанию тип переменных variables, которые затем будут использоватся без объявления (включая параметры procedure, параметры метода interface и параметры считываемых Read данных). Начальный заданный по умолчанию тип - целое число (.i). Каждая переменная может иметь значение по умолчанию, предназначенное непосредственно к ней.

Пример:

  D = E + F
  Define.w
  A = B + C
D, E и F, будут объявлены как переменные типа Integer, потому что не указан тип. A, B и C будут объявлены как переменные типа слово (.w), так как тип не указан, а тип по умолчанию был изменён на тип слово (.w).

Если переменная величина указана, Define объявляет только эти переменные как "defined type" и не будет изменять заданный по умолчанию тип для остальных переменных. Если Вы не зададите значение переменным, то значение для них будет 0.

Пример:

  Define.b a, b = 10, c = b*2, d ; these 4 variables will be byte typed (.b)

Синтаксис
Define <variable>.<type> [= <expression>] [, <variable>.<type> [= <expression>], ...]
Описание
Другая возможность для объявления переменных величин командой Define.

Пример:

  Define MyChar.c
  Define MyLong.l
  Define MyWord.w

  Debug SizeOf(MyChar)   ; will give 1 byte
  Debug SizeOf(MyLong)   ; will give 4 bytes
  Debug SizeOf(MyWord)   ; will give 2 bytes


Dim

Dim

Синтаксис
Dim name.<type>(<expression>, [<expression>], ...)
Описание
Dim используется для создания новых массивов (начальное значение каждого элемента будет равно нулю). Массив в PureBasic может быть любого типа, включая structured, и пользовательские типы. После того как массив был создан, можно изменить его размер, при это его содержание будет удалено, если не использовать ReDim. Массивы динамически распределяются, это означает, что variable или expression могут использоваться, для определения их новых размеров.

Когда Вы определяете новый массив, пожалуйста обратите внимание, что нумерация элементов в PureBasic начинается с элемента 0. Например, если Вы используете Dim(10), у массива будет 11 элементов, элементы от 0 до 10. Такое поведение является различным для статических массивов в structures.

Новые массивы всегда являются локальными, это означает, что Global или Shared должны использоваться, если массив, объявленный в основном исходном коде, должен использоваться в процедурах. Возможно передавать массив как параметр procedure - при использовании Array. Она будет передана "как ссылка" (что означает, что массив не будет копироваться, а функции будет манипулировать исходный массив).

Чтобы удалить содержимое массива и освободить память, вызовите Dim с именем массива и нулевым количеством элементов.

Используйте Swap для перемещения элементов в массиве.

Примечание: проверка на доступ к массиву выполняется только при включенном Debugger.

Пример:

  Dim MyArray.l(41)
  MyArray(0) = 1
  MyArray(1) = 2

Пример: Mногомерные массивы

  Dim MultiArray.b(NbColumns, NbLines)
  MultiArray(10, 20) = 10
  MultiArray(20, 30) = 20

Пример: Массив как параметр процедуры

  Procedure fill(Array A.l(1), length)  ; the 1 stays for the number of dimensions in the array
    For i = 0 To length
      A(i) = i
    Next i
  EndProcedure

  Dim A.l(10)
  fill(A(), 10)  ; the array A() will be passed as parameter here

  Debug A(5)
  Debug A(10)

Синтаксис
ReDim name.<type>(<expression>, [<expression>], ...)
Описание
ReDim используется для изменения размера уже объявленного массива, сохраняя его содержимое. Новый размер может быть большим или меньшим, но число заполненных значений массива не может быть изменено.

Если ReDim используется с многомерным массивом, то только последний размер может быть изменен.

Пример:

  Dim MyArray.l(1) ; We have 2 elements
  MyArray(0) = 1
  MyArray(1) = 2

  ReDim MyArray(4) ; Now we want 5 elements
  MyArray(2) = 3

  For k = 0 To 2
    Debug MyArray(k)
  Next

Синтаксис
ArraySize(Array() [, Dimension])
Описание
Возвращает размер массива, указанный Dim или ReDim. Для многомерных массивов, может быть указано 'Dimension', чтобы получить определенный размер измерения. Первое измерение начинается с 1.

Пример:

  Dim MyArray.l(10)
  Debug ArraySize(MyArray()) ; Will print '10'

  Dim MultiArray.l(10, 20, 30)
  Debug ArraySize(MultiArray(), 2) ; Will print '20'
@arraysizereturns вернёт-1, если массив не может быть объявлен (не хватает памяти ...).

Пример:

  Dim test.q(99999999999999999)

  If ArraySize(test()) <> -1
      test(12345) = 123  ; all is well
  Else
    Debug "Array 'test' couldn't be declared."
  EndIf


Building a DLL

Building a DLL

PureBasic позволяет создавать стандартные Microsoft Windows DLL (динамическая библиотека), разделенные объекты (.so) в Linux и динамических библиотек (.dylib) в MacOS X. Код DLL похож на код PureBasic, за исключением того, что код не может находиться вне процедуры.

В DLL, весь код выполняется в нутри процедуры. Когда пишется общедоступная процедура (то есть: доступная для других программ), необходимо использовать команду ProcedureDLL (или ProcedureCDLL если процедура должна быть в формате 'CDecl') используется вместо Procedure и DeclareDLL (или DeclareCDLL) при объявлении. Это единственное необходимое изменение в программе.

При компиляции выберите пункт 'Shared DLL' в качестве выходного формата ('Compiler Option' в редакторе PureBasic или /DLL в командной строке) и DLL с указанным именем будет создана в выбранном каталоге.

Пример:

  ProcedureDLL MyFunction()
    MessageRequester("Hello", "This is a PureBasic DLL !", 0)
  EndProcedure

  ; Now the client program, which use the DLL
  ;
  If OpenLibrary(0, "PureBasic.dll")
    CallFunction(0, "MyFunction")
    CloseLibrary(0)
  EndIf
Для опытных программистов: имеются 4 специальные процедуры, которые вызываются автоматически с помощью Windows, когда происходит одно из следующих событий:

- DLL был добавлен новый процесс
- DLL был удалён процесс
- DLL был добавлен новый поток
- DLL была удалён поток

Чтобы управлять этими событиями, можно объявить 4 специальные процедуры: AttachProcess(Instance), DetachProcess(Instance), AttachThread(Instance) и DetachThread(Instance). Это означает, что эти 4 процедуры, зарезервированые имена и не могут быть использованы программистом для других целей.

Советы по созданию DLL's:

- Объявление массивов, связанных списков или карты командами Dim, NewList или NewMap должна происходить в пределах процедуры AttachProcess.
- Не пишите программный код вне процедур. Единственное исключение - объявление переменных или структур.
- Подпрограммы инициализации технологии DirectX не должны быть записаны в процедуре AttachProcess.

Примечание о возвращении строк от DLL's:

Если Вы хотите возвратить строку из DLL, строка должна быть объявлена как Global прежде, чем её использовать.

Пример:

  Global ReturnString$

  ProcedureDLL.s MyFunction(var.s)
    ReturnString$ = var + " test"
    ProcedureReturn ReturnString$
  EndProcedure
Если строка не объявлена как Global, она будет локальной в процедуре и будет освобождена в конце процедуры, следовательно не сможет использоватья в вызвавшей эту процедуру программе.

При использовании CallFunction() (или любой другой начинающейся с CallXXX), которая возвращает указатель на строку, она может быть прочитана PeekS().

Пример:

  String.s = PeekS(CallFunction(0, "FunctionName", Parameter1, Parameter2))


Enumerations

Enumerations

Синтаксис
Enumeration [<constant> [Step <constant>]]
  #Constant1
  #Constant2 [= <constant>]
  #Constant3
  ...
EndEnumeration
Описание
Enumerations (перечисления) удобны для объявления набора (последовательности) констант, не используя постоянные числа. Первая константа(постоянная) перечисления принимает значение 0, следующая константа(постоянная) принимает значение 1 и т.д.... Можно изменить начальное значение в списке и изменить значение для приращения каждой константы. Если необходимо, можно присвоить численное значение постоянной (с помощью оператора '=') и константа будет использовать эту новую величину в качестве базовой. Поскольку Enumerations принимает только целые числа, то числа с плавающей запятой будут округляется до ближайшего целого числа. Зарезервированная константа #PB_Compiler_EnumerationValue сохраняет следующее значение, которое будет использоваться в перечислении. Может быть полезно при использовании нескольких цепочек перечислений.

Пример: Простое перечисление

  Enumeration
    #GadgetInfo ; будет 0
    #GadgetText ; будет 1
    #GadgetOK   ; будет 2
  EndEnumeration

Пример: Перечисление с шагом

  Enumeration 20 Step 3
    #GadgetInfo ; будет 20
    #GadgetText ; будет 23
    #GadgetOK   ; будет 26
  EndEnumeration

Пример: Перечисление с динамическим изменением

  Enumeration
    #GadgetInfo      ; будет 0
    #GadgetText = 15 ; будет 15
    #GadgetOK        ; будет 16
  EndEnumeration

Пример: Связанные (цепочечные) перечисления

  Enumeration
    #GadgetInfo ; будет 0
    #GadgetText ; будет 1
    #GadgetOK   ; будет 2
  EndEnumeration

  Enumeration #PB_Compiler_EnumerationValue
    #GadgetCancel ; будет 3
    #GadgetImage  ; будет 4
    #GadgetSound  ; будет 5
  EndEnumeration


For : Next

For : Next

Синтаксис
For <variable> = <expression1> To <expression2> [Step <constant>]
  ...
Next [<variable>]
Описание
For : Next используется для создания цикла с заданными параметрами. За каждую итерацию цикла значение переменной <variable> повышается на 1 (или на значение соответствующее <constant>, если указан [шаг <constant>]), когда значение переменной <variable> достигает <expression2> выполнение цикла прекращается.

Возможно досрочное прекращение выполнения цикла с помощью команды Break или досрочное завершение текущей итераци цикла с помощью Continue.

For : Next функционирует только с целыми значениями. Постоянная Step может быть отрицательной.

Пример:

  For k = 0 To 10
    ...
  Next
программа совершит 11 итераций (от 0 до 10) и завершит работу.

Пример:

  For k = 10 To 1 Step -1
    Debug k
  Next
программа совершит 10 итераций (от 10 до 1) и завершит работу.

Пример:

  a = 2
  b = 3
  For k = a+2 To b+7 Step 2
    ...
  Next k
Here, the program will loop 4 times before quitting, (k is increased by a value of 2 at each loop, so the k value is: 4-6-8-10). The "k" after the "Next" indicates that "Next" is ending the "For k" loop. If another variable, is used the compiler will generate an error. It can be useful to nest several "For/Next" loops.

Пример:

  For x=0 To 320
    For y=0 To 200
      Plot(x,y)
    Next y
  Next x
Примечание: Имейте в виду, что значение <expression2> также может быть изменено внутри цикла For: Next, что может привести к бесконечному циклу, если будет не правильное значение.


ForEach : Next

ForEach : Next

Синтаксис
ForEach LinkedList() Or Map()
  ...
Next [LinkedList() Or Map()]
Описание
ForEach проходит все элементы указанного связанного списка LinkedList() или Map(), начиная с первого элемента до последнего элемента. Если LinkedList() или Map() будет пуст, цикл ForEach: Next будет немедленно отменён. Чтобы посмотреть все команды управления связанными списками, нажмите здесь. Чтобы посмотреть все команды управления картами, нажмите здесь.

При использовании связанных списков, можно удалить delete или добавить add элементы в ходе цикла. Кроме того, можно изменить текущий элемент командой ChangeCurrentElement(). После одного из таких изменений следующая итерация цикла продолжается со следующего элемента текущего списка.

Вы можете оставить цикл ForEach : Next в любое время с помощью команды Break, команда Continue позволяет перейти к следующей итерации, без дальнейшего выполнения кода внутри цикла.

Пример: связанный список

  NewList Number()

  AddElement(Number())
  Number() = 10

  AddElement(Number())
  Number() = 20

  AddElement(Number())
  Number() = 30

  ForEach Number()
    Debug Number() ; Will output 10, 20 and 30
  Next

Пример: карта

  NewMap Country.s()

  Country("US") = "United States"
  Country("FR") = "France"
  Country("GE") = "Germany"

  ForEach Country()
    Debug Country()
  Next


Normal Math-Formulas

Математические формулы (геометрия 2D)

Введение

Ниже вы найдете различные математические формулы. Они должны служить как справочное пособие, а также помочь, преодолеть пробелы в знаниях. Так как без хороших знаний математики, сложные игры и приложения не могут быть реализованы.

Примечание: Вместо знака '^' Пожалуйста, используйте функцию PureBasic POW () из библиотеки 'Math'. 'PI' означает постоянное значение числа "PI = 3.1415...". Пример реализации кода в PureBasic: A = PI*r^2 будет A = PI*Pow(r,2)

Площадь

l = Длина стороны
e = Диагональ
A = Площадь
U = Периметр

Площадь: A = l^2

Периметр: U = 4*l

Диагональ: e = SQR(2)*l

Ромб / ромбические

l = Длина стороны
b = Ширина
A = Площадь
U = Периметр

Площадь: A = l*b

Периметр: U = 4*l

Прямоугольник

l = Длина
b = Ширина
e = Диагональ
A = Площадь
U = Периметр

Площадь: A = l*b

Периметр: U = 2*l+2*b

Диагональ: e = SQR(l^2+b^2))

Ромбовидная / Параллелограмм

l = Длина
h = Высота
b = Ширина
A = Площадь
U = Периметр

Площадь: A = l*h

Периметр: U = 2*l+2*b

Трапеция

a = Сторона 1
b = Сторона 2
c = Сторона 3
d = Сторона 4
lm = Длина медианы
h = Высота
A = Площадь
U = Периметр

Площадь: A = (a+c)/2*h

Периметр: U = a+b+c+d

Длина медианы: lm = (a+c)/2

Треугольник

a = Сторона 1
b = Сторона 2
c = Сторона 3
l = Side length
h = Высота
A = Площадь
U = Периметр

Площадь:
A = (l*h)/2
A = 1/4*SQR(U*(U-2*a)*(U-2*b)*(U-2*c))

Периметр: U = a+b+c

Многоугольник

l = Длина стороны
d = Диаметр вписанного круга
D = Диаметр описанного круга
n = Количество сторон
a = Угол центра
ss = Угол вершин
A = Площадь
U = Периметр

Диаметр вписанного круга: d = SQR(D*D-l*l)

Диаметр описанного круга: D = SQR(d*d+l*l)

Длина стороны: l = D*SIN(180/n)

Угол центра: a = 360/n

Угол вершин: ss = 180-a

Площадь: A = n*l*d/4

Периметр: U = l*n

Круг

r = Радиус
D = Диаметр
A = Площадь
U = Периметр

Площадь:
A = PI*r^2
A = PI/4*d^2

Периметр:
U = 2*PI*r
U = PI*d

Сектор круга

r = Радиус
D = Диаметр
l = Длина хорды
lb = Длина дуги
a = Угол в центре
A = Площадь
U = Периметр

Длина хорды: l = 2*r*SIN(a/2)

Длина дуги: lb = PI*r*a/180

Площадь:
A = PI*D^2*a/1440
A = lb*r/2

Периметр: U = lb+D

Сегмент круга

r = Радиус
D = Диаметр
l = Длина хорды
lb = Длина дуги
a = Угол в центре
b = Ширина
A = Площадь
U = Периметр

Длина хорды:
l = 2*r*SIN(a/2)
l = 2*SQR(b*(2*r-b))

Длина дуги: lb = PI*r*a/180

Ширина:
b = l/2*TAN(a/4)
b = r-SQR(r^2-l^2/4)

Радиус: r = b/2+l^2/(8*b)

Площадь:
A = PI*d^2*a/1440-(l*(r-b))/2
A = (lb*r-l*(r-b))/2

Площадь: U = lb+l

Кольцо

d = Внутренний диаметр
D = Внешний диаметр
dm = Средний диаметр
b = Ширина
A = Площадь

Средний диаметр: dm = (D+d)/2

Площадь:
A = PI*dm*b
A = PI/4*(D^2-d^2)

Потребление памяти изображением

a = ширина изображения (в пикселях)
b = высота изображения (в пикселях)
bits = Битовая глубина цвета изображения (в битах)

Размер = a * b * (bits / 8)

Расстояние между двумя точками

(x1|y1) = координаты XY пункта No. 1
(x2|y2) = координаты XY пункта No. 2
a = Расстояние между пунктами

a = SQR((x1-x2)^2 + (y1-y2)^2)

"Смешивание" двух значений

a = 1-ый Номер
b = 2-ой Номер
v = Отношение (0% - 100%)
e = Результат

e = ((a*v)/100) + ((b*(100-v)) / 100)


General Rules

Общие синтаксические правила

В PureBasic установлены правила, которые никогда не меняются. К ним относятся:

Комментарий

Комментарии обозначаются ; . Любой текст после символа ; игнорируется компилятором до конца строки.

Пример:

  If a = 10 ; это коментарий.

Функции

Все функции должны иметь имя, затем '(', иначе она не будет рассматриваться как функция, (даже при нулевом параметре функции).

Пример:

    EventWindow() ; это функция.
    EventWindow   ; это переменная.

Константы

Все константы начинаются с #. Они могут быть объявлены только один раз в коде и всегда содержат их значения по умолчанию. (Компилятор заменяет все постоянные имена соответствующими значениями при компиляции исполняемого файла.)

Пример:

  #Hello = 10 ; это константа.
  Hello  = 10 ; это переменная.

Метки

Все метки должны сопровождаться : (двоеточие). Имена метки не могут содержать операторы (+,-,...) или специальные символы (ß, ä, ö, ü...).

Пример:

  I_am_a_label:

Выражения

Выражением называют любую последовательность кода, которая может быть оцененной. Выражение может объединить любую переменную величину, константу или функцию того же типа. Когда вы используете числа, перед ними можно ставить знак $, чтобы уточнить, что речь идет о шестнадцатеричном значении или % чтобы уточнить, что это двоичное число. Без любого из этих знаков число будет обработано как десятичное. Строки букв должны быть ограниченны кавычками.

Пример:

  a = a + 1 + (12 * 3)

  a = a + WindowHeight(#Window) + b/2 + #MyConstant

  If a <> 12 + 2
    b + 2 >= c + 3
  EndIf

  a$ = b$ + "this is a string value" + c$

  Foo = Foo + $69 / %1001  ; Hexadecimal and binary number usage

Цепочка команд

Вы можете размещать любое количество команд в одной строке, разделяя их ':'.

Пример:

  If IsCrazy = 0 : MessageRequester("Info", "Not Crazy") : Else : MessageRequester("Info", "Crazy") : EndIf

Типичные понятия в руководстве

У следующих слов, использованных в этом учебнике, всегдаодин и тот же смысл:
<variable> : базисная переменная.
<expression> : выражение как объяснено выше.
<constant> : числовая константа.
<label> : метка программы (признак передачи управления).
<type> : любой тип, (стандартный или структурируемый).

Прочее

- В этом руководстве все темы представлены в алфавитном порядке, чтобы уменьшить время поиска.

- Значения, возвращаемые командами - чаще всего целое число Integer, в противном случае, тип указан в описании синтаксиса команды.


Global

Глобальная переменная

Синтаксис
Global[.<type>] <variable[.<type>]> [= <expression>] [, ...]
Описание
Global позволяет использовать переменные variables которые будут использоваться как глобальные, то есть, она может быть доступна в рамках процедуры Procedure. В этом случае команда Global должна быть вызвана перед объявлением процедуры. Каждой переменной можно перед этим задать значение по умолчанию. Если после Global указывается тип, то тип по умолчанию изменяется. Global может также использоваться с arrays, linkedlists и maps.

Чтобы использовать локальные переменные в процедуре, которые имеют те же названия, как глобальные переменные, то смотрите на ключевые слова Protected и Static.

Пример: With variables

  Global a.l, b.b, c, d = 20

  Procedure Change()
    Debug a  ; Will be 10 as the variable is global
  EndProcedure

  a = 10
  Change()

Пример: With array

  Global Dim Array(2)

  Procedure Change()
    Debug Array(0)  ; Will be 10 as the array is global
  EndProcedure

  Array(0) = 10
  Change()

Пример: With default type

  ; 'Angle' and 'Position' will be a float, as they didn't have a specified type
  ;
  Global.f Angle, Length.b, Position


Gosub : Return

Gosub : Return

Синтаксис
Gosub MyLabel

MyLabel:
  ...
Return
Описание
Gosub используется для вызова подпрограммы MyLabel. После Gosub должна быть указана метка подпрограммы MyLabel, ваша программа продолжится в позиции метки, пока не встретится оператор Return. После выполнения команды Return программа вернется к строке, следующей за оператором Gosub. Gosub полезен для создания быстрого структурированного кода.

Рrocedures являются еще одной альтернативой для разработки структурированной программы. Gosub может быть использован только в основном коде программы, но не в procedures.

Пример:

  a = 1
  b = 2
  Gosub ComplexOperation
  Debug a
  End

  ComplexOperation:
    a = b*2+a*3+(a+b)
    a = a+a*a
  Return

Синтаксис
FakeReturn
Описание
Если Вы хотите совершить прыжок (Goto) из подпрограммы в другую часть кода (вне подпрограммы) - Вы должны использовать FakeReturn для имитации выхода из подпрограммы.Если вы не используете эту команду, ваша программа даст сбой. Не рекомендуется использовать эту команду, потому что хорошо созданная программа не использует Goto. Но иногда, по причине быстродействия, это может помочь программисту.

Пример:

  Gosub SubRoutine1

  SubRoutine1:
    ...
    If a = 10
      FakeReturn
      Goto Main_Loop
    EndIf
  Return


Handles and Numbers

Маркеры и Числа (Идентификационные номера)

Номера

Все созданные объекты идентифицируются произвольным числом (который не является идентификатором объекта). В этом руководстве, номера записываются как #Number (например, у каждого созданного Gadget есть номер #Gadget ).

Числа, которые назначают объектам, не должны быть константами, однако, они должны быть неповторимы для каждого объекта (изображение может иметь то же самое число как Gadget, потому что они - различные типы объектов). Эти номера используются, чтобы позднее получить доступ к этим объектам в программе.

Например, функции обработки событий, вернут эти номера:
  EventGadget()
  EventMenu()
  EventWindow()

Идентификаторы

Все объекты имеют уникальный номер, присвоенный им системой. Эти уникальные номера называются идентификаторами. Некоторым функциям в качестве параметра необходим идентификатор, а не номер PureBasic. В этом руководстве это обозначается как ID.

Пример:

  ImageGadget(#Gadget, x, y, Width, Heigth, ImageID [, Flags])
  ; #Gadget needs to be the number you want to assign to the Gadget
  ; ImageID needs to a handle to the image.
Чтобы получить идентификатор объекта, существуют специальные функции, такие как:
  FontID()
  GadgetID()
  ImageID()
  ThreadID()
  WindowID()
Большая часть функций, которые создают объекты, возвращает идентификатор как результат. Это верно только если #PB_Any не использовалось для создания объекта. Если используется #PB_Any, то эти команды возвращают номер объекта (назначенный PB), а не идентификатор (ID).

Пример:

  GadgetHandle = ImageGadget(...)


Managing projects

Managing projects

The IDE comes with features to easily handle larger projects. These features are completly optional. Programs can be created and compiled without making use of the project management. However, once a program consists of a number of source code and maybe other related files, it can be simpler to handle them all in one project.

Project management overview

A project allows the management of multiple source codes and other related files in one place with quick access to the files through the project tool. Source files included in a project can be scanned for AutoComplete even if they are not currently open in the IDE. This way functions, constants, variables etc. from the entire project can be used with AutoComplete. The project can also remember the source files that are open when the project is closed and reopen them the next time to continue working exactly where you left off.

Furthermore, a project keeps all the compiler settings in one place (the project file) and even allows to manage multiple "compile targets" per project. A compile target is just a set of compiler options. This way multiple versions of the same program, or multiple smaller programs in one project can be easily compiled at once.

All filenames and paths in a project are stored relative to the project file which allows a project to be easily moved to another location as long as the relative directory structure remains intact.

The Project menu

New Project
Creates a new project. If there is a project open at the time it will be closed. The project options window will be opened where the project filename has to be specified and the project can be configured.

Open Project
Opens an existing project. If there is a project open at the time it will be closed. Previously open source codes of the project will be opened as well, depending on the project configuration.

Recent Projects
This submenu shows a list of recently opened project files. Selecting one of the entries openes this project.

Close Project
Closes the currently open project. The settings will be saved and the currently open source files of the project will be closed, depending on the project configuration.

Project Options
Opens the project options window. See below for more information.

Add File to Project
Adds the currently active source code to the current project. Files belonging to the project are marked with a ">" in the file panel.

Remove File from Project
Removes the currently active source from the current project.

Open Project folder
Opens the folder that contains the project file in whatever file manager is available on the system.

The project options window

The project options window is the central configuration for the project. The general project settings as well as the settings for the individual files in the project can me made here.

The following settings can be made on the "Project Options" tab:

Project File
Shows the filename of the project file. This can only be changed during project creation.

Project Name
The name of the project. This name is displayed in the IDE title bar and in the "Recent Projects" menu.

Comments
This field allows to add some comments to the project. They will be displayed in the project info tab.

Set as default project
The default project will be loaded on every start of the IDE. Only one project can be the default project at a time. If there is no default project, the IDE will load the project that was open when the IDE was closed last time if there was one.

Close all sources when closing the project
If enabled, all sources that belong to the project will be closed automatically when the project is closed.

When opening the project...
load all sources that where open last time
When the project is opened, all the sources that were open when the project was closed will be opened again.

load all sources of the project
When the project is opened, all (source-)files of the project will be opened.

load only sources marked in 'Project Files'
When the project is opened, only the files that are marked in the 'Project Files' tab will be opened. This way you can start a session always with this set of files open.

load only the main file of the default target
When the project is opened, the main file of the default target will be opened too.

load no files
No source files are opened when the project is opened.
The "Project Files" tabs shows the list of files in the project on the right and allows to change their settings. The explorer on the left is for the selection of new files to be added.

The buttons on the top have the following function:
Add
Add the selected file(s) in the explorer to the project.

Remove
Remove the selected files in the file list from the project.

New
Shows a file requester to select a filename for a new source file to create. The new file will be created, opened in the IDE and also added to the project.

Open
Shows a file requester to select an existing file to open. The file will be opened in the IDE and added to the project.

View
Opens the selected file(s) in the file list in the IDE or if they are binary files in the FileViewer.
The checkboxes on the bottom specify the options for the files in the project. They can be applied to a single file or to multiple files at once by selecting the files and changing the state of the checkboxes. The settings have the following meaning:
Load file when opening the project
Files with this option will be loaded when the project is open and the "load only sources marked in 'Project Files'" option is specified on the "Project Options" tab.

Display a warning if file changed
When the project is closed, the IDE will calculate a checksum of all files that have this option set and display a warning if the file has been modified when the project is opened the next time. This allows to be notified when a file that is shared between multiple projects has been edited while working on another project. This option should be disabled for large data files to speed up project loading and saving, or for files which are changed frequently to avoid getting a warning every time the project is opened.

Scan file for AutoComplete
Files with this option will be scanned for AutoComplete data even when they are not currently loaded in the IDE. This option is on by default for all non-binary files. It should be turned off for all files that do not contain source code as well as for any files where you do not want the items to turn up in the AutoComplete list.

Show file in Project panel
Files with this option will be displayed in the project sidepanel. If the project has many files it may make sense to hide some of them from the panel to have a better overview and faster access to the important files in the project.

The project overview

When a project is open, the first tab of the file panel shows an overview of the project and its files.

Project Info
This section shows some general info about the project, such as the project filename, its comments or when and where the project was last opened.

Project Files
This section shows all files in the project and their settings from the Project Options window. Double-clicking on one of the files opens the file in the IDE. Right-clicking displays a context menu with further options:

Open - Open the file in the IDE.
Open in FileViewer - Open the file in the FileViewer of the IDE.
Open in Explorer - Open the file in the operating systems file manager.
Add File to Project - Add a new file to the project.
Remove File from Project - Remove the selected file(s) from the project.
Refresh AutoComplete data - Rescan the file for AutoComplete items.
Project Targets
This section shows all compile targets in the project and some of their settings. Double-clicking on one of the targets opens this target in the compiler options. Right-clicking one one of the targets displays a context menu with further options:
Edit target - Open the target in the compiler options.
Set as default target - Set this target as the default target.
Enable in 'Build all Targets' - Include this target in the 'Build all Targets' compiler menu option.

The project panel

There is a sidepanel tool which allows quick access to the files belonging to the project. For more information see the builtin tools section.


If : Else : EndIf

If : Else : EndIf

Синтаксис
If <expression>
  ...
[ElseIf <expression>]
  ...
[Else]
  ...
EndIf
Описание
Структура If используется, чтобы провести проверку, и/или изменить направление программ, если проведение проверки - истина или ложь. ElseIf может использоваться, чтобы сделать любое количество проверок, если предыдущая проверка не была истиной. Else дополнительная команда используется, чтобы выполнить часть кода, если все предыдущие проверки были ложью. Любое количество If структур может быть вложено друг в друга.

Пример:

  If a=10
    Debug "a=10"
  Else
    Debug "a<>10"
  EndIf

Пример:

  If a=10 And b>=10 Or c=20
    If b=15
      Debug "b=15"
    Else
      Debug "Other possibility"
    EndIf
  Else
    Debug "Test failure"
  EndIf


Import : EndImport

Import : EndImport

Синтаксис
Import "Filename"
  FunctionName.<type>(<parameter>, [, <parameter> [= DefaultValue]...]) [As "SymbolName"]
  ...
  VariableName.<type> [As "SymbolName"]
EndImport
Описание
Для опытных программистов. Командой Import : EndImport можно объявить функции и внешние переменные из файлов библиотеки (. Lib) или объектов (. Obj).

После объявления, импортированные функции становятся доступными для использования в программе, как любые другие команды. Компилятор не проверяет существование функции в импортированном файле, если встречается ошибка, об этом сообщит компоновщик.

Эта функция может заменить последовательность OpenLibrary()/CallFunction(), поскольку она имеет ряд преимуществ: тип и количество параметров проверяется компилятором. Кроме того, в отличие от CallFunction(), импортируемые функции могут без проблем управлять типами double, float и quad.

Параметры в конце функции могут иметь значение по умолчанию (требуется постоянное выражение), так что, если эти параметры опущены, когда вызывается функция, будет использоваться значение по умолчанию.

По умолчанию, обозначение импортированной функции записывается следующим образом:_FunctionName @ callsize (имя функции и размер). Это должно работать в большинстве функций, которые используют стандартные вызовы (stdcall). Если библиотека является С, а функция не stdcall, то должен быть использован ImportC. В этом случае, обозначение импортированной функции записывается следующим образом: _FunctionName (только имя функции).

Рseudotypes могут быть использованы для параметров, но не для возвращаемого значения.

Пример:

  Import "User32.lib"

    ; No need to use 'As' as PureBasic decores the function correctly
    ; We also define the 'Flags' as optional, with a default value of 0 (when ommited)
    ;
    MessageBoxA(Window.l, Body$, Title$, Flags.l = 0)

    ; This time PureBasic can't find it alone as the function
    ; name isn't the same than the one used by the symbol
    ;
    MsgBox(Window.l, Body$, Title$, Flags.l) As "_MessageBoxA@16"

  EndImport

  MessageBoxA(0, "Hello", "World") ; We don't specify the flags
  MsgBox(0, "Hello", "World 2", 0)

Пример: С псевдотипами

  Import "User32.lib"

    ; We use the 'p-unicode' pseudotype for the string parameters, as
    ; MessageBoxW() is an unicode only function. The compiler will
    ; automatically converts the strings to unicode when needed.
    ;
    MessageBoxW(Window.l, Body.p-unicode, Title.p-unicode, Flags.l = 0)

  EndImport

  ; It will work correctly in ascii and in unicode mode, even if the API is unicode
  ; only as the compiler will take care of the conversion itself.
  ;
  MessageBoxW(0, "Hello", "World")


Includes Functions

Функция Includes

Синтаксис
IncludeFile  "Filename"
XIncludeFile "Filename"
Описание
IncludeFile вставляет указанный программный файл (файл с исходным кодом PureBasic), в то место где записана эта функция. XIncludeFile делает то же самое, но не даёт использовать файл повторно.

Пример:

  XIncludeFile "Sources\myfile.pb" ; This will be inserted.
  XIncludeFile "Sources\myfile.pb" ; This will be ignored along with all subsequent calls..
Эти команды полезны, если вы хотите разделить ваш программный код на несколько файлов, чтобы иметь возможность повторного использования частей в различных проектах.

Синтаксис
IncludeBinary "filename"
Описание
IncludeBinary вставляет указанный файл (не исходный код PureBasic), в то место где записана эта функция. При этом вставка должна происходить в пределах блока Data. Эта команда используется с командами /CatchImage(), /CatchSound(), /CatchSprite(), для вставки изображений, звуков, спрайтов и т.д., в исполняемый файл

Пример:

  DataSection
    MapLabel:
    IncludeBinary "Data\map.data"
  EndDataSection
.

Синтаксис
IncludePath "path"
Описание
IncludePath определяет заданный по умолчанию путь для всех файлов, включаемых после вызова этой команды. Это полезно, когда вы включаете много файлов, которые находятся в одном каталоге.

Пример:

  IncludePath  "Sources\Data"
  IncludeFile  "Sprite.pb"
  XIncludeFile "Music.pb"


Inline x86 ASM

Inline x86 ASM

Введение

PureBasic позволяет вам вставить любые команды ассемблера x86 (включая MMX и FPU) прямо в исходный код, как если бы это был настоящий ассемблер. Она даёт вам даже более того: вы можете прямо использовать любые variables или pointers в ключевых словах ассемблера, вы можете помещать любые команды ассемблера на одной строке, ... Синтаксис взят от FAsm (http://flatassembler.net), так что если вы хотите больше информации о синтаксисе ассемблера, просто прочитайте руководство FAsm.

Есть несколько способов активировать встроенный ассемблер:
- отметьте compiler option "встроенный ассемблер" в IDE
- воспользуйтесь command line compiler switch /INLINEASM
- воспользуйтесь директивами компилятора EnableASM и DisableASM

Правила

Вам придётся строго следовать нескольким правилам если вы хотите вставить ассемблер в код Basic:

- Используемые variables или pointers должны объявляться перед использованием в ключевом слове ассемблера
- Когда вы ссылаетесь на label, вы должны вставить перед именем префикс 'l_'. Это из-за того, что PureBasic добавляет 'l_' перед меткой BASIC чтобы избежать конфликта со внутренними метками. На метку при использовании встроенного ассемблера нужно ссылаться в нижнем регистре.

Пример:

  MOV ebx,l_mylabel
  ...
  MyLabel:
- Ошибки в ассемблерной части кода сообщаются не компилятором PureBasic, а компилятором FAsm. Просто проверьте ваш код, если такие ошибки имеют место.
- При включенном встроенном ассемблере вы не сможете использовать ключевые слова ассемблера в качестве имён меток в вашем исходном коде.
- Можно изменять значения следующих регистров: eax, edx и ecx. Все другие всегда должны сохраняться.
- Весь файл справки ассемблера можно скачать здесь. Если вы поместите файл 'ASM.HLP' в каталог 'Help/' программы PureBasic, вы сможете также получать справку по ключевым словам ассемблера посредством клавиши F1. (Примечание: эта возможность включена только тогда когда включен встроенный ассемблер).

Если вы используете ассемблер в procedure, вам придётся учитывать несколько важных вещей:

- Чтобы возвратить непосредственно содержимое регистра 'eax', просто используйте команду ProcedureReturn, без какого-либо выражения. Она позволит содержимому регистра eax остаться нетронутым и использует его как возвращаемое значение.

Пример:

  Procedure.l MyTest()
    MOV eax, 45
    ProcedureReturn  ; The returned value will be 45
  EndProcedure
- Локальные переменные в PureBasic индексируются прямо по указателю стека, что означает, что если указатель стека изменяется посредством инструкции ассемблера (такой как PUSH, POP и т.д..), индексация переменных будет нарушена и прямые ссылки на переменные больше работать не будут.

- Можно передать ассемблерную строку прямо ассемблеру без обработки её компилятором с помощью символа '!' в начале строки. Это позволяет иметь полный доступ к директивам ассемблера. При использовании этого приёма можно ссылаться на локальные переменные с помощью нотации 'p.v_variablename' для обычной переменной или 'p.p_variablename' для указателя

Пример:

  Procedure Test(*Pointer, Variable)
    ! MOV dword [p.p_Pointer], 20
    ! MOV dword [p.v_Variable], 30
    Debug *Pointer
    Debug Variable
  EndProcedure

  Test(0, 0)

Пример

AsmInline.pb


Interfaces

Интерфейсы

Синтаксис
Interface <name> [Extends <name>]
  <Method[.<type>]()>
  ...
EndInterface
Описание
Interfaces используются, чтобы обратиться к Объектно-ориентированным модулям динамических библиотек (DLL), таким как COM (Component Object Model) или DirectX. Такие библиотеки становятся все более распространенными интерфейсами Windows, что разрешает использование этих функций, без каких-либо потерь производительности. Можно также заложить основу для объектно-ориентированного программирования в PureBasic, требующих для их реализации некоторых расширенных знаний. Большинство стандартных интерфейсов Windows, уже присутствует в резидентном файле, что позволяет использовать эти объекты.

Опциональный параметр Extends расширяет интерфейс без дублирования их функций (эти "функции", также обычно называют "методы" в других объектно-ориентированных языках таких, как С + + или Java). Все функции содержащиеся в расширенном интерфейсе будут доступны в новом интерфейсе и будут помещены перед новыми функциями. Это полезно для простого наследования объектов.

Возвращаемый тип может быть определен при объявлении интерфейса, добавлением типа type после метода Method.

Команду SizeOf можно использовать с интерфейсами, для определения размера интерфейса и OffsetOf можно использовать для определения индекса функции в интерфейсе.

Рseudotypes можно использовать для параметров функции интерфейса, но не для возвращаемого значения.

Примечание: понятие и использование объектов в первую очередь предназначено для опытных программистов, однако не обязательно понимать их или даже использовать для создания профессионального программного обеспечения или игр.

Пример: Простой пример вызова объекта

  ; Now we will consider you want to access an external object
  ; (in a DLL for example) in PureBasic. First you need to declare its interface:
  ;
  Interface MyObject
    Move(x,y)
    MoveF(x.f,y.f)
    Destroy()
  EndInterface

  ; CreateObject is the function which create your object, from the DLL.
  ; Create the first object..
  ;
  Object1.MyObject = MyCreateObject()

  ; And the second one.
  ;
  Object2.MyObject = MyCreateObject()

  ; Then just use the functions to act on the desired object
  ;
  Object1\Move(10, 20)
  Object1\Destroy()

  Object2\MoveF(10.5, 20.1)
  Object2\Destroy()

Пример: с использованием 'Extends'

  ; Define a basic Cube interface object
  ;
  Interface Cube
    GetPosition()
    SetPosition(x)
    GetWidth()
    SetWidth(Width)
  EndInterface

  Interface ColoredCube Extends Cube
    GetColor()
    SetColor(Color)
  EndInterface

  Interface TexturedCube Extends Cube
    GetTexture()
    SetTexture(TextureID)
  EndInterface

  ; We now have 3 differents objects interfaces:
  ;
  ; - 'Cube' which has Get/SetPosition() and Get/SetWidth() functions
  ; - 'ColoredCube' which has Get/SetPosition(), Get/SetWidth() and Get/SetColor() functions
  ; - 'TexturedCube' which has Get/SetPosition(), Get/SetWidth() and Get/SetTexture() functions
  ;


Useful Internet Links

Полезные интернет-Ссылки

PureBasic Forums

Official Forum
German Forum
French Forum
Русский форум

PureBasic Chat

Servername: irc.freenode.net
Port: 6667
Channel: #purebasic (english)
Channel: #purebasic.de (german)

PureBasic Resources

Official PureBasic Website (Developer & International Publisher)
The PureBasic Visual Designer Website (maintained by Berikco)
PureArea.net (Code-Archiv, PureBasic Freeware & Shareware & much more)
PureBasic Blog (Notes & thoughts by the PureBasic developers)
The Pure Project Network (User-Libs, Code-Snippets, GUI Builders & much more)
PureVision (Visual Form Editor)
PBDev - PureBasic Developer
Robsite - PureBasic Tutorials
Microsoft Windows API Support
AllAPI.net - Another source for using API-functions

PureBasic Reseller

Developer Team & International Publisher
German Publisher

Games written with PureBasic

Restricted Area
Krakout Unlimited 2
Bricklinker
Hostile Skies
Ladies Garden
DEW.Line
Tributoids
Lethal Judgement + Lethal Judgement 2
Puckman

Private websites dedicated to PureBasic

Andreas' PureBasic Site (german)
Freak's PureBasic Place
Horst Schaeffer


Macros

Макросы

Синтаксис
Macro <name> [(Parameter [, ...])]
  ...
EndMacro
Описание
Macros - очень сильная функция, главным образом полезная для опытных программистов. Macros - это метка-заполнитель для небольшого кода (ключевое слово, строка или несколько строк), который вставляется (при компилировании) непосредственно в программный код, где макрокоманда вызывается. В этом она отличается от procedures, поскольку процедуры не копируют код, когда их вызывают.

Macro : EndMacro должно быть записано до первого вызова макроса. Так как макросы будут полностью заменены соответствующим кодом, во время компиляции.

Macros не может иметь по возвращению тип или параметры соответствующие образцу, так как это не имеет смысла. Если у макрокоманды есть параметры, они заменяются в коде на копию, переданную при вызове макроса. Очень важно понять: оценка строки начинается только тогда, когда будут обработаны все найденные в этой строке макросы.

Макросы разделены на две категории: простые (без параметров) и комплексные (с параметрами, при их вызове необходимо использовать скобки). Когда параметр не указан, возможно заменять любое слово, другим словом (или другим выражением). Макросы могут использоваться рекурсивным образом, однако если один из передаваемых параметров содержит #, он не будет работать.

Пример: Простая макрокоманда

  Macro MyNot
    Not
  EndMacro

  a = 0
  If MyNot a   ; Here the line will be expanded to : 'If Not a'
    Debug "Ok"
  EndIf
Используя параметры, можно создать очень гибкие макросы. Символ логической связи # доступен для создания новых слов или меток соединяя кода макроса и выражения переданного ему (пробелы между словами не учитываются). Также возможно определить значения по умолчанию, для каждого параметра, чтобы они могли были быть опущенными во время вызова макроса.

Пример: Макрос с параметрами

  Macro UMsgBox(Title, Body)
    MessageRequester(Title, UCase(Body), 0)
  EndMacro

  Text$ = "World"
  UMsgBox("Hello", "-"+Text$+"-") ; Here the line will be expanded like that:
                                  ; 'MessageRequester("Hello", UCase("-"+Text$+"-"), 0)'

Пример: Макрос с параметром по умолчанию

  Macro UMsgBox(Title, Body = "Ha, no body specified")
    MessageRequester(Title, UCase(Body), 0)
  EndMacro

  UMsgBox("Hello") ; Here the line will be expanded like that:
                   ; 'MessageRequester("Hello", UCase("Ha, no body specified"), 0)'

Пример: Макрос и логическая связь

  Macro XCase(Type, Text)
    Type#Case(Text)
  EndMacro

  Debug XCase(U, "Hello")
  Debug XCase(L, "Hello")

Пример: Расширенная многострочная макрокоманда

  Macro DoubleQuote
    "
  EndMacro

  Macro Assert(Expression)
    CompilerIf #PB_Compiler_Debugger  ; Only enable assert in debug mode
      If Expression
        Debug "Assert (Line " + Str(#PB_Compiler_Line) + "): " + DoubleQuote#Expression#DoubleQuote
      EndIf
    CompilerEndIf
  EndMacro

  Assert(10 <> 10) ; Will display nothing
  Assert(10 <> 15) ; Should display the assert


Pointers and memory access

Указатели и доступ к памяти

Указатели

Использование указателей возможно помещая символ * перед именем variable. Указатель - переменная величина, которая содержит адрес памяти и который обычно присоединен к structure.

Пример:

  *MyScreen.Screen = OpenScreen(0, 320, 200, 8, 0)
  mouseX = *MyScreen\MouseX  ; Assuming than the Screen structure contains a MouseX field
Есть только три правильных метода, чтобы установить значение указателя:
- Получить результат функцией (как показано в примере выше)
- Скопировать значение с другого указателя
- Найти адрес переменной, процедуры или метки (как показано ниже)

Примечание: В противоположность C/C++, в PureBasic символ * неотъемлемая часть имени переменной. Поэтому *ptr и ptr - две различные переменные. ptr является (регулярной) переменной величиной сохраняющей значения, *ptr является переменной ссылочного типа, сохраняющей адрес.

Указатели и емкость памяти

Так как указатели принимают как значение только адрес, размер в опреативной памяти будет таким, чтобы позволить сохранить абсолютный адрес микропроцессора:
- На 32-битных процессорах, адресное пространство ограничено 32 битами, поэтому указатель будет занимать в памяти 32 бита (4 байта, как 'long')
- На 64-битных процессорах, адресное пространство ограничено 64 битами, поэтому указатель будет занимать в памяти 64 бита (8 байт, как 'quad').

Как следствие тип указателя зависит режима адреса центрального процессора, (‘long' на центральном процессоре на 32 бита и ‘quad' на центральном процессоре на 64 бита ).
В результате, присваивая тип указателя (* Pointer.l * Pointer.b ...) не имеет смысла.

Примечани:
- Каждый раз, когда адрес памяти должен быть сохранен в переменной, он должен быть сделан через указатель. Это гарантирует неприкосновенность адреса во время компиляции независимо от способа адресации процессора.
- PureBasic x86 не генерирует исполняемые программы на 64 бита. Для программ откомпилированных PureBasic, система предоставляет им только адресацию с указателями на 32 бита.

Указатели и структуры

Привязывать структуру к указателю (например *MyPointer.Point) позволяет получить доступ к любому адресу в памяти, в структурированном виде (с оператором '\').

Пример:

  Define Point1.Point, Point2. Point
  *CurrentPoint.Point = @Point1  ; Pointer declaration, associated to a structure and initialized with Point1's address
  *CurrentPoint \x = 10          ; Assign value 10 to Point1\x
  *CurrentPoint.Point = @Point2  ; move to Point2's address
  *CurrentPoint \x = 20          ; Assign value 20 to Point2\x
  Debug Point1\x
  Debug Point2\x
Указатели позволяют перемещать, читать и записывать в памяти. Кроме того они позволяют программисту обратиться к большому количеству данных, без дополнительных затрат на копирование данных. Копирование указателя намного быстрее.

Указатели и строки символов

У всех переменных есть постоянный размер в памяти (2 байта для Word, 4 байта для Long, и т.д..), за исключением строк, так как их длина может измениться. По этой причине, ими управляют по-другому.
Таким образом, поля структуры, ссылающиеся на строку, хранят её адрес, а не саму строку: такое поле структуры - это указатель на строку.

Пример:

  Text$ = "Hello"
  *Text = @Text$            ; *Text store the address of the string in memory
  *Pointer.String = @*Text  ; *Pointer points on *Text
  Debug *Pointer\s          ; Display the string living at the address stored in *Pointer (i.e. @Text$)
Арифметические операции с указателями

Арифметические операции с указателями, возможны с помощью команд SizeOf().

Пример:

  Dim Array.Point(1)         ; Array of points

  *Pointer.Point = @Array()  ; Store the array address
  *Pointer\x = 10            ; Change the first array element values
  *Pointer\y = 15

  *Pointer + SizeOf(Point)   ; Move to the next array element

  *Pointer\x = 7             ; Change the second array element values
  *Pointer\y = 9

  ; Display results
  For i = 0 To 1
    Debug Array(i)\x
    Debug Array(i)\y
  Next i

Адреса переменных

Чтобы найти адрес variable в вашем коде, используйте символ (@). Общие причины для использования этого, является передача структурированного типа переменной для procedure. Вы должны передать указатель на эту переменную, так как вы не можете передать структурированную переменную напрямую.

Пример:

  Structure astruct
    a.w
    b.l
    c.w
  EndStructure

  Procedure SetB(*myptr.astruct)
    *myptr\b = 69
  EndProcedure

  Define.astruct myvar

  SetB(@myvar)

  Debug myvar\b

Адреса процедур

Для опытных программистов. Наиболее распространенная причина, для получения адреса процедуры - работа с операционной системой на низком уровне. Некоторые операционные системы позволяют указать обратный вызовов или функции обработчика прерываний (для некоторых операций), которые вызываются операционной системой и позволяют программистам расширить возможности ОС. Адрес procedure находится подобным способом, как и адрес variables.

Пример:

  Procedure WindowCB(WindowID.l, Message.l, wParam.l, lParam.l)
    ; This is where the processing of your callback procedure would be performed
  EndProcedure

  ; A special callback for the Windows OS allowing you to process window events
  SetWindowCallback( @WindowCB() )

Адреса меток передачи управления

Может также быть полезно найти адрес labels в пределах Вашего программного кода. Это может пригодиться для обращения к коду или к данным, помещенным в этом месте или любой другой причине, которая может прийти вам прийти на ум. Чтобы найти адрес метки, Вы помещаете вопросительный знак (?) перед именем метки.

Пример:

  Debug "Size of data file = " + Str(?endofmydata - ?mydata)

  DataSection
    mydata:
      IncludeBinary "somefile.bin"
    endofmydata:
  EndDataSection


NewList

NewList

Синтаксис
NewList name.<type>()
Описание
NewList позволяет создать динамически связанный список. Каждый элемент списка выделяется динамически. Нет никаких ограничений в количестве элементов, таким образом в списке может быть столько элементов, сколько необходимо. Список может иметь Variables стандартного или structured типа. Чтобы получить список всех команд, для управления списками, см. библиотеку LinkedList.

Связные списки по умолчанию являются локальными. Это означает, что должны использоваться команды Global или Shared, если объявленный список, будет использоваться в процедурах. Также можно сделать связаный список параметром в procedure с помощью команды List.

Для быстрой замены содержания связанных списков используйте Swap.

Пример: Простой список

  NewList MyList.l()

  AddElement(MyList())
  MyList() = 10

  AddElement(MyList())
  MyList() = 20

  AddElement(MyList())
  MyList() = 30

  ForEach MyList()
    Debug MyList()
  Next

Пример: Список в качестве параметра процедуры

  NewList Test.l()

  AddElement(Test())
  Test() = 1
  AddElement(Test())
  Test() = 2

  Procedure DebugList(c.l, List ParameterList.l())

    AddElement(ParameterList())
    ParameterList() = 3

    ForEach ParameterList()
      MessageRequester("List", Str(ParameterList()))
    Next

  EndProcedure

  DebugList(10, Test())


NewMap

NewMap

Синтаксис
NewMap name.<type>([Slots])
Описание
NewMap позволяет объявлять новые карты, также известные как хэш-таблицы или словари. Она позволяет осуществлять быстрый доступ к элементу, основанному на ключе. Каждый ключ в карте уникален, что делает невозможным иметь два разных компонента с одинаковым ключом. Нет никаких ограничений по количеству элементов, таким образом в карте может быть столько элементов, сколько необходимо. Карта может быть объявлена с любым типом standard или structured. Чтобы получить список всех команд, для управления картами, см. библиотеку Map.

При использовании нового ключа, в карту автоматически добавляется новый элемент. Если другой элемент с тем же ключом уже присутствует на карте, то он будет заменен на новый. После того как элемент был создан или к нему был произведён доступ, он становится текущим элементом карты, и доступ к этому элементу может быть выполнен без указания ключа. Это полезно при использовании структурированной карты, так как для доступа к различным полям структуры, поиск по этому пункту уже не будет производится.

Карты по умолчанию являются локальными. Это означает, что должны использоваться команды Global или Shared, если объявленная карта, будет использоваться в процедурах. Также можно сделать карту параметром в procedure с помощью команды Map.

Для быстрой замены содержания карты используйте Swap.

Необязательный параметр 'Slots' определяет сколько слотов будет иметь карта, для хранения элементов. Чем больше слотов, имеет карта, тем быстрее будет обращение к элементу, но требуется больше памяти, которую карта будет использовать. Необходим компромисс, зависящий от числа элементов, которые карта будет содержать и быстротой, необходимой для доступа к элементам. Значение по умолчанию 512. Этот параметр не имеет влияния на количество элементов, которое карта может содержать.

Пример: Простая карта

  NewMap Country.s()

  Country("GE") = "Germany"
  Country("FR") = "France"
  Country("UK") = "United Kingdom"

  Debug Country("FR")

  ForEach Country()
    Debug Country()
  Next

Пример: Карта как параметр процедуры

  NewMap Country.s()

  Country("GE") = "Germany"
  Country("FR") = "France"
  Country("UK") = "United Kingdom"

  Procedure DebugMap(Map ParameterMap.s())

    ParameterMap("US") = "United States"

    ForEach ParameterMap()
      Debug ParameterMap()
    Next

  EndProcedure

  DebugMap(Country())

Пример: Структурируемая карта

  Structure Car
    Weight.l
    Speed.l
    Price.l
  EndStructure

  NewMap Cars.Car()

  ; Here we use the current element after the new insertion
  ;
  Cars("Ferrari F40")\Weight = 1000
  Cars()\Speed = 320
  Cars()\Price = 500000

  Cars("Lamborghini Gallardo")\Weight = 1200
  Cars()\Speed = 340
  Cars()\Price = 700000

  ForEach Cars()
    Debug "Car name: "+MapKey(Cars())
    Debug "Weight: "+Cars()\Weight
  Next


Number systems

Система счисления (таблица соответствия)

Числа от 0 до 255 в десятичном , бинарном и шестнадцатеричном формате

Decimal Binary Hexa Decimal Binary Hexa Decimal Binary Hexa Decimal Binary Hexa
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 		00000000
00000001
00000010
00000011
00000100
00000101
00000110
00000111
00001000
00001001
00001010
00001011
00001100
00001101
00001110
00001111
00010000
00010001
00010010
00010011
00010100
00010101
00010110
00010111
00011000
00011001
00011010
00011011
00011100
00011101
00011110
00011111
00100000
00100001
00100010
00100011
00100100
00100101
00100110
00100111
00101000
00101001
00101010
00101011
00101100
00101101
00101110
00101111
00110000
00110001
00110010
00110011
00110100
00110101
00110110
00110111
00111000
00111001
00111010
00111011
00111100
00111101
00111110
00111111 		00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
20
21
22
23
24
25
26
27
28
29
2A
2B
2C
2D
2E
2F
30
31
32
33
34
35
36
37
38
39
3A
3B
3C
3D
3E
3F 		64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
         01000000
01000001
01000010
01000011
01000100
01000101
01000110
01000111
01001000
01001001
01001010
01001011
01001100
01001101
01001110
01001111
01010000
01010001
01010010
01010011
01010100
01010101
01010110
01010111
01011000
01011001
01011010
01011011
01011100
01011101
01011110
01011111
01100000
01100001
01100010
01100011
01100100
01100101
01100110
01100111
01101000
01101001
01101010
01101011
01101100
01101101
01101110
01101111
01110000
01110001
01110010
01110011
01110100
01110101
01110110
01110111
01111000
01111001
01111010
01111011
01111100
01111101
01111110
01111111
         40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
51
52
53
54
55
56
57
58
59
5A
5B
5C
5D
5E
5F
60
61
62
63
64
65
66
67
68
69
6A
6B
6C
6D
6E
6F
70
71
72
73
74
75
76
77
78
79
7A
7B
7C
7D
7E
7F 		128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
         10000000
10000001
10000010
10000011
10000100
10000101
10000110
10000111
10001000
10001001
10001010
10001011
10001100
10001101
10001110
10001111
10010000
10010001
10010010
10010011
10010100
10010101
10010110
10010111
10011000
10011001
10011010
10011011
10011100
10011101
10011110
10011111
10100000
10100001
10100010
10100011
10100100
10100101
10100110
10100111
10101000
10101001
10101010
10101011
10101100
10101101
10101110
10101111
10110000
10110001
10110010
10110011
10110100
10110101
10110110
10110111
10111000
10111001
10111010
10111011
10111100
10111101
10111110
10111111
         80
81
82
83
84
85
86
87
88
89
8A
8B
8C
8D
8E
8F
90
91
92
93
94
95
96
97
98
99
9A
9B
9C
9D
9E
9F
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
AA
AB
AC
AD
AE
AF
B0
B1
B2
B3
B4
B5
B6
B7
B8
B9
BA
BB
BC
BD
BE
BF
         192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255 		11000000
11000001
11000010
11000011
11000100
11000101
11000110
11000111
11001000
11001001
11001010
11001011
11001100
11001101
11001110
11001111
11010000
11010001
11010010
11010011
11010100
11010101
11010110
11010111
11011000
11011001
11011010
11011011
11011100
11011101
11011110
11011111
11100000
11100001
11100010
11100011
11100100
11100101
11100110
11100111
11101000
11101001
11101010
11101011
11101100
11101101
11101110
11101111
11110000
11110001
11110010
11110011
11110100
11110101
11110110
11110111
11111000
11111001
11111010
11111011
11111100
11111101
11111110
11111111 		C0
C1
C2
C3
C4
C5
C6
C7
C8
C9
CA
CB
CC
CD
CE
CF
D0
D1
D2
D3
D4
D5
D6
D7
D8
D9
DA
DB
DC
DD
DE
DF
E0
E1
E2
E3
E4
E5
E6
E7
E8
E9
EA
EB
EC
ED
EE
EF
F0
F1
F2
F3
F4
F5
F6
F7
F8
F9
FA
FB
FC
FD
FE
FF


List of Platform-dependent Functions

Список функций, зависимых от платформы

  • Зеленый: команда или библиотека присутствуют на этой платформе.
  • Желтый: команда присутствует как функция, которая ничего не делает (таким образом она компилирует, но игнорируется).
  • Красный: команда или библиотека не поддерживаются на этой платформе.
  • Все команды, которые здесь не указаны, доступны везде.

Библиотеки, которые не являются полностью кросс-платформенными:

Palette | Windows | Linux | MacOS
Sprite3D | Windows | SDL | OpenGl | MacOS

Отдельных команд, которые не являются полностью кросс-платформенными:

AudioCDLength | Windows | Linux | MacOS | Всегда возвращает 0 в Linux
EjectAudioCD | Windows | Linux | MacOS | Ничего не делает на MacOS
RawKey | Windows | Linux | MacOS | Возвращает 0 в Linux и MacOS, поскольку эта информация не доступна там
ClearConsole | Windows | Linux | MacOS | На Linux или MacOS, это игнорируется
ConsoleCursor | Windows | Linux | MacOS | На Linux или MacOS, это игнорируется
ConsoleLocate | Windows | Linux | MacOS | На Linux или MacOS, это игнорируется
ConsoleColor | Windows | Linux | MacOS | На Linux или MacOS, это игнорируется
ConsoleTitle | Windows | Linux | MacOS | На Linux или MacOS, это игнорируется
EnableGraphicalConsole | Windows | Linux | MacOS | На Linux или MacOS, это игнорируется
GadgetItemID | Windows | Linux | MacOS | Only for TreeGadget on Windows, returns 0 else
MDIGadget | Windows | Linux | MacOS | The MDI concept is not present on Linux (gtk) or MacOSX
WebGadgetPath | Windows | Linux | MacOS | Требуется только для Linux
InitScintilla | Windows | Linux | MacOS | Необходимы только на Windows, чтобы загрузить DLL.
KeyboardMode | Windows | Linux | MacOS | Only has an effect on Windows, ignored else
GetFunctionEntry | Windows | Linux | MacOS | Only present on Windows
CountLibraryFunctions | Windows | Linux | MacOS | Examining Library content is not possible on MacOS
ExamineLibraryFunctions | Windows | Linux | MacOS | Examining Library content is not possible on MacOS
LibraryFunctionAddress | Windows | Linux | MacOS | Examining Library content is not possible on MacOS
LibraryFunctionName | Windows | Linux | MacOS | Examining Library content is not possible on MacOS
NextLibraryFunction | Windows | Linux | MacOS | Examining Library content is not possible on MacOS
MovieAudio | Windows | Linux | MacOS | Always returns 0 on Linux
MovieInfo | Windows | Linux | MacOS | Always returns 0 on Linux
MovieLength | Windows | Linux | MacOS | Always returns 0 on Linux
MovieSeek | Windows | Linux | MacOS | Always returns 0 on Linux
RenderMovieFrame | Windows | Linux | MacOS | Frame rendereing is only supported on Windows, otherwise the function does nothing
MouseWheel | Windows | Linux | MacOS | Works only on Windows, returns 0 on the other OS
ExamineAssembly | Windows | Linux | PPC | x86 | Disassembling only works on x86 and x64 platforms
NextInstruction | Windows | Linux | PPC | x86 | Disassembling only works on x86 and x64 platforms
InstructionAddress | Windows | Linux | PPC | x86 | Disassembling only works on x86 and x64 platforms
InstructionString | Windows | Linux | PPC | x86 | Disassembling only works on x86 and x64 platforms
SelectedFontColor | Windows | Linux | MacOS | Returns the passed color on Linux and MacOS, as there is no color option
AvailableScreenMemory | DirectX | OpenGl | SDL | OpenGl | MacOS | Does not work with OpenGl, returns 0 there
ChangeGamma | DirectX | OpenGl | Linux | MacOS | Only works with DirectX, ignored else
ScreenID | DirectX | OpenGl | SDL | OpenGl | MacOS | Does not work with OpenGl, returns 0 there
ScreenModeRefreshRate | Windows | SDL | OpenGl | MacOS | Not supported with SDL (Linux), returns 0 there
SetRefreshRate | Windows | SDL | OpenGl | MacOS | Not supported with SDL (Linux), ignored there
SetFrameRate | DirectX | OpenGl | Linux | MacOS | Only supported on Windows, ignored else
SoundFrequency | Windows | Linux | MacOS | Only works on Windows, does nothing else
SoundPan | Windows | Linux | MacOS | Only works on Windows and MacOS, does nothing on Linux
StartSpecialFX | DirectX | OpenGl | SDL | OpenGl | MacOS | Command is not supported with OpenGl
StopSpecialFX | DirectX | OpenGl | SDL | OpenGl | MacOS | Command is not supported with OpenGl
UseBuffer | DirectX | OpenGl | SDL | OpenGl | MacOS | Command is not supported with OpenGl
SpritePixelCollision | DirectX | OpenGl | Linux | MacOS | Only supported with DirectX, otherwise maps to SpriteCollision()
ThreadPriority | Windows | Linux | MacOS | Returns 16 (default) and has no effect on Linux and MacOS
GetToolBarButtonState | Windows | Linux | MacOS | Always returns 0 on MacOS
SetToolBarButtonState | Windows | Linux | MacOS | Ignored on MacOS
ToolBarStandardButton | Windows | Linux | MacOS | On MacOS, adds an item without an image, as no standard set is available
SetWindowCallback | Windows | Linux | MacOS | Windows specific Event handling
SmartWindowRefresh | Windows | Linux | MacOS | Only has an effect on Windows, ignored else
WindowOutput | Windows | Linux | MacOS | Always returns 0 on MacO


Others Commands

Другие команды

Синтаксис

Goto <label>
Описание
Эта команда используется для "прыжка" из одной части программы в другую, начинающейся с метки label. .
Будте осторожны используя эту команду, при ее неправильном применении возможно "падение" программы.

Примечание: не используйте Goto для досрочного выхода из циклов, для этого есть Break.

Синтаксис

End [ExitCode]
Описание
Корректное завершение программы. 'ExitCode' параметр может указываться, если программа должна возвращать код ошибки (часто в программах консолей используемо). 'ExitCode' может далее использоваться в другой программе при помощи команды ProgramExitCode().
Пример:
program = RunProgram("Vasha_programma.exe", "Параметр", "C:\rabochaya_papka_vashei_programmi\", #PB_Program_Wait)
;Прога Vasha_programma.exe запущена с параметром Параметр и с рабочей папкой C:\rabochaya_papka_vashei_programmi\,
;программа, запустившая её, ожидает завершения проги Vasha_programma.exe

Result = ProgramExitCode(Program); по завершении проги Vasha_programma.exe запустившая её программа узнаёт exitcode

Синтаксис

Swap <expression>, <expression>
Описание
Изменяет значения обоих выражений, меняя их местами. Оба <expression> должны быть переменной variable, массивом array, элементом связанного списка linked list или картой map (структурированного или нет) и иметь один из нативных типов: long (.l), quad (.q), string и т.д....

Пример: своппинг строк

  Hello$ = "Hello"
  World$ = "World"

  Swap Hello$, World$

  Debug Hello$+" "+World$

Пример: своппинг многомерного массива

  Dim Array1(5,5)
  Dim Array2(5,5)
  Array1(2,2) = 10     ; set initial contents
  Array2(3,3) = 20

  Swap Array1() , Array2()    ; swap the arrays

  Debug "Array contents after swapping:"
  Debug Array1(3,3)    ; will give 20
  Debug Array2(2,2)    ; will give 10


Overview about PureBasic Constants

Номера портов

Обзор

Следующий список, отображает наиболее важные номера портов и их значение. Для доступа в Интернет, например, на FTP сервер с использованием команд сети PureBasic (см. "PureBasic/Examples/Atomic FTP Server"), вы должны указать номер порта. Более подробная информация о стандартах протоколов Интернет, находится на: http://www.rfc-editor.org/rfcxx00.html.

Примечание: некоторые провайдеры могут блокировать определенные номера портов!

Номера портов

     9 : discard
    15 : netstat
    19 : chargen
    21 : ftp
    23 : telnet
    25 : smtp
    39 : rlp
    67 : boot
    79 : finger
    80 : http
    87 : link
   110 : pop3
   113 : ident
   119 : nntp
   139 : net bios
   513 : login
   515 : pkill
   533 : netwall
   560 : rmonitor
   561 : monitor
  1080 : firewall-port
  5580 : mil.http
  8080 : http|mil.http


Procedures

Процедуры

Синтаксис
Procedure[.<type>] name(<parameter1[.<type>]> [, <parameter2[.<type>] [= DefaultValue]>, ...])
  ...
  [ProcedureReturn value]
EndProcedure
Описание
Procedure это раздел программы, который независим от основного кода программы и может иметь свои параметры и variables. В PureBasic полностью поддерживается рекурсии (повторение) процедур, каждая процедура может вызывать сама себя. При каждом вызове процедуры, локальным переменным автоматически присваевается значение 0. Для доступа к данным из основной программы, они должны быть объявлены с помощью процедур Shared или Global (см. также: Protected и Static).

Параметры в конце процедуры могут иметь значения по умолчанию (должны быть постоянными выражениями), если во время вызова функции эти параметры будут опущены, то будет использоваться значение по умолчанию.

Arrays можно передать как параметры, используя команду Array, linked lists используя команду и maps используя команду Map.

Процедура может возвратить значение или строку в случае необходимости. Необходимо установить тип после Procedure и использовать команду ProcedureReturn в любом месте в пределах процедуры. Вызов ProcedureReturn немедленно покидает процедуру, даже если это происходит в пределах цикла.
ProcedureReturn не может использоваться, чтобы возвратить array, linked list или map. Для этого необходимо передать в процедуру массив, связанный список или карту в качестве параметра.

Если для ProcedureReturn не указано значение, то возвращаемое значение не определено (см. inline assembly для получения дополнительной информации).

Примечание: Для возврата строк из DLLs, см. DLLs. Для опытных программистов доступно ProcedureC чтобы вызватьть процедуру используя соглашение 'CDecl' вместо 'StandardCall' используемой по умолчанию.

Отдельные процедуры могут запускаться используя потоки threads.

Пример: Процедура с переменной long в качестве возвращаемого значения

  Procedure.l Maximum(nb1.l, nb2.l)
    If nb1>nb2
      Result.l = nb1
    Else
      Result = nb2
    EndIf

    ProcedureReturn Result
  EndProcedure

  Result.l = Maximum(15,30)
  Debug Result

Пример: Процедура с строкой в качестве возвращаемого значения

  Procedure.s Attach(String1$, String2$)
    ProcedureReturn String1$+" "+String2$
  EndProcedure

  Result$ = Attach("PureBasic", "Coder")
  Debug Result$

Пример: Параметр со значением по умолчанию

  Procedure a(a, b, c=2)
    Debug c
  EndProcedure

  a(10, 12)      ; 2 will be used as default value for 3rd parameter
  a(10, 12, 15)

Пример: Связанные списки как параметр

  NewList Test.Point()

  AddElement(Test())
  Test()\x = 1
  AddElement(Test())
  Test()\x = 2

  Procedure DebugList(c.l, List ParameterList.Point())

    AddElement(ParameterList())
    ParameterList()\x = 3

    ForEach ParameterList()
      MessageRequester("List", Str(ParameterList()\x))
    Next

  EndProcedure

  DebugList(10, Test())

Пример: Массив как параметр

  Dim Table.Point(10, 15)

  Table(0,0)\x = 1
  Table(1,0)\x = 2

  Procedure TestIt(c.l, Array ParameterTable.Point(2))  ; The table support 2 dimensions

    ParameterTable(1, 2)\x = 3
    ParameterTable(2, 2)\x = 4

  EndProcedure

  TestIt(10, Table())

  MessageRequester("Table", Str(Table(1, 2)\x))

Синтаксис
Declare[.<type>] name(<parameter1[.<type>]> [, <parameter2[.<type>]>, ...])
Описание
Иногда процедура должна вызвать другую процедуру, которая не была объявлена перед этим. В этом случай может произойти ошибка компиляции 'Procedure <name> не найдена'. В данном случае может помочь Declare, заявив только заголовок процедуры. Тем не менее, атрибуты функции Declare и фактическое объявление процедуры Procedure должны быть идентичны (включая указание правильного типа после имени процедуры).

Пример:

  Declare Maximum(Value1, Value2)

  Procedure Operate(Value)
    Maximum(10, 2)      ; At this time, Maximum() is unknown.
  EndProcedure

  Procedure Maximum(Value1, Value2)
    ProcedureReturn 0
  EndProcedure


Protected

Protected

Синтаксис
Protected[.<type>] <variable[.<type>]> [= <expression>] [, ...]
Описание
Protected делает возможным доступ к variable только в пределах Procedure, даже если та же самая переменная была объявлена как Global в основной программе. Функцию Protected часто называют местной 'Local', в других BASICах. Каждой переменной можно задать значение по умолчанию. Если после Protected, указывается тип, то тип по умолчанию изменяется для этого объявления. Protected также может быть использован с arrays, linkedlists и maps.

Значение локальной переменной будет повторно инициализировано при каждом вызове процедуры. Чтобы избежать этого, можно использовать команду Static, которая позволяет сохранять значение, при следующем вызове процедуры.

Пример: С переменной величиной

  Global a
  a = 10

  Procedure Change()
    Protected a
    a = 20
  EndProcedure

  Change()
  Debug a ; Will print 10, as the variable has been protected.

Пример: С массивом

  Global Dim Array(2)
  Array(0) = 10

  Procedure Change()
    Protected Dim Array(2) ; This array is protected, it will be local.
    Array(0) = 20
  EndProcedure

  Change()
  Debug Array(0) ; Will print 10, as the array has been protected.


Prototypes

Prototypes

Синтаксис
Prototype.<type> name(<parameter>, [, <parameter> [= DefaultValue]...])
Описание
Для опытных программистов. Prototype позволяет объявить тип, который отобразит функцию. Это позволяет создать указатели на функции, так как этот тип может быть указан для переменной, значение которой будет адресом вызываемой функции и может изменяться по желанию).

Эта функция может заменить последовательность OpenLibrary() и CallFunction(), так как у нее есть несколько преимуществ: происходит проверка типа параметра и количество параметров.

В отличие от CallFunction(), прототип может управлять параметрами variables типа double, float и quad. GetFunction() позволяет получить указатель функции, в любой библиотеке.

Параметры в конце прототипа могут иметь значения по умолчанию (должны быть постоянными выражениями), если во время вызова функции эти параметры будут опущены, то будет использоваться значение по умолчанию.

По умолчанию, функция использует соглашение (stdcall). Если указатель функции вызывает функцию C использующую соглашение (Cdecl), то вместо этого должен использоваться PrototypeC.

Рseudotypes может использоваться для параметров, но не для возвращаемого значения.

Пример:

  Prototype.l ProtoMessageBox(Window.l, Body$, Title$, Flags.l = 0)

  If OpenLibrary(0, "User32.dll")

    ; 'MsgBox' is a variable with a 'ProtoMessageBox' type
    ;
    MsgBox.ProtoMessageBox = GetFunction(0, "MessageBoxA")

    MsgBox(0, "Hello", "World") ; We don't specify the flags
  EndIf

Пример: С псевдотипами

  ; We use the 'p-unicode' pseudotype for the string parameters, as
  ; MessageBoxW() is an unicode only function. The compiler will
  ; automatically converts the strings to unicode when needed.
  ;
  Prototype.l ProtoMessageBoxW(Window.l, Body.p-unicode, Title.p-unicode, Flags.l = 0)

  If OpenLibrary(0, "User32.dll")

    ; 'MsgBox' is a variable with a 'ProtoMessageBoxW' type
    ;
    MsgBox.ProtoMessageBoxW = GetFunction(0, "MessageBoxW")

    MsgBox(0, "Hello", "World") ; We don't specify the flags
  EndIf


Pseudotypes

Pseudotypes

Описание
Для опытных программистов. Рseudotypes предназначены для упрощения программирования, с использованием внешних библиотек нуждающихся в данных, типы которых не поддерживаются PureBasic. В этом случае возможно использование встроенного pseudotype, которая и выполняет необходимые преобразования на лету (во время использования), без каких-либо дополнительных команд. Поскольку они нереальные типы, их обозначение отличается наличием префикса 'p-' ('псевдо') добавлямого к типу. Доступные pseudotypes:
  p-ascii: ведет себя как тип string, последовательность знаков будет всегда конвертироватся в
           ascii во время вызова функции, даже если программа компилируется способом unicode.
           Это полезно при вызове функции библиотеки, которая не поддерживает
           уникод, в программе откомпилированной в уникоде.

  p-utf8: ведет себя как тип string, последовательность знаков будет всегда конвертироватся в
          utf8 во время вызова функции, даже если программа компилируется способом unicode
          Это полезно при вызове функции библиотеки, которая поддерживает только UTF8.

  p-bstr: acts as a string type, but will always convert the string to bstr before calling the
          function. It is very useful when accessing a shared library which needs bstr parameters,
          like COM components.

  p-unicode: acts as a string type, but will always convert the string to unicode before
             calling the function, even when the program is compiled in ascii mode.
             It is very useful when accessing a shared library which only supports unicode
             in an ascii program for example.

  p-variant: acts as a numeric type, will adjust the function call to use the variant parameter
             correctly. It is very useful when accessing a shared library which needs 'variant' parameters,
             like COM components.
Pseudotypes могут использоваться только с функциями prototypes, interfaces и imported. Pseudotypes делает соответствующее преобразование, только если это необходимо: например, применение 'p-ascii' в программе, компилируемой ascii способом не имеет никакого результата, так как PureBasic уже в ascii.

Пример:

  Import "User32.lib"

    ; We use the 'p-unicode' pseudotype for the string parameters, as
    ; MessageBoxW() is an unicode only function. The compiler will
    ; automatically converts the strings to unicode when needed.
    ;
    MessageBoxW(Window.l, Body.p-unicode, Title.p-unicode, Flags.l = 0)

  EndImport

  ; It will work correctly in ascii and in unicode mode, even if the API is unicode
  ; only as the compiler will take care of the conversion itself.
  ;
  MessageBoxW(0, "Hello", "World")


PureBasic objects

Объекты PureBasic

Введение

Цель этого раздела состоит в том, чтобы описать создание, обработку и поведение объектов в PureBasic. Для демонстрации мы будем использовать объект Image, но та же самую логическую схему применяют ко всем другим объектам PureBasic. Создать объект Image мы можем двумя способами: индексированный и динамичный.

I. Индексированная нумерация

Статический или индексированный способ, позволяет Вам ссылаться на объект определенным числовым значением. Первый доступный номер индекса 0, последующие индексы выделяются последовательно. Имейте в виду, что если вы используете значение 0 для первого объекта и значение 1000 для своего второго объекта, то будет использован 1001 индекс, из которых 999 (от 1 до 999) будут неиспользованными, что является не эффективным способом использования индексированных объектов. Если вам нужен более гибкий метод, используйте динамический способ определения объектов, как описано в разделе II. Индексированный способ имеет ряд преимуществ:

- Обработка проще, нет необходимости в variables или arrays.
- 'Групповая' обработка, без необходимости использования промежуточного массива.
- Использование объектов в procedures без объявления их global (если вы используете constant или номер).
- Объект, который связан с этим индексом, автоматически освобождается при повторном использовании этого индекса.
Максимальное индексное число, обычно ограничивается (от 5000 до 60 000) и зависит от типа объекта. Рекомендуется использовать еnumerations, если вы хотите использовать константы, для последовательного определения объектов.

Пример:

  CreateImage(0, 640, 480) ; Create an image, the n°0
  ResizeImage(0, 320, 240) ; Resize the n°0 image

Пример:

  CreateImage(2, 640, 480) ; Create an image, the n°2
  ResizeImage(2, 320, 240) ; Resize the n°2 image
  CreateImage(2, 800, 800) ; Create a new image in the n°2 index, the old one is automatically free'ed

Пример:

  For k = 0 To 9
    CreateImage(k, 640, 480) ; Create 10 differents images, numbered from 0 to 9
    ResizeImage(k, 320, 240) ; Create a new image in the n°2 index, the old one is automatically free'ed
  Next

Пример:

  #ImageBackground = 0
  #ImageButton     = 1

  CreateImage(#ImageBackground, 640, 480) ; Create an image (n°0)
  ResizeImage(#ImageBackground, 320, 240) ; Resize the background image
  CreateImage(#ImageButton    , 800, 800) ; Create an image (n°1)

II. Динамическая нумерация

Иногда индексированная нумерация не удобна, например там где заранее не известно количество объектов. PureBasic позволяет применять дополительный способ, создавать объекты динамически. Оба метода (индексированный и динамический) могут использоваться одновременно, без риска конфликта. Чтобы создать динамический объект, достаточно указать константу #PB_Any вместо индексированного числа, и динамическое число будет возвращено как результат функции. После этого можно использовать возвращенное число, в месте с другими объектными функциями, где Вы использовали бы индексированное число, за исключением создания нового объекта. Такой способ обработки объектов, хорошо сочетается с linked list, который также является динамическим средством управления данными. Пример динамических объектов и связанных списков можно найти здесь: MDI ImageViewer.pb.

Пример:

  DynamicImage1 = CreateImage(#PB_Any, 640, 480) ; Create a dynamic image
  ResizeImage(DynamicImage1, 320, 240) ; Resize the DynamicImage1


Repeat : Until

Repeat : Until

Синтаксис
Repeat
  ...
Until <expression> [or Forever]
Описание
Эта функция создает цикл, который выполняется пока выражение <expression> является истиным. Проверка значения выражения <expression> происходит в конце итерации, поэтому цикл выполняется как минимум один раз. Если необходим бесконечный цикл , то используйте Forever вместо Until. Возможно досрочное прекращение выполнения цикла с помощью команды Break или досрочное завершение текущей итераци цикла Repeat : Until с помощью Continue.

Пример:

  a=0
  Repeat
    a=a+1
  Until a>100
This will loop until "a" takes a value > to 100, (it will loop 101 times).


Select : EndSelect

Select : EndSelect

Синтаксис
Select <expression1>
  Case <expression> [, <expression> [<numeric expression> To <numeric expression>]]
     ...
  [Case <expression>]
     ...
  [Default]
     ...
EndSelect
Описание
Select позволяет провести сравнение. Программа выполнит <expression1> и сохранит свое значение в памяти. Это значение затем сравнивается с каждым значением Case <expression>, и если они равны, то будет выполнен блок кода, следующий за ним и произведён выход из структуры Select. Case поддерживает несколько значений и интервалов значений с помощью оператора To (только числовые значения). Если все значения Case ложь, то будет выполнен блок кода, следующий за Default (если указан).

Примечание: Select также принимает значения floats <expression1>, тем не менее, она округляет его до близлежащего целого числа integer (сравнение проводится только с целыми числами).

Пример: Простой пример

  Value = 2

  Select Value
    Case 1
      Debug "Value = 1"

    Case 2
      Debug "Value = 2"

    Case 20
      Debug "Value = 20"

    Default
      Debug "I don't know"
  EndSelect

Пример: множественный выбор и диапазон

  Value = 2

  Select Value
    Case 1, 2, 3
      Debug "Value is 1, 2 or 3"

    Case 10 To 20, 30, 40 To 50
      Debug "Value is between 10 and 20, equal to 30 or between 40 and 50"

    Default
      Debug "I don't know"

  EndSelect


Using several PureBasic versions on Windows

Using several PureBasic versions on Windows

Введение

Можно установить несколько версий PureBasic на жестком диске одновременно. Это полезно для отладки проекта написанного по правилам более старой версии PureBasic и начать разработку нового проекта с использованием новой версии PureBasic.

Просто создайте различные папки, такие как "PureBasic_v3.94" и "PureBasic_v4", установите соответствующие версии PureBasic в нужной папке.

Когда один из "PureBasic.exe" будет запущен, он ассоциирует все файлы ".pb" с этой версией PureBasic. Если в следующий раз, дважды щелкнуть по файлу ".pb", запустится версия PureBasic использовавшаяся последней. В других папках PureBasic ничего не изменится.

Чтобы предотвратить автоматическое ассоциирование файлов ".pb" с IDE, можно создать ярлык PureBasic.exe с параметром "/NOEXT". Параметры командной строки для IDE описаны здесь.

Примечание: Поскольку PureBasic 4.10, не сохраняет настройки конфигурации IDE в папке PureBasic, а сохраняет в папке %APPDATA%\PureBasic, то для сохранения одинаковых настроек с разными версиями, используйте /P /T и /A switches. Кроме того есть /PORTABLE ключ, который сохраняет все файлы в каталог PureBasic и отключает создание расширения .pb .


Shared

Shared

Синтаксис
Shared <variable> [, ...]
Описание
Shared позволяет обеспечить доступ к variable, array, linkedlist или map в пределах procedure. Когда Shared используется с array, linkedlist или map, необходимо поле имени ставить '()'.

Пример: С переменной

  a = 10

  Procedure Change()
    Shared a
    a = 20
  EndProcedure

  Change()
  Debug a   ; Will print 20, as the variable has been shared.

Пример: С массивом и списком

  Dim Array(2)
  NewList List()
  AddElement(List())

  Procedure Change()
    Shared Array(), List()
    Array(0) = 1
    List() = 2
  EndProcedure

  Change()
  Debug Array(0)  ; Will print 1, as the array has been shared.
  Debug List()    ; Will print 2, as the linkedlist has been shared.


Static

Static

Синтаксис
Static[.<type>] <variable[.<type>]> [= <constant expression>] [, ...]
Описание
Static позволяет создавать локальную variable с постоянным значением в Procedure, даже если та же самая переменная была объявлена как Global в основной программе. Если после Static указывается тип, то тип используемый по умолчанию для этих переменных, изменяется на указанный. Static может также использоваться с arrays, linkedlists и maps. При объявлении статического массива, параметр размерности должен быть постоянным значением.

Значение переменной не обнуляется при каждом вызове процедуры, следовательно, можно использовать локальные переменные, параллельно с глобальными переменными (с тем же самым именем), и оба сохранят свои значения. Каждой переменной можно задать значение по умолчанию, и это должно быть постоянное значение.

Вместе с Static Вы также можете использовать Protected, чтобы отделить глобальную переменную от локальной переменной, но с Protected локальные переменные не будут сохранять своих значений.

Пример: С переменной

  Global a
  a = 10

  Procedure Change()
    Static a
    a+1
    Debug "In Procedure: "+Str(a) ; Will print 1, 2, 3 as the variable increments at each procedure call.
  EndProcedure

  Change()
  Change()
  Change()
  Debug a ; Will print 10, as the static variable doesn't affect global one.

Пример: С массивом

  Global Dim Array(2)
  Array(0) = 10

  Procedure Change()
    Static Dim Array(2)
    Array(0)+1
    Debug "In Procedure: "+Str(Array(0)) ; Will print 1, 2, 3 as the value of the array field increments at each procedure call.
  EndProcedure

  Change()
  Change()
  Change()
  Debug Array(0) ; Will print 10, as the static array doesn't affect global one.


Structures

Structures

Синтаксис
Structure <name> [Extends <name>]
  ...
EndStructure
Описание
Structure полезна, чтобы определить пользовательский тип, и обратиться к некоторым участкам памяти OS. Структуры могут использоваться, для более быстрой и более простой обработки файлов данных. Это полезно, поскольку можно объеденить в один объект информацию, которая разделена. На полях структуры ставиться \. Структуры могут быть вложенными. Статические массивы поддерживаются в рамках структуры.

Параметр Extends даёт возможность расширять структуру, новыми полями (из уже определенной структуры). Все поля, найденные в расширенной структуре, будут доступны в новой структуре и будут помещены перед новыми полями. Это полезно, чтобы проводить простое наследование структур.

SizeOf может использоваться со структурами, чтобы получить размер структуры, и OffsetOf может использоваться, чтобы узнать индекс указанного поля.

Пожалуйста, обратите внимание, что в структурах статический массив [] ведет себя не так, как нормальный БЭЙСИК массив (определенный посредством Dim). Чтобы они соответствовали формату структур в C / C + + (позволяет прямой перенос структуры API). Это означает, что [2] является массивом от 0 до 1 (из двух частей), тогда как Dim (2) создает массив от 0 до 2 (из трех частей).

При использовании большого количества полей структуры можно использовать With : EndWith, что позволит снизить объем кода и улучшить его читаемость.

Можно сделать полную копию структуры, с помощью оператора (=) между двумя элементами одного типа.

ClearStructure может использоваться, чтобы очистить структурный участок памяти. Это только для расширенного использования, когда участвуют pointers.

Пример:

  Structure Person
    Name.s
    ForName.s
    Age.w
  EndStructure

  Dim MyFriends.Person(100)

  ; Here the position '0' of the array MyFriend()
  ; will contain one person and it's own informations

  MyFriends(0)\Name = "Andersson"
  MyFriends(0)\Forname = "Richard"
  MyFriends(0)\Age = 32

Пример: Более сложная структура (вложение и статический массив)

  Structure Window
    *NextWindow.Window  ; Points to another window object
    x.w
    y.w
    Name.s[10]  ; 10 Names available (from 0 to 9)
  EndStructure

Пример: Расширенная структура

  Structure MyPoint
    x.l
    y.l
  EndStructure

  Structure MyColoredPoint Extends MyPoint
    color.l
  EndStructure

  ColoredPoint.MyColoredPoint\x = 10
  ColoredPoint.MyColoredPoint\y = 20
  ColoredPoint.MyColoredPoint\color = RGB(255, 0, 0)

Пример: Копирование структуры

  Structure MyPoint
    x.l
    y.l
  EndStructure

  LeftPoint.MyPoint\x = 10
  LeftPoint\y = 20

  RightPoint.MyPoint = LeftPoint

  Debug RightPoint\x
  Debug RightPoint\y

Синтаксис
StructureUnion
  Field1.Type
  Field2.Type
  ...
EndStructureUnion
Описание
StructureUnion полезна только для опытных программистов, которые хотят сэкономить память, разделяя поля внутри в одной структуры. It's like the 'union' keyword in C/C++.

Примечание: Каждое поле в StructureUnion может быть различного type.

Пример:

  Structure Type
    Name$
    StructureUnion
      Long.l      ; Each field (Long, Float and String) resides at the
      Float.f     ; place in memory.
      String.s    ;
    EndStructureUnion
  EndStructure

Пример: Расширенный пример (управление датой)

  Structure date
    day.s{2}
    pk1.s{1}
    month.s{2}
    pk2.s{1}
    year.s{4}
  EndStructure

  Structure date2
    StructureUnion
      s.s{10}
      d.date
    EndStructureUnion
  EndStructure

  Dim d1.date2(5)

  d1(0)\s = "05.04.2008"
  d1(1)\s = "07.05.2009"

  Debug d1(0)\d\day
  Debug d1(0)\d\month
  Debug d1(0)\d\year

  Debug d1(1)\d\day
  Debug d1(1)\d\month
  Debug d1(1)\d\year

  d2.date2\s = "15.11.2010"

  Debug d2\d\day
  Debug d2\d\month
  Debug d2\d\year


Threaded

Threaded

Синтаксис
Threaded[.<type>] <variable[.<type>]> [= <constant expression>] [, ...]
Описание
Threaded позволяет создать thread based для variable, arrays, linkedlists или maps. Это значит, что у каждого thread будет свой собственный вариант объекта. Это полезно только при написании "многопоточных" приложений (несколько процессов). Если после Threaded, указан тип, то тип используемый по умолчанию для этого потока, изменяется на указанный.

Каждая переменная может иметь значение по умолчанию, однако она должна иметь постоянную величину. При объявлении связного массива параметр размерности, также должен быть постоянной величиной.

Объект Threaded не может быть объявлен в процедуре, так как область ее видимости всегда - глобальная переменная.

Пример: с использованием переменных

  Threaded Counter

  Counter = 128

  Procedure Thread(Parameter)

    Debug Counter ; Will display zero as this thread doesn't have used this variable for now
    Counter = 256
    Debug Counter ; Will display 256

  EndProcedure

  Thread = CreateThread(@Thread(), 0)
  WaitThread(Thread) ; Wait for thread ending

  Debug Counter ; Will display 128, even if Counter has been changed in the thread


Unicode

Unicode

Введение

Уникод это термин, используемый для обозначения расширенных наборов символов, которые позволяют отображать текст на множестве языков (включая те, у которых много различных символов, вроде японского, корейского и т.д.). Он решает проблему кодировки ASCII - множество таблиц для всех языков, заменяя их на одну таблицу, где каждый символ имеет своё место. Если приложение требуется использовать в таких странах, настоятельно рекомендуется использование режима уникода с самого начала разработки, так как это уменьшит количество багов из-за преобразования из ascii в уникод.

Упрощая, уникод можно рассматривать как большую таблицу ascii, которая содержит не 256 символов, а до 65536. Из-за этого каждый символ в уникоде требует 2 байта в памяти (это важно при работе с pointers, например). Специальныйtype PureBasic 'character' (.c) автоматически переключается с 1 байта на 2 байта когда уникод включен.

Вот некоторые ссылки для лучшего понимания уникода (обязательное чтение):

General unicode information
Unicode and BOM

Unicode и Windows

В Windows PureBasic внутри себя использует кодировку UCS2, которая является форматом, используемым в уникодном API Windows, поэтому никаких преобразований при выполнении программы для вызова функции ОС не требуется. Имея дело с функцией API, PureBasic автоматически использует уникодную версию, если таковая есть (например, MessageBox_() отображается в MessageBoxW() в режиме уникода и в MessageBoxA() в режиме Ascii). Все структуры и константы API, поддерживаемые PureBasic, также автоматически переключаются на уникодную версию. Это значит, что один и тот же код API можно скомпилировать и в режиме уникода, и в режиме ascii без каких-либо изменений.

Уникод полностью поддерживается только в Windows NT и далее (Windows 2000/XP/Vista): уникодная программа не будет работать в Windows 95/98/Me. Существует решение с помощью обёрточной библиотеки 'unicows', но оно пока не поддерживается PureBasic. Если требуется поддержка Windows 9x, лучше всего поставлять две версии выполняемого файла: одна скомпилирована в ascii, другая в уникоде. Для этого нужно лишь задать switch, это должно быть довольно быстро.

UTF-8

UTF-8 это другая уникодная кодировка, основанная на байтах. В отличие от UCS2, которая всегда занимает 2 байта на символ, UTF-8 использует кодирование переменной длины для каждого символа (до 4 байт могут обозначать один символ). Наибольшее преимущество UTF-8 - тот факт, что она не содержит в коде нулевых символов, поэтому её можно редактировать как обычный текстовый файл. Также символы ASCII от 1 до 127 сохранены на своих местах, так что текст вполне читаемый, ведь кодируются только специальные символы. Один недостаток это переменная длина, так что все строковые операции будут медленнее из-за необходимости предобработки для обнаружения символов в тексте.

PureBasic использует UTF-8 по умолчанию при записи строк в файлы в режиме уникода (библиотекиFile и Preference), так что все тексты полностью платформонезависимы.

Компилятор PureBasic также обрабатывает файлы в обеих кодировках, и Ascii, и UTF-8 (UTF-8 файлы должны иметь корректный заголовок BOM для корректной обработки). Обе кодировки можно перемешивать в одной и той же программе без проблем: файл ascii может включать (include) файл UTF-8 и наоборот. При разработке уникодной программы рекомендуется установить IDE в режим UTF-8, чтобы все исходные файлы были подготовлены к уникоду. Так как формат UTF-8 не вреден и при разработке программ только для ascii, нет необходимости возвращать эту настройку назад.


Variables and Types

Переменные величины, Типы и Операторы

Объявление переменных

Чтобы объявить переменную в PureBasic, просто введите ее имя. Вы также можете указать тип, для данной переменной. Переменные величины не нуждаются в объявлении, поскольку они могут использоваться как "переменные на лету". Команда Define используется для объявления несколькольких переменных в одной строке. Если Вы не зададите начальное значение переменной, то её значение будет 0.

Пример:

  a.b         ; Declare a variable called 'a' from byte (.b) type.
  c.l = a*d.w ; 'd' is declared here within the expression !
Примечание:
Имена переменных не могут начинаться с цифры (0,1,...) и не могут содержать операторы (+,-,...), а также специальные символы (Я,д,ц,ь,...).

Переменные в PureBasic не чувствительны к регистру, поэтому "pure" и "PURE" одна и та же переменная.

Если содержимое переменной не изменяется во время работы программы (к примеру, использование фиксированных значений ID и т.д....), то предпочтительнее использовать constants в качестве альтернативы.

Для предотвращения орфографических ошибок и т. д., возможно настроить PureBasic ожидать объявление переменных, прежде, чем они будут использоваться, для этого используйте команду EnableExplicit в своем исходном коде.

Основные типы

Типы переменных в PureBasic:

Name
Extension
Memory consumption
Range
Byte | .b | 1 byte | -128 to +127
Ascii | .a | 1 byte | 0 to +255
Character | .c | 1 byte (ascii) | 0 to +255
Word | .w | 2 bytes | -32768 to +32767
Unicode | .u | 2 bytes | 0 to +65535
Character | .c | 2 bytes (unicode) | 0 to +65535
Long | .l | 4 bytes | -2147483648 to +2147483647
Integer | .i | 4 bytes (32 bits) | -2147483648 to +2147483647
Integer | .i | 8 bytes (64 bits) | -9223372036854775808 to +9223372036854775807
Float | .f | 4 bytes | unlimited (see below)
Quad | .q | 8 bytes | -9223372036854775808 to +9223372036854775807
Double | .d | 8 bytes | unlimited (see below)
String | .s | string length + 1 | unlimited
Fixed String | .s{Length} | string length | unlimited

Переменные без знака: Purebasic предлагает родную поддержку переменным без знака для byte и word используя типы ascii (.a) и unicode (.u). Тип (.c) знака (который является байтом без знака в ascii, и словом без знака в unicode) может также использоваться как тип без знака.

Обозначение строковых переменных: Вы можете использовать '$' в качестве последнего символа переменной для обозначения строки. Таким образом, вы можете использовать 'a$' или 'a.s', что будет одно и тоже. Примечание: Вы должны всегда ставить '$' в конце переменной, в отличие от '. S' , которая необходима только один раз когда вы объявляете переменную.
  a.s = "One string"
  a$ = "Another string"
  Debug a   ; will give "One string"
  Debug a$  ; will give "Another string"

Примечание: числа с плавающей запятой (одинарные или двойные) могут быть записаны как: 123.5e-20
  value.d = 123.5e-20
  Debug value   ; will give 0.000000000000000001235

Операторы

Операторы все функции, которые можно использовать в выражениях, чтобы объединить переменные, константы, и все остальное. Приведенная ниже таблица показывает как можно использовать операторы в PureBasic, обозначение (LHS = с левой стороны, RHS = с правой стороны).

Оператор
Описание / Пример
=
 Равно. Это может использоваться двумя способами. Первый - для назначения переменной RHS значение результата выражения LHS. Второй путь состоит в том, что оператор используется в выражении и состоит в том, чтобы сравнить, являются ли значения выражений LHS и RHS тем же самым (если они - равны, возвратит истинный результат, иначе это будет ложь).

пример:
a=b+c ; Assign the value of the expression "b+c" to the variable "a"
If abc=def ; Test if the values of abc and def are the same, and use this result in the If command

Когда '=' используется со строками, принимается во внимание верхний регистр и нижний регистр.

пример:
a$ = b$ ; Assign the content of the string "b$" to the string "a$" zu
If a$ = b$ ; Test, if the content of the strings a$ and b$ is equal, and use this result in the If command.
+
 Плюс. Gives a result of the value of the expression on the RHS added to the value of the expression on the LHS. If the result of this operator is not used and there is a variable on the LHS, then the value of the expression on the RHS will be added directly to the variable on the LHS.

пример:
number=something+2 ; Adds the value 2 to "something" and uses the result with the equals operator
variable+expression ; The value of "expression" will be added directly to the variable "variable"

With strings the '+' is also valid for combining the contents of two strings, where the result will be assigned to the string on the LHS with the '=' operator or will be directly stored into the string on the LHS.

пример:
a$ = b$ + " more" ; Combines the content of the string "b$" with the string " more" and save this into the string "a$"
a$ + b$ ; Attach the content of the string b$ directly to the string a$.
-
 Minus. Subtracts the value of the expression on the RHS from the value of the expression on the LHS. When there is no expression on the LHS this operator gives the negative value of the value of the expression on the RHS. If the result of this operator is not used and there is a variable on the LHS, then the value of the expression on the RHS will be subtracted directly from the variable on the LHS. This operator cannot be used with string type variables.

пример:
var=#MyConstant-foo ; Subtracts the value of "foo" from "#MyConstant" and uses the result with the equals operator
another=another+ -var ; Calculates the negative value of "var" and uses the result in the plus operator
variable-expression ; The value of "expression" will be subtracted directly from the variable "variable"
*
 Multiplication. Multiplies the value of the expression on the LHS by the value of the expression on the RHS. If the result of this operator is not used and there is a variable on the LHS, then the value of the variable is directly multipled by the value of the expression on the RHS. This operator cannot be used with string type variables.

пример:
total=price*count ; Multiplies the value of "price" by the value of "count" and uses the result with the equals operator
variable*expression ; "variable" will be multiplied directly by the value of "expression"
/
 Division. Divides the value of the expression on the LHS by the value of the expression on the RHS. If the result of this operator is not used and there is a variable on the LHS, then the value of the variable is directly divided by the value of the expression on the RHS. This operator cannot be used with string type variables.

пример:
count=total/price ; Divides the value of "total" by the value of "price" and uses the result with the equals operator
variable/expression ; "variable" will be divided directly by the value of "expression"
&
 Bitwise AND. You should be familiar with binary numbers when using this operator. The result of this operator will be the value of the expression on the LHS anded with the value of the expression on the RHS, bit for bit. The value of each bit is set according to the table below. Additionally, if the result of the operator is not used and there is a variable on the LHS, then the result will be stored directly in that variable. This operator cannot be used with strings.
LHS | RHS | Result
------------------
 0  |  0  |    0
 0  |  1  |    0
 1  |  0  |    0
 1  |  1  |    1
пример:
; Shown using binary numbers as it will be easier to see the result
a.w = %1000 & %0101 ; Result will be 0
b.w = %1100 & %1010 ; Result will be %1000
bits = a & b ; AND each bit of a and b and use result in equals operator
a & b ; AND each bit of a and b and store result directly in variable "a"
|
 Bitwise OR. You should be familiar with binary numbers when using this operator. The result of this operator will be the value of the expression on the LHS or'ed with the value of the expression on the RHS, bit for bit. The value of each bit is set according to the table below. Additionally, if the result of the operator is not used and there is a variable on the LHS, then the result will be stored directly in that variable. This operator cannot be used with strings.
LHS | RHS | Result
------------------
 0  |  0  |    0
 0  |  1  |    1
 1  |  0  |    1
 1  |  1  |    1
пример:
; Shown using binary numbers as it will be easier to see the result
a.w = %1000 | %0101 ; Result will be %1101
b.w = %1100 | %1010 ; Result will be %1110
bits = a | b ; OR each bit of a and b and use result in equals operator
a | b ; OR each bit of a and b and store result directly in variable "a"
!
 Bitwise XOR. You should be familiar with binary numbers when using this operator. The result of this operator will be the value of the expression on the LHS xor'ed with the value of the expression on the RHS, bit for bit. The value of each bit is set according to the table below. Additionally, if the result of the operator is not used and there is a variable on the LHS, then the result will be stored directly in that variable. This operator cannot be used with strings.
LHS | RHS | Result
------------------
 0  |  0  |    0
 0  |  1  |    1
 1  |  0  |    1
 1  |  1  |    0
пример:
; Shown using binary numbers as it will be easier to see the result
a.w = %1000 ! %0101 ; Result will be %1101
b.w = %1100 ! %1010 ; Result will be %0110
bits = a ! b ; XOR each bit of a and b and use result in equals operator
a ! b ; XOR each bit of a and b and store result directly in variable "a"
~
 Bitwise NOT. You should be familiar with binary numbers when using this operator. The result of this operator will be the not'ed value of the expression on the RHS, bit for bit. The value of each bit is set according to the table below. This operator cannot be used with strings.
RHS | Result
----------
 0  |    1
 1  |    0
пример:
; Shown using binary numbers as it will be easier to see the result
a.w = ~%1000 ; Result will be %0111
b.w = ~%1010 ; Result will be %0101
()
 Brackets. You can use sets of brackets to force part of an expression to be evaluated first, or in a certain order.

пример:
a = (5 + 6) * 3 ; Result will be 33 since the 5+6 is evaluated first
b = 4 * (2 - (3 - 4)) ; Result will be 12 since the 3-4 is evaluated first, then the 2-result, then the multiplication
<
 Less than. This is used to compare the values of the expressions on the LHS and RHS. If the value of the expression on the LHS is less than the value of the expression on the RHS this operator will give a result of true, otherwise the result is false.

пример:
If a < b ; Tests, if the value a is smaller than b, and uses this result in the If command

Note: The comparing of strings will always be "case-sensitive".
>
 More than. This is used to compare the values of the expressions on the LHS and RHS. If the value of the expression on the LHS is more than the value of the expression on the RHS this operator will give a result of true, otherwise the result is false.

пример:
If a > b ; Tests, if the value a is greater than b, and uses this result in the If command

Note: The comparing of strings will always be "case-sensitive".
<=
 Less than or equal to. This is used to compare the values of the expressions on the LHS and RHS. If the value of the expression on the LHS is less than or equal to the value of the expression on the RHS this operator will give a result of true, otherwise the result is false.
>=
 More than or equal to. This is used to compare the values of the expressions on the LHS and RHS. If the value of the expression on the LHS is more than or equal to the value of the expression on the RHS this operator will give a result of true, otherwise the result is false.
<>
 Not equal to. This is used to compare the values of the expressions on the LHS and RHS. If the value of the expression on the LHS is equal to the value of the expression on the RHS this operator will give a result of false, otherwise the result is true.
And
 Logical AND. Can be used to combine the logical true and false results of the comparison operators to give a result shown in the following table.
  LHS  |  RHS  | Result
-----------------------
 false | false | false
 false |  true | false
  true | false | false
  true |  true |  true
Or
 Logical OR. Can be used to combine the logical true and false results of the comparison operators to give a result shown in the following table.
  LHS  |  RHS  | Result
-----------------------
 false | false | false
 false |  true |  true
  true | false |  true
  true |  true |  true
XOr
 Logical XOR. Can be used to combine the logical true ot false results of the comparison operators to give a result shown in the following table.
  LHS  |  RHS  | Result
-----------------------
 false | false | false
 false |  true |  true
  true | false |  true
  true |  true | false
Not
 The result of this operator will be the not'ed value of the logical on the RHS. The value is set according to the table below. This operator cannot be used with strings.
  RHS  | Result
---------------
 false |  true
  true | false
<<
 Arithmetic shift left. Shifts each bit in the value of the expression on the LHS left by the number of places given by the value of the expression on the RHS. Additionally, when the result of this operator is not used and the LHS contains a variable, that variable will have its value shifted. It probably helps if you understand binary numbers when you use this operator, although you can use it as if each position you shift by is multiplying by an extra factor of 2.

пример:
a=%1011 << 1 ; The value of a will be %10110. %1011=11, %10110=22
b=%111 << 4 ; The value of b will be %1110000. %111=7, %1110000=208
c.l=$8000000 << 1 ; The value of c will be 0. Bits that are shifted off the left edge of the result are lost.
>>
 Arithmetic shift right. Shifts each bit in the value of the expression on the LHS right by the number of places given by the value of the expression on the RHS. Additionally, when the result of this operator is not used and the LHS contains a variable, that variable will have its value shifted. It probably helps if you understand binary numbers when you use this operator, although you can use it as if each position you shift by is dividing by an extra factor of 2.

пример:
d=16 >> 1 ; The value of d will be 8. 16=%10000, 8=%1000
e.w=%10101010 >> 4 ; The value of e will be %1010. %10101010=170, %1010=10. Bits shifted out of the right edge of the result are lost (which is why you do not see an equal division by 16)
f.b=-128 >> 1 ; The value of f will be -64. -128=%10000000, -64=%11000000. When shifting to the right, the most significant bit is kept as it is.
%
 Modulo. Returns the remainder of the RHS by LHS integer division.

пример:
a=16 % 2 ; The value of a will be 0 as 16/2 = 8 (no remainder)
b=17 % 2 ; The value of a will be 1 as 17/2 = 8*2+1 (1 is remaining)

Приоритеты операторов

  Priority Level |     Operators
  ---------------+---------------------
       8(высокий)|        ~
       7         |    <<, >>, %, !
       6         |       |, &
       5         |       *, /
       4         |       +, -
       3         | >, >=, <, <=, =, <>
       2         |       Not
       1(низкий) |  And, Or, XOr

Структурируемые типы

Создание структурированных типов, возможно используя опцию структур. Подробная информация расположена в главе structures chapter.

Информация о числах с плавающей запятой Floats и Doubles

A floating point number is stored in a way that makes the binary point "float" around the number, so that it is possible to store very large numbers or very small numbers. However, you cannot store very large numbers with very high accuracy (big and small numbers at the same time, so to speak).

Another limitation of floating point numbers is that they still work in binary, so they can only store numbers exactly which can be made up of multiples and divisions of 2. This is especially important to realise when you try to print a floating point number in a human readable form (or when performing operations on that float) - storing numbers like 0.5 or 0.125 is easy because they are divisions of 2. Storing numbers such as 0.11 are more difficult and may be stored as a number such as 0.10999999. You can try to display to only a limited range of digits, but do not be surprised if the number displays different from what you would expect!

This applies to floating point numbers in general, not just those in PureBasic.

Like the name says the doubles have double-precision (64 bit) compared to the single-precision of the floats (32 bit). So if you need more accurate results with floating point numbers use doubles instead of floats.

The exact range of values, which can be used with floats and doubles to get correct results from arithmetic operations, looks as follows:
Float: +- 1.175494e-38 till +- 3.402823e+38
Double: +- 2.2250738585072013e-308 till +- 1.7976931348623157e+308
Для получения дополнительной информации о 'IEEE 754' посетите Wikipedia.


PureBasic Visual Designer

PureBasic визуальный редактор

Краткий обзор

PureBasic Visual Designer (конструктор для графических интерфейсов пользователя) был создан для языка программирования PureBasic и конечно разрабатывается в PureBasic. Он станет более сильным и поддержит продвинутые функции такие как диалоги, редактирование Gadgets, исходный код PureBasic и т.д..

Использование

Визуальный редактор предоставлен с его собственным файлом помощи. Вы найдете его в каталоге PureBasic, речь идет о файле "Visual Designer.chm".


While : Wend

While : Wend

Синтаксис
While <expression>
  ...
Wend
Описание
Wend цикл будет выполнятся до тех пор пока выражение <expression> не станет ложью. Если первая попытка будет ложью, то выполнение программы никогда не достигнет кода внутри цикла и пропустит эту часть. В отличии от Repeat у которого цикл выполняется по крайней мере один раз.

Возможно досрочное прекращение выполнения цикла с помощью команды Break или досрочное завершение текущей итераци цикла While : Wend с помощью Continue.

Пример:

  b = 0
  a = 10
  While a = 10
    b = b+1
    If b=10
      a=11
    EndIf
  Wend
This program loops until the 'a' value is <> 10. A change here when b=10, the program will loop 10 time.


Windows Message Handling

Windows Message Handling

Introduction

The messages for your program will be sent by Windows into a queue, which is worked off only if you want this. Windows sends thousand messages to your program without noticing this directly.

For example if you change the status of a gadget (identical whether you add a new entry or change the image of an ImageGadget), a message is sent to the queue of your program.

There are two possibilities to receive and to process the Windows messages in PureBasic: WaitWindowEvent() and WindowEvent(). The difference is, that WaitWindowEvent() waits till a message arrives and WindowEvent() continues to work also so. The messages in the queue will be processed however only, after you have called WindowEvent() or WaitWindowEvent().

Specials of WindowEvent()

The command WindowEvent() don't wait, until a message arrives, but checks only whether one is in the queue. If yes, the message is processed and WindowEvent() gives back the number of the message. If no message lines up, then zero (0) is given back.

Пример:

  While WindowEvent() : Wend
cause, that WindowEvent() becomes called as long till it gives back 0, i.e. until all messages of the queue are processed.

It doesn't reach, if you insert a simple 'WindowEvent()' after a SetGadgetState() to process this 1 message. Firstly there still can be other messages in the queue, which have arrived before, and secondly Windows also sends quite a number of other messages, we don't have to take care of... which nevertheless are in the queue.

A simple call of
  WindowEvent()
doesn't reach, the code then runs correct under circumstances on one Windows version, but on another version not. The different Windows versions are internally very different, so that one version only sends 1 message but another Windows version sends 5 messages for the same circumstance.

Because of this one always uses for updating:
  While WindowEvent() : Wend
Of course there is also the alternative
  Repeat : Until WindowEvent() = 0
possible, what isn't rather usual however.

The described method While : WindowEvent() : Wend is frequently useful in connection with the command Delay(), where the loop is inserted BEFORE the Delay(), e.g. to firstly wait for the update of an ImageGadget after changing an image with SetGadgetState().


With : EndWith

With : EndWith

Синтаксис
With <expression>
  ...
EndWith
Описание
With : EndWith уменьшает объем кода, чтобы улучшить читаемость и понимание, при использовании большого количества полей structure. Код будет автоматически вставлен перед каждым символом обратного слеша '\' после пробела или оператора. Это директива компилятора, которая работает так же, как macro: строка расширяется в момент компилирования. With : EndWith блоки не могут быть вложенными, так как это может привести к затруднению поиска ошибки, при замене нескольких операторов с различными значениями.

Пример:

  Structure Person
    Name$
    Age.l
    Size.l
  EndStructure

  Friend.Person

  With Friend
    \Name$ = "Yann"
    \Age   = 30
    \Size  = 196

    Debug \Size+\Size
  EndWith

Пример: Комплексный пример

  Structure Body
    Weight.l
    Color.l
    Texture.l
  EndStructure

  Structure Person
    Name$
    Age.l
    Body.Body[10]
  EndStructure

  Friend.Person

  For k = 0 To 9
    With Friend\Body[k]
      \Weight = 50
      \Color  = 30
      \Texture = \Color*k

      Debug \Texture
    EndWith
  Next