СообЧа > База Знаний > Программирование > Visual Basic > Формы и элементы управления

Вопрос

Создал AppWizard'ом MDI'шку и обнаружил облом!

Если подчиненная форма развернута, то в кепшене мамаши будет

MDI.Caption & " — [" & ChildForm.Caption & "]"

Если пробовать изменить — бесполезно!
А когда детишка обратно восстанавливается, то кепшен становится прежним.

Как избавиться от этого глюка? Уже все, что есть, все перекопал.

Ответ

Мне в свое время надо было подобное — я ловил Resize дочерней формы и если ее разворачивают, ставил ее caption="". При восстановлении возвращал все обратно. Способ кривой, но работал.

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

Вопрос

А можно уже существующую форму переделать в MDI?

Ответ

В VB6 НЕТ. Это два РАЗНЫХ объекта (как кнопка и Label)

В VB.NET это можно делать по умолчанию. Единственные различия между обычным окном, MDI-контейнером и MDI-ребеном — это значения свойств IsMdiContainer и IsMdiChild. И менять их можно в рантайме.

Из конференции VB

Вопрос

Возможно ли средствами VB отключить кнопку «Пуск»?

Ответ

Можно, вот код:
Функция FindWindow:
lpClassName — имя класса нужного нам окна
lpWindowName — заголовок окна, можно передать строку содержащею 0 символов
Функция возвращяет hWnd указанного окна.

Функция FindWindowEx:
hWndParent — hWnd полученный функцией FindWindow
hWndChildAfter — hWnd дочернего окна
lpClassName — аналогичен параметру функция FindWindow
lpWindowName — аналогичен параметру функция FindWindow

Далее все очень просто, получив hWnd нужного нам окна мы можем делать с этим
окном почти все, что угодно. А теперь небольшой пример, работы с кнопкой Start (Пуск).

'Создайте стандартный проект, установите на форму 4 кнопки.

Option Explicit
Dim hwndChild As Long
Const SW_HIDE = 0
Const SW_SHOW = 5
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWndParent As Long, ByVal hWndChildAfter As Long, _
ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function EnableWindow Lib "user32" Alias "EnableWindow" _
(ByVal hWnd As Long, ByVal fEnable As Boolean) As Long
Private Declare Function ShowWindow Lib "user32" Alias "ShowWindow" _
(ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Private Sub Form_Load()
Me.Caption = "Start button"
Command1.Caption = "Hide"
Command2.Caption = "Show"
Command3.Caption = "Enabled"
Command4.Caption = "Disabled"
hwndChild = FindWindowEx(FindWindow("Shell_traywnd", ""), 0, "Button", "")
End Sub
Private Sub Command1_Click()
ShowWindow hwndChild, SW_HIDE
' скрыто окно
End Sub
Private Sub Command2_Click()
ShowWindow hwndChild, SW_SHOW
' видно окно
End Sub
Private Sub Command3_Click()
EnableWindow hwndChild, True
' можно использовать
End Sub
Private Sub Command4_Click()
EnableWindow hwndChild, False
' нельзя использовать
End Sub

' Аналогичным способом можно использовать любое окно. В этом примере
используется небольшая часть того, что можно вытворять с окнами. Здесь главное быть осторожным,
так как Windows может не простить допущенной вами ошибки.

@LEXis

Вопрос

Ситуация такая: frmMain запускает frm2 и помещает ее в себя, т.е. frm2 становится как бы контролом внутри frmMain (если бордер убрать у frm2, то и вовсе не отличить), точнее не в себя, а в PictureBox на себе. При этом frm2 абсолютно ничего не знает про frmMain.
Так вот, надо сделать так, чтоб frmMain не реагировала ни на что, а frm2 вела себя как обычно.
Как это сделать?

Ответ

Передавай все события отлавливаемые frmMain в frm2.

Сергей Л.

Вопрос

Где в IDE VB можно изменить (установить) порядок обхода элементов формы?

Ответ

За это отвечает свойство TabIndex каждого из элементов.

BSP

Значит, делается это так: встаешь на последний (согласно выбранному тобой порядку) из элементов и назначаешь TadIndex=0, затем встаешь на предпоследний и снова TadIndex=0. Так до самого первого элемента. Все

mr_ofeny

Вопрос

Необходимо сделать выпадающее меню в виде календаря, чтобы можно было передвигаться по месяцам и выбирать соответствующую дату. Есть стандартный объект?

Ответ

Microsoft Windows Common Controls — 2 6.0 (SP4) файл MSCOMCT2.OCX
Поставляется он вместе с VB 6.0 SP4

Ruslan Inozemtsev

Вопрос

Как быстро перекинуть данные (List, ItemData) из одного Комбо в другой? Нужен максимально быстрый способ на ВБ6.

Ответ

Можно так попробовать. Просто сделать List c Index(0), по сути, массив. Как понадобится скопировать куда-то — Load List(1) и ставим в нужное место. Как данные теряют актуальность, Unload List(1) и снова Load(1).

Вообще, быстро сделать можно элементарным перебором с помощью АПИ, который произойдет хотябы ненамного быстрее перебора средствами VB.

Вот пример для ЛистБокса. Без труда оптимизируется для КомбоБокса.

Private Declare Function SendMessageStr Lib "user32" Alias "SendMessageA" (ByVal _
hWnd As Long, ByVal wMsg As Long,
ByVal wParam As Long, ByVal lParam As String) As Long
Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal _
hWnd As Long, ByVal wMsg As Long,
ByVal wParam As Long, ByVal lParam As Long) As Long

Private Function CopyListToList(source As ListBox, target As ListBox) As Long
Dim c As Long
Const LB_GETCOUNT = &H18B
Const LB_GETTEXT = &H189
Const LB_ADDSTRING = &H180
Dim numitems As Long
Dim sItemText As String * 255
numitems = SendMessageLong(source.hWnd, LB_GETCOUNT, 0&, 0&)
If numitems > 0 Then
For c = 0 To numitems — 1
Call SendMessageStr(source.hWnd, LB_GETTEXT, c, ByVal sItemText)
Call SendMessageStr(target.hWnd, LB_ADDSTRING, 0&, ByVal sItemText)
Next
End If
numitems = SendMessageLong(target.hWnd, LB_GETCOUNT, 0&, 0&)
CopyListToList = numitems
End Function

Еще быстрее, думаю, не выйдет.

Из конференции VB

Вопрос

Как в ComboBox'е (style='Dropdown list') программно установить значение? Скажем у меня список состоит из: a,b,c нужно установить b.

Ответ

cmbMobiles.ListIndex = 1

Savenger

Вопрос

Использую CommonDialog (SP3).
Появилась необходимость загнать в фильтр несколько типов файлов (как сделано например при открытии файла в Excel). Как это сделать? Нужно, чтоб было несколько фильтров, и чтоб можно было между ними переключаться.

Ответ

Попробуй такой фильтр:

Доки|*.txt;*.doc|Исполняемые файлы|*.exe;*.bat

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

Вопрос

Как в CommonDialog настроить фильтр на расширение?

Ответ

Смотрите соответствующий раздел на сайте
http://vbnet.ru/ — Библиотека Кодов — Работа с CommonDialog.

Шаронов Игорь Александрович

Вопрос

Как в MDI-форме кодом переключиться на следующее окно?

Ответ

Все формы помещаются в коллекцию по порядку создания.
От этого и пляши. Например, создай Public переменную, храни в ней номер активной формы, и пиши:

Forms(iActiveForm+1).SetFocus.
If iActiveForm=Forms.Count Then
    iActiveForm=1 ' первая будет MDI-форма, если она у тебя стартовая.
Else
   iActiveForm=iActiveForm+1
End If

А если в проекте помимо MDIChild форм открываются обычные формы, то можно еще добавить проверку, типа:

IF Forms(iActiveForm+1).mdichild then
    'Переходим на след. child-форму
    …
END IF

Из конференции VB

Вопрос

Можно ли в MSFlexGrid'е заблокировать выделение нескольких строк, чтобы выделялась только одна за раз?

Ответ

Private Sub MsFlexGrid_SelChange()
     MsFlexGrid.RowSel = MsFlexGrid.Row
End Sub

Viaceslavas Kaleda

Вопрос

В VB пытаюсь сделать текстовый редактор. Посоветуйте, как сделать, чтобы по нажатии на кнопку BOLD (полужирный), полужирным становился не весь текст, а только выделенный. Я написал так:

Case "Bold"
With txtBox
 If .FontBold = True Then
  .FontBold = False
 Else
  .FontBold = True
 End If
End With

Ответ

Чтобы сделать часть текста как Bold нужно использовать компонент Microsoft Rich Textbox Control. Это такое же текстовое поле, но можно для любой части текста менять свойства.

Rutshtein Alex

Вопрос

