Гм.. Странно совпало как-то: сегодня юбилейный 250-ый выпуск рассылки, а в понедельник у меня день рождения! Поздравления принимаются :)
Кстати... В разделе Вопрос/Ответ я сегодня не все ответы закинул, уж сильно их много было, какие остались - опубликую в следующем выпуске...
Читайте!
SeaWar - Это сетевая версия популярной игры "Морской бой". Программа не до конца доработана и является бета -версией. Все замечания и пожелания отправлять на :rusivan_2004@mail.ru Программа реализована с помощью контрола WINSOCK.
RPC/Литерал и свобода выбора - Посмотрим, почему используемый для Web сервиса формат обмена сообщениями SOAP не всегда определяет используемую модель программирования. Больше узнаем о форматах обмена сообщениями SOAP и разделении формата сообщения и модели программирования.
Mabry MIDI Player - Очень крутой проигрыватель MIDI файлов, с визуализатором состояния звука. Простой в то же время мошный проигрыватель построен на осное контролей написанных Marby Software. Контроли написаны на Си но подправлены ан ВИжуал Бейзике. Дерзайте!
Volume İndicator 128/256 - Контроль типа VolumeBar - кто не знает загляните и посмотрите. Можно использовать как индекатор загруженности или простой Progress bar. В архиве 2 вида контроля с исходниками. Один 128 для 128-бит а другой 256 модифицированный и универсльный. Где даже начало чвета и сам чвет каждого статуса можно указать. Одним словом, хотите узнать получше - взгляните! Применяйте в аудио утилитах! Очень полезно!
16.03.2004 - Свежие новости MSDN для разработчиков на .NET
Важнейшие материалы, новые веб-ресурсы, продукты и технологии наших партнеров, веб-презентации, общение в режиме реального времени, мероприятия для разработчиков.
Как вызвать окно "Параметры страницы", как в блокноте (Файл>Параметры страницы...)?
Ответы:
Автор: LamerOnLine
Option Explicit
Private Declare Function PageSetupDlg Lib "comdlg32.dll" Alias "PageSetupDlgA" (pPagesetupdlg As PageSetupDlg) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type PageSetupDlg
lStructSize As Long
hwndOwner As Long
hDevMode As Long
hDevNames As Long
flags As Long
ptPaperSize As POINTAPI
rtMinMargin As RECT
rtMargin As RECT
hInstance As Long
lCustData As Long
lpfnPageSetupHook As Long
lpfnPagePaintHook As Long
lpPageSetupTemplateName As String
hPageSetupTemplate As Long
End Type
Private Function ShowPageSetupDlg() As Long
Dim m_PSD As PageSetupDlg
'Set the structure size
m_PSD.lStructSize = Len(m_PSD)
'Set the owner window
m_PSD.hwndOwner = Me.hWnd
'Set the application instance
m_PSD.hInstance = App.hInstance
'no extra flags
m_PSD.flags = 0
'Show the pagesetup dialog
If PageSetupDlg(m_PSD) Then
ShowPageSetupDlg = 0
Else
ShowPageSetupDlg = -1
End If
End Function
Private Sub Command1_Click()
Dim Ret As Long
Ret = ShowPageSetupDlg
End Sub
Как то в выпуске 89 был код: "Kак убрать программу из списка Ctrl+Alt+Del".
В Win95-98 он идет а, на ХР выдает ошибку во время выполнения прграммы '453'. Не может найти DLL точку входа RegisterServiceProcess в kernel32.
Private Declare Function RegisterServiceProcess Lib "kernel32" (ByVal ProcessID As Long, ByVal ServiceFlags As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Sub Form_Load()
RegisterServiceProcess GetCurrentProcessId, 1 'Hide app
End Sub
Private Sub Form_Unload(Cancel As Integer)
RegisterServiceProcess GetCurrentProcessId, 0 'Remove service flag
End Sub
У меня такая проблема:
Я пишу скринграбер. В функции съёмки окна или элемента окна я думаю перерисовать содержимое экрана на форму и развернуть эту форму на весь экран. Так намного лучше чем давать пользователю водить мышкой прямо по окнам, выбирая их. Но тогда ведь не будет работать WindowFromPoint... Ведь она отлавливает верхнее окно, а верхним будет моя форма (может можно сделать как-то, чтобы она мою не учитывала?). Поэтому я решил, что сначала надо создать список всех окон в системе с их координатами, размерами. А потом, когда пользователь водит крысой, из этого списка выбирается то, что находится в этой точке... Но если таких несколько? Как определить которое выше? Я намутил такой вот код:
Dim w As Long
Dim w As Long
Dim RC As RECT
L.Clear
w = GetWindow(GetDesktopWindow, GW_CHILD)
Do While w <> 0
If IsWindowVisible(w) Then
GetWindowRect w, RC
L.AddItem w & " (" & RC.Left & ", " & RC.Top & ", " & RC.Right & ", " & RC.Bottom & ")"
End If
w = GetWindow(w, GW_HWNDNEXT)
Loop
Он создаёт список окон на рабочем столе (без учёта дочерних) с их координатами. Он может стать основой. Но как реализовать остальное я не знаю :(
Возможно есть и другой способ, полегче...
Буду благодарен за любые советы (лучше полный код :).
Хочу сделать антивирус, но вот начались проблемы с созданием антивирусных баз.
База представляет собой следующий файл.В начале должна находится версия базы, далее после символа "VbNewLine" идет название вруса #1, а после этого символ "VbNewLine" и часть бинарного кода вируса, подом название вируса #2, и его код и.т.д. Помогите, пожалуйста, осуществить это.
Ответы:
Вопрос:
Есть такой код. Проблема в том, что в Windows 98 он работает, а в 2000 и ХР нет. Подскажите, что здесь неправильно.
Private Declare Function CreatePolygonRgn Lib "gdi32.dll" (lpPoint _
As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Private Declare Function SetWindowRgn Lib "user32.dll" (ByVal hwnd _
As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Dim P(407) As POINTAPI
Dim hw As Long
hw=me.hwnd 'hWnd формы
'Заполняем массив точек. Данный массив рисует звездочку на форме
P(0).X = 124: P(0).Y = 0
P(1).X = 159: P(1).Y = 86
P(2).X = 248: P(2).Y = 86
P(3).X = 183: P(3).Y = 146
P(4).X = 248: P(4).Y = 312
P(5).X = 124: P(5).Y = 199
P(6).X = 0: P(6).Y = 312
P(7).X = 65: P(7).Y = 146
P(8).X = 0: P(8).Y = 86
P(9).X = 89: P(9).Y = 86
P(10).X = 124: P(10).Y = 0
'Вызов этой функции при работе под Win2000 дает 0
'Я менял второй параметр ставил его и 10 и 11, результат один и тот же.
Rgn = CreatePolygonRgn(P(0), 10, 0)
Call SetWindowRgn(hw, Rgn, True)
nPolyFillMode - определяет режим заполнения, используемый для определения того, какие пиксели входят в область. Может принимать одно из следующих значений:
ALTERNATE
Попеременный режим. Закрашиваются только те фрагменты внутренней области многоугольника, которые получаются путем соединения линий с нечетными номерами (1, 3, 5 и т. д.). Другие фрагменты внутренней области не закрашиваются.
WINDING
Сквозной. Windows закрашивает все внутренние области.
Const ALTERNATE = 1 ' ALTERNATE and WINDING are
Const WINDING = 2 ' constants for FillMode.
В вашем примере
Rgn = CreatePolygonRgn(P(0), 10, 0)
необходимо 0 заменить на 1 или 2, например:
Rgn = CreatePolygonRgn(P(0), 10, 1)
Вопрос:
Как сгенерировать случайное число, состоящее из 5 чисел, все из которых будут единицы или нули?
Лучше всего оформить это в виде процедуры. Можешь это сделать так:
Public Function GetRnd()
Randomize
For rndIndex = 0 To 4
tmpRnd = Int(Rnd * 2)
If tmpRnd = 1 Then tmpRnd = 0 Else tmpRnd = 1
strRnd = strRnd & tmpRnd
Next
GetRnd = strRnd
End Function
Потом в теле программы просто делаешь вызывов типа:
Привет, если я правильно понял проблему, то ее можно решить так:
Dim x As String
Dim k As Integer
Dim i As Integer
x = ""
k = 0
i = 0
For i = 0 To 4
'инициализируем генератор случайных чисел
Randomize
'случайное число
k = Rnd
If k > 0.5 Then
k = 1
Else
k = 0
End If
x = x & CStr(k)
Next i
'выводим полученное случайное число в Immediate Window
Debug.Print x
Можешь сгенерировать любое число, а заменить его цифры:
Dim aa As Long
Randomize (Time)
aa = Rnd() * 100000
Dim str As String
str = CStr(aa)
For i = 1 To Len(str)
If CInt(Mid(str, i, 1)) >= 5 Then Mid(str, i, 1) = "1" Else Mid(str, i, 1) = "0"
Next i
MsgBox aa & " " & str
Вот замутил функцию GetRnd. Для примера сделал модную нынче Matrix ;)
Добавь на форму таймер, вставь этот код, BorderStyle поставь None = 0 и посмотри... Если долго пристально вглядыватся, то создаётся впечеатление движения :)
rs.addnew - вставка строки( прописываешь в код кнопки "Добавить")
rs.update - фиксирует изменения после addnew или редактирования(кнопка "Сохранить изменения")
Редактирование(как и заполнение пустой строки) производиться либо через элементы управления (например DBGrid) либо в коде:
rs.fields(0).value=10 'запишет в первый(нулевой) столбец выбранной строки значение "10"
Каким способом можно считывать переменные из файла (например *.txt)? Я только знаю оператор Open, но он мне не подходит, потому что он считывает только одну строчку или файл целиком. Может можно использвать этот файл как-то по другому? В файле у меня написано:
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
Public Function ReadINI(AppName As String, KeyName As String, FileName As String, Default As String) As String
Dim s As String, char As Long
s = String(7001, 0)
char = GetPrivateProfileString(AppName, KeyName, Default, s, 7000, FileName)
ReadINI = Left(s, char)
End Function
Public Function WriteINI(AppName As String, KeyName As String, sData As String, FileName As String)
WritePrivateProfileString AppName, KeyName, sData, FileName
End Function
Private Sub Command1_Click()
WriteINI "Name", "siename", "Иванов", "имя Вашего файла" 'Записываем данные
'Результат будет таков
'[Name]
'siename=Иванов
Me.Text1.text = ReadINI("Name", "siename", "имя Вашего файла", "еси нету данных, то по умолчанию читаем хххх ")
End Sub
По открытию файла:
Ну собственно всё, что надо, ты уже знаешь. Остальное придётся ручками.
Здесь пожалуй два варианта:
1. Считывать построково и решать проблему так:
dim v as integer
v=instr(1,stroka,"=")
if v>0 then
varname=left$(stroka,v-1)
select case varname
case "chislo":chislo=mid$(stroka,v+1)
' и т.д.
end select
end if
2. Считывать сразу весь файл (если он не огромный или у тебя нет напряга с оперативкой) и потом разбараться с ним через массивы:
tmparr=split(fullfile,vbcrlf)
' Здесь проверку на правильность создания массива
maxarr=ubound(tmparr) ' Пойдёт только в случае полной уверенности
' наличия массива,
' а потом в цикле применяешь или первый метод (см. выше) или опять
' Split:
for i=0 to maxarr
tmparr2=split(tmparr(i),"=")
' здесь опять проверка должна быть (я опускаю)
varname=tmparr2(0)
select case varname
case "chislo":chislo=tmparr2(1)
' и т.д.
end select
next i
select case в принципе можно заменить одним хитрым способом, который я видел, но никогда не применял, поэтому не запомнил - узнавание переменной по имени. Но в случае, если переменных немного, то проще select case'ом. А если ты точно знаешь в какой строке находится нужная переменная (к примеру INI-файл), то совсем просто: элементарно по порядку всех их вытаскиваешь...
Вопрос:
Как считывать информацию из базы данных? Например у меня есть база данных в формате Microsoft Acsess. Как мне присвоить переменным значения этой таблицы:
Фамилия Имя Отчество
Иванов Иван Иваныч
Желательно, бея раяличных компонентов и библиотек.
Есть такой контрол в системной папке:
X:\WINDOWS\system32\Macromed\Flash\swflash.ocx
Вопрос:
Есть элемент Picture1 и нужно чтобы из буфера обмена картинка вставлялась в него.
Picture1.Picture = LoadPicture(Clipboard.GetData)
Данная команда постоянно выдает ошибку "Файл не найден "ХХХХХХ", где ХХХХХХ постоянно изменяющееся число.
Подскажите, как определять, что в clipboard имеется картинка (BMP-формат или что-то в этом роде) и если это так, то вставить эту картинку в PictureBox и сохранить в файл, желательно в формате JPG.
if Clipboard.GetFormat (vbCFBitmap)=True then
Picture1.Picture = Clipboard.GetData 'Вставка картинки из буфера
end if
SavePicture Picture1.picture, "c:\1.bmp"