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


Автор: Nic442 27.4.2006, 01:58
Вопрос такой у меня есть treeview и memo и фунукция, которая ищет определенные слова и запихивает их в treeview. Как сделать, чтобы при нажатии на пункт treeview но выделял слово. Позиция начала и конца выделения известны. Я думал их занести в рекорд.

Код

type
  PositRec = ^TMyRec;
  TMyRec  = record
     begin_pos: array of integer;
     end_pos: array of integer;
  end;

Код

Функция
var
 MyRecPtr: PositRec;
 start_pos: integer;
 ....
begin
...
SetLength(MyRecPtr^.end_pos, High(MyRecPtr^.end_pos)+1);
MyRecPtr^.end_pos[High(MyRecPtr^.end_pos)]:= start_pos;
Index_Form.spiski.Items.AddChildObject(Index_Form.spiski.Items[0].Item[3].Item[id],'bbh '+name_txt,MyRecPtr);



Код

procedure TIndex_Form.spiskiDblClick(Sender: TObject);
begin
  text_GL.SelStart:=PositRec(spiski.Selected.Data)^.Begin_pos[не знаю что];
  text_GL.SelLength:=
PositRec(spiski.Selected.Data)^.Begin_pos[1]-PositRec(spiski.Selected.Data)^.end_pos[не знаю что];

end;


И главный вопрос. Как при щелчке на treeview определить куда ссылается ? на какой индекс??

TreeView имеет вложенность.
 smile  

Автор: _hunter 27.4.2006, 11:21
у TTreeNode есть свойство Data пиши в него свою запись. у дерева есть Selections. бери первый из них (это будет нода) читай ее  Data -- получиш искомую запись 

Автор: Nic442 27.4.2006, 13:42
Можно пример с массивом. Я сделал без массива но он выделял только последнее слово
Код

type    
  PositRec = ^TMyRec;    
  TMyRec  = record    
     begin_pos:  integer;    
     end_pos: integer;    
  end;


А с массивом какая-то фигня происходит. 
Я должен создавать 2 массива, а в Data сохранять указатель на элементы этих двух массивов. Как это сделать? 

Автор: _hunter 27.4.2006, 13:47
в смысле? с каким массивом (да и зачем?)? 

Автор: Nic442 27.4.2006, 14:34
В Data нельзя же записывать данные, только указатели на данные - я так понял. Следовательно, начало и конец выделения должны храниться в двух массивах, на элементы которых должно ссылаться Data. 

Автор: _hunter 27.4.2006, 14:54
зачем массив?
создавай структуру Create' ом (или как-там-у-вас-) и полученный указатель и засовывай в Data указатель (только про удаление потом не забудь) 

Автор: Snowy 27.4.2006, 14:55
Зачем? Чем тебе Data не массив? 

Автор: Nic442 27.4.2006, 15:53
Сделал!!! заработало :-) . Когда я вчера сделал я стормозил и не впихнул в цикл New(MyRecPtr); поэтому выдавало только одно слово, но было поздно и бошка не сработала.

Теперь возник вопрос. Я создаю в цикле New(MyRecPtr); как мне его очищать???
Вот так?
Код

FreeMemory(MyRecPtr);

 

Автор: _hunter 27.4.2006, 16:05
пройтись по всем итемам дерева (это линейный массив) и удалить все указатели из Data 

Автор: Snowy 27.4.2006, 16:21
Dispose(MyRecPtr); 

Автор: Nic442 27.4.2006, 17:46
Так мне так делать???

Код

pamyt:=spiski.Items.Count-1;
 for pamyt:=pamyt downto 0 do  spiski.Items[pamyt].Data:=nil;


или достаточно один раз написать Dispose(MyRecPtr); 

Автор: Snowy 27.4.2006, 17:56
Код

  for pamyt:=pamyt downto 0 do  begin
    Dispose(TMyRec(spiski.Items[pamyt].Data));
    spiski.Items[pamyt].Data:=nil;
  end;
 

Автор: Nic442 27.4.2006, 18:23
А при закрытии формы указатели и Data автоматически очищаюся? 

Код

for pamyt:=pamyt downto 0 do  begin    
    Dispose(TMyRec(spiski.Items[pamyt].Data));    
    spiski.Items[pamyt].Data:=nil;    
  end;


А то этот код на OnClose или OnDestroy выдаёт ошибку. А при обновлении работает. 

Автор: _hunter 27.4.2006, 18:32
что OnClose что OnDestroy происходят до вызова деструкторов => само удаляться ничег оне должно... 

Автор: Nic442 27.4.2006, 19:09
Так куда тогда вешать очистку памяти? 

Автор: Nic442 27.4.2006, 21:37
Ошибка из-за того что я где-то создаю лишние указатели, буду искать!!

Повесил на Close 
Код

pamyt:=Index_Form.spiski.Items.Count-1;
   for pamyt:=pamyt downto 0 do  begin
       if Index_Form.spiski.Items[pamyt].Data<>nil then begin     // Вот здесь была одна ошибка у меня не у всех Data есть
         MessageDlg(inttostr(PMyRec(spiski.Items[pamyt].Data)^.begin_pos),mtWarning,[mbOk],0);  ..// Так у меня показывает нормально, нормально а потом бац 38049612
         Dispose(PMyRec(Index_Form.spiski.Items[pamyt].Data));
         Index_Form.spiski.Items[pamyt].Data:=nil;
       end;
end;
 

Автор: Nic442 27.4.2006, 22:55
Всё ошибка была найдена и устранена. Точно с указателями попутался. smile  

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