+ Ответить в теме
Показано с 1 по 11 из 11
  1. #1
    Аватар для zxibit zxibit На пути к лучшему Дорогой гость
    Сообщений
    1,415
    Поблагодарили 38 раз(а) в 37 сообщениях

    Динамический проводник

    Всем привет. Делаю динамический проводник для одного большого проекта.
    Есть такой код:
    PHP код:
    function createDyn($path)
    {
        
    $path str_replace(PHP_EOL''$path);
        
    $_files scandir($path);
        foreach(
    $_files as $file) {
            if (
    $file == '.' or $file == '..') continue;
            else 
    $files[] = $file;
        }
        
    $xi 0;
        
    $yi 0;
        foreach(
    $files as $i => $file) {
            
    $panel = new TPanelc("MyComputer->sbInner") );
            
    $panel->parent c("MyComputer->sbInner");
            
    $panel->172;
            
    $panel->32;
            if (((
    $i 1) * 180) > c("MyComputer->sbInner")->w) {
                
    $yi++;
                
    $xi 0;
            }
            
    $panel->$xi 180;
            
    $xi++;
            
    $panel->$yi 40;
            
            
    $label = new TLabel($panel);
            
    $label->parent $panel;
            
    $label->32;
            
    $label->0;
            
    $label->32;
            
    $label->32;
            
    $label->alignment taCenter;
            
    $label->layout tlCenter;
            
    $label->text $file;
            
    $label->onClick = function($self) use ($file) {
                
    $path c("MyComputer->expl_path")->text;
                
    $path explode('/'$path);
                unset(
    $pathcount($path) - ]);
                
    $path implode('/'$path);
                
    c("MyComputer->expl_path")->text $path;
                
    createDyn($path);
                
                
    $path c("MyComputer->expl_path")->text;
                
    $nextpath $path '/' $file;
                if (!
    is_file($nextpath))
                    
    createDyn($path);
                else
                    
    uose_file_open($file);
            };
        }

    То есть при вызове createDyn('/path/to/folders/') программа должна сканировать папку ПАПКА_С_ПРОГРАММОЙ/drives/path/to/folders/ и создавать TPanel'ы с названиями папок, а при клике на папку - открывать ее, то есть запускать createDyn('/path/to/folders/ClickedFolderName'), к примеру.
    Все норм, кнопки создает, но вот только одна проблема - при клике программа бесится - моргает форма и потом вылетает. Что не так?
    Последний раз редактировалось zxibit; 28.05.2016 в 16:50.
    Помог? Лучший способ отблагодарить - плюс в репутацию (оставить отзыв положительный) =)
    Для "спасибо" слева есть кнопка "Сказать спасибо" (только после 30-ти сообщений)

  2. #2
    Аватар для akper akper Вообще от рук отбился Постоялец
    Сообщений
    864
    Поблагодарили 72 раз(а) в 61 сообщениях
    Я давно еще делал проводник, только он с использованием ListView
    Вот скрин:
    Скрытый текст:

    Вот там тебе, может понадобится
    https://yadi.sk/d/5_5h1U6ps5Q5b
    Наша группа Unfolnt
    Вторая моя группа exLune

  3. #3
    Аватар для zxibit zxibit На пути к лучшему Дорогой гость
    Сообщений
    1,415
    Поблагодарили 38 раз(а) в 37 сообщениях
    Цитата Сообщение от akper Посмотреть сообщение
    Я давно еще делал проводник, только он с использованием ListView
    Вот скрин:
    Скрытый текст:

    Вот там тебе, может понадобится
    https://yadi.sk/d/5_5h1U6ps5Q5b
    Без листвью. Девиз проекта - никаких Windows компонентов, т.е. чтобы вид проекта был одинаковым и в Windows 95, и в XP, и в 7, и в 10, и даже в Wine.
    Помог? Лучший способ отблагодарить - плюс в репутацию (оставить отзыв положительный) =)
    Для "спасибо" слева есть кнопка "Сказать спасибо" (только после 30-ти сообщений)

  4. #4
    Аватар для akper akper Вообще от рук отбился Постоялец
    Сообщений
    864
    Поблагодарили 72 раз(а) в 61 сообщениях
    У меня где то валялось такое, если найду скину, но там кое какие баги были, можно исправить
    Наша группа Unfolnt
    Вторая моя группа exLune

  5. #5
    Аватар для zxibit zxibit На пути к лучшему Дорогой гость
    Сообщений
    1,415
    Поблагодарили 38 раз(а) в 37 сообщениях
    Цитата Сообщение от akper Посмотреть сообщение
    У меня где то валялось такое, если найду скину, но там кое какие баги были, можно исправить
    Буду благодарен. Баги исправлю
    Помог? Лучший способ отблагодарить - плюс в репутацию (оставить отзыв положительный) =)
    Для "спасибо" слева есть кнопка "Сказать спасибо" (только после 30-ти сообщений)

  6. #6
    Аватар для vGhost vGhost В каждой бочке затычка vGhost В каждой бочке затычка vGhost В каждой бочке затычка vGhost В каждой бочке затычка vGhost В каждой бочке затычка vGhost В каждой бочке затычка vGhost В каждой бочке затычка vGhost В каждой бочке затычка vGhost В каждой бочке затычка vGhost В каждой бочке затычка vGhost В каждой бочке затычка Почетный гражданин
    Сообщений
    4,035
    Поблагодарили 1,212 раз(а) в 865 сообщениях
    Цитата Сообщение от zxibit Посмотреть сообщение
    Без листвью. Девиз проекта - никаких Windows компонентов, т.е. чтобы вид проекта был одинаковым и в Windows 95, и в XP, и в 7, и в 10, и даже в Wine.
    А с каких пор TPanel и TLabel не Windows компоненты? Вообще то, DS построена на Delphi VCL, а VCL это что не наесть объектно ориентированный интерфейс к WinApi и "Windows компонентам". Даже канва на которой всё рисуется это "Windows компонент"
    Хочшь чтоб везде одинаково выглядело? Прицепи к программе манифест в котором отключи темы для своего приложения.
    - У тебя бывают приступы лени?
    - У меня бывают приступы активности, лень у меня постоянно.

  7. #7
    Аватар для zxibit zxibit На пути к лучшему Дорогой гость
    Сообщений
    1,415
    Поблагодарили 38 раз(а) в 37 сообщениях
    Каеф. Все работает. Осталось только как-нибудь сделать свой скроллбар (не в приоритете) и решить проблему - при загрузке новых панелек с папками и файлами старые не удаляются. repaint() и x++; x-- не помогают.
    Помог? Лучший способ отблагодарить - плюс в репутацию (оставить отзыв положительный) =)
    Для "спасибо" слева есть кнопка "Сказать спасибо" (только после 30-ти сообщений)

  8. #8
    Аватар для WxMaper WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог WxMaper Бог Уже родной
    Сообщений
    2,030
    Поблагодарили 215 раз(а) в 188 сообщениях
    Цитата Сообщение от zxibit Посмотреть сообщение
    Осталось только как-нибудь сделать свой скроллбар
    Самый простой вариант (и прожорливый для ОЗУ) - это создать длинный контейнер, в котором уже отрисовано все содержимое. Ну а дальше простая математика (пример для вертикального скрола):
    • имеем высоту скроллируемого контейнера;
    • имеем высоту сролл-панели (ну она типа равна высоте родительского контейнера или высоте формы). Из нее нужно вычесть высоту "квадратика", который будет дёргаться мышкой.
    Составляем пропорцию из этих данных и смещаем скроллируемый контейнер по Y в обратном направлении при вертикальном перемещении "квадратика"


    Менее прожорливый вариант будет сложнее. Заключается он в том, что размер скроллируемого контейнера всегда больше родительского контейнера ровно на одну единицу полного скролла. Чую, что звучит это непонятно, но объяснить по другому не могу =)
    Получается так, что скроллируемый контейнер отрисовывает только видимую часть контента с небольшим запасом в той стороне, в которую происходит смещение. Когда смещение доходит до некой критической точки (отрисованный контент заканчивается), контейнер перемещается в нулевую позицию, перерисовывает весь контент и снова скроллится от нулевой позиции до критической точки. Благодаря этому размер контейнера получается маленьким - используется меньше памяти, но задействуется больше процессорного времени на перерисовку (для глаза и юзабилити это не заметно, если конечно алгоритмы отрисовки составлены грамотно).
    Последний раз редактировалось WxMaper; 19.06.2016 в 21:27.

  9. Пользователь сказал cпасибо:

    zxibit (20.06.2016)

  10. #9
    Аватар для zxibit zxibit На пути к лучшему Дорогой гость
    Сообщений
    1,415
    Поблагодарили 38 раз(а) в 37 сообщениях
    Цитата Сообщение от WxMaper Посмотреть сообщение
    Заключается он в том, что размер скроллируемого контейнера всегда больше родительского контейнера ровно на одну единицу полного скролла
    Нет, почему. Все даже очень понятно.
    Но первый вариант кажется проще
    Помог? Лучший способ отблагодарить - плюс в репутацию (оставить отзыв положительный) =)
    Для "спасибо" слева есть кнопка "Сказать спасибо" (только после 30-ти сообщений)

  11. #10
    Аватар для Alan_wake Alan_wake Очень опасный тип Alan_wake Очень опасный тип Alan_wake Очень опасный тип Alan_wake Очень опасный тип Alan_wake Очень опасный тип Alan_wake Очень опасный тип Постоялец
    Сообщений
    948
    Поблагодарили 9 раз(а) в 9 сообщениях
    Цитата Сообщение от WxMaper Посмотреть сообщение
    Менее прожорливый вариант будет сложнее. Заключается он в том, что размер скроллируемого контейнера всегда больше родительского контейнера ровно на одну единицу полного скролла. Чую, что звучит это непонятно, но объяснить по другому не могу =)
    Хм, это что-то вроде постраничного скроллинга? Как в win xp?

  12. #11
    Аватар для EGORN EGORN Не известно кто Новичок
    Сообщений
    1
    Поблагодарили 0 раз(а) в 0 сообщениях
    А почему только диск Д? как сделать диск С?

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения