Visual Basic: новости сайтов, советы, примеры кодов.
Выпуск 207.


VBNet VBMania
Голосование:

Голосования сайта VBNet.Ru. Результаты голосований передаются на сайт. Проследите, что есть соединение с интернетом.



Рассылки Subscribe.Ru
VB.NET-World
Новости сайта IgorykSoft и советы по программированию
DanSoft о Visual Basic
Visual Basic.NET Уроки.

Ссылки:

  • Улицы VB
  • Использование VB
  • Азбука VB
  • VB на русском
  • Улицы VB
  • Кирпичики VB
  • CообЧа VB
  • MDesign
  • IgorykSoft
  • DanSoft
  • Господа!!! читайте MSDN!!!

    Несколько слов от автора:

       Новый выпуск.
    Читайте!


    Содержание выпуска




    Как изменять размер динамического массива, сохраняя данные?

    Вопрос:

    Необходимо размерность двумерного динамического массива увеличивать, при этом данные сохранять (типа Preserve)
    вот так пишу:

    Dim bd() As Variant

         ReDim bd(0, 0) As Variant
         ReDim Preserve bd(0, UBound(bd) + 1)
         bd(0, 0) = "Abcde"
         bd(0, 1) = 2

         ReDim Preserve bd(UBound(bd) + 1, 1)
         ' вот здесь ошибку выдает, а если
         'Preserve убрать работает, но данные то нужны!
         bd(1, 0) = "sdfsdfs"
         bd(1, 1) = 5

    Так что делать?

    Ответ:

    Если ты используешь ключевое слово Preserve, то ты можешь изменить только последнюю размерность массива .

    Есть два пути решения.
    первый - вообще не изменять размер первого измерения.
    Второй - создать новый динамический массив и в него переписать данные из предыдущего массива.

        Артем Кривокрисенко

    Это можно делать только со строками таблицы.

    Есть массив, правильно сделанный. X(5,5) так вот 5,10 сделать можно, а 10,5 нельзя. Точнее можно, но гораздо более сложно.

        DmitryK1

    наверх


    Как преобразовать 4 байта в Лонг?

    Вопрос:

    Достаю из файла 4 байта - переменную типа Long\DWord.
    Как преобразовать её в число Long?

    Ответ:

    lngResult=byt1 + _
               byt2 * 2^8 + _
               byt3 * 2^16 + _
               byt4 * 2^24

    Это - без апи. Можно и с АПИ.

    Call MoveMemory(lngResult, byt1,1)
    Call MoveMemory(ByVal VarPtr(lngResult)+1, byt2,1)
    Call MoveMemory(ByVal VarPtr(lngResult)+2, byt3,1)
    Call MoveMemory(ByVal VarPtr(lngResult)+3, byt4,1)

        Артем Кривокрисенко

    Можно ещё LSET попробовать

    создаётся два типа.в одном 4 байта в другом 2 лонга, из них две переменных. а потом

    Lset tip1=tip2

        DmitryK1

    наверх


    Как в NT-системе правильно скопировать текст?

    Вопрос:

    Как под NT системой правильно скопировать текст в буфер? Вот такая строчка "Clipboard.SetText lstStatus.Text" копирует лажу (не в той кодировке).

    Ответ:

    Можно программно менять раскладку:

    Private Declare Function ActivateKeyboardLayout Lib "user32" _
         (ByVal HKL As Long, ByVal flags As Long) As Long

    Public Sub RussianKbd()
         ActivateKeyboardLayout 68748313, 0
    End Sub

    Public Sub EnglishKbd()
         ActivateKeyboardLayout 67699721, 0
    End Sub

        Рязанов Андрей

    наверх


    Как определить позицию курсора в Windows?

    Вопрос:

    Как определить позицию курсора в Windows?

    Ответ:

    Позицию курсора можно определить с помощью API функции GetCursorPos
    Объявление:

    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Type POINTAPI
          x As Long
          y As Long
    End Type
    Private g As Long' Любая переменная типа Long
    Private Position As POINTAPI ' Любая переменная типа POINTAPI

    Применение:

    Private Sub Form_Load()
    g = GetCursorPos(Position)
    MsgBox "Позиция по Х: " & Position.x
    MsgBox "Позиция по Y: " & Position.y
    End Sub

    Ivan

    наверх


    Как сумировать ячейки в таблице Excel, которые выделены красным цветом?

    Вопрос:

    Как сумировать ячейки в таблице Excel, которые выделены, к примеру, красным цветом?

    Ответ:

    Можно использовать такую схему:

    ' отобранные ячейки для суммирования
    Dim sumRange As Range
    ' отдельная проверямая ячейка
    Dim rCell As Range

    ' просматриваем диапазон ячеек
    For Each rCell In Range("A1:D5").Cells
       ' проверяем цвет шрифта в ячейке
       If rCell.Font.Color = RGB(255, 0, 0) Then
           ' если набор ячеек еще не инициализирован
           If sumRange Is Nothing Then
               ' инициализируем набор первой найденной ячейкой
               Set sumRange = rCell
           Else
               ' или добавляем очередную ячейку к уже найденным
               Set sumRange = Union(sumRange, rCell)
           End If
       End If
    Next rCell

    ' записываем результат, используя для суммирования
    ' встроенную функцию Excel'я
    Range("A7").Value = Application.Sum(sumRange)

    Kirill

    наверх


    Вопрос/Ответ

    Здесь Вы можете задать вопрос, или ответить на уже имеющиеся вопросы.

    Вопросы:


    Автор вопроса: Игорь

    Ответ ожидается по этому адресу

       Как с помощью модема соедениться с двумя машинами и передать файл (на VB6)?


    Автор вопроса: Den

    Ответ ожидается по этому адресу

       Вопрос по .Net.

    Мне надо вызвать процедуру обработки события "Panel1_paint" из другой процедуры. Но там какие-то два странных Аргумента:

    (ByVal sender As System.Object, ByVal _ e As _ System.Windows.Forms.PaintEventArgs)"

    Скажите, для чего они нужны и что в них надо передавать.


    Автор вопроса: Anakonda

    Ответ ожидается по этому адресу

       Как проигрывать звук циклически без всяких там контролов, только средствами Win API и VB?


    Автор вопроса: Антон

    Ответ ожидается по этому адресу

       Как на VB получить системную переменную?
    Мне конкретно нужна переменная, в которой хранится полный путь к временной дирректории (temp). Полагаю, нужно использьзовать WINAPI, но какую ф-ю не знаю. Может кто делал и поделится инфой, можно и примерчиком маленьким.




    Ответы:


    Вопрос:

          Скажите, пожалуйста, как заблокировать мышь и клавиатуру.
       Идея: тест производительности системы и нужно, чтобы пользователь не имел возможности клацать мышь и клавиатуру, чтобы не созадавать погрешности в расчетах.

    Ответ:

    Автор ответа: Sergey

    Хорошая WinXPI ф-ция - BlockInput. Блокирует/разблокирует мышь и клавиатуру.


    Вопрос:

       Существует кем-то написанная программа, работающая в фоновом режиме, хочу послать ее окну комбинацию клавиш:
    Shift+a, ctrl+a, alt+a (a – для примера). Знаю hwnd этого окно, пробовал при помощи sendmessage, но посылается только отдельная клавиша, а как комбинацию послать не знаю

    Ответ:

    Автор ответа: Sergey

    Попробуй следующие комбинации:

    "+(a)","^(a)","%(a)"


    Вопрос:

       На форме есть RichTextBox. Как узнать скорость ввода символов?

    Ответ:

    Автор ответа: Котофей

    Для этого поставь на форму еще обьекты Timer и Label и пиши:

    Dim z1 As Long '-время начала работы в секундах
    Dim z2 As Long '-время в данный момент (проверяется через время заданное в свойстве обьекта Timer1.interval)
    Dim z3 As Long '-разнось времени сейчас и начала работы
      
    Private Sub Form_Load()
    z1 = Timer
    End Sub
      
    Private Sub Timer1_Timer()
    z2 = Timer+1 ' - плюсовать один чтобы не было переполнения переменной
    z3 = z2 - z1
    Label1.Caption = "скорость" & Len(RichTextBox1.Text) / z3
    End Sub
      
    Функция Timer возвращает количество секунд прошедшее после полуночи.
    Если нужно что-нибудь усложнить или что-то непонятно пиши на ящик, помогу.



    Ответ:

    Автор ответа: Sergey

        А разве скорость ввода символов зависит от того, куда мы их вводим (если конечно не предусмотреть специальной обработки)?
        Попробуй WinAPI ф-ции SystemParametersInfo c параметрами SPI_GETKEYBOARDDELAY, SPI_GETKEYBOARDSPEED.


    Вопрос:

       Есть ли какая нибуть ф-ция для конвентирования файлов bmp в другие форматы?

    Ответ:

    Автор ответа: Vir

    Функций нет, есть только контролы, много в инете, например, на VBNET.RU.


    Вопрос:

       Как красивее написать следующее условие:
      Если NameVariable = 0 или NameVariable = 1 или NameVariable = 2 или NameVariable = 3 или NameVariable = 1000 ...и т.д.
    (Переменная одна, а значений, при которых это условие должно выполнятся, может быть ооооооочень много).

    Ответ:

    Автор ответа: Mind Engine

    Вот так!

       select case NameVariable
        case 0
        ...
        case 1
        ...
        case 2
        ...
        case 3
        ...
        case 1000
        ...
        case else
        ...
       end select



    Ответ:

    Автор ответа: Vlasenko Fedor

    Красивее написать так:

    Select Case NameVariable
         Case 0
             Msgbox 0
         Case 1
             Msgbox 1
         '..................
         Case 1000
             Msgbox 1000
         '..................
    End Select



    Ответ:

    Автор ответа: Котофей

    Если значения переменной находятся в какой-то закономерности или это последовательность то можно например так:

    if (NameVariable>0 and NameVariable<1000) or (NameVariable>2000 and NameVariable<3000) or ...



    Ответ:

    Автор ответа: Vir

    1. если последовательны то 0<=NameVariable <=1000
    2. значения 0,1,2 хранятся в массиве a(1000) то
    a=array(1,2,3,4,...)
    for i=0 to 1000
         if a(i)=NameVariable then
             ...
             exit for
         end if
    next



    Ответ:

    Автор ответа: Сан Саныч

       Для таких случаев существует конструкция Select Case:

       Select Case NameVariable
              Case 1 to 20, 55, 23, 64 to 80
                   'do something
              Case Else
                   'do else something
       End Select


    Вопрос:

       1. Как различить нажатие левой и правой клавиши Ctrl ( Shift, Alt). В программе мне необходимо выполнить два разных действия при нажатии левой или правой клавиши?
    2. Аналогично, как различить нажатие Enter и Enter дополнительной клавиатуры?

    Ответ:

    Автор ответа: Vir

    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
      
    Private Sub Timer1_Timer()
         Text1.Text =""
         For i = 1 To 255
             If GetAsyncKeyState(i) Then
                 Text1.Text =Text1.Text & " " & i
             End If
         Next
    End Sub

    Код показывает все нажатые клавиши.




    Можете заполнить эту форму, либо отослать вопрос СЮДА

    Форма для добавления нового вопроса в этот раздел. Информация отсылается по E-mail владельцу сайта.
    Текст сообщения:
    Ваше имя
    E-mail для ответа

    наверх


    Выпуск подготовили:

    Сурменок Павел