Текущий архив: 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