Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1110011376
Creator___
2005-03-05 11:29
2005.03.20
Service Application в Delphi 7.0


3-1108536863
Серж_Евдокимов
2005-02-16 09:54
2005.03.20
Посоветуйте плиз менеджер БД для MS SQL вместо Enterprise Manager


1-1109846602
Urm
2005-03-03 13:43
2005.03.20
Взаимодействуем с Winamp


3-1108911051
Dell3r
2005-02-20 17:50
2005.03.20
NetWork


14-1109767969
snake_r
2005-03-02 15:52
2005.03.20
BSClient





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский