Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.02;
Скачать: CL | DM;

Вниз

Перекрытие события компонента   Найти похожие ветки 

 
main   (2004-11-23 16:41) [0]

Привет.
Затык у меня вышел с компонентой. Необходимо, чтобы она после обработки события
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. Это событие ВООБЩЕ НЕ ВЫЗЫВАЕТСЯ.
В чем ошибка???


 
jack128 ©   (2004-11-23 17:19) [1]

main   (23.11.04 16:41)

> property onchange:tnotifyevent read fonchange write
> fonchange;

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.10.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.039 c
1-1126000466
melena
2005-09-06 13:54
2005.10.02
jpg в exe


4-1123222622
WebSQLNeeder
2005-08-05 10:17
2005.10.02
Как на Делфи изменить настройки прокси-сервера ИЕ?


1-1126259631
BFG9k
2005-09-09 13:53
2005.10.02
Некорректная работа PrinterSetupDialog


1-1126704720
NetFlover
2005-09-14 17:32
2005.10.02
Проиграть по телефону музычку .... :)


8-1115369906
anat
2005-05-06 12:58
2005.10.02
OpenGL + пересечение