Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перекрытие события компонента [D5, Win95/98]


main ©   (2004-11-23 16:41:00) 

Привет.
Затык у меня вышел с компонентой. Необходимо, чтобы она после обработки события
ONCHANGE сделала еще несколько команд.
Компонент откомпилировался нормально. Вот исходник:
unit FileTreeView;

interface

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

type
 TFileTreeView = class(TTreeView)
 private
   { Private declarations }
   fdirname:string;
   fmaskfile:string;
   fcurrentpath:string;
   fonchange:tnotifyevent;

 protected
   { Protected declarations }
   property onchange:tnotifyevent read fonchange write fonchange;
 public
   { Public declarations }
   constructor Create(AOwner: TComponent); override;
 published
   { Published declarations }
   property dirname:string read Fdirname Write Fdirname;
   property maskfile:string read FMaskfile Write FMaskFile;
   property CurrentPath:string Read FCurrentPath;
   procedure executefind;
   procedure Change(node:ttreenode);override;
 end;

procedure Register;

implementation

constructor Tfiletreeview.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fdirname:='';
fmaskfile:='';
fcurrentpath:='';
end;

procedure tfiletreeview.executefind;
var
 CachedStrs: TStringList;
 Procedure AddItem(Lev: Integer; ParentNode: TTreeNode; S: String);
   Function FindNodeWithText(AParent: TTreeNode; Const S: String): TTreeNode;
   Var
     K : Integer;
     fStr : String;
     tmpNode: TTreeNode;
   Begin
   Result := Nil;
   fStr := S + IntToStr(Integer(AParent));
   K := CachedStrs.IndexOf(fStr);
   If K > -1 Then
     Result := Pointer(CachedStrs.Objects[K])
   Else
     Begin
     If AParent <> Nil Then
     tmpNode := AParent.getFirstChild
     else
     tmpNode := Items.GetFirstNode;
     While tmpNode <> Nil Do
       Begin
       If tmpNode.Text = S Then
         Begin
         Result := tmpNode;
         CachedStrs.AddObject(fStr, Pointer(tmpNode));
         break;
         End;
       tmpNode := tmpNode.getNextSibling;
       End;
      End
    End;

 Var
   prefix: String;
   ID : Integer;
   aNode : TTreeNode;
 Begin
 If S = '' Then Exit;
 ID := Pos('\', S);
 prefix := '';
 If ID > 0 Then
 prefix := Copy(S, 1, ID - 1)
 Else
   Begin
   prefix := S;
   S := '';
   End;
 aNode := FindNodeWithText(ParentNode, prefix);
 If aNode = Nil Then
   Begin
   aNode := Items.AddChild(ParentNode, prefix);
   End;
 AddItem(Lev + 1, aNode, Copy(S, ID + 1, Length(S)));
 End;

procedure ScanDir(StartDir: string;
                 Mask:     string);
var
 SearchRec : TSearchRec;
begin
if Mask = '' then Mask := '*.*';
if StartDir[Length(StartDir)] <> '\'
then  StartDir := StartDir + '\';
if FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then
 begin
   repeat
   application.ProcessMessages;
   if (SearchRec.Attr and faDirectory) <> faDirectory then
   Additem(0,nil,startdir+searchrec.name);
   until FindNext(SearchRec) <> 0;
   FindClose(SearchRec);
  end;

if FindFirst(StartDir+'*.*', fadirectory, SearchRec) = 0 then
 begin
   repeat
   application.ProcessMessages;
     if (SearchRec.Name <> '..') and (SearchRec.Name <> '.')
     then
       begin
       ScanDir(StartDir + SearchRec.Name + '\',Mask);
       end;
   until FindNext(SearchRec) <> 0;
   FindClose(SearchRec);
  end;

end;

begin
CachedStrs := TStringList.Create;
CachedStrs.Duplicates := dupIgnore;
CachedStrs.Sorted := True;
 Try
 Items.BeginUpdate;
 SortType := stNone;
 scandir(fdirname,fmaskfile);
 finally
 Items.EndUpdate;
 CachedStrs.Free;
 end;
end;

procedure tfiletreeview.change(node:ttreenode);
var
 st:string;
 lev,i:integer;

begin
inherited change(node);

//--------- Вот эти команды ----
st:=node.Text;
lev:=node.Level;
if lev<>0 then
 for i:=1 to lev do
 begin
 st:=node.Parent.Text+'\'+st;
 node:=node.Parent;
 end;
fcurrentpath:=st;
//-------------------------------
end;

procedure Register;
begin
 RegisterComponents('Samples', [TFileTreeView]);
end;

end.

Теперь в основной программе я хочу получить значение переменной CurrentPath
Вот код
...
procedure TForm1.FileTreeView1Change(Sender: TObject; Node: TTreeNode);
begin
Label1.text:=filetreeview1.currentpath;
end;

Смотрю по F4. Это событие ВООБЩЕ НЕ ВЫЗЫВАЕТСЯ.
В чем ошибка???


main   (2004-11-24 08:19:00) [1]

Я нашла ошибку. Все работает. Спасибо!


jack128   (2004-11-23 17:19:00) [2]

main   (23.11.04 16:41)

> property onchange:tnotifyevent read fonchange write
> fonchange;

зачем это? помоему ты нигде не используешь это событие

Поставь breakpoint на строку inherited Change(Node) и выясни что там происходит.  И вообще ты уверен, что сначала должен вызываться обработчик OnChange, а потом вычисляться fcurrentpath??


Наверх

Титульная страница Поиск, карта сайта Написать письмо