|
Вопрос # 4 612/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Помогите, пожалуйста, дописать или изменить код.
Есть CheckListBox, который при создании формы заполняется названиями директорий из каталога «Сборка». Названия директорий – это перечень деталей (Болт, Гайка, Планка и т.д.). В каждой директории лежит текстовый файл с перечнем комплектации (Например - Гайка, Шайба, Гровер). Нужно чтобы при выборе, например «Планка» был считан текстовый файл из папки «Планка» и если не выбраны чек-боксы перечисленные в файле был вывод в метку – «Выберите Болт и т.д.».
Приложение: Переключить в обычный режим-
-
- procedure TForm1.ChList9_1ClickCheck(Sender: TObject);
- var
- i, l, k: Integer;
- s: string;
- begin
-
- i := ChList9_1.ItemIndex;
- Str := TStringList.Create;
- Str.Clear;
-
- if ChList9_1.Checked[i] = true then
-
- if FileExists(s + '' + ChList9_1.Items.Strings[i] + ' Completing .txt')
- then
- begin
- Str.LoadFromFile(s + '' + ChList9_1.Items.Strings[i] +
- ' Completing.txt');
- end;
- end;
-
- Memo1.Lines.Clear;
-
-
- for k := 0 to ChList9_1.Items.Count - 1 do
- begin
- for l := 0 to str.Count - 1 do
- begin
- if AnsiCompareText(ChList9_1.Items.Strings[k],
- str.Strings[l]) = 0 then
- begin
-
-
- if ChList9_1.Checked[k] = false then
- begin
-
-
- str.Strings[l]);
- end;
- end
- end;
- end;
- end;
-
-
-
-
 |
Вопрос задал: OlegD (статус: Посетитель)
Вопрос отправлен: 27 сентября 2010, 17:36
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 21; последнее сообщение — 29 сентября 2010, 08:15; участников в обсуждении: 2.
Страницы: [1] [2] [Следующая »]
|
min@y™ (статус: Доктор наук), 27 сентября 2010, 17:49 [#1]:
Цитата (OlegD):
Есть CheckListBox, который при создании формы заполняется названиями директорий из каталога «Сборка». Названия директорий – это перечень деталей (Болт, Гайка, Планка и т.д.). В каждой директории лежит текстовый файл с перечнем комплектации (Например - Гайка, Шайба, Гровер).
Здесь всё понятно. Дальше начинаются непонятки:
Цитата (OlegD):
Нужно чтобы при выборе, например «Планка» был считан текстовый файл из папки «Планка»
Считан КУДА??
Цитата (OlegD):
и если не выбраны чек-боксы перечисленные в файле был вывод в метку – «Выберите Болт и т.д.».
Какие чек-боксы? В каком ещё файле? Откуда чек-боксы в файле?
Давай-ка поподробнее: чего ж тебе надо-то?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
OlegD (статус: Посетитель), 27 сентября 2010, 17:58 [#2]:
Текстовый файл считывается в TStringList. Далее он в цикле прокручивается и сравнивается с названиями чек-боксов. Если название чека и строки из стринга совпадают, но этот чек не выбран то выводится сообщение.
Спасибо за отклик.
|
|
min@y™ (статус: Доктор наук), 27 сентября 2010, 18:03 [#3]:
Цитата (OlegD):
Текстовый файл считывается в TStringList. Далее он в цикле прокручивается и сравнивается с названиями чек-боксов. Если название чека и строки из стринга совпадают, но этот чек не выбран то выводится сообщение.
Понятно. Теперь говори, в чём проблема?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
OlegD (статус: Посетитель), 27 сентября 2010, 18:11 [#4]:
Зелено, молодо простите.
Задумка такая. Выбрав нужный чек, проверяю, есть ли в его папке файл комплектации, если есть я его считываю в стринг. Далее в цикле сравниваю строки из стринга с названиями всех чеков и если найден чек по имени сходный со строкой в стринге, но он не Checked:= True то выводится сообщение о неполной комплектации. Нужен циклический обход всех чеков и вывод сообщения, если любой из них (находящихся в списке стринга) не установлен в True.
|
|
OlegD (статус: Посетитель), 27 сентября 2010, 18:15 [#5]:
P.S. - у меня получается проверить только один, и то если он проверен, но после этого снять чек с нужной для него комплектации, проверки на ошибку нет.
|
27 сентября 2010, 18:26: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с файловой системой модератором Ерёмин А.А.
|
min@y™ (статус: Доктор наук), 27 сентября 2010, 18:30 [#6]:
Чой-то всё запутаннее и запутаннее становится...
Неужели трудно организовать вложенный цикл?
for i:= 0 to List.Count - 1 do
for j:= 0 to CheckListBox.Items.Count - 1 do
if (List[i] = CheckListBox.Items[j]) and not CheckListBox.Checked[j] then ...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
OlegD (статус: Посетитель), 27 сентября 2010, 19:10 [#7]:
Код компактный. Но работает как и мой - в список выводит все необходимые комплектующие для "основного" чека, но при выборе любого нужного сообщение пропадает. Нужно снова тыкать в "основной" чек для получения обновленного списка. И выбрав все нужные, можно снять один из них, но сообщения об отсутствии одного комплектующего не будет. Т.е. повторной проверке для уже выбранного "основного" чека нет.
Расплывчато для Вас профи, но по иному не могу пояснить.
|
|
min@y™ (статус: Доктор наук), 27 сентября 2010, 19:33 [#8]:
Цитата (OlegD):
Расплывчато для Вас профи, но по иному не могу пояснить.
Так абстрагируйся. Выкинь всякие чеки и прочую специфику. Просто сформулируй вопрос в общем виде: "Дано:... Получить:...". Иначе никак.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
OlegD (статус: Посетитель), 27 сентября 2010, 19:43 [#9]:
Можно как-то прикрепить проект. Я Дельфи только начал изучать и знаний пока огромный ноль, но увы это дело заводит,сижу все свободное время.
|
|
min@y™ (статус: Доктор наук), 27 сентября 2010, 20:02 [#10]:
Не, копаться в чужих исходниках - это, ИМХО, не комильфо. Либо ставь задачу так, чтобы я смог её выполнить, либо я пас.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
OlegD (статус: Посетитель), 27 сентября 2010, 20:37 [#11]:
1. Есть в папке "Сборка" поддиректории - по "имени" комплектующие изделий.
2. В некоторых поддиректориях лежат файлы Completing.txt (можно без расширения) - в них список из одной, двух строк (имя других поддиректорий - дополнительные материалы к этому изделию = CheckListBox1.Items.Strings)
3. При открытии формы вносим все поддиректории в ListCheckBox.
4. При событии OnClickCheck на любом Items проверяется, есть ли в папке со сходным именем, файл Completing.
5. Если файл есть, то считываем его список дополнений (имя поддиректории) в TStringList и далее в цикле сверяем все Items со списком, находится ли одноименный Items в состоянии Checked. Если нет, то выводим сообщение в Memo.
6. Если установили требуемый Items в состоянии Checked, то в Мemo информация обновляется - если остались еще не выставленные согласно списка Items в состоянии Checked.
7. Если проверка прошла Мemo.Lines :='';
8. Если убрать Checked с любого ранее выставленного Items, необходимо повторить полностью процедуру проверки по всем Items на предмет отсутствия необходимого Checked для ранее проверенного Items.
Спасибо!
|
|
OlegD (статус: Посетитель), 27 сентября 2010, 20:48 [#12]:
Пример: Есть папка "Болт", болт нужен многим. В папке "Болт" (и/или в дугих)в файле Completing будет имя этой папки. И если выбрать в CheckListBox Items "Уголок", то он запросит выставить Items "Болт" в Checked. Если выставили все в порядке - сообщения нет, но если сняли Checked c "Болт" без проверки всех Items, то комплектация "Уголок" окажется не полной, так как обратной проверки нет.
|
|
min@y™ (статус: Доктор наук), 27 сентября 2010, 20:49 [#13]:
Цитата (OlegD):
5. Если файл есть, то считываем его список дополнений
Что такое "список дополнений" файла?
Цитата (OlegD):
6. Если установили требуемый Items в состоянии Checked, то в Мemo информация обновляется - если остались еще не выставленные согласно списка Items в состоянии Checked.
Вообще нихрена не понял.
Разбей задачу на подзадачи. Иначе "толи лыжи не едут,...".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 27 сентября 2010, 20:59 [#14]:
Цитата (OlegD):
Пример: Есть папка "Болт", болт нужен многим. В папке "Болт" (и/или в дугих)в файле Completing будет имя этой папки. И если выбрать в CheckListBox Items "Уголок", то он запросит выставить Items "Болт" в Checked. Если выставили все в порядке - сообщения нет, но если сняли Checked c "Болт" без проверки всех Items, то комплектация "Уголок" окажется не полной, так как обратной проверки нет.
Ты, конечно, меня извини, но этот текст напоминает бред человека под "белкой". Перечитал раз 10, чувствую, пора покурить. Травы...
Болт нужен многим! Он запросит выставить... Обратной проверки нет...
Такими вопросами я ещё тут не занимался. Я ж просил убрать конкретику.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
OlegD (статус: Посетитель), 27 сентября 2010, 21:01 [#15]:
Я не знаю как правильно пояснить.
Список дополнений - в файле Completing просто строка или пару строк с именем других папок.
Вот весь код. Извините, если надоел.
--------------
procedure TForm1.FormUpdateList;
var
SR: TSearchRec;
FindRes: Integer;
begin
CheckListBox1.Clear;
FindRes := FindFirst('C:\Сборка\Fitting' + '\*.*', faAnyFile, SR);
while FindRes = 0 do
begin
if ((SR.Attr and faDirectory) = faDirectory) and
((SR.Name = '.') or (SR.Name = '..')) then
begin
FindRes := FindNext(SR);
Continue;
end;
CheckListBox1.Items.Add(SR.Name);
FindRes := FindNext(SR);
end;
FindClose(SR);
CheckListBox1.ItemIndex := 0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FormUpdateList;
end;
procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
var
i, j: Integer;
s: string;
begin
s := 'C:\Сборка\Fitting';
i := CheckListBox1.ItemIndex;
Str := TStringList.Create;
Str.Clear;
Memo1.Clear;
if CheckListBox1.Checked[i] = true then
begin // проверяем есть ли файл Completing и добавляем в стринг
if FileExists(s + '\' + CheckListBox1.Items.Strings[i] + '\Completing') then
begin
Str.LoadFromFile(s + '\' + CheckListBox1.Items.Strings[i] + '\Completing');
end;
end;
for i := 0 to str.Count - 1 do
begin
for j := 0 to CheckListBox1.Items.Count - 1 do
begin
if (CheckListBox1.Items[j] = str[i]) and not CheckListBox1.Checked[j] then
memo1.Lines.Add('Дополните ' +
CheckListBox1.Items.Strings[CheckListBox1.ItemIndex] + ' набором ' +
str.Strings[i]);
end;
end;
end;
end.
|
|
min@y™ (статус: Доктор наук), 27 сентября 2010, 21:08 [#16]:
Разбей задачу на подзадачи, я сказал! Так понятней будет и проще отладить.
Код не смотрел и не буду. Проще самому по-новой написать, но, как ни пытал тебя, не могу понять, что же тебе нужно.
Если честно, надоел. Давай-ка прервёмся до завтра, мне хотца помыться и спать. Утром на работу. Завтра в 8:30 мск залезай ко мне в аську: "выпьем хереса и потолкуем" (©). А щас - хорош. Ты меня так грузанул - аж кочан разболелся.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
OlegD (статус: Посетитель), 27 сентября 2010, 21:09 [#17]:
Покурите! Я тоже может тоже стану, когда повзрослею "Кандидатом наук" и смогу курить в таких случаях в «открытую».
|
|
min@y™ (статус: Доктор наук), 27 сентября 2010, 21:21 [#18]:
Надеюсь, завтра мы твою проблему решим.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
OlegD (статус: Посетитель), 27 сентября 2010, 21:58 [#19]:
СПАСИБО ВАМ!
|
|
OlegD (статус: Посетитель), 28 сентября 2010, 23:07 [#20]:
min@y™ (статус: Кандидат наук).
Большое Вам спасибо. Мне помогли подправить Ваш код и все работает.
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|