Многоуважаемые, как вызвать метод Validate для каждого TextBox-a на форме? Боксов штук 15, все с разными именами.
У каждого бокса уже есть свой обработчик txtXXX_Validate, так вот их и надо вызвать все по очереди. По идее, этот эвент стреляет при потере боксом фокуса, но если делать программно txtXXX1.SetFocus:txtXXX2.SetFocus …, то события не происходит :( Так как вызвать это событие программно?

Ответ

Если тебе нужно вызывать процедуры обработки события, то попробуй использовать команду CallByName. Не знаю почему, но она мало известна. Ее даже в русскоязычном хэлпе по VB5 нету. Обработчики события Validate должны быть объявлены Public.

For Each c In Me.Controls
If c.Tag="xxx" Then
CallByName Me, c.Name & "_Validate", vbMethod, False
End If
Next


Вот конечный текст:

Private Function FormIsValid() As Boolean
Dim a As Control, tm As Boolean
tm = False
For Each a In Me.Controls
If (TypeOf a Is TextBox) Then
If a.Enabled Then
CallByName Me, a.Name & "_Validate", VbMethod, tm
If tm Then a.SetFocus: Exit For
End If
End If
Next
FormIsValid = Not tm
End Function


Пример xxx_Validate:

Public Sub txtRSchet_Validate(Cancel As Boolean)
If Len(txtRSchet.Text) <> 20 Then
MsgBox "Неправильный расчетный счет", vbExclamation +
vbOKOnly, "Внимание!"
Cancel = True
End If
End Sub


Сурменок Павел, Андрей, Дмитрий Данелия

Вопрос

Как в VB работать с портами LPT и COM? И как сделать так, чтобы я нажимал выключатель и запускался ну например таймер? Пожалуйста укажите Web-страницы, где об этом можно прочитать!

Ответ

Есть такой контрол
MS Comm

Есть такие страницы…
MSDN называется.

Sergey Y. Tkachev

Вопрос

У меня такой вопрос: как сделать так, чтобы программа при сворачивании окна сворачивалась не в TaskBar, а в System Tray (где часы, индикатор клавиатуры и т.п.)?

Ответ

На форму помещаешь элемент PictureBox и в него помещаешь ИКОНКУ.
Также делаешь меню: элемент первого уровня — mnuMain (Visible = False)
Элементы второго уровня: mnuMainShow и MnuMainExit
Далее код:
Option Explicit
Private Declare Function Shell_NotifyIcon _
Lib "shell32.dll" Alias _
"Shell_NotifyIconA" (ByVal dwMessage As Long, _
lpData As NOTIFYICONDATA) _
As Long ' функция, которая работает с SysTray
Private Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type
Private Const NIM_ADD = &H0 ' позволяет добавлять элемент в Tray
Private Const NIM_DELETE = &H2 ' позволяет удалять элемент из Tray
Private Const NIF_MESSAGE = &H1 ' позволяет принимать сообщения
Private Const NIF_ICON = &H2
Private Const NIF_TIP = &H4
'Делаем собственную константу:
Private Const NIF_FLAG = NIF_MESSAGE Or NIF_ICON Or NIF_TIP
' какие события может обрабатывать
Private Const WM_MOUSEMOVE = &H200
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_MBUTTONDOWN = &H207
Private Const WM_MBUTTONUP = &H208
Private Const WM_MBUTTONDBLCLK = &H209
Private Icn As NOTIFYICONDATA
Private Sub Form_Resize()
If Me.WindowState = vbMinimized Then ' если форма минимизируется
With Icn
.cbSize = Len(Icn)
.hwnd = Picture1.hwnd
.uID = 1
.uFlags = NIF_FLAG 'вот и наша константа,
' содержащая параметры вызова функции
.uCallbackMessage = WM_MOUSEMOVE
.hIcon = Picture1.Picture
Shell_NotifyIcon NIM_ADD, Icn ' добавляем в Tray
Me.Hide ' прячем саму форму
End With
End If
End Sub
Private Sub mnuMainExit_Click()
Shell_NotifyIcon NIM_DELETE, Icn
Unload Me
End
End Sub
Private Sub mnuMainShow_Click()
Me.WindowState = vbNormal
Me.Show
Shell_NotifyIcon NIM_DELETE, Icn
End Sub
Private Sub Picture1_MouseMove(Button As Integer, _
Shift As Integer, _
X As Single, _
Y As Single)
X = X / Screen.TwipsPerPixelX
Select Case X
Case WM_LBUTTONDOWN
'в эту сточку добавьте код,
'который должен выполниться,
'если нажата левая кнопка мышки
Case WM_RBUTTONDOWN
Me.PopupMenu mnuMain
Case WM_MOUSEMOVE
Case WM_LBUTTONDBLCLK
Case WM_RBUTTONUP
Case WM_RBUTTONDBLCLK
End Select
End Sub


Дмитрий Данелия

Вопрос

Подскажите, пожалуйста, как в VB6 сделать активной форму?

Ответ

Попробуй метод SetFocus.
Можно через API: SetForegroundWindow.

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

Вопрос

Как в VB6.0 сделать форму AlwaysOnTop?

Ответ

  Для создания такого окна используется функция API SetWindowPos из библиотеки user32.dll. Декларируем в модуле следующую функцию и константы:

Option Explicit
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOACTIVATE = &H10
Public Const SWP_SHOWWINDOW = &H40
Public Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE
Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

  В форму вписывается следующий код

Option Explicit
Private Sub Form_Load()
Call SetWindowPos(Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
End Sub

Иван

Вопрос

Как в VBA загрузить и отобразить форму?

Ответ

'Загрузка и вывод на экран формы
Load frmColorCalc
frmColorCalc.Show

Сработает под VBA и под VB

Alex Juice

Вопрос

Как в элементе управления Webbrowser организовать функцию автоскроллинга?

Ответ

Лично я для этого использовал в цикле следующую конструкцию:

WebBrowser.Document.Parent.ScrollTo (x,y)

или

WebBrowser.Document.Parent.Scroll (x,y)

Точно не помню, а под рукой нет ни VB, ни MSDN. Возможно существует более изящное решение, но я его не нашел.

LC

Вопрос

Как в заголовок окна добавить свою кнопку?

Ответ

СМ. пример titlebarbutton.zip

(V(B)revno)

Вопрос

У меня есть прога. У нее в трее есть иконка, правый клик по которой выдает контекстное меню. Как можно в этом контекстном меню сделать разделительные полосы между некоторыми пунктами?

Ответ

Создай пункт меню, которому в поле Caption поставь "-".

Максим Кнышов

Вопрос

Возможно ли в процессе выполнения программы изменить свойство BorderStyle?

Ответ

Смотри файл BorderStyle.zip

Savenger

Вопрос

Подскажите пожалуйста, как включить в программу просмотр HTML документов а ля IE с возможностью переходов на другие файлы внутри локального компьютера.

Ответ

Прежде всего, включить в проект компоненту Micriosoft Internet Control и перетянуть на форму, где предполагается просмотр, Control WebBrowser и растянуть его до нужного размера. Код для просмотра: Browser1.Navigate2 file.htm.

Тюльпа Владимир.

Возможен еще вариант написания полностью своего контрола для просмотра, но это займет некоторое время и, в принципе, некоторого профессионализма

fox

Вопрос

Как вместо часиков в трее, поместить свой текст?

Ответ

clock.zip

Алексей Вишневский

progress.zip

JGD

Вопрос

Как сделать так, что бы текущий указатель в MsFlexGrid встал на данную строку/столбец?
Просто

mygrid.row=XXX

конечно ставит, но пользователь этого не видит!
А у меня он большой (вертикально) — хотелось бы что бы менялся на форме для пользователя, встав на нужное место.

Ответ

grid.TopRow = XXX

Serge Zh.

Вопрос

Научите, плз, как клепать контролы. Хотя бы только основное.

Ответ

1. VB -> New Project -> ActiveX Control
2. VB -> Add-Ins -> Add-In Manager -> VB 6 ActiveX Ctrl Interface
2. VB -> Wizard -> (Check Load/Unload)+ OK :o)
3. VB -> Add-Ins -> ActiveX Control Interface Wizard
4. А дальше как на форме располагай чего хочешь. Потом через Wizard можешь свои свойства/методы/события создавать (там все идет по порядку)

Сергей Л.

Вопрос

Есть форма. На ней несколько CheckBox(Index)'ов. Мне нужно, чтобы при определенных условиях к ним добовлялись еще N таких же, а потом еще. А при других условиях некоторые из имеющихся надо удалять. Как это сделать?

Ответ

Есть форма. На ней всего 1 CheckBox со значением Index=0.
При необходимости из кода делаешь Load CheckBox(1), размещаешь его где нужно на форме. Как только необходимость в нем отпала, делай Unload CheckBox(1).

Savenger

Вопрос

Как сделать на VB для какого-нибудь контрола курсор в виде руки? В MousePointer есть все, что не надо, и песочные часы, и вопросики, и стрелочки, а вот именно руки нет. Неужели надо подключать какой-то левый курсор?

Ответ

MousePointer = vbCustom
MouseIcon выбираешь, скажем из ..\Graphics\Cursors\h_point.cur

Сергей Л

Вопрос

Как правильно добавить в RichTextBox строку произвольного цвета?

Ответ

With rtbMain
  .SelColor = vbYellow
  .SelText = "vbYellow" & vbCrLf
  
  .SelColor = vbBlue
  .SelStart = Len(.Text)
  .SelText = "vbBlue" & vbCrLf

  .SelColor = vbRed
  .SelStart = Len(.Text)
  .SelText = "vbRed" & vbCrLf
End With

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

Вопрос

Как добавить в угол обычного окна под кнопкой «Закрыть» еще одну такую же кнопку?

Ответ

СМ. файл knipka.zip

shadow

Вопрос

Как добавлять в листбокс строки с помощью АПИ?

Ответ

Этот код быстро скопирует один листбокс в другой:

Private Declare Function SendMessageStr Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam _
As String) As Long
Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam _
As Long) As Long

Private Function CopyListToList(source As ListBox, target As ListBox) As Long
Dim c As Long
Const LB_GETCOUNT = &H18B
Const LB_GETTEXT = &H189
Const LB_ADDSTRING = &H180
Dim numitems As Long
Dim sItemText As String * 255
 numitems = SendMessageLong(source.hWnd, LB_GETCOUNT, 0&, 0&)
  If numitems > 0 Then
   For c = 0 To numitems — 1
Call SendMessageStr(source.hWnd, LB_GETTEXT, c, ByVal sItemText)
    Call SendMessageStr(target.hWnd, LB_ADDSTRING, 0&, ByVal sItemText)
  Next
  End If
numitems = SendMessageLong(target.hWnd, LB_GETCOUNT, 0&, 0&)
  CopyListToList = numitems
End Function

Наметкин Андрей

Вопрос

А как написать в самое начало контрола WebBrowser?

Например, я туда уже написал:

wbrView.document.writeln "1<br>"
wbrView.document.writeln "2<br>"
wbrView.document.writeln "3<br>"


А теперь перед единицей хочу вписать 0. Возможно ли это?

Ответ

Text = wbText.Document.body.innerhtml
wbText.Document.body.innerhtml = New_Text & "<HR>" & Text


Savenger

Вопрос

А как подчиненную форму можно выравнять по центру относительно родительского окна ? (на попытки изменить свойство startup position выдает что свойство используется неверно)

Ответ

Private Sub Form_Load()
   Move (MDIForm1.ScaleWidth — Me.Width) / 2, (MDIForm1.ScaleHeight — Me.Height) / 2
End Sub

Дмитрий Данелия

Вопрос

Как заблокировать меню?

Ответ

Первое, что пришло в голову — mnu1.Enabled=False, mnu2.Enabled=False (проходишь только верхнеуровневые меню)

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

Вопрос

Как загружать новые экземпляры дочерней формы в MDI форму?
Чтоб можно было потом работать с ними, как с массивом.

Ответ

Точно так же как и с контролами — в модуле объявляешь :

Public MyChildForms(99) As New ChildForm

Создаешь одну базовую дочернюю форму, далее в событии Form_Load(), записываешь необходимые свойства для самой формы и для ее элементов, для каждой формы из массива MyChildForms(99).

clayman

Вопрос

Как загрузить в Image картинку из файла?

Ответ

Image1.Picture = LoadPicture("путь к картинке")

Alex

Вопрос

Как закрыть все дочерние окна МДИ-программы ?
Т.е. закрыть окна не выходя из самой программы..

Ответ

dim f as form
For each f in forms
    if f.MDIChildthen then unload f.name
next


Shemyakin, Dmitry

Вопрос

Что написать в коде чтобы по окончании выполнения программы Form_Load она закрывалась сама, т.е. не закрывать ее в ручную?

Ответ

Unload Me (или Unload [имя формы])

Дмитрий Данелия

Можно так:
lngTemp=DestroyWindow (hwnd)
АПИ работает быстрее.

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

Вопрос

Как закрыть форму открытую с помощью функции show Form2.Show?

Ответ

Есть два варианта:

1. form2.hide

Как видишь эта функция всего лишь скрывает окно, т.е. оно еще находится в памяти и содержимое его переменных сохраняется. Например, есть текстовое поле, ввел что-то, а потом закрыл с помощью Hide окно, то если его опять показать(Show), то содержимое текстового поля сохранится.

2. Unload(form2)

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

Из конференции Expert_FAQ

Вопрос

Как сделать чтобы при щелчке мышю по ComboBox он открывался, а не редактировался?

Ответ

Установи у него Style=2 (DropDown List).

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

Вопрос

У меня есть СheckBox. Мне необходимо, чтобы когда я ставлю галочку, затенялись некоторые TextBox'ы и Label'ы. Когда я снимаю эту галочку нужно чтобы эти же TextBox'ы и Label'ы становились снова включенными. Работает только первая фаза, обратно — нет.

Ответ

Как я понимаю затеняешь ты установкой свойства Enabled=false или еще какое нить. Тебе нужно после изменения данных проверить значение в СheckBox. И допустим на True скрыть все, а на False — наоборот. => ставишь

if <имяСheckBox>.valu=true
then textBox'ы.Enabled=false
else TextBox'ы.Enabled=True
endif

должно работать.

Из конференции Expert_FAQ

Дополню к предыдущему: если свойства теряются то можно их textbox.text и прочая закидывать в textbox_text, а при textbox.enabled=true добавлять textbox.text=textbox_text

billg

Вопрос

Как из дерева TreeView удалить один из родительских узлов?

Ответ

Private Sub Command1_Click()
tv.Nodes.Remove TreeNodes.GetNode(tv, "A").Index
' ^этот-то код все и удаляет!^
End Sub

Private Sub Form_Load()
TreeNodes.AddNode tv, "A"
TreeNodes.AddNode tv, "A\b"
End Sub

Хвастунов Михаил

Вопрос

Почему у меня получаются в TreeView большие расстояния между «плюсом» и картинкой, а в проводнике этого нет? Уже всякие настройки TreeView дергал, все бестолку. Так бы оно ничего, но у меня в TreeView большая степень вложенность узлов и получается, что слишком широкое дерево выходит.

Ответ

Indentation = 300

Shemyakin, Dmitry

Вопрос

В VB есть такой control DataRepeater. Прочитал, что его можно использовать в качестве подчиненной формы (не ленточной, а именно подчиненной, как в Access), но нет документации, как это сделать. Может кто-нибудь знает?

Ответ

Могу дать только намек. DataRepeater может являться контейнером для одного контрола, который он размножает, как и ленточная форма Аксеса. Для этого тебе нужно сделать свой ActiveX (например два текстовых поля, чекбокс, комбобокс) и уже его положить на DataRepeater.

Sergey Y. Tkachev

Вопрос

Я нашел код динамического создания PopupMenu — он работает, но как потом использовать это меню (где писать функции, которые будут происходить при нажатии на определенный пункт этого меню).

Ответ

Сообщение WM_COMMAND говорит о том, что свершилось нажатие на меню. А ловить сообщение нужно субклассингом.

Можно и по-другому. Если установить uFlag=TPM_RETURNCMD, то функция вернет индентификатор меню, которое было выбрано.

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

Вопрос

Как мне в TextBox другой программы ввести текст?

Ответ

В простейшем случае достаточно просто передать фокус этой форме (user32.dll\SetActiveWindowA(W)).
Затем если этот текстбокс там один, то просто бэйсиковским SendKeys'ом.
Если не один, или еще по какойто причине, то это делается чуть сложнее — через апи (user32.dll\SendMessageA(W))

Private Const EM_SETSEL = &HB1
Private Const EM_REPLACESEL = &HC2
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd _
As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Function T_Y_P_E(BOXhWND As Long, TXT As String)
Dim ar() As Byte
ReDim ar(Len(TXT) — 1) As Byte
For i = 0 To Len(TXT) — 1
  ar(i) = CByte(Asc(Mid(TXT, i + 1, 1)))
Next i
SendMessage BOXhWND, EM_SETSEL, -1, 0
SendMessage BOXhWND, EM_REPLACESEL, False, ar(0)
End Function


Хвастунов Михаил

Вопрос

Кто знает как можно BackColor менять у строк ListView в режиме report?
Мне нужен фон. Но фон строки. Не всего контрола.

Ответ

Нужно использовать API и субклассинг.

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

Все достаточно просто после подсказок…
   if Item.Caption='111' then
    begin
     DefaultDraw := True;
   Sender.Canvas.Font.Color := clYellow;
   Sender.Canvas.Brush.Color := clRed;
  end;

Вопрос

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

Ответ

Если Вам известен hWnd текстового поля, то можно получить текст используя функцию API GetWindowText.

Из конференции Expert_FAQ

А можно просто взять в фокус это текстовое поле(есть способ), послать нажатие клавиш CTRL-INS, а потом уже из буфера, что хочешь, то и делай с ним.

vadim

Вопрос

У меня несколько текстовых полей в одной форме. При вводе данных в эти поля для перевода курсора на другое толе, приходится нажимать клавишу [TAB] (стандартное Windows), как можно реализовать эту операцию при нажатии на клавишу [ENTER]?

Ответ

Надо использовать метод SetFocus. Например, у нас есть текстовые поля Text1 и Text2,
в этом примере при нажатии "Enter" в Text1 фокус переходит к Text2:

Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then Text2.SetFocus
End Sub


Аркадий

Вопрос

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

Ответ

Поместите в модуль:

Public Declare Function SetWindowPos Lib "user32" _
(ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _
ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long
Public Const HWND_NOTOPMOST = -2
Public Const HWND_TOPMOST = -1
Public Const SWP_NOACTIVATE = &H10
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
'==On top==

Public Sub SetFormPosition(frmHandl As Long, TopPosition As Boolean)
If TopPosition Then
SetWindowPos frmHandl, HWND_TOPMOST, 0, 0, 0, 0, _
SWP_NOACTIVATE Or SWP_NOSIZE Or SWP_NOMOVE
Else
SetWindowPos frmHandl, HWND_NOTOPMOST, 0, 0, 0, 0, _
SWP_NOSIZE Or SWP_NOMOVE
End If
End Sub


и вызывать: Call SetFormPosition(Me.hWnd, True / False)

Далее при перемещении основной формы наверх активизируешь этот код.


DmitryK1

Вопрос

Как найти в richtextbox слова и изменить их цвет?

Ответ

Ну, например, ищешь в тексте слово "комп", для этого используй следующий код:

   MyWord="комп" ' Это слово которое нужно найти
   MyColor=RGB(255,0,0) ' Каким цветом выделить слово
   FindText=Instr(RichTextBox1.Text,MyWord) 'Ищет слово в тексте
   If FindText<>0 Then 'Если удалось что-то найти
    RichTextBox1.SelStart = FindText 'Начинаем помечать слово
    RichTextBox1.SelLength = Len(MyWord) 'Заканчиваем
    RichTextBox1.SelColor = MyColor 'Меняем цвет текста
    RichTextBox1.SelLength = 0 'Снимаем выделение
   End IF

Igoryk

Вопрос

Как найти элемент ListBox по нескольким начальным буквам или первому слову?

Ответ

Private Sub Command1_Click()
Dim sStr as String, i as integer, n as Integer
sStr="слв" 'строковая переменная, содержащая
'кусок текста для поиска
For i=0 to List1.ListCount-1
If InStr(1,List1.List(i),sStr,vbTextCompare)>0 Then n=n+1
Next i
MsgBox "Указанная строка содержится в списке " & n & " раз."
End Sub

Иванов Виталий

В Declaration

Private Declare Function SendMessageByString _
Lib "user32" _
Alias "SendMessageA" (ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As String) As Long
Private Const LB_FINDSTRINGEXACT = &H1A2 As Long

Private Sub cmdFind_Click()
Dim lngRetVal As Long
lngRetVal = SendMessageByString(List1.hWnd, LB_FINDSTRINGEXACT, _
-1, "Строка для поиска")
List1.ListIndex = lngRetVal
End Sub

Правда, ищет целиком строку, но зато очень быстро.

Дмитрий Данелия

Вопрос

Как напечатать отчет?

Ответ

Я никогда не маялся тем, чтобы печатать формы из VB. Сам я использую Crystal Reports 8, но если у тебя его нет, то можно воспользоваться Data Report Designer, который входит в состав VB6 (Кстати, в состав пятого Бэйсика, а по-моему и шестого тоже, входит Crystal Reports for Visual Basic 4.5)

Sergey Y. Tkachev

Вопрос

Версия языка: 5.0

Нужно написать маааленькую такую прогу, типа Web browser на платформе конечно ИЕ.

Ответ

Выбираешь Project — components
В списке выбираешь Microsoft Internet Controls.
Теперь в палитре появился новый компонент WebBrowser. Вот его и используй.
Чтобы глянуть его функции выбери:

View — Object Browser

В Левом списке выбери WebBrowser и увидишь все свойства и функции обьекта. Внизу находится описание выбранной функции.
Могу лишь сказать, чтобы загрузить страницу используй:

WebBrowser.Navigate("http://www.ru/")

Вместо http://www.ru можно указать полный путь к файлу на диске.

Из конференции Expert_FAQ

Вопрос

Как наполнить TreeView содержимым?

Ответ

Вот модуль неплохой. Позволяет работать с TV как с диском TreeNodes.zip

Хвастунов Михаил

Вопрос

Народ, подскажите где настраиваетя в VB6 в форме проставяется порядок перехода по нажатию tab — типа «tab order»?

Ответ

Смотри свойства tabstop, tabindex

Наметкин Андрей

Вопрос

Как у формы сделать ограничение на минимальный размер? Если ресайзом ловить и ставить, сколько нужно, то она моргает.

Ответ

Нужно субклассить сообшение WM_GETMINMAXINFO и возвращать нужные размеры, на си это выглядит так:

case WM_GETMINMAXINFO:
  ((LPMINMAXINFO)lParam)->ptMinTrackSize.x=550;
  ((LPMINMAXINFO)lParam)->ptMinTrackSize.y=450;
     break;

Без труда адаптируется под VB

Ivan Rozhuk

Вопрос

Создал я массив управления, например из Label1(0) и Label1(1),при щелчке на одном из них мне надо определить индекс того элемента, на который я щелкнул.

Ответ

Это очень легко. Лежит индекс в переменной Index (она передается в параметрах процедуры). Просто пиши:

MsgBox Index

Или типа того.

Из конференции Expert_FAQ

Вопрос

Как организовать пункт меню, состоящий из рисунка?

Ответ

Вот хороший пример: picmenu.zip

Андрей

Вопрос

Как открыть диалог выбора папки?

Ответ

http://vbnet.ru/faq/showtopic.asp?id=5

Шаронов Игорь Александрович

Вопрос

Скажите, пожалуйста, как в VB отлавливать события потери/получения фокуса приложением? Form_Got/LostFocus работают только 'внутри' программы

Ответ

Как временный способ можно использовать GetForegroundWindow и сравнивать с hWnd окна программы. А так, думаю, сабклассинг поможет.

Savenger

Вопрос

Как отловить закрытие формы по нажатию на «крестик»?

Ответ

Использовать событие QueryUnload формы. Оно позволяет узнать, из-за чего закрывается форма — из кода или по кнопке (или по alt + ctrl + del).

BSP

Вопрос

Как отследить в TreeView нажатие клавиши Delete? При ее нажатии событие не возникает?

Ответ

Пользуйтесь KeyDown — позволяет отследить нажатие любых клавиш (кроме
Alt+Ctrl+Del, Reset и кнопки питания).
Private Sub ИгровоеПоле_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyDelete
msgbox "Нажата клавиша Del"
End Select
End Sub
Ответ2: По событиям Key_Up или KeyDown код клавиши Del = 46
Нахождение кода любой клавиши
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
MsgBox KeyCode
End Sub
событие Key_press, не обрабатывает нажатие клавиш Del, Tab, клавиш со стрелками, Enter
Также необходимо установить свойство формы и элемента KeyPreview=true иначе события
Key_Up, Key_Down, Key_Press не возникает

Bsp, Николай

Вопрос

Как отследить нажатие кнопки Cancel в CommonDialog(сохранение)?

Ответ

Установи CancelError = TRUE и отслеживай ошибку 32755 (cdlCancel)

Наметкин Андрей

Вопрос

Как перемещать в TreeView элементы вверх-вниз, а потом сохранить их позицию?

Ответ

Вот здесь есть пример:
http://hiprog.com/access/article.asp?idd=221
правда реализовано в Акцесе, но это непроблема, легко адапритруеться и в ВБ

Качанюк Александр

Вопрос

Как перенести данные из одного TreeView в другой?

Ответ

Просто перекинуть коллекцию Nodes из одного в другой.

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

Вопрос

Как сделать, чтоб при нажатии на Tab в текстбоксе появлялось 4 пробела, как это работает в редакторе VB?

Ответ

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

Однако выход нашелся быстро:

Sub Text1_KeyPress (…)
If KeyAscii=9 Then
    KeyAscii=0
    Text1.SelText=" "
End If
End Sub

Только сначала поставь у всех контролов на форме TabStop=False.

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

Вопрос

Как показать окно выбора папки, в котором бы были и сетевое окружение, и рабочий стол, и пр.?

Ответ

Подготовте проект, добавив в него форму.
Добавте в форму:


'Необходимые константы
Const BIF_RETURNONLYFSDIRS = 1
Const BIF_DONTGOBELOWDOMAIN = 2
Const MAX_PATH = 260

'Декларации API
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long

'Тип для передачи в функцию
Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type

Private Sub Form_Load()
Dim lpIDList As Long
Dim sBuffer As String
Dim szTitle As String
Dim tBrowseInfo As BrowseInfo
'Замените строку "Выберите папку" на нужную вам строку заголовка окна.
szTitle = "Выберите папку"
With tBrowseInfo
hWndOwner = Me.hWnd
lpszTitle = lstrcat(szTitle, "")
ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN
End With
lpIDList = SHBrowseForFolder(tBrowseInfo)
If (lpIDList) Then
sBuffer = Space(MAX_PATH)
SHGetPathFromIDList lpIDList, sBuffer
'Значение sBuffer содержит директорию, выбранную в диологовом окне
sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) — 1)
MsgBox sBuffer
End If
End Sub

