Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не срабатывает условие, Что делать? 
V
    Опции темы
ColdSpirit
Дата 6.7.2012, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 10.12.2010

Репутация: нет
Всего: 2



Пишу программу, которая читает текстовый файл (внутри папки и файлы в виде дерева). Никак не могу закончить, и что делать незнаю, из-за такого глюка:
user posted image
Условие не срабатывает, хотя должно.
Если хотите посмотреть всю прогу (она еще маленькая) - то смотрите раздел "procedure TForm1.TreeView1Click(Sender: TObject);". Эта моя первая программа, на которую я потратил много времени, поэтому прошу не судить за ###код, хоть и частично комментированный (тем более она еще не законченная).

Как пользоваться - нажимаете на верхнюю кнопку справа, потом щелкаете по появившемуся элементу, программа должна найти в файле все элементы следующего порядка и вывести их в дерево, еще отметить, что этот элемент больше не нужно обрабатывать. При клике заново на этот же элемент - он разворачивается, условие срабатывает - программа ничего не делает. При клике на другой элемент условие уже не срабатывает. Этот момент отскринил (картинка выше).

Исходники выложил, текстовый файл там же (FileTree.txt).


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  Project.zip 290,37 Kb
PM MAIL   Вверх
Frees
Дата 6.7.2012, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



ты бы  код написал а не скрин прикрепил (код не кнопку код)




--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
ColdSpirit
Дата 6.7.2012, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 10.12.2010

Репутация: нет
Всего: 2



Frees, да я подумал, что код в браузере ничего не даст, но если надо.. =)
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure TreeView1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  f: TextFile;
  str: String;
  finded: array of boolean;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  a: array [0..255] of integer; // массив последних индексов опр. уровня
  oldLevel,newLevel,itemIndex,i: integer;
begin
  oldLevel:=0;
  newLevel:=0;
  itemIndex:=1;
  for i:=0 to 255 do a[i]:=0;
  TreeView1.Items.Clear; //Очищение списка папок

  AssignFile(f,'FileTree.txt'); // открытие файла
  Reset(f);

  readLn(f,str);                // создание корневого каталога
  TreeView1.Items.Add(nil,str); // из первой строки файла

  while not EOF(f) do // обработка файла
  begin
    readLn(f,str); // чтение строки и занос в переменную str
    newLevel:=((pos('-',str)-2) div 4)+1;   // поиск уровня из строки

    Delete(str,1,pos('-',str)+2); // оставляем только название файла\папки

    //TreeView1.Items.AddChild(TreeView1.Items[a[newLevel-1]],str+', '+inttostr(itemIndex));

    a[newLevel]:=itemIndex;
    itemIndex:=itemIndex+1;
    oldLevel:=newLevel;
  End;

  setLength(finded,itemIndex);
  CloseFile(f); // закрытие файла
end;

procedure TForm1.TreeView1Click(Sender: TObject);
var
  index,level,pLevel: integer;
begin

pLevel:=0;
level:=0;

AssignFile(f,'FileTree.txt'); //добираемся до опр. строки
Reset(f);

for index:=0 to TreeView1.Items.Count-1 do
begin

  readln(f,str);

  if TreeView1.Items[index].Selected=true and finded[index]=false then //получаем индекс выделенного элемента
  begin // стоит фильтр на то, что объект выбран, и то, что объект раньше не кликался
    finded[index]:=true; // объект обработан

    if index<>0 then pLevel:=((pos('-',str)-2) div 4)+1;   // поиск уровня родителя

    repeat
      readln(f,str);
      level:=((pos('-',str)-2) div 4)+1; // поиск уровня след. строки
      if pLevel=level-1 then
          TreeView1.Items.AddChild(TreeView1.Items[index],str)
      else if pLevel<level-1 then
          continue
      else if pLevel>level-1 then
           break;
    until (EOF(f));

  end;
end;

CloseFile(f); // Закрываем файл. Конец

end;

end.

PM MAIL   Вверх
superVad
Дата 6.7.2012, 16:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 7
Всего: 15



ColdSpirit, and это такая же логическая операция как и =.

Код

 if TreeView1.Items[index].Selected and (not finded[index]) then


Ну или хотя бы в скобочки взять...
PM MAIL   Вверх
ColdSpirit
Дата 6.7.2012, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 10.12.2010

Репутация: нет
Всего: 2



superVad, спасибо! Все работает!  smile 
Но я все равно не понял почему)) По идее раньше у меня в таких случаях программа тупо не копилировалась или вылетала, а сейчас работает.
Если не сложно, можете объяснить, почему так происходило?

А за помощь +, как сто сообщений наберу  smile 
PM MAIL   Вверх
superVad
Дата 6.7.2012, 18:29 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 7
Всего: 15



Цитата(ColdSpirit @  6.7.2012,  15:23 Найти цитируемый пост)
Но я все равно не понял почему)) По идее раньше у меня в таких случаях программа тупо не копилировалась или вылетала, а сейчас работает.Если не сложно, можете объяснить, почему так происходило?


Ну вот гугл выдал по запросу - приоритет логических операций - ссылка.

Код

 if TreeView1.Items[index].Selected=true and finded[index]=false then

равнозначно (((true and finded[index]) = TreeView1.Items[index].Selected) = false).
PM MAIL   Вверх
northener
Дата 7.7.2012, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(superVad @  6.7.2012,  18:29 Найти цитируемый пост)
1:
    
 if TreeView1.Items[index].Selected=true and finded[index]=false then

равнозначно (((true and finded[index]) = TreeView1.Items[index].Selected) = false). 

Был бы я новичком - ничего бы не понял в данном ответе. smile


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
superVad
Дата 7.7.2012, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 7
Всего: 15



Цитата(northener @  7.7.2012,  00:12 Найти цитируемый пост)
Был бы я новичком - ничего бы не понял в данном ответе. 

Эх, не развил я свои преподавательские скилы  smile 

Ну главное, видно, что условие делает совсем не то что должно.

Кстати
(((true and finded[index]) = TreeView1.Items[index].Selected) = false)
если сократить, то
finded[index] <> TreeView1.Items[index].Selected

Это сообщение отредактировал(а) superVad - 7.7.2012, 11:12
PM MAIL   Вверх
ColdSpirit
Дата 7.7.2012, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 10.12.2010

Репутация: нет
Всего: 2



Да уж, про приоритеты я и не знал почти, понял что за бред я написал)
superVad, спасибо огромное!  smile Снимаю шляпу и низкий поклон  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1548 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.