Visual basic 2013 express

В этом разделеIn This Section

Условные обозначения и соглашения о кодеTypographic and Code ConventionsСуммирует сведения о том, как ключевые слова, заполнители и другие элементы языка форматируются в документации по Visual Basic.Summarizes the way that keywords, placeholders, and other elements of the language are formatted in the Visual Basic documentation.

Члены библиотеки времени выполнения Visual BasicVisual Basic Runtime Library MembersСодержит список классов и модулей пространства имен Microsoft.VisualBasic со ссылками на их функции-члены, методы, свойства, константы и перечисления.Lists the classes and modules of the Microsoft.VisualBasic namespace, with links to their member functions, methods, properties, constants, and enumerations.

Ключевые словаKeywordsСодержит список всех ключевых слов Visual Basic и ссылки на дополнительную информацию.Lists all Visual Basic keywords and provides links to more information.

Атрибуты (Visual Basic)Attributes (Visual Basic)Документирует атрибуты, доступные в Visual Basic.Documents the attributes available in Visual Basic.

Константы и перечисленияConstants and EnumerationsДокументирует константы и перечисления, доступные в Visual Basic.Documents the constants and enumerations available in Visual Basic.

Типы данныхData TypesДокументирует типы данных, доступные в Visual Basic.Documents the data types available in Visual Basic.

ДирективыDirectivesДокументирует директивы компилятора, доступные в Visual Basic.Documents the compiler directives available in Visual Basic.

ФункцииFunctionsДокументирует функции времени выполнения, доступные в Visual Basic.Documents the run-time functions available in Visual Basic.

МодификаторыModifiersСодержит список модификаторов времени выполнения Visual Basic и ссылки на дополнительную информацию.Lists the Visual Basic run-time modifiers and provides links to more information.

МодулиModulesДокументирует модули, доступные в Visual Basic, и их члены.Documents the modules available in Visual Basic and their members.

NothingNothingОписывает значение по умолчанию любого типа данных.Describes the default value of any data type.

ОбъектыObjectsДокументирует объекты, доступные в Visual Basic, и их члены.Documents the objects available in Visual Basic and their members.

ОператорыOperatorsДокументирует операторы, доступные в Visual Basic.Documents the operators available in Visual Basic.

СвойстваPropertiesДокументирует свойства, доступные в Visual Basic.Documents the properties available in Visual Basic.

ЗапросыQueriesСодержит справочные сведения об использовании выражений LINQ в коде.Provides reference information about using Language-Integrated Query (LINQ) expressions in your code.

ОператорыStatementsДокументирует объявления и исполняемые операторы, доступные в Visual Basic.Documents the declaration and executable statements available in Visual Basic.

XML-теги для комментариевXML Comment TagsСодержит описание комментариев к документации, для которых IntelliSense предоставляется в Visual Basic редакторе кода.Describes the documentation comments for which IntelliSense is provided in the Visual Basic Code Editor.

Свойства оси XMLXML Axis PropertiesПриводит ссылки на сведения об использовании свойств оси XML для доступа к XML непосредственно в коде.Provides links to information about using XML axis properties to access XML directly in your code.

XML-литералыXML LiteralsПриводит ссылки на сведения об использовании XML-литералов для включения XML непосредственно в код.Provides links to information about using XML literals to incorporate XML directly in your code.

сообщения об ошибкахError MessagesСодержит список Visual Basic компилятора и сообщений об ошибках во время выполнения, а также справку по их обработке.Provides a listing of Visual Basic compiler and run-time error messages and help on how to handle them.

Сводка обновлений языка VBA7Summary of VBA7 language updates

Новые дополнения языка VBA обобщаются и объясняются в приведенной ниже таблице.The following table summarizes the new VBA language additions and provides an explanation of each.