Мир программирования на Visual BASIC и HTML

Вопрос

Имеем путь: "С:\Program Files\Program\My Folders\program name.exe"
Нужно получить: "С:\Progra~1\Program\MyFold~1\progra~1.exe"

Ответ

Public Declare Function GetShortPathName Lib "kernel32" Alias _
"GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath _
As String, ByVal cchBuffer As Long) As Long


Savenger

Вопрос

Из UserControl'а мне бы очень-очень хотелось бы получить объекты, лежащие на той же форме, где и UserControl. Как это можно сделать?

Ответ

Dim obj As Object
For Each obj In Picture1.Parent.Controls
     MsgBox obj.Name
Next obj

Ну, вместо Picture1 поставь Me (обращаешься к конкретному экземпляру контрола).

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

Вопрос

Как получить список всех анимаций у Agent.Characters(xxx)? В МСДН написано, что надо использовать AnimationNames, но VB сообщает, что такого свойства нет, хотя если в Быстрый просмотр поместить Agent.Characters("1"), у него вся коллекция открывается и имена видно.

Ответ

На www.vbnet.ru есть хорошая статья Шатрыкина Ивана о MS Agent.

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

Вопрос

Как поменять фон в textbox на градиентную заливку или рисунок?

Ответ

Получаешь хендл контекста девайса текстбокса:

hDC=GetDC(txtmain.hwnd)

а дальше — работаешь с этим контекстом всеми мыслимыми и немыслимыми функциями из GDI. Подробнее ты о них можешь почитать в мсдн.

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

Вопрос

Такая проблема: Как установить размер MsFlexGrid'а, равный количеству строк умноженное на высоту строки — чтобы высота (и длина) была как раз под количество строк и столбцов?

Ответ

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

For i = 0 To MsFlexGrid.Cols — 1
     hHeight = hHeight + MsFlexGrid.RowHeight(i)
Next
MsFlexGrid.Height = hHeight

For i = 0 To MsFlexGrid.Rows — 1
     hWidth = hWidth + MsFlexGrid.ColWidth(i)
Next
MsFlexGrid.Width = hWidth
Второй цикл, как правило, можно заменить строкой

MsFlexGrid.Width = MsFlexGrid.ColWidth(0) * (MsFlexGrid.Cols + 1)

при условии, что количество строк больше нуля и строки имеют одинаковую высоту.

Viaceslavas Kaleda

Вопрос

Нужно послать нажатия клавиш окну, зная только его hWnd. Может кто знает?

Ответ

Вот эти сообщения получило мое тестовое окно, когда я нажал и отпустил Enter.

msg=0x129 hwnd=0x11067c wparam=0x0 lparam=0x0 result=0x0
msg=0x87 (WM_GETDLGCODE) hwnd=0x11067c wparam=0x0 lparam=0x0 result=0x0
msg=0x100 (WM_KEYDOWN) hwnd=0x11067c wparam=0xd lparam=0x1c0001 result=0x0
msg=0x87 (WM_GETDLGCODE) hwnd=0x11067c wparam=0x0 lparam=0x0 result=0x0
msg=0x102 (WM_CHAR) hwnd=0x11067c wparam=0xd lparam=0x1c0001 result=0x0
msg=0x101 (WM_KEYUP) hwnd=0x11067c wparam=0xd lparam=0xffffffffc01c0001 result=0x0

В принципе, оставить нужно только

msg=0x100 (WM_KEYDOWN) hwnd=0x11067c wparam=0xd lparam=0x1c0001 result=0x0
msg=0x102 (WM_CHAR) hwnd=0x11067c wparam=0xd lparam=0x1c0001 result=0x0
msg=0x101 (WM_KEYUP) hwnd=0x11067c wparam=0xd lparam=0xffffffffc01c0001 result=0x0

