СообЧа > База Знаний > Программирование > Delphi

Вопрос

У меня возникли кое-какие вопросы, если сможете, ответьте…

1) DirectoryListBox1, как сделать что бы в нем были видны скрытые папки.

2) DriveComboBox1,что бы при отсутствии дискеты во флопе или cd в cdrom'е выдавалось сообщение об этом.

3) FilterComboBox1, как указать в одном FilterName несколько фильтров, например: [Pictures] [*.jpg ?,? *.bmp], через какой символ?

4) FileListBox1, как сделать , что бы при 2м нажатии запускался файл?

5) FileListBox1, пример я выделил файл, как его скопировать, вставить?

6) И последнее: например в Edit я пишу [c:\] и нажимаю Button, а в DirectoryListBox1 открывался диск c:\

Я конечно понимаю, что завалил вопросами, но просто мне не откуда это узнать. Купил 2 книги, а там не написано про это.

Ответ

По поводу твоих вопросов: итак приступим.

1.По моему никак нельзя простыми методами, потому что когда я просмотрел unit FileCtrl и содержащийся в нем код этого компонента, то заметил, что процедура TDirectoryListbox.ReadDirectoryNames, которая ищет и принимает к сведению информацию об имеющихся каталогах делает это таким образом:

— Ищет по FindFirst / FindNext.

— Проверяет, директория ли это: if ( атрибут faDirectory=1010 bin) and (логическое умножение) (SearchRec.Attr — атрибуты найденного оюъекта в искомом (родительском)

каталоге (может быть папка, файл, <.>, <..>)=faDirectory then тогда считается, что это подходящая папка и ее можно показывать, : если папка обычная, то SearchRec.Attr будут равны faAnyFile=111111 и умножение даст faDirectory, а если папка скрытая то в ее атрибуте гаситься четвертый разряд (faHidden=0010) и умножение даст faHidden, и <умный> обработчик такую папку отбросит. Выйти из этого положения думаю не так и сложно: создать свой личный компонент в котором эта процедура будет исправлена, а остальные содрать один к одному.

2.Я надыбал только один подходящий обработчик OnChange. На него надобно считать из свойства Drive букву диска, добавить ':\' и вызвать процедуру FindFirst(та буква что считалась+':\',faAnyFile,Search). После чего вызывай функцию GetLastError и если она вернет значение ERROR_NOT_READY = 21, то это говорит о том, что диска в данное устройство не готово( нет диска, что-то он ообрабатывает (такое случается, когда всовываешь CD и он пару секунд мигает-позиционируется, читает всякие там метки и т.д., но это сейчас не важно,) так вот в это время тоже он не готов. Выводить сообщение: я так люблю: MessageDlg('В устройство '+DriveComboBox1.Drive+ ' не плохо было бы вставить что нибудь, (если некуда, так и в дисковод можно!',mtError,[mbOK],0), но учти, что при флопах будет выскакивать стандартное некрасивое системное окно(как в проводнике) и не забудь вызывать SearchClose(Search) в конце, а то мозги утекать начнут по чути-чути:-), не твои-компа;

3.Через вертикальную палку |-разные фильтры. ;- однотопные фильтры. пример: FilterComboBox1.Filter:='Pictures|*.bmp;*.jpg|All files|*.*';

4.Нужно обрабатывать событие DblClick-двойной щелчок и на него: пример, не могу на русском-проще па делфи.

procedure TForm1.FileListBox1DblClick(Sender: TObject); var count:integer; selected:integer; begin selected:=-1; for count:=0 to FileListBox1.Count do if FileListBox1.Selected[count] then begin selected:=count; break; end; if selected<0 then exit; caption:=FileListBox1.Items[selected]; {шоб было видно на этапе отладки} ShellExecute(hWnd(0),'open',PChar(caption),'',PChar(FileListBox1.Directo ry),SW_SHOWNORMAL) end;

5).Что-то ты для начинающего слишком много хочешь. =;-)). Я толком то и сам еще не знаю. Не было необходимости разбираться. Но по моему это нужно работать с потоками. А зачем, позволь спросить. Пишешь свой Windows Commander 6.99 ? -8-)). Я всегда делал по деревенски: открывал для чтения, создавал другой файл, перегонял блоком данные из одного в другой. И дело с концом. А ты, я смотрю решил что-то крутое отгрохать. Хоть поглядеть дашь, когда напишешь? :-)., а узнать, какой выделенный файл, так это в четвертом вопросе было.

6).Все понятно, но зачем писать квадратные скобки? Их же в ручную чистить надо будет для получение той заветной буквы. Ну да ладно. По порядку.1. По Edit.Text передвигаешся for i:=0 to Length(Edit.Text) и читаешь i-е символы из него. Когда находишь букву, то проверяешь, есть ли такой диск (глянь API Windows GetLogicalDrives, она простая — кард0й бит-0то диск: бит-0-установлен — диск «а» в наличии, бит-1-сброшен — диск «b» в шкафу на полочке и тд. )- это если надо проверять корректность введенных данных, а если нет, то валяй напрямую. Дальше присвой свойству DirectoryListBox1.Drive эту буквочку. И все это дело на БоттонКлиск делаешь.

Из конференции Expert_FAQ



Copyright © 2000-2004 Сообщество Чайников
Контактная информация