var Folder,ColWidth_0,VSW=GetSystemMetrics(SM_CXVSCROLL);
// Главная форма
frm=new TForm();
frm.Caption="JS+ - функция JS+ FindClose";
frm.Width =600;
frm.Height=600;
// Строка состояния
stb=new TStatusBar(frm);
stb.SimpleText=" Пример работы с файловыми функциями поиска";
// Значки папок и файлов
(ic1=new TIcon()).LoadFromFile(JSPlus.HelpDir+"IMAGE\\Function\\Fld_Opn.ico");
(ic2=new TIcon()).LoadFromFile(JSPlus.HelpDir+"IMAGE\\Function\\Fld_Cls.ico");
(ic3=new TIcon()).LoadFromFile(JSPlus.HelpDir+"IMAGE\\Function\\Doc_Cls.ico");
// Список дисков
cmb=new TComboBox(frm);
cmb.Style=csDropDownList;
cmb.Left=cmb.Top=10;
cmb.Width=frm.ClientWidth-cmb.Left*2;
cmb.OnSelect=cmb_Select;
for (i=0,w=GetLogicalDrives();i<26;i++) {
if ((w>>i) & 1) {
tmp_str="Диск "+(dsk_str=String.fromCharCode(65+i)+":");
if (GetDriveType(dsk_str)==DRIVE_FIXED)
cmb.Items.Add(tmp_str+" "+DiskLabel(i+1));
}
}
cmb.ItemIndex=0;
// Таблица строк
stg=new TStringGrid(frm);
stg.BorderStyle=bsSingle;
stg.ScrollBars=ssBoth;
stg.Options=goFixedHorzLine | goFixedVertLine | goRowSelect | goThumbTracking;
stg.ColCount=3;
stg.RowCount=2;
stg.FixedRows=1;
stg.Left=cmb.Left;
stg.Top =cmb.Top+cmb.Height+10;
stg.Width =cmb.Width;
stg.Height=stb.Top-stg.Top-10;
stg.DefaultRowHeight=stg.TextHeight("Q")+4;
stg.Cells[0][0]="Имя файла/каталога";
stg.Cells[1][0]="Дата";
stg.Cells[2][0]="Размер";
stg.ColWidths[1]=stg.TextWidth("00.00.0000")+20;
stg.ColWidths[2]=stg.TextWidth("0000000000")+20;
stg.ColWidths[0]=ColWidth_0=
stg.ClientWidth-stg.ColWidths[1]-stg.ColWidths[2]-2;
stg.OnDblClick=stg_DblClick;
stg.OnDrawCell=stg_DrawCell;
cmb_Select(cmb);
stg.OnSelectCell=stg_SelectCell;
frm.ShowModal();
// Формирует список файлов и каталогов
function Make_fList(Fld_Str)
{
var i,j,str,spl_lst,src=new TSearchRec();
// Начать поиск файлов и каталогов
if (FindFirst(Folder+"*.*",faAnyFile,src)!=0) {
FindClose(src);
src.Delete();
return false;
}
str=new TStrings();
if (src.Name!=".")
str.Add(((src.Attr & faDirectory) ? "D" : "F")+"|"+
src.Name+"|"+DateToStr(FileDateToDateTime(src.Time))+"|"+
src.Size);
// Продолжить поиск
while (FindNext(src)==0) {
if (src.Name=="..")
continue;
str.Add(((src.Attr & faDirectory) ? "D" : "F")+"|"+
src.Name+"|"+DateToStr(FileDateToDateTime(src.Time))+"|"+
src.Size);
}
// Завершить поиск
FindClose(src);
src.Delete();
str.Sort();
if (Folder.split("\\").length>2)
str.Insert(0,"D|..||");
for (i=stg.RowCount;i>0;i--)
stg.Rows[i].Clear();
stg.Row=1;
stg.RowCount=str.Count+1;
for (i=0;i<str.Count;i++) {
spl_lst=str[i].split("|");
if ((stg.Cells[0][j=i+1]=spl_lst[1])==Fld_Str)
stg.Row=j;
stg.Cells[1][j]=spl_lst[2];
stg.Cells[2][j]=(spl_lst[0]=="D") ? "-" : spl_lst[3];
}
i=ColWidth_0;
if (stg.RowCount<=(stg.VisibleRowCount+stg.FixedRows))
i+=VSW;
stg.ColWidths[0]=i;
return true;
}
// Обработчик события OnSelect
function cmb_Select(cmb)
{
Folder=cmb.Items[cmb.ItemIndex].split(" ")[1]+"\\";
Make_fList("");
stg.SetFocus();
}
// Обработчик события OnDblClick
function stg_DblClick(stg)
{
var row,spl_lst,stg_str,old_fld=Folder,fld_str="";
var pnt=new TPoint(),grc=new TGridCoord();
GetCursorPos(pnt);
pnt=stg.ScreenToClient(pnt);
stg.MouseToCell(pnt.x,pnt.y,grc);
pnt.Delete();
row=grc.Y;
grc.Delete();
if ((row<1) || (stg.Cells[2][row]!="-"))
return;
if ((stg_str=stg.Cells[0][row])=="..") {
spl_lst=Folder.split("\\");
fld_str=spl_lst[i=spl_lst.length-2];
spl_lst.splice(i,1);
Folder=spl_lst.join("\\");
}
else
Folder+=stg_str+"\\";
if (Make_fList(fld_str)==false)
Folder=old_fld;
}
// Обработчик события OnDrawCell
function stg_DrawCell(stg,col,row,rct,state)
{
var stg_str=stg.Cells[col][row],cnv=stg.Canvas;
var ttl_str,bclr=stg.Color,fclr=stg.Font.Color;
var icn,y,out_Style=DT_VCENTER+DT_SINGLELINE;
if (state & gdFixed)
bclr=stg.FixedColor;
else
if (state & gdSelected) {
if (stg.RowCount>1) {
bclr=clHighlight;
fclr=clHighlightText;
}
}
else
if ((row % 2==0) &&
(((col==0) && (stg.Cells[2][row]!="-")) ||
((col> 0) && (stg.Cells[2][row]!="-"))))
bclr=0xF0F0F0.toTColor();
// Закрасить ячейку
cnv.Brush.Color=bclr;
rct.Right+=1;
cnv.FillRect(rct);
// Вывести текст ячейки
cnv.Font.Color=fclr;
if (row==0)
out_Style+=DT_CENTER;
else
switch (col) {
case 0: switch (stg.Cells[2][row]) {
case "-": icn=(stg_str=="..") ? ic1 : ic2; break;
default: icn=ic3;
}
y=rct.Top+(rct.Height()-icn.Height)/2;
cnv.Draw(rct.Left+=4,y,icn);
rct.Left+=icn.Width+4;
break;
case 1: out_Style+=DT_CENTER; break;
case 2: if (stg_str=="-")
return;
rct.Right-=stg.TextWidth(" ");
out_Style+=DT_RIGHT;
}
DrawText(cnv.Handle,stg_str,-1,rct,out_Style);
}
// Обработчик события OnSelectCell
function stg_SelectCell(stg,col,row)
{
var stb_str=Folder+stg.Cells[col][row];
var cnv=stb.Canvas,dx=cnv.ClipRect.Width()-20;
if (stg.RowCount==1)
return false;
if (col!=stg.LeftCol) {
stg.Col=stg.LeftCol;
stg.Row=row;
return false;
}
stb.SimpleText=" "+MinimizeName(stb_str,cnv,dx);
}