Ну а в качестве wparam подставляй виртуальный код твоей клавиши (в случае с Enter он равен vbKeyReturn или 13 (d в 16-ричной системе счисления). Отправить сообщение поможет апишка SendMessage.

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

Вопрос

Как при загрузке формы туда добавить новый контрол, например Label?

Ответ

Form1.Controls.Add "VB.Label", "Label1" 'сработало…
With Form1!Label1
    .Move (ScaleWidth — .Width) \ 2, (ScaleHeight — .Height) \ 2
    .Caption = "My new label control"
    .Visible = True
End With

Сергей Л.

Вопрос

Как в VB можно какой-нибудь объект привязать к форме, чтобы он растягивался вместе с ней? Приведите код или свойство.

Ответ

Наверное, ты хочешь, чтобы пропорционально менялись не только размеры, но и положение элемента. Возьем, например, кнопку. В декларациях объявляешь

Private kX As Single, kY As Single

Private kLeft As Single, kTop As Single

При загрузке формы высчитываешь коэффициенты, а при изменении размеров формы изменяешь размеры и положение кнопки в соответствии с этими коэффициентами.

Private Sub Form_Load() kX = Form1.Width
/ Command1.Width kY = Form1.Height
/ Command1.Height kLeft = Form1.Width
/ Command1.Left kTop = Form1.Height
/ Command1.Top End Sub Private Sub Form_Resize() Command1.Width = Form1.Width
/ kX Command1.Height = Form1.Height
/ kY Command1.Left = Form1.Width
/ kLeft Command1.Top = Form1.Height
/ kTop End Sub


Из конференции Expert_FAQ

Вопрос

Как проверить корректность ввода различной информации в соответствующие текстовые поля формы (цифры или текст)?
Может есть уже готовые коды?

Ответ

Если надо проверять ввод каждого символа, то проверку надо встроить в процедуру Text1_KeyPress.

Для проверки на цифру в VB есть функция IsNumeric, если есть необходимость, то можно вставить проверку на нажатие специфических клавиш (забой — KeyAscii=8, Tab — KeyAscii=9, и др.).

Private Sub Text1_KeyPress(KeyAscii As Integer)
If IsNumeric(Chr(KeyAscii)) Then
Print «Введена цифра»
Else
Print «Введена не цифра»
End If
End Sub

Из конференции Expert_FAQ

Вопрос

Вопрос такой:
На форме расположено TreeView (TV) и CommandButton (cmdOK) на TV заведена некая древовидная структура с активнами CheckBox'ами. Как по нажатию на cmdOK определить, у каких элементов "галочка" стоит, а у каких — нет.
Если знаешь структуру "дерева" в TV, то можно и перебором, а если ты ее не знаешь, то как?

Ответ

Private Sub cmdOK_Click()
   Dim tNode As Node
   For Each tNode in TV.Nodes
If tNode.Checked Then MsgBox "Node " & tNode.Text & " is checked."
   Next tNode
End Sub

Andrey Shchekin [darXeth]

Вопрос

Подскажите, как программно отключить доступ к Windows-кнопке «Пуск» ?

Ответ

start.zip

Хвастунов Михаил

Вопрос

У меня у формы BorderStyle=0. Как мне программно поменять его на 1 или 2? Если написать просто form1.borderstyle=1, то ничего не происходит.

Ответ

Это невозможно сделать, потому что свойство BorderStyle доступно только для чтения во время выполнения, а, следовательно, изменению не подлежит.
Этот небольшой пример показывает как можно на лету менять структуру окна (внешний вид и не только).
Создайте форму (Form1), поместите на нее пять кнопок (Command1, Command2, Command3, Command4, Command5) и данный код.
Вся информация взята из книги «Win32 и Visual BASIC. Для профессионалов(+CD)". Автор Dan Appleman's. Большая благодарность автору! Цена книге соответствует.
В коде есть только одна проблема. После использования функции SetWindowLong, окно меняет свои свойства, но не перерисовывается. Для этого я использовал изменения размеров окна. Наверное можно использовать что-нибудь попроще с использованием SendMessage или как нибудь еще.

Option Explicit
Dim tmplong As Long
Dim tmplong1 As Long

' Основные параметры окна
Const WS_OVERLAPPED& = &H0& ' при создании — окно с рамкой и заголовком, в работе — ошибка защиты Windows
Const WS_MAXIMIZEBOX& = &H10000 ' для окна — наличие кнопки минимизировать
Const WS_TABSTOP& = &H10000 ' для других элементов — закрепление позиции табуляции
Const WS_MINIMIZEBOX& = &H20000 ' для окна — наличие кнопки свернуть
Const WS_GROUP& = &H20000 ' для остального — является началом группы элементов
Const WS_THICKFRAME& = &H40000 ' для окна — размеры окна меняются за толстую рамку
Const WS_SYSMENU& = &H80000 ' в левой части окна есть кнопка системного меню
Const WS_HSCROLL& = &H100000 ' в окне есть горизонтальная полоса прокрутки
Const WS_VSCROLL& = &H200000 ' в окне есть вертикальная полоса прокрутки
Const WS_DLGFRAME& = &H400000 ' окно с двойной рамкой но нет заголовка
Const WS_BORDER& = &H800000 ' окно с рамкой
Const WS_CAPTION& = &HC00000 ' окно с рамкой и заголовком
Const WS_MAXIMIZE& = &H1000000 ' окно развернуто
Const WS_CLIPCHILDREN& = &H2000000 ' в окне нельзя рисовать поверх других элементов (аналог свойства ClipControls)
Const WS_CLIPSIBLINGS& = &H4000000 ' запрещает дочернему окну рисовать поверх другого дочернего окна
Const WS_DISABLED& = &H8000000 ' окно заблокировано (аналог Enable = False)
Const WS_VISIBLE& = &H10000000 ' окно является видимым (аналог Visible = True)
Const WS_MINIMIZE& = &H20000000 ' окно свернуто
Const WS_CHILD& = &H40000000 ' окно является дочерним (надо установить после SetPatent)
Const WS_CHILDWINDOW& = (WS_CHILD) '
Const WS_POPUP& = &H80000000 ' окно является всплывающим
Const WS_OVERLAPPEDWINDOW& = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
Const WS_POPUPWINDOW& = (WS_POPUP Or WS_BORDER Or WS_SYSMENU)
Const WS_TILED& = WS_OVERLAPPED '
Const WS_TILEDWINDOW& = WS_OVERLAPPEDWINDOW '

' Расширенные параметры окна
Const WS_EX_LEFT& = &H0& ' значение по умолчанию
Const WS_EX_LTRREADING& = &H0& ' значение по умолчанию
Const WS_EX_RIGHTSCROLLBAR& = &H0& ' значение по умолчанию
Const WS_EX_DLGMODALFRAME& = &H1& ' окно имеет двойную рамку
Const WS_EX_NOPARENTNOTIFY& = &H4& ' Windows не будет уничтожать это окно
Const WS_EX_TOPMOST& = &H8& ' окно находится поверх остальных у которых бит не установлен
Const WS_EX_ACCEPTFILES& = &H10& ' окно принимает файлы при перетаскивании из диспетчера файлов (?)
Const WS_EX_TRANSPARENT& = &H20& ' окно является прозрачным и не скрывает окна под собой
Const WS_EX_MDICHILD& = &H40& ' окно имеет уменьшенный заголовок и не отображается в панели задач
Const WS_EX_TOOLWINDOW& = &H80& ' окно представляет собой кнопку, содержащую растр вместо текста
Const WS_EX_WINDOWEDGE& = &H100& ' окно имеет приподнятую рамку
Const WS_EX_CLIENTEDGE& = &H200& ' окно имеет утопленную рамку
Const WS_EX_CONTEXTHELP& = &H400& ' в заголовке есть кнопка с вопросом.
Const WS_EX_RIGHT& = &H1000& ' если WS_EX_RTLREADING установлен текст выравнивается по правому краю
Const WS_EX_RTLREADING& = &H2000& ' в иврите и арабском языке текст вывлдится справа налево
Const WS_EX_LEFTSCROLLBAR& = &H4000& ' если WS_EX_RTLREADING установлен полоса прокрутки перемещается налево
Const WS_EX_CONTROLPARENT& = &H10000 ' клавиша Tab вызывает переключение между дочерними окнами данного окна
Const WS_EX_STATICEDGE& = &H20000 ' объемное оформление
Const WS_EX_APPWINDOW& = &H40000 ' свернутое приложение помещается в панель задач

' Разновидность параметра
Const GWL_WNDPROC& = (-4) ' адрес функции окна
Const GWL_HINSTANCE& = (-6) ' манипулятор экземпляра, владеющего заданным окном
Const GWL_HWNDPARENT& = (-8) ' манипулятор родителя для заданного окна (лучше только читать, для записи SetParent)
Const GWL_ID& = (-12) ' идентификатор дочернего окна в диалоговой панели
Const GWL_STYLE& = (-16) ' СТИЛЬ ОКНА
Const GWL_EXSTYLE& = (-20) ' РАСШИРЕННЫЙ СТИЛЬ ОКНА
Const GWL_USERDATA& = (-21) ' параметры определяются приложением (что то навроде Tag)

' функции для чтения и записи информации о структуре окна
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
'Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

' приведение окна к нормальному виду (можно его нормально закрыть)
Private Sub Command1_Click()
SetWindowLong Me.hwnd, -16, tmplong 'GetWindowLong(Me.hwnd, -16) Or WS_CAPTION& Or WS_THICKFRAME&
Me.Height = Me.Height — 10
Me.Height = Me.Height + 10
End Sub

' кнопка убирает заголовок окна режим BorderStyle=2
Private Sub Command2_Click()
SetWindowLong Me.hwnd, -16, tmplong And (Not WS_CAPTION&)
Me.Height = Me.Height — 10
Me.Height = Me.Height + 10
End Sub

' кнопка убирает толстую рамку. режим BorderStyle=1
Private Sub Command3_Click()
SetWindowLong Me.hwnd, -16, tmplong And (Not WS_THICKFRAME&)
Me.Height = Me.Height — 10
Me.Height = Me.Height + 10
End Sub

' кнопка убирает толстую рамку. режим BorderStyle=0
Private Sub Command4_Click()
SetWindowLong Me.hwnd, -16, tmplong And (Not (WS_THICKFRAME& Or WS_CAPTION&))
Me.Height = Me.Height — 10
Me.Height = Me.Height + 10
End Sub

'кнопка утопляет поверхность формы
Private Sub Command5_Click()
SetWindowLong Me.hwnd, -20, tmplong1 Or WS_EX_CLIENTEDGE&
Me.Height = Me.Height — 10
Me.Height = Me.Height + 10
End Sub

' при загрузке формы желательно сохранить ее параметры в переменных
' и восстановить их при ее удалении,
' а то можно получить ошибку защиты
Private Sub Form_Load()
tmplong = GetWindowLong(Me.hwnd, -16) Or WS_VISIBLE&
tmplong1 = GetWindowLong(Me.hwnd, -20)
End Sub

Private Sub Form_Unload(Cancel As Integer)
SetWindowLong Me.hwnd, -16, tmplong And Not WS_VISIBLE&
SetWindowLong Me.hwnd, -20, tmplong1
End Sub

' Т.е. вид окна определяется набором флагов.
' Для установки SetWindowLong Me.hwnd, GWL_ … , GetWindowLong(Me.hwnd, GWL_ …) Or (сбрасываемое значение WS_ или WS_EX)
' Для сброса SetWindowLong Me.hwnd, GWL_ … , GetWindowLong(Me.hwnd, GWL_ …) And Not (сбрасываемое значение WS_ или WS_EX)

Алексей Каленов

Вопрос

Как программно создать элемент упраления?

Ответ

В General Declarations пишется что-то вроде

Dim MyCoolSuperControl As КлассКонтрола 'Например, Button

А в процедуре, где надо создать контрол, пишем

Set MyCoolSuperControl = ИмяФормыКудаДобавляем.Controls.Add ("ПолноеНазваниеКлассаКонтролаКоторыйХотимСоздать", "БудущееИмяКонтрола")

Контрол создан! Теперь осталось переместить его куда надо и сделать ему

MyCoolSuperControl.Visible = True.

P@Ssword

Вопрос

При добавлении значений в список функцией List1.AddItem — они добавляются сверху вниз, а когда они уже не умещаются в списке, то естественно появляется вертикальный scroll-bar, и чтобы увидеть последний элемент надо этот список прокручивать самому.

А как сделать так чтобы он сам прокручивался, или чтобы значения добавлялись снизу вверх?

Ответ

Во-первых, можно указывать, куда добавлять. Например:

List1.AddItem sTemp, 0

Всегда будет сверху. Или пользоваться свойством TopIndex для прокрутки списка…

Иванов Виталий

Вопрос

У меня такая проблемка: имеется рисунок в Image очень большего размера (Image1.Height=60435, Image1.Width=46560). Этот Image находится в PictureBox'e. Надо его прокручивать, а вот скроллы такую длину не поддерживают. Что посоветуете?

Ответ

Листай не по одному твипу, а по пикселу (или по 2, 3 пиксела).

60435 — 100% (или 1000 едениц, или 10000 — если совсем мягкий скрол нужен), и соответственно max у прокрутки 100 (или 1000 или 10000)

Из конференции VB

Вопрос

Как сделать чтобы на одной вкладке TabStrip была например кнопка, а на другой вкладке TextBox?

Ответ

  Весь прикол в том, что TabStrip не предоставляет контейнер для элементов, он просто рисует красивую рамочку и закладочки. Так что есть два выхода:

Выход первый. Сложнее. Продолжаем использовать TabStrip. На форму для каждого таба кладем по одному контейнеру (например, Frame). Далее в событии Click по TabStrip показываем нужный Frame, остальные при этом пряча. В общем, если с утра просто необходимо размять руки на клавиатуре, то можно сделать такой проект. Но для тех, кто занимается продуктивным трудом, а не расходом калорий, придумали другое решение. Итак, способ номер два.

Выход второй. Прошу любить и жаловать, Micro$oft Tabbed Dialog Control 6.0. Клик на нужный таб, поклали контролы, клик на следующий таб… Чертовски удобная штука. Им бы еще раскраску изменить — вообще идеально. Да ладно, че мечтать — MacroHard все-таки…

P@Ssword

Вопрос

Допустим, есть какие-то переменные:

мама
машина
миска

И допустим, пользователь в комбо или в текстбохе пишет "М" они все появлются, и если мышкой шелкнуть вставятся! Но пользователь может еще и "И" написать, тогда тока останется МИСКА, но если напишет "А" то первые два. И так нужно сделать таку вещь.
Как лучше всего ее организовать?

Ответ

Смотри файл: auto.zip

MixeR

Вопрос

Добавляю в TreeView дерево, а оно оказывается свернутым по умолчанию. Как его развернуть программным путем? Как свернуть обратно?

Ответ

.Expand() — чтобы развернуть
.Collapse() — чтобы свернуть

Алексей Вишневский

Вопрос

Есть ComboBox, который при загрузке формы заполняется данными. Так вот, после загрузки формы значение cmb.ListIndex почему-то всегда равно '-1'. Даже, если написать после его заполнения:

cmb.Text=cmb.List(5)


то после этого текст будет соответствовать значению имеющему пятый индекс в листе, а ListIndex будет все равно равен '-1'.

Ну и теперь задача: мне нужно чтобы после загрузки было — cmb.Text=cmb.List(0) и чтобы значение ListIndex было равно '0'. Возможно ли такое?

Ответ

cmb.listindex=0

Хвастунов Михаил

Вопрос

Как сделать графическое меню, чтобы каждому пункту меню соответствовала своя картинка и отображалась около этого пункта?

Ответ

Смотри файлы menu1.zip и menu2.zip

Ivan Rozhuk

Вопрос

Нужно что бы можно было перетащить файлы из проводника Windows в мою программу. Как можно это сделать?

Ответ

Вот, реализовано для FlexGrid.
Нужно два события обрабатывать и включить свойство у контрола, которая называется как-то типа OleDrop что-ли (точно не помню), она одна там такая, найдешь, если захочешь

Private Sub Grid1_OLEDragDrop(Data As MSFlexGridLib.DataObject, Effect As Long, _
Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim resultOle As String
If Data.GetFormat(vbCFFiles) Then
  resultOle = Data.Files(1)
'дальше делай с именем файла чего надо
End If
End Sub

Private Sub Grid1_OLEDragOver(Data As MSFlexGridLib.DataObject, Effect As Long, _
Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer)
If Data.GetFormat(vbCFFiles) Then
Effect = vbDropEffectCopy And Effect
Else
Effect = vbDropEffectNone
End If
End Sub

Алексей Вишневский

Вопрос

Как сделать индикацию какого-либо процесса? Можно графическую в виде каких-нибудь квадратиков или хотя бы сообщения, что осталось столько — то процентов.

Ответ

Подключи к проекту Microsoft Windows Common Controls 6.0 — там есть ProgressBar — он тебе и нужен.

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

Вопрос

Как сделать меню нестандартного вида? Видел в некоторых прогах — некоторые элементы меню покрашены в разные цвета, имеют нестандартные значки.

Ответ

MenuX контрол. Модная штука!

Vovan-VE

Вопрос

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

Ответ

Const LWA_COLORKEY = &H1
Const LWA_ALPHA = &H2
Const GWL_EXSTYLE = (-20)
Const WS_EX_LAYERED = &H80000
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal
hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal
hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As
Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Sub Form_Load()
 'KPD-Team 2000
  'URL: http://www.allapi.net/
  'E-Mail: KPDTeam@Allapi.net
  Dim Ret As Long
  'Set the window style to 'Layered'
  Ret = GetWindowLong(Me.hWnd, GWL_EXSTYLE)
  Ret = Ret Or WS_EX_LAYERED
  SetWindowLong Me.hWnd, GWL_EXSTYLE, Ret
  'Set the opacity of the layered window to 128
  SetLayeredWindowAttributes Me.hWnd, 0, 128, LWA_ALPHA
End Sub

Но это только для NT/2k/ХР

Хвастунов Михаил

Вопрос

Как сделать так, чтобы моя MDI-форма была на весь экран(подчеркиваю, не простая форма, а MDI-форма)? Пробую вот так, но не выходит:

MDIForm1.Move 0,0,screem.Width,screen.Height

может быть это можно сделать как-нибудь через функции API?

Ответ

lngTemp=SetWindowPos(hwnd, HWND_TOPMOST, 0,0, _
screen.width/screen.TwipsPerPixelX,screen.height/
screen.TwipsPerPixelY,0)

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

Вопрос

Хотелось бы, чтобы при вводе текста в TextBox буквы там становились большими.

Пробовал
Private Sub TxtBox_KeyPress(KeyAscii As Integer)
TxtBox = UCase(TxtBox)
End Sub

Не работает.

Ответ

Можно так:

Private Sub TxtBox_KeyPress(KeyAscii As Integer)
KeyAscii = Asc(UCase(Chr$(KeyAscii)))
End Sub


Savenger

Можно и так:

Private Sub Text1_Change()
Dim lngSelStart As Long
lngSelStart = Text1.SelStart
Text1.Text = UCase(Text1.Text)
Text1.SelStart = lngSelStart
End Sub


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

Первый способ всегда работает, а второй замудренный. Можно в первый способ переделать так:

Private Sub TxtBox_KeyPress(KeyAscii As Integer)
if KeyAscii<160 then KeyAscii=KeyAscii+32
End Sub


Работает только для русских букв:)

Sabbah

Вопрос

Как сделать установачный пакет (что бы моя программа заносилось в список «Установка и удаление программ»)?

Ответ

Используй программу InstallShield или InstallShield Express (она проще) или Inno Setup для создания установочных пакетов.

Rutshtein Alex

Вопрос

Как сделать форму поверх всех окон и таскбара?

Ответ

SetWindowPos lHwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_NOSIZE _
Or SWP_NOMOVE

Наметкин Андрей

Вопрос

Как сделать форму прозрачной?

Ответ

'Функции, переменные и типы, необходимые для установления прозрачности
'окна, только Win2000
Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal
hwnd
As Long, ByVal crKey As Long, ByVal bAlpha As Long, ByVal dwFlags As
Long)
As Long
Public Declare Function UpdateLayeredWindow Lib "user32" (ByVal hwnd As
Long, ByVal hdc As Long, pptDst As POINTAPI, pSize As SIZE, ByVal
hdcSrc As
Long, pptSrc As POINTAPI, ByVal crKey As Long, pBlend As BLENDFUNCTION,
ByVal dwFlags As Long) As Long

Public Type BLENDFUNCTION
    BlendOp As Byte
    BlendFlags As Byte
    SourceConstantAlpha As Byte
    AlphaFormat As Byte
End Type

Private Type POINTAPI
    x As Long
    y As Long
End Type

Public Type SIZE
    cx As Long
    cy As Long
End Type

Public Const LWA_COLORKEY = &H1&
Public Const LWA_ALPHA = &H2&
Public Const LWA_OPAQUE = &HFF&

Public Const ULW_COLORKEY = &H1
Public Const ULW_ALPHA = &H2
Public Const ULW_OPAQUE = &H4

Public Declare Function GetWindowLong Lib "user32" Alias
"GetWindowLongA"
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias
"SetWindowLongA"
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As
Long

Public Const GWL_STYLE = (-16)
Public Const GWL_EXSTYLE = (-20)
Public Const WS_EX_LAYERED = &H80000

Public Declare Function GetSysColor Lib "user32" (ByVal nIndex As
Long) As
Long

Public Declare Function GetVersionEx Lib "kernel32" Alias
"GetVersionExA"
(lpVersionInformation As OSVERSIONINFO) As Long

Public Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type

Public Const VER_PLATFORM_WIN32s = 0
Public Const VER_PLATFORM_WIN32_WINDOWS = 1
Public Const VER_PLATFORM_WIN32_NT = 2

Остальное смотри: trans.zip.

Аваков Дмитрий Александрович

Смотри файл FormCool.zip.

Krueger

Вопрос

Объясните, плз. по-подробнее, как сделать «ошибочную страницу».

Ответ

Подробно это скажет только документация на твой веб-сервер. Разные сервера поддерживают разные методы настройки страниц-ошибок. В теори все просто: веб-серверу надо указать некую страницу, которую он должен отдавать юзеру при той или иной ошибке. Наибоее типичные ошибки — «запрошенный url не существует» и «отказ в праве доступа».

Из конференции Expert_FAQ

Вопрос

Как мне сделать так, чтоб можно было взять картинку на форме мышкой и потащить ее?

Ответ

Держи примерчик: DragDrop.zip. Надо использовать DragDrop.

Дмитрий Данелия

Вопрос

Как сделать, чтоб можно было изменять размеры какого-нибудь эу? Примерно так, как изменяются размеры обычной формы.

Ответ

Option Explicit
Dim bool As Boolean

Private Sub Form_Load()
bool = False
Picture1.ScaleMode = vbPixels
Picture3.ScaleMode = vbPixels
Picture1.MousePointer = 7
Picture3.MousePointer = 9
Picture1.Move 0, 3000, 3000, 60
Picture3.Move 3000, 0, 60, 3000
Picture2.Move 0, 0, 3000, 3000
End Sub
Private Sub Picture3_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)
bool = True
Dim xx As Long
Dim yy As Long
Picture3.BackColor = vbWhite
For xx = 0 To Picture3.Width / Screen.TwipsPerPixelX Step 2
For yy = 0 To Picture3.Height / Screen.TwipsPerPixelY
Picture3.PSet (xx + Int((-0.5) ^ yy), yy)
Next yy
Next xx
End Sub
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)
bool = True
Dim xx As Long
Dim yy As Long
Picture1.BackColor = vbWhite
For xx = 0 To Picture1.Width / Screen.TwipsPerPixelX Step 2
For yy = 0 To Picture1.Height / Screen.TwipsPerPixelY
Picture1.PSet (xx + Int((-0.5) ^ yy), yy)
Next yy
Next xx
End Sub
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
If bool = True Then
Picture1.Top = Picture1.Top + Y
Picture2.Move 0, 0, Picture2.Width, Picture1.Top
Picture3.Height = Picture1.Top
End If
End Sub
Private Sub Picture3_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
If bool = True Then
Picture3.Left = Picture3.Left + X
Picture2.Move 0, 0, Picture3.Left, Picture2.Height
Picture1.Width = Picture3.Left
End If
End Sub
Private Sub Picture3_MouseUp(Button As Integer, Shift As Integer, X As
Single, Y As Single)
bool = False
Picture3.BackColor = Me.BackColor
End Sub
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As
Single, Y As Single)
bool = False
Picture1.BackColor = Me.BackColor
End Sub

shadow

Вопрос

Как сделать, чтобы при нажатии кнопки с рисунком, ее рисунок изменялся на другой?

Ответ

Помести на форму объект ImageList из библиотеки Microsoft Windows Common Controls 6.0. В него занеси 2 рисунка. Затем при загрузке формы впиши следующий код:

Private Sub Form_Load()
Command1.Picture = ImageList1.ListImages(1).Picture ' Где 1 — индекс картинки
End Sub

А при нажатии на кнопку

Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Command1.Picture = ImageList1.ListImages(2).Picture
End Sub

Если необходимо, чтобы при отпускании кнопки рисунок возвращался на место, пишем следующее:

Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Command1.Picture = ImageList1.ListImages(1).Picture
End Sub

Иван

Вопрос

Как сделать, чтобы при перемещении tab'ом на textbox фокуса текст выделялся?

Ответ

Private Sub Text1_GotFocus()
     Text1.SelStart = 0
     Text1.SelLength = Len(Text1.Text)
End Sub

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

Вопрос

Есть ли быстрые способы обновления следующик котролов:
DriveListBox, DirListBox, FileListBox?
Ну то есть, скажем меняю диск в DriveListBox и соотвественно меняется содержание DirListBox и FileListBox?

Ответ

При событии Change в DriveListBox напиши:

Dir1.Path = Drive1.Drive

А у DirListBox это:

File1.Path = Dir1.Path

Sergiy Zhygunenko

Вопрос

Копирую картинку из PictureBox в ImageList:

Picture2.PaintPicture Picture1.Picture, 0, 0, , , 0, 0, 16, 16 'pixels
imlButton.ListImages.Clear
imlButton.ListImages.Add 1, "Normal", Picture2.Picture

В третьей строке ошибка — показывает, что Picture2.Picture=0

В чем тут дело?

Ответ

Попробуй Picture1.Image и Picture2.Image

FELIX-RUS

Вопрос

Есть стандартный контрол ScrollBar. Как его научить скроллиться колесом мыши?

Ответ

Public Declare Function SetWindowLong _
 Lib "user32" Alias "SetWindowLongA" ( _
     ByVal hwnd As Long, _
     ByVal nIndex As Long, _
     ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc _
 Lib "user32" Alias "CallWindowProcA" ( _
     ByVal lpPrevWndFunc As Long, _
     ByVal hwnd As Long, _
     ByVal Msg As Long, _
     ByVal wParam As Long, _
     ByVal lParam As Long) As Long

Private Const WM_MOUSEWHEEL = &H20A

Function SwapProcAB(ByVal hwnd As Long, ByVal Msg As Long, ByVal _
     wParam As Long, ByVal lParam As Long) As Long
     Dim lReturn As Long
 lReturn = CallWindowProc(formname.OldABProc, hwnd, Msg, wParam, lParam)
     Select Case Msg
         Case WM_MOUSEWHEEL
     formname.ScrollFlex wParam
     End Select
     SwapProcAB = lReturn
End Function

в форме:

Public OldABProc As Long
Private Const GWL_WNDPROC = (-4)

Private Sub Form_Load()

  OldABProc = SetWindowLong(Flex1.hwnd, GWL_WNDPROC, AddressOf SwapProcAB)
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

     SetWindowLong Flex1.hwnd, GWL_WNDPROC, OldABProc
End Sub

•Creator•

Вопрос

В SysTray создал иконку. Как сделать, чтобы, когда я форму сворачиваю, она исчезала с экрана и панели задач, а оставалась лишь иконка в SysTray?

Ответ

Просто в событии формы Form_Resize проверяешь состояние формы и, если она свернута, убираешь ее с экрана:

if Me.WindowState = vbMinimized then
   Unload Me или Me.Visible = false
end if

Так же можно делать и при попытке закрытия формы (нажатия на кнопку Х):

private sub Form_Unload(cancel as integer)
   Me.WindowState = vbMinimized ' Сворачиваем окно,
   Me.Visible = false ' затем его убираем
end sub

P@Ssword

Вопрос

Как слить содержимое двух РичТекстБоксов в один, включая форматирование:

strTemp = txtTemp.SelRTF
txtMain.TextRTF = strTemp & txtMain.TextRTF

не срабатывает — все, что в текстбоксе было, заменяется тем, что было в txtTemp.

Ответ

txtMain.SelRTF = txtTemp.TextRTF

Ruslan Inozemtsev

Вопрос

Как сменить кодировку текста, чтобы в Textbox иметь возможность выбора шрифта?

Ответ

Нужно использовать свойство Charset у объекта Font. Т.е. Text1.Font.Charset = 204 или другой номер кодировки.

SHatrykin Ivan

Вопрос

Как создавать MDI-форму?

Ответ

Делаешь так:

Project/Add MDI-Form. Это ГЛАВНАЯ_ФОРМА.
Затем Project/Add Formу, этой формы ставишь свойство MDIChild = True. Это дочерняя форма.

Чтобы увидеть результ, в событии главной формы напиши:

Private Sub Form_Load()
     ChildForm.Show
End Sub

Vovan-VE

Вопрос

Нужно создать меню последних открытых файлов в программе.
Как это сделать?

Ответ

Создаешь, например, 5 пунктов меню. Скрытые, кэпшна нет, тег пустой. При загрузке читаешь последние открытые файлы из реестра/INI, если таковые есть — заполняешь меню: тег — полный путь к файлу, кэпшн — только имя файла, визибл = тру. При открытии очередного файла сдвигаешь все на один пункт вниз (самый «давнооткрытый» файл при этом «забывается). В первое меню добавляешь новый файл по той же схеме. Пишешь его в реестр/INI. При щелчке на меню (лучше делать массив с одним именем) делаешь что-то вроде:

Sub mnuMRU_Click (Index as Integer)
  OpenFile mnuMRU(Index).Tag
End Sub


Savenger

В режиме дизайна создай элемент меню, имеющий Caption равный "-". Этот элемент будет представлять собой разделитель имен файлов (обычно список файлов отделяют таким разделителем). Если разделитель не нужен, поставь Visible=false. ОЧЕНЬ ВАЖНО!!!___ поставь Index=0.

Далее нет ничего сложного. Но много писанины.
lngCount — здесь хранишь количество элементов, сохраненных в реестре
mnuFileRecent — имя менюшки, которое ты создал в предыдущем шаге.

For i = 1 To lngCount
   'Загрузим следующий элемент.
   Load mnuFileRecent(i)
   'Новосозданный элемент еще не видим. Исправим положение.
   mnuFileRecent(i).Visible = True
   'Загрузим путь из реестра
   strText=GetSetting(…)
   'Присвоим Caption
   'Тут я попытался добавить в список только имя файлы.
   mnuFileRecent(i).Caption = left(strtext,instrrev(strtext,"\"))
   'В свойство Tag запишем полный путь.
   mnuFileRecent.tag=strText
Next i

При клике на этом меню загружаешь файл mnuFileRecent(index).tag
Добавлять элемент можно простым циклом. Есди mnuFileRecent.ubound меньше макс. кол-ва файлов, сначала загрузи еще один элемент:
lngMaxCount — макс. кол-во файлов

if mnuFileRecent.ubound < lngMaxCount then
   'Загрузим элемент меню, индекс которого на 1 больше кол-ва,
   'элементов в списке.
   load mnuFileRecent(mnuFileRecent.ubound+1)
   'Теперь просто обращаемся к самому «высокому» элементу
   mnuFileRecent(mnuFileRecent.ubound).visible=true
end if

for i = mnuFileRecent.ubound to 2
 mnuFileRecent(i).caption=mnuFileRecent(i-1).caption
next i

mnuFileRecent(1).caption=strFileName


Кривокрисенко

Вопрос

Как сделать окно неправильной формы? Скажем, в виде круга или эллипса.

Ответ

Это делается с помощью такого средства, как регионы.

Вопрос

Как сочинить «пасхальное яйцо» (через asc коды?) при активном окне программы?

Ответ

Если я правильно тебя понял то попробуй такую конструкцию.

Dim MassKeys(0 To 250) As Boolean
'Здесь будут храниться все нажатые клавиши Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'Если клавиша не нажата, то она типа нажата и мы это запоминаем :)
'ну и так до бесконечности If MassKeys(KeyCode) = False Then MassKeys(KeyCode) = True
'А теперь проверяем нажата ли нужная конфигурация кнопок (здесь: "Ctrl" + "Alt" + "a")
'и если да то яичко у вас в руках If MassKeys(17) = True And MassKeys(18) = True And MassKeys(65) = True Then
'Скажем что все кнопки у нас отпущены дабы не было казусов MassKeys(17) = False MassKeys(18) = False MassKeys(65) = False MsgBox "Пасхальное яйцо" End If End Sub Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
'Ну а здесь при отпускании клавиши говорим что она отпущена :) MassKeys(KeyCode) = False End Sub


P.S. Чуть не забыл. Этот код будет работать только в том случае если на форме больше нет никаких элементов. В противном случае события _KeyUp и _KeyDown надо написать для того элемента который находиться в фокусе

Из конференции Expert_FAQ

Если на форме есть элементы, то надо уставить свойство формы KeyPreview равным True, тогда все нажатия клавиш будут сначала обрабатываться формой а уж потом элементом, находящимся в фокусе.

grix1

Вопрос

Есть некая программа, которая запускается при старте системы и ее нельзя выгружать. Окно ее, даже в свернутом состоянии, бывает, мешает. Поэтому нужно спрятать его в tray.
Таким образом, программа помещается в трей со своим значком, окно прячется. Далее надо получить то, что мы имеем в .uCallbackMessage = WM_MOUSEMOVE и Private Sub Form_MouseMove, когда помещаем в трей свою программу.
Как это сделать?

Ответ

Средствами VB эти желания неосуществимы . Нужно использовать API, но как? Окошко чужое, поэтому засубклассить его функцией SetWindowLong не удастся. Нужно юзать неуловимую SetWindowLongPtr. Но не удается составить объявление этой функции для VB. Есть такая вещь, как пакет SpyWorks. Там присутствуют библиотеки, которые без проблем субклассят чцжые окна. Если не боишься сделать свою программу зависимой от библиотеки размером на 200 кб, рискуй.

Я так понимаю, что hwnd окошка ты уже знаешь. А почему бы не ставить в трей иконку твоего окна? А при активации твое окно вызывает ShowWindow (hwnd,State), где State — состояние окна. Правда, нужно будет как-то словить момент, когда чужое окошко минимизируется. Но это проблема не большая. Можно в таймере вызывать GetWindowPlacement, и когда оказывается, что окошко минимизировано, прятать его, и показывать свое окошко в трее. Артем Кривокрисенко

Вопрос

Как убрать кнопочку [X] из правого верхнего угла формы, а кнопки «Свернуть» и «Развернуть» оставить? Или как заблокировать эту кнопку, чтобы юзер не мог на нее нажать.

Ответ

Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, _
ByVal bRevert As Long) As Long
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal, _
nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As _
Long
Const SC_CLOSE = &HF060
Const MF_BYCOMMAND = &H0

Public Sub DisableXbutton(ByVal frmHwnd As Long)
Dim hMenu As Long

hMenu = GetSystemMenu(frmHwnd, 0&)
If hMenu Then
Call DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
DrawMenuBar (frmHwnd)
End If
End Sub

Private Sub Form_Load()
DisableXbutton (Me.hwnd)
End Sub

Можно и так

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If UnloadMode = vbFormControlMenu Then
Cancel = True
End If
End Sub

vitarada

Вопрос

Можно ли в MSFlexGrid'е как-то вернуть номера выделенных строк/столбцов? Скажем, выделены строки с 3 по 7.

Ответ

SelRow1 = MsFlexGrid.Row
SelRow2 = MsFlexGrid.RowSel

(Выделены строки с SelRow1 по SelRow2, со столбцами аналогично)

Viaceslavas Kaleda

Вопрос

Как узнать значения второго и последующих столбцов listview?

Ответ

Например, так:

msgbox lstFAQ.ListItems(1).SubItems(1)

А еще можно зажирнить надпись

lstFAQ.ListItems(1).ListSubItems(1).Bold

Или изменить ее цвет

lstFAQ.ListItems(1).ListSubItems(1).forecolor

Или иконку

lstfaq.ListItems(1).ListSubItems(1).ReportIcon

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

Вопрос

Как узнать количество Item'ов в ListView, которые могут быть видны при его текущих размерах? В принципе, большая точность ненужна, Но хотелось бы красивый способ.

Ответ

Private Declare Function SendMessage Lib «user32» Alias «SendMessageA»
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As
Any) As Long