ИмяName ТипType ОписаниеDescription
PtrSafePtrSafe Ключевое словоKeyword Утверждает, что оператор Declare ориентирован на 64-разрядные системы.Asserts that a Declare statement is targeted for 64-bit systems. Требуется для 64-разрядных данных.Required on 64-bits.
LongPtrLongPtr Тип данныхData type Псевдоним типа, который отображается на тип Long в 32-разрядных системах или на тип LongLong в 64-разрядных системах.Type alias that maps to Long on 32-bit systems, or LongLong on 64-bit systems.
LongLongLongLong Тип данныхData type 8-байтный тип данных, который доступен только в 64-разрядных системах.8-byte data type that is only available on 64-bit systems. Числовой тип.Numeric type. Целые числа в диапазоне от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807.Integer numbers in the range of -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807.Использование типа LongLong допустимо только на 64-разрядных платформах.LongLong is a valid declared type only on 64-bit platforms. Кроме того, тип LongLong может не преобразовываться неявно в тип данных меньшего размера (например, невозможно присвоить тип LongLong типу Long).Additionally, LongLong may not be implicitly converted to a smaller type (for example, you can’t assign a LongLong to a Long). Это необходимо для предотвращения случайного усечения указателя.This is done to prevent inadvertent pointer truncation.Явное приведение типов данных допускается, так что в приведенном выше примере можно было бы применить CLng к LongLong и присвоить результат типу Long (действительно только для 64-разрядных платформ).Explicit coercions are allowed, so in the previous example, you could apply CLng to a LongLong and assign the result to a Long (valid on 64-bit platforms only).
^ Символ объявления типа LongLongLongLong type-declaration character Явно объявляет литерал как тип LongLong.Explicitly declares a literal value as a LongLong. Требуется для объявления литерала LongLong, который больше чем максимальное значение типа Long (иначе он будет неявно преобразован в тип double).Required to declare a LongLong literal that is larger than the maximum Long value (otherwise it will get implicitly converted to double).
CLngPtrCLngPtr функция преобразования типаtype conversion function Преобразует простое выражение в LongPtr.Converts a simple expression to a LongPtr.
CLngLngCLngLng функция преобразования типаtype conversion function Преобразует простое выражение в тип данных LongLong (действительно только для 64-разрядных платформ).Converts a simple expression to a LongLong data type (valid on 64-bit platforms only).
vbLongLongvbLongLong Константа VarTypeVarType constant Целое число LongLong (действительно только для 64-разрядных платформ).LongLong integer (valid on 64-bit platforms only).
DefLngPtrDefLngPtr Оператор DefTypeDefType statement Устанавливает для диапазона переменных тип данных по умолчанию как LongPtr.Sets the default data type for a range of variables as LongPtr.
DefLngLngDefLngLng Оператор DefTypeDefType statement Устанавливает для диапазона переменных тип данных по умолчанию как LongLong.Sets the default data type for a range of variables as LongLong.

3D-движок, написанный на формулах MS Excel

Перевод

Скриншот экрана игры
Эта статья посвящена тому, как я смог написать 3D-движок только на формулах Excel. Я реализовал следующий функционал:

  • бесконечная процедурно генерируемая карта лабиринта
  • рендеринг трассировкой лучей в реальном времени
  • вычисление окклюзии
  • рендеринг простейшего освещения
  • шейдер освещения и вычислений
  • движок естественного движения
  • в 3D-движке не используются макросы

* чтобы управлять игрой нажатием клавиш, нужны макросы, управляющие движением с помощью одной простой инструкции копирования.
Можете скачать файл и протестировать его самостоятельно!

Использование рефакторинга и IntelliSenseUse refactoring and IntelliSense

Рассмотрим несколько примеров того, как рефакторинг и IntelliSense помогают повысить эффективность кода.Let’s look at a couple of the ways that refactoring and IntelliSense can help you code more efficiently.

Во-первых, переименуем переменную :First, let’s rename the variable:

Дважды щелкните переменную , чтобы выбрать ее.Double-click the variable to select it.

Введите имя переменной, username.Type in the new name for the variable, username.
Обратите внимание, что вокруг переменной отображается серый прямоугольник, а в поле появляется значок лампочки.Notice that a gray box appears around the variable, and a light bulb appears in the margin.

Выберите значок лампочки для отображения доступных быстрых действий.Select the light bulb icon to show the available Quick Actions. Выберите Переименовать name в username.Select Rename ‘name’ to ‘username’.

Переменная переименовывается во всем проекте, то есть в нашем случае только в двух местах.The variable is renamed across the project, which in our case is only two places.

Теперь рассмотрим возможности IntelliSense.Now let’s take a look at IntelliSense

После строки напишите следующий фрагмент кода:Below the line that says , type the following code fragment:

Появится поле с членами класса DateTime.A box displays the members of the DateTime class. Кроме того, в отдельном поле отображается описание выбранного элемента.In addition, the description of the currently selected member displays in a separate box.

