Автор вопроса: »VladikComper« | Web-сайт:vladikcomper.narod.ru | ICQ: 419668582
Для своей очередной проги я пишу НАСТОЯЩИЙ КОНТРОЛ-ПРОВОДНИК (по папкам)...
Работа мало-помалу продвигается, но разработку приостановили две проблемы:
1. ПАПКА-НЕ-НЕПАПКА
Вначале мой контрол определяет все ПАПКИ, а потом все ФАЙЛЫ в заданном каталоге. Происходит это так:
Sub ReadPath()
Dim sForder$, sFile$: UnVisibleAll
counter = 0
AlignItem counter: filelist_fname(0) = "Подождите..."
sForder = Dir(ucPath, vbDirectory) ' ВОТ ПЕРЕМЕННАЯ СОДЕРЖАЩАЯ ИМЕНА ПАПОК!!!
If sForder <> "" Then
Do While sForder <> ""
WriteForder sForder, counter: counter = counter + 1: sForder = Dir(, vbDirectory) ' ВОТ, КАК ПЕРЕМЕНН. ПОЛУЧАЕТ СЛЕДУЮЩЕЕ ИМЯ!
If counter = 50 Then Exit Sub
Loop
End If
ShowScroll ' см. Вторую проблему
End Sub
Я не знаю, почему, но ПОСЛЕ ПЕРВОЙ УДАЧНО определившейся папки в списке идут файлы!!! Что делать... :-0
2. СКРОЛЛ-УЖАС
Помогите!!!!!!!!!!!!!!!!!
У меня в контроле 50 лейбелов... Label(0), Label(1), Label(2) ... и т.д и т.п... Долго ломал голову, что делать, а потом вывел глючный код... Как же работать со скроллом???
Нужно, чтобы все эти Label(0 To 49) двигались вверх-вниз, на расстояние, равное их высоте...
1. Скопипастил просто с учебника Климова (вроде его)
' Нижеприведённый кусок кода
' отобразит в окне Immediate список папок
' в корневой директории на диске С
MyPath = "C:\"
MyName = Dir(MyPath, vbDirectory)
' Возвратит первую директорию.
Do While MyName <> "" ' Начало цикла
' Игнорируем текущую директорию или заключительную
If MyName <> "." And MyName <> ".." Then
' Используем битовое сравнение, чтобы определить
' что MyName есть директория (а не файл).
If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
Debug.Print MyName ' Отобразим в окне Immediate MyName
End If
End If
MyName = Dir
Loop
лучше не лейблы юзать, а через API DrawText рисовать надписи
Увы, с АПИ не дружу... Ладно, я поищу код...
Ну тут уже пиши куда надо.
Код не работает!!! Вначале были "ашипки", когда исправил на ...
Do While sForder <> ""
sForder = Dir(, vbDirectory)
If sForder <> "." And sForder <> ".." Then
If GetAttr(ucPath & sForder) = vbDirectory Then
AlignItem counter: WriteForder sForder, counter
counter = counter + 1
End If
End If
If counter = 50 Then Exit Do
Loop
Public Declare Function DrawText Lib "user32" Alias "rawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
Код то работает. Просто для твоей задачи надо его немного переделать. Я на контроле не проверял, но в том варианте все нормально. Просто надо написать в какой папке ты хочешь смотреть подпапки и куда их записываешь.
sFile = Dir("C:\", vbNormal Or vbHidden Or vbSystem Or vbReadOnly)
If sFile <> "" Then
Do While sFile <> ""
WriteFile sFile, counter: counter = counter + 1
sFile = Dir(, vbNormal Or vbHidden Or vbSystem Or vbReadOnly) ' < RUN-TIME ERROR: неправильный вызов команды или аргумент!!!
If counter > 49 Then Exit Sub
Loop
End If
Почему??? Я просто хотел отыскать файлы на C:\, а он на CONFIG.SYS останавливается!!!
Просто надо написать в какой папке ты хочешь смотреть подпапки и куда их записываешь.
У меня в ucPath лежит моя директория. Проверял, все нормал... и переменные для файлов-папок: sForder, sFile - тоже нормал... Все в порядке, атока "ашипки" случаются... !
Привет!
Я вижу кучу недостатков в организации этого контрола
Во-первых
Можно сделать по-другому через контрол ListView (он есть практически в каждой винде, а те кто юзает 9.х, так у них наверняка установлен МС Офис - ListView идет с его поставкой). Отпадает очень много гемора. Несколько лет назад я написал такой контрол, но увы исходник потерял
Во-вторых
Если уж очень нужно создать оригинальный контрол, тогда создай отдельный вспомагающий контрол Итем (он должен иметь лейбл, картинку... ну по желанию еще что-то). Дальше его нужно юзать как леблы, но делай их 50 штук. Сделай один и поставь значение Index=0 (в таблице свойств). А потом с помощью команд Load/Unload добалвяй/удаляй иетмы. Но при этом тебе нужно усечь много факторов. Например - у тебя папка, которая имеет 50 000 файлов. Если создадишь 50 000 итемом у тебя прога загнется. Значит тебе нужно генерировать не для всех файлов по итему, а нужно ровно столько, сколько в данный момент вмещается в область видимости контрола, а уже при прокрутке скрола, ты опять генерируешь итемы, но уже для следюющих файлов
Я вижу кучу недостатков в организации этого контрола
Это мой втрой контрол!!! Конечно...
Если создадишь 50 000 итемом у тебя прога загнется. Значит тебе нужно генерировать не для всех файлов по итему, а нужно ровно столько, сколько в данный момент вмещается в область видимости контрола
Винда также делает что ли?
Только возникает вопрос: как задать поиск файлов, скажем, начиная с DDDDD.DDD а не с AAAAA.AAA?