Private Const LVM_FIRST As Long = &H1000
Private Const LVM_GETCOUNTPERPAGE As Long = (LVM_FIRST + 40)

Private Function GetListviewVisibleCount() As Long
   
GetListviewVisibleCount = SendMessage(ListView1.hwnd, _
     LVM_GETCOUNTPERPAGE, _
     0&, _
     ByVal 0&)

Аваков Дмитрий Александрович

Вопрос

Каким образом поменять цвет рамки, с черноного на кой-нить еще, у ТекстБокса, который имеет свойство Apearance=Flat?

Ответ

Private Sub Form_Click()
Dim lngDC
As Long Dim lngTemp
As Long Dim lngPen
As Long Dim pntPoints(4)
As POINTAPI pntPoints(0)
.x = 0 pntPoints(0)
.y = 0 pntPoints(1)
.x = 0 pntPoints(1)
.y = Text1.Height — 1 pntPoints(2)
.x = Text1.Width — 1 pntPoints(2)
.y = Text1.Height — 1 pntPoints(3)
.x = Text1.Width — 1 pntPoints(3)
.y = 0 pntPoints(4)
.x = 0 pntPoints(4)
.y = 0
lngDC = GetDC(Text1.hwnd)
lngBrush = CreatePen(PS_SOLID, 1, vbBlue)
lngTemp = SelectObject(lngDC, lngBrush)
lngTemp = PolylineTo(lngDC, pntPoints(0), 5)
End Sub


Объявления функций и констант сделай сам.

Из конференции Expert_FAQ

Вопрос

Есть adodc на форме с данными, как бы нарисовать график? Может контролы какие прицепить?

Ответ

Есть стандартный контрол MS Chart.

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

Вопрос

В меню можно сделать неактивными его элементы (сереньким цветом) Скажем есть меню «Файл», в котором находятся команды «открыть» «сохранить» и т.д. Так вот эти команды можно сделать неактивными через свойство enabled=false, а можно тоже самое проделать целиком с меню «Файл»?

Ответ

Заходишь в MenuEditor — там у тебя первый элемент по идее — это меню Файл. У него устанавливается имя, например, mnuFile. В коде пишешь:

mnuFile.Enabled = False

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

Вопрос

Можно ли картинку на кнопке уменьшить пропорционально размеру кнопочки?

Ответ

Вот пример ЭУ кнопки. Там смотри на свойства X и Y.

•Creator•

Вопрос

Не подскажете, как превратить обычный Label в ссылку типа <MailTo…>?
Чтобы запускался почтовик.

Ответ

------Фрагмент из кода GoldenBackUp--------
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As
Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As
String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Sub mnuInfo_Click()
  Call ShellExecute(Me.hwnd, "Open", "mailto:info.gbu@mail.dsip.net, "", App.Path, 1)
End Sub
-----/Фрагмент из кода GoldenBackUp---------

Максим Кнышов

Вопрос

Подскажите почему на такую команду:

Combo1.SetFocus

Выдается ошибка:
runtime error '5': invalid procedure call or argument.

Ответ

Тогда вопрос — где ты вызываешь этот метод? Если в Form_load, то ошибка должна возникать. То есть, форма еще не отображена, а ты уже пытешься установить ее контролу фокус? Попробуй так:

frmmain.show
combo1.setfocus

(это прописать в form_load. Если ты это прописавыешь именно там.)

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

Вопрос

  Я с помощью функции SetWindowRgn устанавливаю регион. Но вот когда я его начинаю перемещать, то он остается на месте, а перетаскивается только рамка.
Какие параметры поставить, или может есть специальная функция для перемещения региона?

Ответ

  Функция есть, называется она OffsetRgn. Объявление ее звучит так:

Declare Function OffsetRgn Lib "gdi32" Alias "OffsetRgn" (ByVal hRgn As Long, ByVal x As Long, ByVal y As Long) As Long

Параметры:

hrgn
Сам регион

nXOffset
смещение по Х

nYOffset
Смещение по У

Kurt Haeldar

Вопрос

Я пытаюсь вызвать окно выбора шрифта: CommonDialog.ShowFont. Однако при выполнении этой строки кода я получаю информационное сообщение — заголовок окна: «ШРИФТЫ», сообщение: Шрифты не установлены. Для их установки используйте папку шрифтов в панели управления. Как правильно вызвать окно выбора шрифта?

Ответ

Перед тем, как вызывать диалог нужно проставить это:
CommonDialog1.Flags = cdlCFBoth

Теперь будет работать.

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

Вопрос

Версия VB: 6.0

Расскажите поподробнее про RichTextBox, пожалуйста. Особенно интересуют всякие уловки обращения с ним, устраниние неудобностей, нахождение удобностей.. Очень бы хотелось поподробное узнать о таких незаметных для невооруженного глаза вещах как: Function Find(bstrString As String, [vStart], [vEnd], [vOptions]) As Long, Function GetLineFromChar(lChar As Long) As Long, Sub LoadFile(bstrFilename As String, [vFileType]), Sub SaveFile(bstrFilename As String, [vFlags]), Sub ShowWhatsThis(), Sub Span(bstrCharacterSet As String, [vForward], [vNegate]), Sub UpTo(bstrCharacterSet As String, [vForward], [vNegate]) и т.д.

Особенно интересуют все эти странные параметры начинающиеся на v.. какие они есть и что бы они значили..

Ответ

На самом деле это очень удобный контрол :)

1. Ну чтож, начнем с f Find(bstrString As String, [vStart], [vEnd], [vOptions]) As Long

bstrString — искомая строка,

vStart — позиция в тексте, начиная с которой будет искать,

vEnd — позиция в тексте, до которой будет искать,

vOptions — условие, с учетом которого будет производиться поиск.

( rtfMatchCase = 4; rtfNoHighlight = 8; rtfWholeWord = 2 )

2. GetLineFromChar(lChar As Long) As Long

выдает номер последней строки в которой встречается указаный как lChar символ (если не знаещ ASCII табл. то можно использовать f Asc();

например:

f Asc(«a») — вернет соответствующий символу «a» код)

ну а остальное тут и самому не трудно разобраться :)

Из конференции Expert_FAQ

Вопрос

Открыл свои проекты, в которых WinSock использован, а VB (6) сообщает, что не удается продолжить загрузку.

Поглядел в списках доступных контролов — WinSock'а нигде нет. Поискал в директории со старой Win98 wsock*.ocx — тоже нет, но в 98 все работало. Что делать?
PS: сейчас у меня Win2k.

Ответ

По умолчанию его в Windows нет. Просто возьми где-нибудь wsock32.dll, запиши в Windows/system32 и зарегистрируй.
Если взять негде, он есть в составе сервиспаков для VS6 (я пробовал из SP5 доставать).

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

Вопрос

Для поиска строки в списке (контрол такой) я поступаю так:
Const LB_FINDSTRINGEXACT = &H1A2
Private Declare Function SendMessageByString& Lib "user32" Alias
"SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As
Long, ByVal lParam As String).
hw& = Combo1.hWnd
t& = SendMessageByString&(hw&, LB_FINDSTRINGEXACT, -1, "string")

Если t& = -1, тогда нет строки…

Все работает на отлично. Когда я использую это же для поиска в DataCombo, то ничегошеньки у меня не выходит. Наверное, значение константы LB_FINDSTRINGEXACT надобно поменять. Подскажите, на что ее заменить (если надо) или расскажите, каким образом найти строку в DataCombo (желательно с помощью API).

Ответ

Все очень просто, нужно просто поменять на:

Private Const CB_FINDSTRING = &H14C
Private Const CB_FINDSTRINGEXACT = &H158
CB — означает ComboBox
LB — означает ListBox

Из конференции Expert_FAQ

Вопрос

Есть родительская MDI форма, с меню и тулбаром. Как только появляется дочерняя MDI форма, растягивающаяся по всему доступному дочернему размеру, с тулбарами в контейнере из фрэймов и с невидимым меню, для popupmenu — СРАЗУ же на родительской MDI форме пропадает меню. А тулбар остается. И дело не в ресайзинге. Кто что подскажет?

Ответ

Потому что по свойствам MDI-нитерфейса, при разворачивании Child-формы, имеющей меню, оно становится активным и заменяет меню MDI-формы.

Дмитрий Данелия

Вопрос

Есть главная форма, на которой Кнопка, и Форма2. В Форма2 выполняется процедура, в которой упомянается MainФорма.Кнопка.Enable.

Почему-то в этом возвращается False, в то время как оно на самом деле =True.Что делать?

Ответ

Такое происходит, если Форму2 ты вазываешь модально, и это естественно, т.к. блокируется все другие формы, а если не модально, то все True.

Дмитрий Данелия

Вопрос

У листбокса есть еще одна неприятная особенность — он не умеет нормально «ресайзится». То есть, ему обязательно нужно, чтобы была полностью видна каждая строчка, которая видна при таком размере листбокса. В стороны, правда, все ресайзится без проблем, а вот изменение высоты создает проблемы.

У меня на небольшой форме, вроде вертикальной панли инструментов лежит ЛистБокс. Для простоты надо чтобы при изменении размера формы листбокс тоже изменял размеры соответственно. но из-за его проблемы с высотой ничего не получается. Короче, я перепробовал стандартные методы: при изменении формы приравнивал высоту(scaleheight) формы листбоксу, а потом, если форма больше, то подгонял высоту формы под листбокс. Все это дело получалось довольно некрасиво.
Есть более удобные способы?

Ответ

Нужно выключить свойство IntegralHeight = False

Vovan-VE

Вопрос

Что такое Microsoft Agent, для чего он, с как его использовать, что он делает?

Ответ

Видел в офисе скрепку? Это реализовано на технологии MS Agent (по крайней мере в Office XP точно). С ее помощью показывают персонажей MS Agent, которые анимированы. Если установлены соответствующие движки, то персонажи могу говорить (даже по русски) и понимать речь (пока только английскую). Можно почитать замечательную статью Шатрыкина Ивана «Использование MS Agent» на сайте www.VBNet.Ru

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



Copyright © 2000-2004 Сообщество Чайников
Контактная информация