Страница: 1 | 2 |
Вопрос: У меня опять два вопроса..... 8)
Добавлено: 21.01.05 00:15
Автор вопроса: Neco | Web-сайт:
Ура!!!!!!!!
Ожил! 8)
1. Как открыть диалог SHBrowseForFolder так, чтобы в нём уже был раскрыт определённый путь, а не приходилось рыскать по всем папкам каждый раз заново?
2. В каком всё-таки типе данных надо хранить данные о размерах на дисках. К примеру, свобдное место на харде. Я поначалу хранил в Double, но потом увидел в примере хранение в Currency. В чём точнее?
Ответы
Всего ответов: 21
Номер ответа: 1
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #1
Добавлено: 21.01.05 01:28
1.В структуре BROWSEINFO укажи callback процедуру. В этой процедуре на сообщение BFFM_INITIALIZED нужно послать опять в эту процедуру
Dim Root As String*260
Root="MyFolder"
SenMessage hWnd,BFFM_SETSELECTION, TRUE,BYVAL Root
И когда BFFM_SETSELECTION аукнется в callback процедуру сообщением BFFM_SELCHANGED, нужно по этому сообщению вызвать
SHGetPathFromIDList lParam,ByVal Root
и затем
SendMessage hwnd,BFFM_SETSTATUSTEXT,0,ByVal Root
и твой диалог откроется в муфолдере
2. Double.
Номер ответа: 2
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #2
Добавлено: 21.01.05 02:03
Довольно кривая реализация (моя), т.к. давнишняя
Вообще глобальных переменных быть не должно, а должен в lpData указатель на локальную переменную передаваться
(это я уже потом додумался когда на асьме переписывал эту фишку)
'* Написано: 01.08.2003 (Team HomeWork) *
'* e-mail: sne_pro@mail.ru *
'***************************************************************************************
Option Explicit
Private Declare Function GetOpenFileNameA Lib "comdlg32" (FileName As FileName) As Long
Private Declare Function GetSaveFileNameA Lib "comdlg32" (FileName As FileName) As Long
Private Declare Function ChooseColorAPI Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Type FileName
lngStructSize As Long
lngHandle As Long
lngInstance As Long
strFilter As String
strCustomFilter As String
lngMaxCustFilter As Long
lngFilterIndex As Long
strFile As String
lngMaxFile As Long
strFileTitle As String
lngMaxFileTitle As Long
strInitialDir As String
strTitle As String
lngFlags As Long
intFileOffset As Integer
intFileExtension As Integer
strDefExt As String
lngCustData As Long
lngHook As Long
strTemplateName As String
End Type
Private Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Private Type CHOOSECOLOR
lStructSize As Long
hwndOwner As Long
hInstance As Long
RGBResult As Long
lpCustColors As String
flags As Long
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
Public Enum CdlgExt_Flags
OFN_CREATEPROMPT = &H2000
OFN_ENABLESIZING = &H800000
OFN_EXPLORER = &H80000
OFN_FILEMUSTEXIST = &H1000
OFN_HIDEREADONLY = &H4
OFN_OVERWRITEPROMPT = &H2
OFN_PATHMUSTEXIST = &H800
End Enum
Public Enum WhatBrowse
BIF_RETURNONLYFSDIRS = &H1
BIF_DONTGOBELOWDOMAIN = &H2
BIF_STATUSTEXT = &H4
BIF_RETURNFSANCESTORS = &H8
BIF_EDITBOX = &H10
BIF_NEWDIALOGSTYLE = &H40
BIF_BROWSEINCLUDEFILES = &H1 Or &H4000
BIF_BROWSEFORCOMPUTER = &H1000
BIF_BROWSEFORPRINTER = &H2000
BIF_USENEWUI = (BIF_NEWDIALOGSTYLE Or BIF_EDITBOX)
End Enum
Private Const MAX_PATH As Long = 260
Private Inst As Long, _
sArray() As String, _
sBuffer As String
'--------------------------------------------------------------------------------
' Проект : OfflineClient
' Процедура : GetOpenFileName
' Описание : Отурытие файла
' Кем создан : SNE
' Дата-Время : 08.11.2004-17:44:28
'
' Параметры : lngHandle - Хэндл родителя
' lDlgStyle - Стиль окна открытия
' strFilter - Фильтр
' FltrIndex - Номер используемого фильтра
' sInitPath - Начальный путь
' sInitFile - Начальное имя файла
' sDlgTitle - Заголовок окошка
'--------------------------------------------------------------------------------
Public Function GetOpenFileName(Optional ByVal lngHandle As Long = &H0, _
Optional ByVal lDlgStyle As CdlgExt_Flags = OFN_HIDEREADONLY, _
Optional ByVal strFilter As String = vbNullString, _
Optional ByVal FltrIndex As Long = &H1, _
Optional ByVal sInitPath As String = vbNullString, _
Optional ByVal sInitFile As String = vbNullString, _
Optional ByVal sDlgTitle As String = vbNullString) As String
Dim FN As FileName
Call InitialisateOFN(FN, lngHandle, lDlgStyle, strFilter, FltrIndex, sInitPath, sInitFile, sDlgTitle)
Call GetOpenFileNameA(FN)
Inst = InStr(1&, FN.strFile, vbNullChar) - &H1
If Inst Then GetOpenFileName = Left$(FN.strFile, Inst)
End Function
'--------------------------------------------------------------------------------
' Проект : OfflineClient
' Процедура : GetSaveFileName
' Описание : Сохранение файла
' Кем создан : SNE
' Дата-Время : 08.11.2004-17:44:28
'
' Параметры : lngHandle - Хэндл родителя
' lDlgStyle - Стиль окна открытия
' strFilter - Фильтр
' FltrIndex - Номер используемого фильтра
' sInitPath - Начальный путь
' sInitFile - Начальное имя файла
' sDlgTitle - Заголовок окошка
'--------------------------------------------------------------------------------
Public Function GetSaveFileName(Optional ByVal lngHandle As Long = &H0, _
Optional ByVal lDlgStyle As CdlgExt_Flags = OFN_HIDEREADONLY, _
Optional ByVal strFilter As String = vbNullString, _
Optional ByVal FltrIndex As Long = &H1, _
Optional ByVal sInitPath As String = vbNullString, _
Optional ByVal sInitFile As String = vbNullString, _
Optional ByVal sDlgTitle As String = vbNullString) As String
Dim FN As FileName
Call InitialisateOFN(FN, lngHandle, lDlgStyle, strFilter, FltrIndex, sInitPath, sInitFile, sDlgTitle)
Call GetSaveFileNameA(FN)
Inst = InStr(1&, FN.strFile, vbNullChar) - &H1
If Inst Then GetSaveFileName = Left$(FN.strFile, Inst)
End Function
Private Sub InitialisateOFN(ByRef FN As FileName, _
ByVal lngHandle As Long, _
ByVal lDlgStyle As CdlgExt_Flags, _
ByVal strFilter As String, _
ByVal FltrIndex As Long, _
ByVal sInitPath As String, _
ByVal sInitFile As String, _
ByVal sDlgTitle As String)
For Inst = 1 To Len(strFilter)
If Mid$(strFilter, Inst, 1& = "|" Then Mid$(strFilter, Inst, 1& = vbNullChar
Next
strFilter = strFilter & vbNullChar & vbNullChar
With FN
.lngStructSize = Len(FN)
.lngHandle = lngHandle
.lngFlags = lDlgStyle Or OFN_EXPLORER
.lngInstance = App.hInstance
.lngMaxFile = MAX_PATH
.lngMaxFileTitle = MAX_PATH
.strFile = sInitFile & String$(MAX_PATH - Len(sInitFile), &H0)
.strFileTitle = String$(MAX_PATH, &H0)
.strFilter = strFilter
.lngFilterIndex = FltrIndex
.strInitialDir = sInitPath
.strTitle = sDlgTitle
End With
End Sub
' §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
'--------------------------------------------------------------------------------
' Проект : OfflineClient
' Процедура : ShowColor
' Описание : Выбор цвета
' Кем создан : SNE
' Дата-Время : 08.11.2004-17:44:28
'
' Параметры : hOwner - Хэндл родителя
' InOutColor - Цвет
'--------------------------------------------------------------------------------
Public Function ShowColor(hOwner As Long, InOutColor As Long) As Long
Dim shi As Integer
Dim CC As CHOOSECOLOR
Dim CustomColors(&H0 To &H10 * &H4 - &H1) As Byte
For shi = 0 To UBound(CustomColors)
CustomColors(shi) = &HFF
Next
With CC
.lStructSize = Len(CC)
.hwndOwner = hOwner
.hInstance = App.hInstance
.lpCustColors = StrConv(CustomColors, vbUnicode)
.flags = &H1 Or &H2 Or &H4 Or &H8
.RGBResult = InOutColor
If ChooseColorAPI(CC) Then
InOutColor = .RGBResult: ShowColor = .RGBResult
Else
ShowColor = InOutColor
End If
End With
End Function
' §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
'--------------------------------------------------------------------------------
' Проект : OfflineClient
' Процедура : fBrowseForFolder
' Описание : Обзор каталогов
' Кем создан : SNE
' Дата-Время : 08.11.2004-17:44:28
'
' Параметры : hOwner - Хэндл родителя
' sPrompt - Надпись сверху
' WhatBr - Что будем смотреть
' InitDir - Начальный каталог
' fileMasks - Маска файлов
'--------------------------------------------------------------------------------
Public Function fBrowseForFolder(ByVal hOwner As Long, _
Optional ByVal sPrompt As String, _
Optional ByVal WhatBr As WhatBrowse, _
Optional ByVal InitDir As String = vbNullString, _
Optional ByVal fileMasks As String = vbNullString) As String
Dim udtBI As BROWSEINFO
With udtBI
.hOwner = hOwner
.lpszTitle = Trim$(sPrompt)
.ulFlags = WhatBr
Call CopyMemory(.lpfn, AddressOf BrowseCallbackProc, &H4)
End With
sBuffer = InitDir
If Len(fileMasks) Then sArray = Split(fileMasks, "|" Else ReDim sArray(0)
Inst = SHBrowseForFolder(udtBI)
fBrowseForFolder = String$(&H200, &H0)
If Inst And SHGetPathFromIDList(Inst, fBrowseForFolder) = vbNull Then
fBrowseForFolder = Left$(fBrowseForFolder, InStr(&H1, fBrowseForFolder, vbNullChar) - &H1)
Call AddSlash(fBrowseForFolder)
Else
fBrowseForFolder = vbNullString
End If
End Function
Private Function BrowseCallbackProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal lParam As Long, ByVal lpData As Long) As Long
Dim ci As Long, sPath As String
Select Case uMsg
Case Is = &H1 'BFFM_INITIALIZED
If Len(sBuffer) Then Call SendMessage(hWnd, &H466, &H1, ByVal sBuffer & vbNullChar)
Case Is = &H2 'BFFM_SELCHANGED
sPath = String$(&H200, &H0)
If Not SHGetPathFromIDList(lParam, sPath) = vbNull Then Exit Function
sPath = Left$(sPath, InStr(1, sPath, vbNullChar) - 1)
Call AddSlash(sPath)
Call SendMessage(hWnd, &H464, &H0, ByVal sPath)
If Len(sArray(0)) = &H0 Then Exit Function
Call SendMessage(hWnd, &H465, &H0, ByVal False)
For ci = 0 To UBound(sArray)
If Len(Dir$(sPath & sArray(ci))) Then
Call SendMessage(hWnd, &H465, &H0, ByVal True)
Exit For
End If
Next
End Select
End Function
Private Function AddSlash(ByRef inPath As String) As String
On Error GoTo er
Dim nf As Integer: nf = FreeFile
AddSlash = inPath
Open inPath For Input As nf
Close nf
Exit Function
er: AddSlash = IIf(Right$(inPath, &H1) = "\", inPath, inPath & "\": inPath = AddSlash
End Function
Номер ответа: 3
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #3
Добавлено: 21.01.05 02:06
LARGE_INTEGER
Номер ответа: 4
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #4
Добавлено: 21.01.05 02:31
VERY_LARGE_INTEGER )))
А ещё говорят, что асмовые листинги длинные
Тут одих деклараций и описаний типов и констант столько, что и делать ничего не захочешь
Номер ответа: 5
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #5
Добавлено: 21.01.05 11:49
ну да, у мня то что на асьме в 4 раза меньше исходник весит чем тут )
Номер ответа: 6
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #6
Добавлено: 21.01.05 12:21
String... прописью на русском, в Unicode
А если к вашим asm по-честному, без include все константы, структуры, декларации дописать? А если еще от includelib отказаться - всё самому переписать? Так что размер исходников _здесь_ - понятие относительное!
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 21.01.05 13:38
) все равно там описание и констант и деклараций короче
Номер ответа: 8
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #8
Добавлено: 21.01.05 15:37
mc-black
Ну так как ты объявляешь вручную константы - зачем же так делать? Все константы, прототипы, структуры уже объявлены и лежат в одной куче в инклюдах. Их специально для этого и придумали А VB так не может, пока соберешь по справочникам все объявления да константы - и делать ничего не захочешь И исходник превращается в такого рода портянку, как в примере sne. А ещё говорят, что на VB очень быстро программы пишутся... Хрен там
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 21.01.05 15:56
У VB вместо инклюдов проекты. Это более продвинутая их форма. Да и API кстати не являются основой интефейса, как скажем в системо-ориентированных языках.
Номер ответа: 10
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #10
Добавлено: 21.01.05 18:18
VB тоже может, для этого придуманы TLB. Просто никто о них не знает.
Номер ответа: 11
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #11
Добавлено: 21.01.05 18:28
Почему же не знает? Видел я одну такую .tlb, как раз чтобы api не объявлять. Как там говорят: Гы-Гы-Гы несколько сотен кб весит, всего-навсего около 600 ф-ций описано. Круто!
Номер ответа: 12
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #12
Добавлено: 21.01.05 18:29
Да лано, в асьме вообще не обязательно что-то объявлять
Про тлб знают все, но их надо компилить к примеру в Си, что не есть гууд...
Номер ответа: 13
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #13
Добавлено: 21.01.05 18:43
Эти килобайты в ехешник не включаются :P
Номер ответа: 14
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #14
Добавлено: 21.01.05 19:07
Не в том дело, что не включаются, а что при 606 кб объявлено всего 600 функций из нескольких тысяч, и те с какими-то левыми названиями, которые ещё и выучить надо
Номер ответа: 15
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #15
Добавлено: 21.01.05 19:11
А бывает что деларации еще и переделывать приходится