Форум: "Основная";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
Вниз
У меня вопросик... у самого не хватает логики, чтобы решить его. Найти похожие ветки
← →
rolex (2005-03-08 12:06) [0]В чеклистбоксе дан список адресов. Моя программа сканирует по этим адресам не важно что. Во избежани того, чтобы программа не сканировала один и тотже участок нужно сделать следующую проверку:
К примеру вот список адресов:
-------------------------------
D:\Downloads
C:\Program Files
C:\Program Files\ATI
C:\Windows
-------------------------------
Как мы видим, у нас прога будет сканировать два раза в папке C:\Program Files\ATI, т.к. она уже включена в папку C:\Program Files.
Внимание вопрос: как сделать, чтобы программа снимала галочку в чеклистбоксе с папок, содержащихся уже в других папках?
(Т.е. в нашем случае прога должна автоматически снять галку с папки C:\Program Files\ATI).
Пока у меня хватило мозгов написать такой код (однако он не совсем правильный):procedure TForm2.CheckListBox1ClickCheck(Sender: TObject);
var i,i2:integer;
begin
for i:=0 to CheckListBox1.Items.Count-1 do
if CheckListBox1.Checked[i]=true then
for i2:=0 to CheckListBox1.Items.Count-1 do
if (CheckListBox1.Checked[i2]=True) and (CheckListBox1.items[i]<>CheckListBox1.items[i2]) and (copy(CheckListBox1.Items[i],1,3)=copy(CheckListBox1.Items[i2],1,3)) then
if copy(CheckListBox1.Items[i],4,1)=" " then begin CheckListBox1.Checked[i2]:=false; Application.MessageBox(PChar("С объекта ""+CheckListBox1.Items[i2]+"" автоматически снимается выделение, т.к. он содержится в выделенном объекте: ""+copy(CheckListBox1.Items[i],1,3)+"", чтобы избежать сканирования одного и того же участка."), "", MB_OK+MB_ICONINFORMATION); end;
end;
← →
Palladin © (2005-03-08 12:14) [1]А отсекать на этапе заполнения списка религия не позволяет?
← →
rolex (2005-03-08 12:20) [2]
> Palladin © (08.03.05 12:14) [1]
> А отсекать на этапе заполнения списка религия не позволяет?
Этот вариант отбывает. Долго объяснять почему.
← →
Palladin © (2005-03-08 12:41) [3]хм
procedure TForm2.CheckListBox1ClickCheck(Sender: TObject);
Var
i,j:integer;
Function IsSubFolder(Const S,R:String):Boolean;
Begin
Result:=Length(S)>Length(R);
If Result Then Result:=Copy(S,1,Length(R))=R;
End;
Begin
With (Sender as TCheckListBox) Do
For i:=0 to Items.Count-1 Do
For j:=0 to Items.Count-1 Do
If (i<>j) and Checked[i] and Checked[j] Then Checked[j]:=IsSubFolder(Items[i],Items[j]);
End;
Но раз уж ты взялся за подобное, тогда отслеживай диски созданные Subst, Linkами (NTFS), сетевые подключения к себе же. Это все что мне сейчас пришло в голову, есть и другие варианты.
← →
Anatoly Podgoretsky © (2005-03-08 12:53) [4]For j := i+1 to Items.Count-1 Do
← →
Palladin © (2005-03-08 12:55) [5]Точно
← →
Palladin © (2005-03-08 12:58) [6]Нет не точно.
При раскладе
C:\Sub\
C:\
отмечается сначала "C:\" потом прекрасно отметится и "C:\Sub\"
← →
Palladin © (2005-03-08 12:59) [7]причем выделение с "C:\" не снимется
← →
Anatoly Podgoretsky © (2005-03-08 13:08) [8]Список нужен сортированый, это кстати еще один резерв для повышения происзводительности.
У тебя просто недостатки алгоритма.
← →
Anatoly Podgoretsky © (2005-03-08 13:11) [9]И еще кроме того, такие задачи решают с использованием дерева. Задача распространеная.
← →
Palladin © (2005-03-08 13:20) [10]
> [8]
Ну это не ко мне. В постановке о сортированном списке не было ни слова. Соответвенно предполагается пессемистический вариант.
> [9]
А вот здесь нужно проанализировать, а не из пушки ли это по воробьям. При количестве элементов до 50, это не ощутимо. Дальше конечно уже нужно строить дерево при добавлении элемента. Но я сомневаюсь, что их количество превысит хотя бы 20. По ситуации нужно смотреть. Да и при большом количестве элементов, пользоватся CheckListBox неудобно... Соответственно и сама задача снимать галочки теряет смысл.
← →
Anatoly Podgoretsky © (2005-03-08 13:31) [11]А не надо анализировать, если видел инсталяторы, или сканеры дисков (например антивирусные), где есть иерархия, то должен представлять насколько это удобно, для того, что бы поставить снять отметку не надо бегать по всему подчиненому дереву.
Даже при 20 папках/файлах, тоже при плоской структуре не устанешь бегать по ней, если она не отсортирована.
Визуальные средства требуют любить пользователя.
← →
Palladin © (2005-03-08 13:47) [12]:) Короче, ролекс, используй TTreeView. Оно и логичней и проще в работе с деревом директорий и пользователь будет тебя любить. А то с TCheckListBoxом он будет тебя любить более силно и в извращенной форме.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.045 c