Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Не срабатывает условие


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

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

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

Автор: Frees 6.7.2012, 14:59
ты бы  код написал а не скрин прикрепил (код не кнопку код)


Автор: ColdSpirit 6.7.2012, 15:02
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.

Автор: superVad 6.7.2012, 16:00
ColdSpirit, and это такая же логическая операция как и =.

Код

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


Ну или хотя бы в скобочки взять...

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

А за помощь +, как сто сообщений наберу  smile 

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


Ну вот гугл выдал по запросу - приоритет логических операций - http://delphimetoda.com/operacii-v-delfi-poryadok-vychisleniya-vyrazhenij/

Код

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

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

Автор: northener 7.7.2012, 01:12
Цитата(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

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

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

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

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

Автор: ColdSpirit 7.7.2012, 12:16
Да уж, про приоритеты я и не знал почти, понял что за бред я написал)
superVad, спасибо огромное!  smile Снимаю шляпу и низкий поклон  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)