Выберите член с именем Now, который является свойством класса, дважды щелкнув его или воспользовавшись клавишей со стрелкой вниз, а затем нажмите клавишу TAB.Select the member named Now, which is a property of the class, by double-clicking on it or selecting it using the up or down arrow keys and then pressing Tab.

Ниже введите или вставьте следующие строки кода:Below that, type in or paste the following lines of code:

Совет
Console.Write будет немного отличаться от Console.WriteLine в том, что не добавляет знак завершения строки после ее вывода.Console.Write is a little different to Console.WriteLine in that it doesn’t add a line terminator after it prints. Это означает, что следующий фрагмент текста, отправляемый на вывод, будет выводиться в той же строке.That means that the next piece of text that’s sent to the output will print on the same line. Можно навести указатель мыши на каждый из этих методов в коде, чтобы просмотреть его описание.You can hover over each of these methods in your code to see their description.

Далее мы снова используем рефакторинг, чтобы сделать код более кратким.Next, we’ll use refactoring again to make the code a little more concise. Щелкните переменную в строке .Click on the variable in the line .
Обратите внимание, что на поле в этой строке отображается маленький значок отвертки.Notice that a little screwdriver icon appears in the margin on that line.

Щелкните значок отвертки, чтобы увидеть предложения Visual Studio.Click the screwdriver icon to see what suggestions Visual Studio has available. В этом случае отображается рефакторинг Встроенная временная переменная для удаления строки кода без изменения его общего поведения:In this case, it’s showing the Inline temporary variable refactoring to remove a line of code without changing the overall behavior of the code:

Щелкните Встроенная временная переменная, чтобы выполнить рефакторинг кода.Click Inline temporary variable to refactor the code.

  1. Снова запустите программу, нажав клавиши Ctrl+F5.Run the program again by pressing Ctrl+F5. Выходные данные выглядят следующим образом:The output looks something like this:

  1. Снова запустите программу, нажав клавиши Ctrl+F5.Run the program again by pressing Ctrl+F5. Выходные данные выглядят следующим образом:The output looks something like this:

Visual Basic 15.5Visual Basic 15.5

В Visual Basic 15.3 и более ранних версиях при включении в вызов метода аргументов по положению и по имени позиционные аргументы должны были предшествовать именованным.In Visual Basic 15.3 and earlier versions, when a method call included arguments both by position and by name, positional arguments had to precede named arguments. Начиная с Visual Basic 15.5, позиционные и именованные аргументы могут появляться в любом порядке при условии, что все аргументы до последнего позиционного аргумента находятся в правильном положении.Starting with Visual Basic 15.5, positional and named arguments can appear in any order as long as all arguments up to the last positional argument are in the correct position. Это особенно полезно, если именованные аргументы используются, чтобы сделать код более удобочитаемым.This is particularly useful when named arguments are used to make code more readable.

Например, следующий вызов метода имеет два позиционных аргумента между именованным аргументом.For example, the following method call has two positional arguments between a named argument. Именованный аргумент показывает, что значение 19 представляет возраст.The named argument makes it clear that the value 19 represents an age.

Это новое сочетание ключевых слов определяет член, доступный для всех членов содержащего его класса, а также типы, производные от содержащего член класса, но только в том случае, если они присутствуют и в сборке, содержащей член.This new keyword combination defines a member that is accessible by all members in its containing class as well as by types derived from the containing class, but only if they are also found in the containing assembly. Так как структуры нельзя наследовать, можно применять только к членам класса.Because structures cannot be inherited, can only be applied to the members of a class.

Начальный шестнадцатеричный/двоичный/восьмеричный разделительLeading hex/binary/octal separator

В Visual Basic 2017 поддерживается использование подчеркивания () в качестве разделителя цифр.Visual Basic 2017 added support for the underscore character () as a digit separator. Начиная с Visual Basic 15.5, в качестве начального разделителя между префиксом и двоичными, шестнадцатеричными или восьмеричными цифрами можно использовать знак подчеркивания.Starting with Visual Basic 15.5, you can use the underscore character as a leading separator between the prefix and hexadecimal, binary, or octal digits. В следующем примере начальный разделитель цифр используется для определения 3 271 948 384 в качестве шестнадцатеричного числа:The following example uses a leading digit separator to define 3,271,948,384 as a hexadecimal number:

Чтобы использовать символ подчеркивания в качестве начального разделителя, нужно добавить в файл проекта Visual Basic (*.vbproj) следующий элемент:To use the underscore character as a leading separator, you must add the following element to your Visual Basic project (*.vbproj) file:

Visual Basic 15.3Visual Basic 15.3

При присвоении значения элементов кортежа из переменных Visual Basic выводит имя элементов кортежа из соответствующих имен переменных; нет необходимости явно называть элемент кортежа.When you assign the value of tuple elements from variables, Visual Basic infers the name of tuple elements from the corresponding variable names; you do not have to explicitly name a tuple element. В следующем примере вывод используется для создания кортежа с тремя именованными элементами: , и .The following example uses inference to create a tuple with three named elements, , , and .

Дополнительные параметры компилятораAdditional compiler switches

Теперь компилятор командной строки Visual Basic поддерживает параметры -refout и -refonly для управления выводом базовых сборок.The Visual Basic command-line compiler now supports the -refout and -refonly compiler options to control the output of reference assemblies. -refout определяет выходной каталог базовой сборки, а -refonly указывает, что в результате компиляции будет выводиться только базовая сборка.-refout defines the output directory of the reference assembly, and -refonly specifies that only a reference assembly is to be output by compilation.

Что новенького в нашей документации по .NET (за декабрь 2019)

Перевод

Добро пожаловать в «Что новенького в нашей документации по .NET (за декабрь 2019)». Ниже перечислены некоторые из недавно опубликованных нами документов. Узнайте больше в полной статье ниже.

Новые статьи

  • .NET Core Uninstall Tool
  • Важные изменения при переходе с версии 2.0 на 2.1
  • Важные изменения при миграции с .NET Framework на .NET Core
  • Гайд: отладка memory leak в .NET Core
  • Как установить локализованные файлы IntelliSense для .NET Core
  • Варианты конфигурации рантайма для компиляции
  • Параметры конфигурации рантайма для отладки и профилирования
  • Варианты конфигурации рантайма для глобализации
  • Варианты конфигурации рантайма для работы в сети
  • Параметры конфигурации рантайма для потоков
  • Начало работы с .NET Core в Windows/Linux/macOS с помощью командной строки
  • Что нового в .NET Core 3.1

Написание кода, который работает как в Office 2010 (32-разрядный или 64-разрядный пакет), так и в предыдущих версиях OfficeWriting code that works on both Office 2010 (32-bit or 64-bit) and previous versions of Office

Чтобы написать код, работающий как в новой, так и в старой версиях Office, можно использовать комбинацию новых условных констант компилятораVBA7 и Win64.To write code that can work in both new and older versions of Office, you can use a combination of the new VBA7 and Win64 conditional Compiler constants. Условная константа компилятора Vba7 применяется, чтобы определить, работает ли программный код в версии 7 редактора VB (версия VBA, которая поставляется в Office 2010).The Vba7 conditional compiler constant is used to determine if code is running in version 7 of the VB editor (the VBA version that ships in Office 2010). Условная константа компиляции Win64 применяется, чтобы определить, какая версия (32-разрядная или 64-разрядная) Office функционирует на компьютере.The Win64 conditional compiler constant is used to determine which version (32-bit or 64-bit) of Office is running.

Безопасность Microsoft Office: макросы VBA

В 2016 году исследователи отметили всплеск активности, практически второе рождение, еще недавно казавшейся безнадежно устаревшей техники распространения нежелательного ПО — несущих злонамененную нагрузку макросов в документах Microsoft Office, т.н. «макровирусов».
Самый знаменитый макровирус, Melissa, появился в марте 1999 года. Вирус поразил по крайней мере сто тысяч компьютеров по всему миру, парализовал работу сотен компаний, ущерб экономике составил 80 миллионов долларов в одних только США.
Судя по отчетам компаний, связанных с информационной безопасностью (например, здесь ), на сегодняшний день макровирусы все еще занимают верхние строчки в рейтингах по распространенности.
Не появилось никаких способствовавших этому новых уязвимостей, как в общем-то не было никаких чисто технических предпосылок. По-видимому, распространители malware, испытывая недостаток в свежих багах, обратили свои взоры на плохо забытые (и все еще эффективные) старые.
Почему почти через двадцать лет та же техника остается на вооружении всевозможных компьютерных злоумышленников? Попробуем разобраться.

Создание проектаCreate a project

Сначала мы создадим проект приложения Visual Basic.First, we’ll create a Visual Basic application project. Для этого типа проекта уже имеются все нужные файлы шаблонов, что избавляет вас от лишней работы.The project type comes with all the template files you’ll need, before you’ve even added anything!

  1. Откройте Visual Studio 2017.Open Visual Studio 2017.

  2. В верхней строке меню последовательно выберите Файл > Создать > Проект.From the top menu bar, choose File > New > Project.

  3. В левой области диалогового окна Новый проект разверните узел Visual Basic и выберите .NET Core.In the New Project dialog box in the left pane, expand Visual Basic, and then choose .NET Core. На средней панели выберите Консольное приложение (.NET Core) .In the middle pane, choose Console App (.NET Core). Назовите проект WhatIsYourName.Then name the project WhatIsYourName.

Добавление рабочей нагрузки (необязательно)Add a workload (optional)

Если шаблон проекта Консольное приложение (.NET Core) отсутствует, его можно получить, добавив рабочую нагрузку Кроссплатформенная разработка .NET Core.If you don’t see the Console App (.NET Core) project template, you can get it by adding the .NET Core cross-platform development workload. Добавить ее можно одним из двух способов в зависимости от того, какие обновления Visual Studio 2017 установлены на вашем компьютере.You can add this workload in one of the two following ways, depending on which Visual Studio 2017 updates are installed on your machine.

Вариант 2: использование меню «Сервис»Option 2: Use the Tools menu bar

  1. Закройте диалоговое окно Создать проект и в верхней строке меню выберите Сервис > Получить средства и компоненты.Cancel out of the New Project dialog box and from the top menu bar, choose Tools > Get Tools and Features.

  2. Запускается Visual Studio Installer.The Visual Studio Installer launches. Выберите рабочую нагрузку Кроссплатформенная разработка .NET Core и затем элемент Изменить.Choose the .NET Core cross-platform development workload, and then choose Modify.

Примечание

На некоторых снимках экрана в этом учебнике используется темная тема.Some of the screenshots in this tutorial use the dark theme. Если вы не используете темную тему, но хотите переключиться на нее, см. страницу Персонализация интегрированной среды разработки и редактора Visual Studio.If you aren’t using the dark theme but would like to, see the Personalize the Visual Studio IDE and Editor page to learn how.

  1. Запустите Visual Studio 2019.Open Visual Studio 2019.

  2. На начальном экране выберите Создать проект.On the start window, choose Create a new project.

  3. В поле поиска окна Создание проекта введите консоль.On the Create a new project window, enter or type console in the search box. Затем выберите Visual Basic в списке языков и Windows в списке платформ.Next, choose Visual Basic from the Language list, and then choose Windows from the Platform list.

    Применив фильтры языка и платформы, выберите шаблон Консольное приложение (.NET Core) и нажмите кнопку Далее.After you apply the language and platform filters, choose the Console App (.NET Core) template, and then choose Next.

    Примечание

    Если шаблон Консольное приложение (.NET Core) отсутствует, его можно установить из окна Создание проекта.If you do not see the Console App (.NET Core) template, you can install it from the Create a new project window. В сообщении Не нашли то, что искали? выберите ссылку Установка других средств и компонентов.In the Not finding what you’re looking for? message, choose the Install more tools and features link.

    После этого в Visual Studio Installer выберите рабочую нагрузку Кроссплатформенная разработка .NET Core.Then, in the Visual Studio Installer, choose the .NET Core cross-platform development workload.

    Затем нажмите кнопку Изменить в Visual Studio Installer.After that, choose the Modify button in the Visual Studio Installer. Вам может быть предложено сохранить результаты работы; в таком случае сделайте это.You might be prompted to save your work; if so, do so. Выберите Продолжить, чтобы установить рабочую нагрузку.Next, choose Continue to install the workload. После этого вернитесь к шагу 2 в процедуре .Then, return to step 2 in this «» procedure.

  4. В поле Имя проекта окна Настроить новый проект введите WhatIsYourName.In the Configure your new project window, type or enter WhatIsYourName in the Project name box. Затем нажмите Создать.Then, choose Create.

    Новый проект открывается в Visual Studio.Visual Studio opens your new project.

RemarksRemarks

