Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: У меня опять два вопроса..... 8) Добавлено: 21.01.05 00:15  

Автор вопроса:  Neco | Web-сайт: neco.pisem.net | ICQ: 247906854 
Ура!!!!!!!!
Ожил! 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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #5
Добавлено: 21.01.05 11:49
:) ну да, у мня то что на асьме в 4 раза меньше исходник весит чем тут :))

Ответить

Номер ответа: 6
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #6
Добавлено: 21.01.05 12:21
String... прописью на русском, в Unicode :)

А если к вашим asm по-честному, без include все константы, структуры, декларации дописать? А если еще от includelib отказаться - всё самому переписать? :) Так что размер исходников _здесь_ - понятие относительное!

Ответить

Номер ответа: 7
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #9
Добавлено: 21.01.05 15:56
У VB вместо инклюдов проекты. Это более продвинутая их форма. Да и API кстати не являются основой интефейса, как скажем в системо-ориентированных языках.

Ответить

Номер ответа: 10
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #12
Добавлено: 21.01.05 18:29
Да лано, в асьме вообще не обязательно что-то объявлять ;)

Про тлб знают все, но их надо компилить к примеру в Си, что не есть гууд...

Ответить

Номер ответа: 13
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #15
Добавлено: 21.01.05 19:11
А бывает что деларации еще и переделывать приходится ;)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам