Я взялся заа изучение технологии XSLT. Очень удобная штука! Хорошо структурированные и удобочитаемые данные в формате XML с помощью XSLT бсытро превращаются в красивый HTML! Уже подумываю о том, чтобы написать формат данной рассылки в XML и XSLT для преобразования в HTML, а для создания XML припрячь .NET, тем самым максимально автоматизировав создание рассылки, которая сейчас делается почти полностью вручную.
Читайте!
Как делать DropDown Button в Васике? (Это такая выпадающая кнопка, типа Back в IE)
Ответ:
Делаешь в ToolBar кнопку, задаешь ей стиль 5 - tbrDropdown.
Для анализа выбора обрабатывай Toolbar1_ButtonMenuClick
Можно динамически добавлять и удалять пункты:
Поясните как работать с функцией API:
FindWindow, EnumWindow.
Мне нужно найти идентификатор окна.
Ответ:
Функция может искать хендл окна либо по заголовку, либо по имени класса, в
зависимости от того, что известно. Ну и, естественно, хендл надо получить:
Dim lMyHandle As Long
lMyHandle = FindWindow(vbNullString, "Калькулятор")
' если знаем заголовок
lMyHandle = FindWindow("ExploreWClass", vbNullString)
' найдешь окно Проводника
А EnumWindows используется для того, чтобы перебрать все окна, существующие
в данный момент.
Private Sub Form_Load()
Me.AutoRedraw = True
'call the Enumwindows-function
EnumWindows AddressOf EnumWindowsProc, ByVal 0&
End Sub
'Это помещаешь в модуль
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal
lParam As Long) As Boolean
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal
hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetWindowTextLength Lib "user32" Alias
"GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As
Boolean
Dim sSave As String, Ret As Long
Ret = GetWindowTextLength(hwnd)
sSave = Space(Ret)
GetWindowText hwnd, sSave, Ret + 1
Form1.Print Str$(hwnd) + " " + sSave
EnumWindowsProc = True ' продолжение перебора
End Function
Есть панель Panel1, на ней два текстбокса. Как сделать
так, чтобы при появлении текста во втором текстбоксе,
снизу создавался третий.
Не делался visible, а появлялся, создавался.
Ответ:
'Вверху там где объявления переменных уровня класса
Friend WithEvents txtNumber As System.Windows.Forms.TextBox
'В процедуре, в которой создаёшь текстбокс
txtNumber=New System.Windows.Forms.TextBox
txtNumber.Visible=true
'Устанавливаем положение и размеры
txtNumber.Left=...
txtNumber.top=...
txtnumber.width=...
txtnumber.height=...
Павел Сурменок
Можно унаследовать предыдущий и делать все это с массивом.
redim pres...
txtNumber(index)=New txtNumber(index-1)
txtNumber(index).top=txtNumber(index-1).top + сколько надо
а чтоб появился надо добавить его в соответствующую коллекцию
Controls
и еще не забыть обработчик навесить, чтоб под ним тоже могло появляться.
Щелкни правой кнопкой мышки по форме: выбери пункт Menu Editor
В Caption вводишь названия пунктов своего меню, в Name - имя-идентификатор
для каждого пункта, например:
Caption = Файл
Name = mnuOpen
Для создания каждого последующего пункта щелкай на Next
Если в пункте меню должны быть еще раскрывающиеся подпункты
щелкай на стрелочку вправо (появится ....)
Для создания разделителя в Caption вводи - (знак минус)
Вот и все твое меню готово. Жми ОК!
Если меню должно быть всплывающим в твоей программе
(скажем,появляться по нажатию правой кнопки мыши на форме)
тогда первым пунктом добавь что-то типа Name = mnuPopUp, и сними
флажок Visible,
а все остальные пункты сделай подчиненными данному пункту (вложенными)
и вызывай следующим образом
Sub Form_MouseDown(Button As Integer,Shift As Integer, _
X As Single,Y As Single)
if button =2 then
popupmenu mnuPopup
end if
End Sub
Все события при щелчке на пунктах меню обрабатываются в MenuName_Click
Сергей Л.
Вопрос/Ответ
Здесь Вы можете задать вопрос, или ответить на уже имеющиеся вопросы.
В Excel есть табличка-справочник (поля User, Resurs, ...). И таблица основная, в которой указываются разные юзеры. Надо, чтобы в соседнюю колонку вытаскивался Resurs из справочной таблицы для этого юзера. Какое сочетание встроенных функций использовать?
Как послать программе в качастве параметра строку длиннее 300 символов? Например, надо загрузить в WinGroove музыкальный список длиной около 40 песен. Напрямую это сделать не получается - система выдает ошибку из-за слушком большой длины строки.
Ответы:
Вопрос:
Как найти все названия компьютеров в локальной сети?
Option Explicit
Declare Function NetMessageBufferSend Lib "netapi32.dll" (ByVal ServerName As String, ByVal MsgName As String, ByVal
FromName As String, Buf As Any, BufLen As Long) As Long
Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Private Type NETRESOURCE
dwScope As Long
dwType As Long
dwDisplayType As Long
dwUsage As Long
lpLocalName As Long
lpRemoteName As Long
lpComment As Long
lpProvider As Long
End Type
'------------------------------------------
Private Type NETRESOURCE_STRING
dwScope As Long
dwType As Long
dwDisplayType As Long
dwUsage As Long
lpLocalName As String
lpRemoteName As String
lpComment As String
lpProvider As String
End Type
'------------------------------------------
Type NetInfo
dwScope As Long
dwType As Long
dwDisplayType As Long
dwUsage As Long
LocalName As String
RemoteName As String
Comment As String
Provider As String
End Type
'------------------------------------------
Private Declare Function WNetOpenEnum Lib "mpr.dll" Alias "WNetOpenEnumA" (ByVal dwScope As Long, ByVal dwType As Long,
ByVal dwUsage As Long, lpNetResource As Any, lphEnum As Long) As Long
Private Declare Function WNetEnumResource Lib "mpr.dll" Alias "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long,
ByVal lpBuffer As Long, lpBufferSize As Long) As Long
Private Declare Function WNetCloseEnum Lib "mpr.dll" (ByVal hEnum As Long) As Long
'------------------------------------------
Const RESOURCE_CONTEXT = &H5
'------------------------------------------
Private Const RESOURCETYPE_ANY = &H0
Private Const RESOURCEUSAGE_CONTAINER = &H2
'------------------------------------------
Private Const GMEM_FIXED = &H0
Private Const GMEM_ZEROINIT = &H40
Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)
'------------------------------------------
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
'------------------------------------------
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As
Long)
Private Declare Function CopyPointer2String Lib "kernel32" Alias "lstrcpyA" (ByVal NewString As String, ByVal OldString
As Long) As Long
'------------------------------------------
Public NI() As NetInfo
Private NRS As NETRESOURCE_STRING
Private NR As NETRESOURCE
'------------------------------------------
Private Sub FillNRS(Index As Long)
NRS.dwDisplayType = NI(Index).dwDisplayType
NRS.dwScope = NI(Index).dwScope
NRS.dwType = NI(Index).dwType
NRS.dwUsage = NI(Index).dwUsage
NRS.lpComment = NI(Index).Comment & Chr$(0)
NRS.lpLocalName = NI(Index).LocalName & Chr$(0)
NRS.lpProvider = NI(Index).Provider & Chr$(0)
NRS.lpRemoteName = NI(Index).RemoteName & Chr$(0)
End Sub
'------------------------------------------
'очистить список компьютеров
Private Sub ClearNr()
NR.dwDisplayType = 0&
NR.dwScope = 0&
NR.dwType = 0&
NR.dwUsage = 0&
NR.lpComment = 0&
NR.lpLocalName = 0&
NR.lpProvider = 0&
NR.lpRemoteName = 0&
End Sub
'------------------------------------------
Private Sub FillInfo(Index As Long)
NI(Index).dwScope = NR.dwScope
NI(Index).dwDisplayType = NR.dwDisplayType
NI(Index).dwType = NR.dwType
NI(Index).dwUsage = NR.dwUsage
NI(Index).RemoteName = PointerToString(NR.lpRemoteName)
NI(Index).LocalName = PointerToString(NR.lpLocalName)
NI(Index).Comment = PointerToString(NR.lpComment)
NI(Index).Provider = PointerToString(NR.lpProvider)
End Sub
'------------------------------------------
'обновить список компьютеров
Sub GetCompName()
'------------------------------------------------------
Form1.MousePointer = vbHourglass
'-------------------------------------------------
NetEnumLocal
FillLVNet
'------------------------------------------------------
Form1.MousePointer = vbDefault
'-------------------------------------------------
End Sub
'------------------------------------------
Private Sub NetEnumLocal()
Dim hEnum As Long, lpBuff As Long
Dim cbBuff As Long, cCount As Long
Dim p As Long, res As Long, I As Long
On Error GoTo ErrorHandler
ClearNr
cbBuff = 16384
cCount = &HFFFFFFFF
res = WNetOpenEnum(RESOURCE_CONTEXT, RESOURCETYPE_ANY, RESOURCEUSAGE_CONTAINER, NR, hEnum)
If res = 0 Then
lpBuff = GlobalAlloc(GPTR, cbBuff)
res = WNetEnumResource(hEnum, cCount, lpBuff, cbBuff)
If res = 0 Then
ReDim NI(cCount)
p = lpBuff
For I = 1 To cCount
CopyMemory NR, ByVal p, LenB(NR)
FillInfo I
p = p + LenB(NR)
Next I
End If
ErrorHandler:
On Error Resume Next
If lpBuff <> 0 Then GlobalFree (lpBuff)
WNetCloseEnum (hEnum)
End If
End Sub
'------------------------------------------
'показать компьютеры
Private Sub FillLVNet()
Dim I As Integer
Dim NetName As String
Form1.List1.Clear
On Error GoTo A
For I = 1 To UBound(NI)
NetName = StripSlash(NI(I).RemoteName)
If NetName <> "" Then
Form1.List1.AddItem NetName
End If
Next I
A:
End Sub
'------------------------------------------
'убираем "\\" перед названием компьютера
Private Function StripSlash(sName As String) As String
Dim A As Integer, b As Integer
Do
b = A
A = InStr(A + 1, sName, "\", vbTextCompare)
Loop While A <> 0
StripSlash = Mid$(sName, b + 1)
End Function
'------------------------------------------
Private Function PointerToString(p As Long) As String
Dim s As String
s = String(255, Chr$(0))
CopyPointer2String s, p
PointerToString = Left(s, InStr(s, Chr$(0)) - 1)
End Function
'------------------------------------------
Как сделать чтобы, при нажатии кнопки cmd выполнялись такие действия :
1. Создание файла Excel с именем Name.
2. Занесение в ячейку А2 значение переменной тхт1.
3. Занесение в ячейку А3 значение переменной тхт2.
Public Sub CreateExcel(xx As Object)
On Error Resume Next
Set xx = GetObject(, "Excel.Application")
If xx Is Nothing Then
Set xx = CreateObject("Excel.Application")
End If
End Sub
sub XXX()
Dim ss As Object 'New Excel.Application
Dim xx As Application
Dim zz As Workbook
Call CreateExcel(ss) 'Тут либо создаетсчя новый эксель, либо используется уже открытый
Set xx = ss.Application
Set zz = ss.Workbooks.Open("МегаФайл.xls")
xx.Cells(1, 1) = txt1
xx.Cells(2, 1) = txt2
end sub
Вопрос:
В чем моя ошибка?
Private Sub Запись()
Open App.Path & "\файл" For Append As #1
With Сервер 'Тип обозначен ранее
.Имя = txtName.Text
.Адрес = txtAdress.Text
.Порт = txtPort.Text
Write #1, .Имя; .Адрес; .Порт
End With
Close #1
End Sub
Вот, эта функция успешно записывает все данные в файл. Теперь мне надо прочесть данные из файла и разместить это в ListView'е. Делаю я это так:
Private Sub Чтение()
Dim i As Long
Dim DAS As ListItem
Open App.Path & "\файл" For Input As #2
i = 1
Do While Not EOF(2)
With Сервер
Set DAS = ListView1.ListItem.Add (.Имя)
DAS.SubItem(1) = .Адрес
DAS.SubItem(2) = .Порт
End With
i = i + 1
Loop
Close #2
End Sub
Так вот, проблема заключается в незаполнении ListView. Я не пойму, почему. Может кто-то подскажет
Private Sub Чтение()
Dim i As Long
Dim DAS As ListItem
Open App.Path & "\файл" For Input As #2
i = 1
Do While Not EOF(2)
With Сервер
Set DAS = ListView1.ListItem.Add (.Имя)
DAS.SubItem(1) = .Адрес
DAS.SubItem(2) = .Порт
End With
i = i + 1
Loop
Close #2
End Sub
Private Sub Запись()
Open App.Path & "\файл" For Append As #1
With Сервер 'Тип обозначен ранее
.Имя = txtName.Text
.Адрес = txtAdress.Text
.Порт = txtPort.Text
'-----------------------------------
Write #1, .Имя; .Адрес; .Порт
'-----------------------------------
'если тип Сервер имеет только три поля и в файл записываются только
'они, то есть другой способ записи данных типа в файл.
'-----------------------------------
Put #1, 1, Сервер
'-----------------------------------
End With
Close #1
End Sub
Private Sub Чтение()
Dim i As Long
Dim DAS As ListItem
Open App.Path & "\файл" For Input As #2
i = 1
Do While Not EOF(2)
'прежде, чем заносить в ListView, необходимо считать данные из файла
'--------------------------------
Get #2, 1, Сервер
'--------------------------------
With Сервер
Set DAS = ListView1.ListItem.Add (.Имя)
DAS.SubItem(1) = .Адрес
DAS.SubItem(2) = .Порт
End With
i = i + 1
Loop
Close #2
End Sub
'Ошибки:
'Во-первых не считал данные из файла
'Во-вторых при чтении открывал файл как Append, а надо Input.
'Не используй русские имена,VB начинает глючить.
'Не забудь добавить ListBox1
Private Type Server
sName As String
sAdress As String
sPort As Long
End Type
Private Server As Server
Private Sub Save()
Open "c:\fff.txt" For Append As #1
With Server
.sAdress = "ServerAdress"
.sName = "ServerName"
.sPort = 50
Write #1, .sAdress; .sName; .sPort
End With
Close #1
End Sub
Private Sub Load()
Dim i As Long
Open "c:\fff.txt" For Input As #1
Do While Not EOF(1)
With Server
Input #1, .sAdress
Input #1, .sName
Input #1, .sPort
ListBox1.AddItem "Adress=" & .sAdress & " Name=" & .sName & " Port=" & .sPort, i
End With
i = i + 1
Loop
Close #1
End Sub
Dim aa As ListItem
Set aa = ListView1.ListItems.Add
Dim bb As ListSubItem
aa.Text = "ads"
Set bb = aa.ListSubItems.Add
bb.Text = "adsasd"
Set bb = aa.ListSubItems.Add
bb.Text = "ad"