Для логического сравнения параметр имеет значение, только если оба значения и имеют значение .For Boolean comparison, is if and only if both and evaluate to . В следующей таблице показано, как определяется.The following table illustrates how is determined.

Если имеет значение If is И являетсяAnd is Значение равноThe value of is

Примечание

При логическом сравнении оператор всегда вычисляет оба выражения, которые могут включать вызовы процедур.In a Boolean comparison, the operator always evaluates both expressions, which could include making procedure calls. Оператор AndAlso выполняет сокращенное вычисление, означающее, что если имеет значение , то не вычисляется.The AndAlso Operator performs short-circuiting, which means that if is , then is not evaluated.

При применении к числовым значениям оператор выполняет побитовое сравнение одинаково позиционированных битов в двух числовых выражениях и устанавливает соответствующий бит в соответствии со следующей таблицей.When applied to numeric values, the operator performs a bitwise comparison of identically positioned bits in two numeric expressions and sets the corresponding bit in according to the following table.

Если бит в имеет значениеIf bit in is И bit в имеетAnd bit in is Бит в имеет значениеThe bit in is
11 11 11
11
11

Примечание

Так как логические и побитовые операторы имеют более низкий приоритет, чем другие арифметические и реляционные операторы, все битовые операции должны быть заключены в круглые скобки для обеспечения точных результатов.Since the logical and bitwise operators have a lower precedence than other arithmetic and relational operators, any bitwise operations should be enclosed in parentheses to ensure accurate results.

Работа с диапазонами ячеек

Вся работа в Excel VBA производится с диапазонами ячеек. Они создаются функцией Range и возвращают объект типа Range. У него есть всё необходимое для работы с данными и/или оформлением. Кстати сказать, свойство Cells листа — это тоже Range.

Примеры работы с Range

Теперь давайте поймем алгоритм работы нашего кода. Итак, у каждой строчки листа data, начиная со второй, есть некоторые данные, которые нас не интересуют (ID, название и цена) и есть две вложенные группы, к которым она принадлежит (тип и производитель). Более того, эти строки отсортированы. Пока мы забудем про пропуски перед началом новой группы — так будет проще. Я предлагаю такой алгоритм:

  1. Считали группы из очередной строки.
  2. Пробегаемся по всем группам в порядке приоритета (вначале более крупные)
    1. Если текущая группа не совпадает, вызываем процедуру AddGroup(i, name), где i — номер группы (от номера текущей до максимума), name — её имя. Несколько вызовов необходимы, чтобы создать не только наш заголовок, но и всё более мелкие.
  3. После отрисовки всех необходимых заголовков делаем еще одну строку и заполняем её данными.

Для упрощения работы рекомендую определить следующие функции-сокращения:

Далее определим глобальную переменную «текущая строчка»: Dim CurRow As Integer. В начале процедуры её следует сделать равной единице. Еще нам потребуется переменная-«текущая строка в data», массив с именами групп текущей предыдущей строк. Потом можно написать цикл «пока первая ячейка в строке непуста».

Теперь надо перенести всякую информацию в result

Подогнать столбцы по ширине и выбрать лист result для показа результата

Всё. Можно любоваться первой версией.

Некрасиво, но похоже. Давайте разбираться с форматированием. Сначала изменим процедуру AddHeader:

Уже лучше:

Осталось только сделать границы. Тут уже нам требуется работать со всеми объединёнными ячейками, иначе бордюр будет только у одной:

Поэтому чуть-чуть меняем код с добавлением стиля границ:

Осталось лишь добится пропусков перед началом новой группы. Это легко:

В цикле расстановки заголовков

В точности то, что и хотели.

Надеюсь, что эта статья помогла вам немного освоится с программированием для Excel на VBA. Домашнее задание — добавить заголовки «ID, Название, Цена» в результат. Подсказка: CurRow = 0 CurRow = 1.

Файл можно скачать тут (min.us) или тут (Dropbox). Не забудьте разрешить исполнение макросов. Если кто-нибудь подскажет человеческих файлохостинг, залью туда.

Спасибо за внимание. UPD: Перезалил пример на Dropbox и min.us

UPD: Перезалил пример на Dropbox и min.us.

UPD2: На самом деле, при вызове процедуры с одним параметром скобки можно поставить. Либо использовать конструкцию Call Foo(«bar», 1, 2, 3) — тут скобки нужны постоянно.

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий