Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчёт полугот.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

Структурный анализ

Диаграмма - это графическое представление совокупности элементов, чаще всего изображаемое в виде связного графа, состоящего из вершин (сущностей) и ребер (отношений). С помощью диаграмм можно визуализировать систему с различных точек зрения.

Диаграммы прецедентов применяются для моделировании вида системы с точки зрения прецедентов (или вариантов использования). Чаще всего это предполагает моделирование контекста системы, подсистемы или класса либо моделирование требований, предъявляемых к поведению указанных элементов.

Диаграммы прецедентов имеют большое значение для визуализации, специфицирования и документирования поведения элемента. Они облегчают понимание систем, подсистем или классов, представляя взгляд извне на то, как данные элементы могут быть использованы в соответствующем контексте. Кроме того, такие диаграммы важны для тестирования исполняемых систем в процессе прямого проектирования и для понимания их внутреннего устройства при обратном проектировании.

Рис.1 - Диаграмма прецедентов

Диаграммы деятельности можно использовать для моделирования динамических аспектов поведения системы. Как правило, они применяются, чтобы промоделировать последовательные (а иногда и параллельные) шаги вычислительного процесса. С помощью диаграмм деятельности можно также моделировать жизнь объекта, когда он переходит из одного состояния в другое в разных точках потока управления.

Рис.2 - Диаграмма деятельности

Приложение в Листинг Программы

unit main;

// создание формы

procedure TForm1.FormCreate(Sender: TObject);

var UT,AN,glist:tstringlist;

m,k,n,i:integer;

cfgini:Tinifile;

begin

groups.OnChange:=nil;

Phones.OnChange:=nil;

dir:=extractfilepath(application.ExeName);

if not DirectoryExists(dir+'text') then

if not CreateDir(dir+'text') then begin

raise Exception.Create('Cannot Create Work Dir');

showmessage('Возможно диск защищен от записи или нет соответствующих прав доступа');

application.Terminate;

end;

Newi:=True;

SetCurrentDir(dir);

ini:=tinifile.create(dir+'phones.pdb');

// загрузка групп телефонов

glist:=tstringlist.create;

glist.Clear;

Groups.Clear;

try

if fileexists(dir+'groups.pdb') then

glist.LoadFromFile(dir+'groups.pdb')

except

writelog(log,'FileReadError(Groups.pdb)','FormCreate');

end;

Groups.AddItem('<Весь список>',nil);

for i:=0 to gList.Count-1 do begin

Groups.AddItem(gList[i],nil);

end;

GList.Free;

groups.ItemIndex:=0;

// загрузка списка заметок

try

FileSetAttr(dir+'text\notes.lst',$00);

if FileExists(dir+'text\notes.lst') then

List.LoadFromFile(dir+'text\notes.lst');//:3

except

WriteLog(Log,'FileAccessError(notes.lst)','FormCreate');

end;

//-------------------------------

cfgini:=tinifile.Create(dir+'PhoneBook.ini');

AN:=tstringlist.create;

ut:=tstringlist.create;

ut.Clear;

an:=GetAllNotesNames;

:=list.Items.AddChild(list.Items.GetFirstNode,'*').AbsoluteIndex;

cfgini.writestring('group','*','Заметки не используемые ни в одной группе(востановленные после неудачного удаления)');

UpdateNotesIcons;

for k:=0 to List.Items.Count-1 do

for n:=0 to An.Count-1 do

if (list.items[k].Text=AN[n]) then

UT.add(an[n]);

for n:=0 to an.Count-1 do begin

if UT.IndexOf(an[n])=-1 then

list.Items.AddChild(list.Items[m],an[n]);

end;

AN.Free;

UT.Free;

if list.Items[m].Count<1 then list.Items[m].Delete;

cfgini.Free;

//-------------------------------

cfg.loadCFG;

form1.PageControl1.Update;

UpdateNotesIcons;

groups.OnChange:=GroupsChange;

Phones.OnChange:=PhonesChange;

end;

// удаление группы телефонов

procedure TForm1.N2Click(Sender: TObject);

var i:integer;

glist:tstringlist;

begin

if groups.ItemFocused.Caption<>'<Весь список>' then

if messagedlg('Вы действительно хотите удалить группу "'+groups.ItemFocused.Caption+'"',mtConfirmation,[mbNo,mbYes],0)=mrYes then begin

groups.ItemFocused.Delete;

glist:=tstringlist.create;

glist.Clear;

for i:=1 to groups.Items.Count-1 do begin

glist.add(groups.Items[i].Caption);

end;

try

filesetattr(dir+'groups.pdb',$00);

glist.SaveToFile(dir+'groups.pdb');

except

//запись лога при ошибке

writelog(log,'FileWriteError(Groups.pdb)','N2Click');

end;

glist.Free;

end;

end;

//загрузка телефонов в соответствии с группой

procedure LoadGroupPhones(Const Groupname:string);

var i,cur:integer;

sec:tstringlist;

begin

form1.phones.OnChange:=nil;

sec:=tstringlist.Create;

with form1 do begin

phones.Clear;

try

ini.ReadSections(sec);

status.panels[1].text:=' число записей: '+inttostr(sec.Count);

if groups.ItemIndex=0 then begin

for i:=0 to sec.Count-1 do begin

Phones.Items.Add.Caption:=Sec[i];

Phones.Items[i].SubItems.Add(Ini.ReadString(Sec[i],'n1',''));

Phones.Items[i].SubItems.Add(Ini.ReadString(Sec[i],'n2',''));

Phones.Items[i].SubItems.Add(Ini.ReadString(Sec[i],'n3',''));

Phones.Items[i].SubItems.Add(Ini.ReadString(Sec[i],'n4',''));

Phones.Items[i].SubItems.Add(Ini.ReadString(Sec[i],'n6',''));

Phones.Items[i].SubItems.Add(Ini.ReadString(Sec[i],'n5',''));

end;

end;

if groups.itemindex>0 then begin

for i:=0 to sec.Count-1 do begin

if ini.readstring(sec[i],'n7','')=GroupName then begin

cur:=phones.Items.Add.Index;

phones.items[cur].Caption:=sec[i];

phones.items[cur].SubItems.Add(ini.readstring(sec[i],'n1',''));

phones.items[cur].SubItems.Add(ini.readstring(sec[i],'n2',''));

phones.items[cur].SubItems.Add(ini.readstring(sec[i],'n3',''));

phones.items[cur].SubItems.Add(ini.readstring(sec[i],'n4',''));

phones.items[cur].SubItems.Add(ini.readstring(sec[i],'n6',''));

phones.items[cur].SubItems.Add(ini.readstring(sec[i],'n5',''));

end;

end;

end;

except

writelog(log,'FileReadError('+ini.filename+')','LoadAllPhones');

end;

end;

form1.phones.OnChange:=form1.PhonesChange;

end;

//загрузка всех телефонов

procedure LoadPhones;

var i:integer;

sec:tstringlist;

begin

form1.phones.OnChange:=nil;

sec:=tstringlist.Create;

with form1 do begin

phones.Items.Clear;

try

ini.ReadSections(sec);

status.panels[1].text:=' число записе1: '+inttostr(sec.Count);

for i:=0 to sec.Count-1 do begin

phones.Items.Add;

phones.items[i].Caption:=sec[i];

phones.items[i].SubItems.Add(ini.readstring(sec[i],'n1',''));

phones.items[i].SubItems.Add(ini.readstring(sec[i],'n2',''));

phones.items[i].SubItems.Add(ini.readstring(sec[i],'n3',''));

phones.items[i].SubItems.Add(ini.readstring(sec[i],'n4',''));

phones.items[i].SubItems.Add(ini.readstring(sec[i],'n6',''));

phones.items[i].SubItems.Add(ini.readstring(sec[i],'n5',''));

end;

except

writelog(log,'FileReadError('+ini.filename+')','LoadPhones');

end;

end;

form1.phones.OnChange:=form1.PhonesChange;

end;

// изменение телфонов

procedure TForm1.PhonesChange(Sender: TObject; Item: TListItem;Change: TItemChange);

var i:integer;

begin

comment.Clear;

for i:=0 to 100 do begin

try

if ini.readstring(item.Caption,'c'+inttostr(i),'@')<>'@' then comment.lines.Add(ini.readstring(item.Caption,'c'+inttostr(i),'')):

except writelog(log,'FileReadError('+ini.filename+')','PhonesChange');

end;

end;

comment.SelStart:=0;

comment.Sellength:=0;

comment.Update;

CommentChanged:=false;

end;

// редактирование телефона

procedure TForm1.edit_Execute(Sender: TObject);

begin

if (phones.Focused)and(phones.selected<>nil) then begin

Application.CreateForm(Tform6, form6);

if form6.showmodal=mrOk then begin

LoadGroupPhones(groups.Selected.Caption);

end;

form6.Free;

end;

end;

// удаление телефона

procedure TForm1.delete_Execute(Sender: TObject);

var attr:integer;

begin

if phones.Focused then

if messagedlg('Вы действительно хотите удалить "'+phones.ItemFocused.Caption+'"'

,mtConfirmation,[mbNo,mbYes],0)=mrYes then begin

try

attr:=filegetattr(ini.FileName);

filesetattr(ini.FileName,$00);

ini.EraseSection(phones.ItemFocused.Caption);

filesetattr(ini.FileName,attr);

//LoadAllPhones(groups.Selected.Caption);

phones.ItemFocused.Delete;

except writelog(log,'FileWriteError('+ini.filename+')','delete_execute');

end;

end;

end;

// редактирование телефона

procedure TForm1.PhonesDblClick(Sender: TObject);

begin

if phones.ItemFocused<>nil then edit_.Execute;

end;

// создание телефона

procedure TForm1.new_Execute(Sender: TObject);

begin

Application.CreateForm(Tform5, form5);

if form5.ShowModal=mrOk then

if groups.itemIndex>0 then

LoadGroupPhones(groups.items[groups.itemIndex].Caption)

else

LoadGroupPhones(groups.items[0].Caption);

form5.free;

end;

// новая группа телефонов

procedure TForm1.N1Click(Sender: TObject);

var newstr:string;

i:integer;

glist:tstringlist;

begin

try

NewStr:=InputBox('Новая группа телефонов','Введите имя группы','');

if newstr<>'' then begin

groups.Items.add.Caption:=newstr;

glist:=tstringlist.create;

glist.Clear;

for i:=1 to groups.Items.Count-1 do begin

Glist.add(groups.Items[i].Caption);

end;

try

FileSetAttr(dir+'groups.pdb',$00);

Glist.SaveToFile(dir+'groups.pdb');

Glist.Free;

except

WriteLog(log,'FileWriteError(Groups.pdb)','N1Click');

end;

end;

except

WriteLog(log,'NewGroupError','N1Click');

end;

end;

// активация формы

procedure TForm1.FormActivate(Sender: TObject);

begin

ComboBox1Change(self);

groups.Items[0].selected:=true;

if phones.Items.Count>0 then

phones.Items[0].selected:=true;

LoadGroupPhones(groups.Selected.Caption);

groups.Update;

PhonesColumnClick(phones,phones.Column[0]);

phones.Update;

phones.Realign;

groups.Realign;

files.Realign;

List.Realign;

asqn.Realign;

PhoneList.Realign;

status.Realign;

comment.Realign;

// splitter1.Align:=alBottom;

if not _f then begin

Groups.ItemIndex:=_II;

_f:=true;

end;

end;

// изменение групп телефонов

procedure TForm1.GroupsChange(Sender: TObject; Item: TListItem;

Change: TItemChange);

begin

Phones.OnChange:=Nil;

if groups.Items.Count>0 then

if (groups.ItemIndex>=0) and (groups.ItemIndex<groups.Items.Count) then

LoadGroupPhones(groups.Selected.Caption);

Phones.OnChange:=PhonesChange;

if phones.Items.Count>0 then

phones.Items[0].Selected:=true;

end;

// видимость групп телефонов

procedure TForm1.CheckBox2Click(Sender: TObject);

begin

Groups.Visible:= CheckBox2.Checked;

end;

//видимость комментариев для контакта

procedure TForm1.CheckBox3Click(Sender: TObject);

begin

comment.Visible:= CheckBox3.Checked;

splitter1.align:=alNone;

splitter1.top:=splitter1.top-50;

splitter1.align:=alBottom;

end;

// закрытие формы

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

var i:integer;

begin

for i:=0 to list.Items[0].Count-1 do begin

if list.Items[0].item[i].text='*' then list.Items[0].Item[i].Delete;

end;

try

FileSetAttr(dir+'text\notes.lst',$00);

list.SaveToFile(dir+'text\notes.lst');

except

writelog(log,'FileWriteError(notes.lst)','FormClose');

end;

cfg.SaveCFG;

end;

// выбор полежения табов

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

Case combobox1.ItemIndex of

0:PageControl1.TabPosition:=tpTop;

1:PageControl1.TabPosition:=tpBottom;

2:PageControl1.TabPosition:=tpRight;

3:PageControl1.TabPosition:=tpLeft;

end;

end;

// удаление элимента каталога

procedure TForm1.RemoveExecute(Sender: TObject);

var s:string;

cfgini:tinifile;

begin

cfgini:=tinifile.Create(dir+'PhoneBook.ini');

try

if list.selected<>list.Items.GetFirstNode then begin

if list.selected.ImageIndex =2 then s:='Действительно удалить заметку "'

+AnsiUpperCase(list.selected.text)+'"?'

else s:='Действительно удалить категорию "'+AnsiUpperCase(list.selected.text)+'"?';

if messagedlg(s,mtConfirmation,[mbYes,mbNo],0)=mrYes then begin

if list.selected.ImageIndex =2 then begin

//deletefile(list.selected.text+'.txt')

filesetattr(dir+'text\'+list.selected.text+'.txt',$00);

deletefile(dir+'text\'+list.selected.text+'.txt');

end

else begin

filesetattr(cfgini.FileName,$00);

cfgini.deleteKey('Group',list.selected.text);

end;

list.Items.Delete(list.Selected);

end;

end;

except writelog(log,'FileReadError('+cfgini.filename+')','RemoveExecute');

end;

cfgini.Free;

updatenotes; //обновить параметры каталога

updatenotesIcons; // и отображения

end;

// создание нового каталога

procedure TForm1.NewSubCategoryExecute(Sender: TObject);

begin

Application.CreateForm(TForm2, Form2);

form2.showmodal;

UpdateNotesIcons;

UpdateNotes;

form2.free;

end;

// добавление новой заметки

procedure TForm1.NewTextExecute(Sender: TObject);

begin

Application.CreateForm(TForm3, Form3);

form3.showmodal;

form3.Free;

updateNotesIcons;

UpdateNotes;

end;

// изменение состояния списка каталога

procedure TForm1.ListChange(Sender: TObject; Node: TTreeNode);

begin

UpdateNotes;

end;

// конфигурация шрифта для отображения текста заметок

procedure TForm1.FontcfgExecute(Sender: TObject);

var fs:string;

cfgini:tinifile;

begin

cfgini:=tinifile.Create(dir+'PhoneBook.ini');

try

fs:='0000';//начальные параметры стиля

fontdialog1.Font := files.font;

if fontdialog1.Execute then begin

files.Font:=fontdialog1.Font;

//запомним и установим выбранные параметры

filesetattr(cfgini.FileName,$00);

cfgini.WriteInteger('Notes','FontSize',files.Font.size);

cfgini.WriteString('Notes','FontFace',files.Font.Name);

// закодируем и сохраним стиль шрифта

if fsBold in files.font.Style then fs[1]:='1';

if fsItalic in files.font.Style then fs[2]:='1';

if fsUnderline in files.font.Style then fs[3]:='1';

if fsStrikeOut in files.font.Style then fs[4]:='1';

cfgini.WriteString('Notes','FontStyle', fs);

end;

except writelog(log,'FileWriteError('+cfgini.FileName+')','RemoveExecute');

end;

cfgini.Free;

end;

// Запомним изменяющийся текст в заметке по ходу его изменения

procedure TForm1.FilesChange(Sender: TObject);

var cr_lf:integer;

begin

//только если это заметка

if list.selected.imageindex=2 then begin

try

fileSetAttr(includeTrailingBackslash(dir)+'text\'+list.selected.text+'.txt',$00); files.Lines.savetofile(includeTrailingBackslash(dir)+'text\'+list.selected.text+'.txt');

except writelog(log,'FileWriteError('+list.selected.text+'.txt)','FilesChange');

end;

end;

cr_lf:=files.Lines.count*2;

statusbar1.Panels[3].text:='Символов:'+inttostr(length(files.lines.text)-cr_lf);

end;

// изменение имени заметки или имени и комментария группы

procedure TForm1.ChgPropExecute(Sender: TObject);

begin

Application.CreateForm(TForm4, Form4);

if list.Selected<>list.items.GetFirstNode then form4.showmodal;

form4.free;

UpdateNotes;

end;

// обновления отображения иконок для узлов каталога

procedure UpdateNotesIcons;

var i:integer;

cfgini:tinifile;

begin

cfgini:=tinifile.Create(dir+'PhoneBook.ini');

try

with form1 do begin

FOR I:=1 TO LIST.ITEMS.COUNT-1 DO BEGIN

if cfgini.ValueExists('Group',List.Items[i].Text) then begin

if list.items[i].count>0 then begin

List.Items[i].ImageIndex:=1;

List.Items[i].SelectedIndex:=1;

end

else begin

List.Items[i].ImageIndex:=3;

List.Items[i].SelectedIndex:=3;

end;

end

else begin

list.items[i].ImageIndex:=2;

list.items[i].SelectedIndex:=2;

end;

END;

list.Refresh;

end;

except

writelog(log,'FileReadError(PhoneBook.ini)','UpdateItemsIcons');

end;

cfgini.Free;

end;

// обновление параметров каталога

procedure UpdateNotes;

var fll:tstringlist;//список строк заметки для загрузки

cntfiles,i:integer;

begin

for i:=0 to form1.list.Items[0].Count-1 do begin

if (form1.list.Items[0].item[i].text='*')and(form1.list.Items[0].item[i].Count<1) then

form1.list.Items[0].Item[i].Delete;

end;

if form1.list.selected=nil then

form1.list.items[0].Selected:=true;

form1.statusbar1.panels[2].text:='';

form1.statusbar1.panels[3].text:='';

form1.files.Clear;

//применение параметров в зависимости от выбранного элимента списка

case form1.list.selected.imageindex of

0: begin //корень

//установим кооментарий и деактивизируем недоступные элименты

// покажем доступные

form1.NewSubcategory.Enabled:=true;

form1.newtext.enabled:=true;

// скроем недоступные

form1.setfirst.enabled:=false;

form1.chgprop.enabled:=false;

form1.cut.enabled:=false;

form1.copy.enabled:=false;

form1.paste.enabled:=false;

form1.Remove.enabled:=false;

form1.files.enabled:=False;

form1.savenote.Enabled:=false;

form1.allUpper.enabled:=false;

form1.allLower.enabled:=false;

form1.allInvert.enabled:=False;

form1.allProper.enabled:=false;

form1.PrintNote.Enabled:=false;

end;

1: begin //группа

//доступные элименты

form1.chgprop.enabled:=true;

form1.Remove.enabled:=True;

form1.newtext.enabled:=true;

form1.setfirst.enabled:=true;

form1.NewSubcategory.Enabled:=true;

//недоступные элименты

form1.cut.enabled:=false;

form1.copy.enabled:=false;

form1.paste.enabled:=false;

form1.files.enabled:=False;

form1.savenote.Enabled:=false;

form1.allUpper.enabled:=false;

form1.allLower.enabled:=false;

form1.allInvert.enabled:=false;

form1.allProper.enabled:=false;

form1.PrintNote.Enabled:=false;

end;

3: begin //группа

//доступные элименты

form1.setfirst.enabled:=True;

form1.chgprop.enabled:=true;

form1.Remove.enabled:=True;

form1.newtext.enabled:=true;

form1.NewSubcategory.Enabled:=true;

//недоступные элименты

form1.cut.enabled:=false;

form1.copy.enabled:=false;

form1.paste.enabled:=false;

form1.files.enabled:=False;

form1.savenote.Enabled:=false;

form1.allUpper.enabled:=false;

form1.allLower.enabled:=false;

form1.allInvert.enabled:=false;

form1.allProper.enabled:=false;

form1.PrintNote.Enabled:=false;

end;

2: begin //заметка

//недоступный элимент

form1.NewSubcategory.Enabled:=False;

form1.allUpper.enabled:=false;

form1.allLower.enabled:=false;

form1.allProper.enabled:=false;

form1.allInvert.enabled:=false;

form1.cut.enabled:=false;

form1.copy.enabled:=false;

//доступные элименты управления

form1.PrintNote.Enabled:=true;

form1.setfirst.enabled:=True;

form1.chgprop.enabled:=true;

form1.Remove.enabled:=True;

form1.newtext.enabled:=true;

form1.files.enabled:=true;

form1.savenote.Enabled:=true;

form1.paste.enabled:=true;

//загрузим текст

fll:=tstringlist.create;

try

if FileExists(dir+'text\'+form1.list.selected.Text+'.txt') then begin

fileSetAttr(dir+'text\'+form1.list.selected.Text+'.txt',$00);

fll.LoadFromFile(dir+'text\'+form1.list.selected.Text+'.txt');

end

else Fll.SavetoFile(dir+'text\'+form1.list.selected.Text+'.txt');

except

writelog(log,'FileWriteError('+form1.list.selected.Text+'.txt)','UpdateNotes');

end;

form1.files.Clear;

form1.files.lines.AddStrings(fll);

//очистим времменую переменную

fll.free;

end;

end;

cntfiles:=0;

for i:=0 to form1.list.Items.count-1 do

if form1.list.Items[i].ImageIndex=2 then inc(cntfiles);

form1.StatusBar1.Panels[1].text:='Заметок:'+inttostr(cntfiles);

end;

// сохранение заметки в др. файл

procedure TForm1.SaveNoteExecute(Sender: TObject);

begin

sd.FileName:=list.selected.Text+'.txt';

if sd.Execute then begin

try

files.Lines.SaveToFile(sd.FileName);

except

writelog(log,'FileWriteError('+sd.filename+')','SaveNoteExecute');

end;

end;

end;

// в верхний регистр

procedure TForm1.AllUpperExecute(Sender: TObject);

var s,l:integer;

begin

s:=files.SelStart;

l:=files.SelLength;

if l>0 then begin

files.SelText:=ansiuppercase(files.SelText);

files.SelStart:=s;

files.SelLength:=l;

end;

end;

// в нижний регистр

procedure TForm1.AllLowerExecute(Sender: TObject);

var s,l:integer;

begin

s:=files.SelStart;

l:=files.SelLength;

if l>0 then begin

files.SelText:=ansilowercase(files.SelText);

files.SelStart:=s;

files.SelLength:=l;

end;

end;

// в правельный регистр

procedure TForm1.AllProperExecute(Sender: TObject);

var s,l:integer;

begin

s:=files.SelStart;

l:=files.SelLength;

if l>0 then begin

files.seltext:=propercase(files.seltext);

files.SelStart:=s;

files.SelLength:=l;

end;

end;

// инверсный регистр

procedure TForm1.AllInvertExecute(Sender: TObject);

var s,l:integer;

begin

s:=files.SelStart;

l:=files.SelLength;

if l>0 then begin

files.seltext:=invertcase(files.seltext);

files.SelStart:=s;

files.SelLength:=l;

end;

end;

// Вырезать

procedure TForm1.CutExecute(Sender: TObject);

begin

if files.SelLength>0 then files.CutToClipboard;

end;

// Вставить

procedure TForm1.PasteExecute(Sender: TObject);

begin

files.PasteFromClipboard;

end;

// Копировать

procedure TForm1.CopyExecute(Sender: TObject);

begin

if files.sellength>0 then files.CopyToClipboard;

end;

// установка активности функций и положения курсора

procedure TForm1.filesKeyUp(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if files.SelLength=0 then begin

cut.enabled:=false;

copy.enabled:=false;

AllProper.enabled:=false;

AllInvert.enabled:=false;

AllUpper.enabled:=false;

AllLower.enabled:=false;

end

else begin

cut.enabled:=true;

copy.enabled:=true;

AllProper.enabled:=true;

AllInvert.enabled:=True;

AllUpper.enabled:=True;

AllLower.enabled:=True;

end; StatusBar1.Panels[2].Text:=inttostr(files.CaretPos.x)+':'+inttostr(files.CaretPos.y+1);

end;

// установка активности функций и положения курсора

procedure TForm1.filesMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if files.SelLength=0 then begin

cut.enabled:=false;

copy.enabled:=false;

AllProper.enabled:=false;

AllInvert.enabled:=false;

AllUpper.enabled:=false;

AllLower.enabled:=false;

end

else begin

cut.enabled:=true;

copy.enabled:=true;

AllProper.enabled:=true;

AllInvert.enabled:=True;

AllUpper.enabled:=True;

AllLower.enabled:=True;

end;

end;

// Попуп на списке заметок

procedure TForm1.ListPopupPopup(Sender: TObject);

var ind:integer;

begin

ind:=list.Selected.absoluteIndex;

UpdateNotes;

list.items[ind].Selected:=true;

if form1.list.selected.Index=0 then

form1.SetFirst.Enabled:=false;

end;

// раскрыть все

procedure TForm1.N16Click(Sender: TObject);

begin

list.fullexpand;

end;

// сортировка списка

procedure SortList;

var i:integer;

begin

with form1 do begin

for i:= 0 to list.Items.Count-1 do begin

if (list.items[i].ImageIndex=1) or (list.items[i].ImageIndex=3) then begin

list.items[i].MoveTo(list.items[i].Parent,naAddChildFirst)

end;

end;

for i:= 0 to list.Items.Count-1 do begin

if (list.items[i].ImageIndex=1) then begin

list.items[i].MoveTo(list.items[i].Parent,naAddChildFirst)

end;

end;

end;

end;

// переместить в начало группы

procedure TForm1.SetFirstExecute(Sender: TObject);

begin

list.selected.MoveTo(list.selected.Parent,naAddChildFirst)

end;

// сортировка списка (через меню)

procedure TForm1.N18Click(Sender: TObject);

begin

sortlist;

end;

// перемещение фокуса по заметкам

procedure TForm1.FocusListExecute(Sender: TObject);

begin

if list.Focused then begin

if files.enabled then begin

files.SetFocus;

files.SelStart:=0;

end;

end

else list.SetFocus;

end;

// Выделить все

procedure TForm1.SelAllExecute(Sender: TObject);

begin

if files.Focused then files.SelectAll;

end;

// закрыть все ветки

procedure TForm1.N37Click(Sender: TObject);

begin

list.fullcollapse;

list.Items.GetFirstNode.Expand(false);

end;

// печать заметки

procedure TForm1.PrintNoteExecute(Sender: TObject);

var

pd:TPrintdialog;

Line: Integer;

PrintText: TextFile; {declares a file variable}

begin

pd:=Tprintdialog.Create(form1);

if Pd.Execute then begin

try

AssignPrn(PrintText); {assigns PrintText to the printer}

Rewrite(PrintText); {creates and opens the output file}

Printer.Canvas.Font := Files.Font; {assigns Font settings to the canvas}

for Line := 0 to Files.Lines.Count - 1 do

Writeln(PrintText, Files.Lines[Line]); {writes the contents of the Memo1 to the printer object}

CloseFile(PrintText); {Closes the printer variable}

except

WriteLog(Log,'PrintError','PrintNoteExecute');

showmessage('Ошибка печати');

end;

end;

end;

// правильный регистр

function ProperCase(ss:string):string;

var s : string;

fs : short;

begin

s:=TrimLeft(ss);

fs:=length(ss)-length(s);

result:=stringofchar(' ',fs)+AnsiUpperCase(copy(s,1,1))+AnsiLowerCase(copy(s,2,length(s)));

end;

// инверсный регистр

function invertCase(s:string):string;

var i : integer;

s1,s2 : string;

begin

s1:='';

s2:='';

for i:=1 to length(s) do begin

if AnsiCompareStr(AnsiUpperCase(s[i]),s[i])>0 then begin

s1:=s[i];

s2:=s2+AnsiUpperCase(s1);

end

else begin

s1:=s[i];

s2:=s2+AnsiLowerCase(s1);

end;

end;

result:=s2;

end;

// Перехват нажатия кнопок в редакторе заметок

procedure TForm1.filesKeyPress(Sender: TObject; var Key: Char);

var

line, scol,n,n2,x,y,n3: integer;

ss1,ss2,s1,s2,s3: String;

begin

if key=#13 then begin

key:=#0;

n2:=files.selstart;

line:=files.CaretPos.y;

x:=files.CaretPos.x;

s1:=files.lines[line];

s2:=trimleft(s1);

scol:=length(s1)-length(s2);

s3:=system.copy(files.lines[line],1,x);

s2:=system.copy(files.lines[line],x+1,length(files.lines[line])-x+1);

s1:=trimright(s3);

n3:=length(s3)-length(s1);

s2:=trim(s2);

files.lines[line]:=s1+#13#10+stringofchar(' ',scol)+s2;

files.selstart:=n2+2+scol-n3;

end;

if key=chr(vk_tab) then begin

n:=files.Selstart;

key:=#0;

y:=files.CaretPos.y;

x:=files.CaretPos.x;

ss1:=system.copy(files.lines[y],1,x);

ss2:=system.copy(files.lines[y],x+1,length(files.lines[y])-x);

files.lines[y]:=ss1+tab+ss2;

files.Selstart:=n+length(tab);

end;

end;

// отображение положения курсора

procedure TForm1.filesClick(Sender: TObject);

begin

StatusBar1.Panels[2].Text:=inttostr(files.CaretPos.x)+':'+inttostr(files.CaretPos.y+1);

end;

// положение курсора

procedure TForm1.filesKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

Begin

StatusBar1.Panels[2].Text:=inttostr(files.CaretPos.x)+':'+inttostr(files.CaretPos.y+1);

end;

// Сортировка списка телефонов

procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

//

end;

// обработка нажатия кнопок на списке телефонов

procedure TForm1.PhonesKeyUp(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

(Sender: TObject);

begin

files.WordWrap:=checkbox1.Checked;

if files.WordWrap then

files.ScrollBars:=ssVertical

else

files.ScrollBars:=ssBoth;

n8.Checked:=checkbox1.Checked;

end;

// Установка цвета фона (экспорт)

procedure TForm1.bgcolorClick(Sender: TObject);

begin

if colorD.Execute then

bgcolor.font.Color:=colorD.Color;

end;

// установка цвет текста(экспорт)

procedure TForm1.textcolorClick(Sender: TObject);

begin

if colorD.Execute then

textcolor.font.Color:=colorD.Color;

end;

// устантовка цвета фона(экспорт)

procedure TForm1.bordercolorClick(Sender: TObject);

begin

if colorD.Execute then

bordercolor.font.Color:=colorD.Color;

end;

// выход

procedure TForm1.ExitOnEscExecute(Sender: TObject);

begin

if checkbox5.Checked then close;

end;

// подгонка ширины столбцов

procedure TForm1.ToolButton16Click(Sender: TObject);

var i:integer;

begin

for i:=0 to phones.Columns.Count-1 do

phones.Column[i].width:=round(phones.Width/phones.Columns.Count)-1;

end;

// перетаскивание при DnD

procedure TForm1.ListDragOver(Sender, Source: TObject; X, Y: Integer;

State: TDragState; var Accept: Boolean);

begin

if source is TTreeView then begin

node:=(Source as TTreeView).Selected;

ToNode:=(sender as TTreeView).GetNodeAt(x,y);

if tonode<>nil then begin

if ((tonode.ImageIndex in [0,1,3])and(node.ImageIndex<>0)and(tonode<>node)) then

accept:=true

else accept:=false;

if node.ImageIndex = 1 then StatusBar1.Panels[0].Text:=node.text+' -> '+tonode.Text;

if node.ImageIndex = 2 then StatusBar1.Panels[0].Text:=node.text+' -> '+tonode.Text;

end

else accept:=false;

end

else accept:=false;

end;

// Переместить элимент при DnD

procedure TForm1.ListDragDrop(Sender, Source: TObject; X, Y: Integer);

var s:string;

begin

Application.CreateForm(TForm7, Form7);

case node.ImageIndex of

1:s:='Переместить группу "'+ansiuppercase(node.text)+'" в группу "'+ansiuppercase(tonode.Text)+'"?';

2:s:='Переместить заметку "'+ansiuppercase(node.text)+'" в группу "'+ansiuppercase(tonode.Text)+'"?';

end;

Form7.Label1.Caption:=s;

if node.ImageIndex=1 then Form7.RadioGroup1.ItemIndex:=0

else Form7.RadioGroup1.ItemIndex:=1;

CheckBox1Click(sender);

end;

// изменение списка заметок

procedure TForm1.TabSheet4Show(Sender: TObject);

begin

ListChange(list,nil);

end;

procedure TForm1.N30Click(Sender: TObject);

var lp:array[0..127] of char;

s:shortstring;

begin

s:='mailto:'+phones.Selected.SubItems[4];

shellexecute(0,nil,StrPCopy(lp,s),nil,nil,0);

end;

procedure TForm1.EditFindChange(Sender: TObject);

var i:integer;

s:ShortString;

begin

for i:=0 to phones.items.count-1 do begin

s:=Ansiuppercase(system.Copy(phones.items[i].CAPTION,0,length(editFind.Text)));

if Ansiuppercase(EditFind.text)=s then begin

phones.items[i].Selected:=true;

phones.ItemIndex:=i;

phones.ItemFocused:=phones.items[i];

break;

end;

end;

if phones.ItemFocused<>nil then

phones.ItemFocused.MakeVisible(false);

end;

procedure TForm1.SelAll1DrawItem(Sender: TObject; ACanvas: TCanvas;

ARect: TRect; Selected: Boolean);

var bm:tbitmap;

begin

if selected then begin

// acanvas.Pen.Color:=clblack+$00101010;

// Acanvas.brush.Color:=$00986565;

acanvas.Pen.Color:=clblack+$00101010;

Acanvas.brush.Color:=$00ffffff;

acanvas.Rectangle(arect.left+1,arect.top,arect.Right,arect.top+19);

if (sender as tmenuitem).Default then acanvas.Font.Style:=[fsBold]

else acanvas.Font.Style:=[];

if not(sender as TMenuItem).Enabled then acanvas.Font.Color:=clGrayText

else acanvas.Font.Color:=clBlack;

acanvas.TextOut(arect.left+32,arect.top+3,(sender as tmenuitem).Caption);

if (sender as tmenuitem).Enabled then acanvas.Font.Color:=clNavy;

if (sender as tmenuitem).ShortCut>0 then

acanvas.TextOut(arect.right-8-acanvas.TextWidth(ShortCutToText((sender as tmenuitem).ShortCut)),arect.top+3,ShortCutToText((sender as tmenuitem).ShortCut));

end

else begin

Acanvas.Pen.Color:=clSilver+$00221111;

Acanvas.brush.Color:=Acanvas.Pen.Color;

acanvas.Rectangle(arect.left+24,arect.top,arect.Right,arect.top+19);

if (sender as tmenuitem).Default then acanvas.Font.Style:=[fsBold]

else acanvas.Font.Style:=[];

if (sender as TMenuItem).Enabled then acanvas.Font.Color:=clBlack

else acanvas.Font.Color:=clGrayText;

acanvas.TextOut(arect.left+32,arect.top+3,(sender as tmenuitem).Caption);

if (sender as tmenuitem).Enabled then acanvas.Font.Color:=clNavy;

if (sender as tmenuitem).ShortCut>0 then

acanvas.TextOut(arect.right-8-acanvas.TextWidth(ShortCutToText((sender as tmenuitem).ShortCut)),arect.top+3,ShortCutToText((sender as tmenuitem).ShortCut));

acanvas.Pen.Color:=clSkyBlue;

// acanvas.Pen.Color:=$00ffddcc;

Acanvas.brush.Color:=acanvas.Pen.Color;

acanvas.Rectangle(arect.Left,arect.Top,arect.Left+24,arect.Bottom);

if (sender as TMenuItem).Caption='-' then begin

Acanvas.Pen.Color:=clSilver;

Acanvas.brush.Color:=clGray;

Acanvas.Rectangle(26,arect.top+3,arect.left+arect.Right-2,arect.top+6);

end;

end;

bm:=tbitmap.Create;

Actions.GetBitmap((sender as tmenuitem).ImageIndex,bm);

bm.Transparent:=true;

if not (sender as TMenuItem).Enabled then

bm.Mask(clWhite);

acanvas.Draw(arect.Left+3,arect.Top+1,(bm as TGraphic));

bm.Free;

end;

procedure TForm1.PhonesColumnClick(Sender: TObject;

Column: TListColumn);

var ind:integer;

begin

ind:=column.Index;

case ind of

0:begin

if sorttype[ind]=0 then sorttype[ind]:=1

else sorttype[ind]:=0;

phones.CustomSort(@SortNames, sorttype[ind]);

end;

1:begin

if sorttype[ind]=0 then sorttype[ind]:=1

else sorttype[ind]:=0;

phones.CustomSort(@SortHPhones, sorttype[ind]);

end;

2:begin

if sorttype[ind]=0 then sorttype[ind]:=1

else sorttype[ind]:=0;

phones.CustomSort(@SortWPhones, sorttype[ind]);

end;

3:begin

if sorttype[ind]=0 then sorttype[ind]:=1

else sorttype[ind]:=0;

phones.CustomSort(@SortCelPhones, sorttype[ind]);

end;

4:begin

if sorttype[ind]=0 then sorttype[ind]:=1

else sorttype[ind]:=0;

phones.CustomSort(@SortAdres, sorttype[ind]);

end;

5:begin

if sorttype[ind]=0 then sorttype[ind]:=1

else sorttype[ind]:=0;

phones.CustomSort(@SortEmail, sorttype[ind]);

end;

6:begin

if sorttype[ind]=0 then sorttype[ind]:=1

else sorttype[ind]:=0;

phones.CustomSort(@SortDate, sorttype[ind]);

end;

end;

sortindex:=ind;

end;

procedure TForm1.ToHTMLExecute(Sender: TObject);

var i:integer;

f:tstringlist;

bgcolor,textcolor,bordercolor:string;

begin

f.Add(' <table border="1" leftmargin="2" align="center" cellpadding="0" cellspacing="0" bordercolor=#'+bordercolor+' width="98%">')

else

f.Add(' <table align="center" leftmargin="2" cellpadding="0" cellspacing="0" width="98%">');

f.Add(' <tr>');

f.Add(' <td><b>Имя</td>');

if cb1.Checked then f.Add(' <td><b>&nbspТелефон</b></td>');

if cb2.Checked then f.Add(' <td><b>&nbspРабочий</b></td>');

if cb3.Checked then f.Add(' <td><b>&nbspСотовый</b></td>');

if cb4.Checked then f.Add(' <td><b>&nbspАдрес</b></td>');

if cb5.Checked then f.Add(' <td><b>&nbspE-mail</b></td>');

f.Add(' </tr>');

for i:=0 to Phones.items.Count-1 do begin

f.Add(' <tr>');

if length(Phones.items[i].Caption)>0 then f.Add(' <td>&nbsp'+Phones.items[i].Caption+'</td>')

else f.Add(' <td>&nbsp</td>');

if cb1.Checked then

if length(Phones.items[i].SubItems[0])>0 then f.Add(' <td>&nbsp'+Phones.items[i].SubItems[0]+'</td>')

else f.Add(' <td>&nbsp</td>');

if cb2.Checked then

if length(Phones.items[i].SubItems[1])>0 then f.Add(' <td>&nbsp'+Phones.items[i].SubItems[1]+'</td>')

else f.Add(' <td>&nbsp</td>');

if cb3.Checked then

if length(Phones.items[i].SubItems[2])>0 then f.Add(' <td>&nbsp'+Phones.items[i].SubItems[2]+'</td>')

else f.Add(' <td>&nbsp</td>');

if cb4.Checked then

if length(Phones.items[i].SubItems[3])>0 then f.Add(' <td>&nbsp'+Phones.items[i].SubItems[3]+'</td>')

else f.Add(' <td>&nbsp</td>');

if cb5.Checked then

if length(Phones.items[i].SubItems[4])>0 then f.Add(' <td>&nbsp'+Phones.items[i].SubItems[4]+'</td>')

else f.Add(' <td>&nbsp</td>');

f.Add(' </tr>');

end;

f.SaveToFile(shtml.FileName);

except

writeLog(log,'ExportError','PBToolButton6Click');

showmessage('Ошибка Сохранения файла');

end;

f.Free;

end;

end;

procedure TForm1.ToExcelExecute(Sender: TObject);

var ws,xl:variant;

i,maxrow:integer;

col,fst:integer;

begin

fst:=2;

xl:=createoleobject('Excel.Application');

try

maxrow:=0;

xl.visible:=true;

XL.WorkBooks.Add;

ws := XL.ActiveWorkBook.ActiveSheet;

ws.Range['A1:O500'].NumberFormat:='@';

ws.Range['A'+inttostr(fst)].Value := '№пп';

ws.Range['B'+inttostr(fst)].Value := 'Имя';

col:=1;

if cb1.Checked then begin

inc(col);

ws.Range[Chr(Ord('A')+col)+inttostr(fst)].Value := 'Телефон';

end;

if cb2.Checked then begin

inc(col);

ws.Range[Chr(Ord('A')+col)+inttostr(fst)].Value := 'Рабочий телефон';

end;

if cb3.Checked then begin

inc(col);

ws.Range[Chr(Ord('A')+col)+inttostr(fst)].Value := 'Мобильный';

end;

if cb4.Checked then begin

inc(col);

ws.Range[Chr(Ord('A')+col)+inttostr(fst)].Value := 'Адрес';

end;

if cb5.Checked then begin

inc(col);

ws.Range[Chr(Ord('A')+col)+inttostr(fst)].Value := 'E-Mail';

end;

for i:=fst+1 to Phones.Items.Count+fst do begin

col:=1;

ws.Range['a'+inttostr(i)].Value := i-(fst);//# работы

ws.Range['b'+inttostr(i)].Value := Phones.Items[i-fst-1].Caption;

if cb1.Checked then begin

inc(col);

ws.Range[Chr(Ord('A')+col)+inttostr(i)].Value:=Phones.Items[i-fst-1].SubItems[0];

end;

if cb2.Checked then begin

inc(col);

ws.Range[Chr(Ord('A')+col)+inttostr(i)].Value:=Phones.Items[i-fst-1].SubItems[1];

end;

if cb3.Checked then begin

inc(col);

ws.Range[Chr(Ord('A')+col)+inttostr(i)].Value:=Phones.Items[i-fst-1].SubItems[2];

end;

if cb4.Checked then begin

inc(col);

ws.Range[Chr(Ord('A')+col)+inttostr(i)].Value:=Phones.Items[i-fst-1].SubItems[3];

end;

if cb5.Checked then begin

inc(col);

ws.Range[Chr(Ord('A')+col)+inttostr(i)].Value:=Phones.Items[i-fst-1].SubItems[4];

end;

maxrow:=i;

end;

//установим сетку для таблицы

ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlEdgeLeft].LineStyle:=xlContinuous;

ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlEdgeLeft].Weight:=xlThin; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlEdgeLeft].ColorIndex:=xlAutomatic; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlEdgeTop].LineStyle:=xlContinuous; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlEdgeTop].Weight:=xlThin; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlEdgeTop].ColorIndex:=xlAutomatic; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlEdgeBottom].LineStyle:=xlContinuous; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlEdgeBottom].Weight:=xlThin; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlEdgeBottom].ColorIndex:=xlAutomatic; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlEdgeRight].LineStyle:=xlContinuous; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlEdgeRight].Weight:=xlThin; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlEdgeRight].ColorIndex:=xlAutomatic;

//внутреннее пересечение ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlInsideVertical].LineStyle:=xlContinuous; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlInsideVertical].Weight:=xlThin; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlInsideVertical].ColorIndex:=xlAutomatic; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlInsideHorizontal].LineStyle:=xlContinuous; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlInsideHorizontal].Weight:=xlThin; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(maxrow)].Borders[xlInsideHorizontal].ColorIndex:=xlAutomatic;

//наружние границы ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(fst)].Borders[xlEdgeLeft].LineStyle:=xlContinuous; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(fst)].Borders[xlEdgeLeft].Weight:=xlMedium; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(fst)].Borders[xlEdgeLeft].ColorIndex:=xlAutomatic;

ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(fst)].Borders[xlEdgeTop].LineStyle:=xlContinuous; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(fst)].Borders[xlEdgeTop].Weight:=xlMedium; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(fst)].Borders[xlEdgeTop].ColorIndex:=xlAutomatic; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(fst)].Borders[xlEdgeBottom].LineStyle:=xlContinuous; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(fst)].Borders[xlEdgeBottom].Weight:=xlMedium; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(fst)].Borders[xlEdgeBottom].ColorIndex:=xlAutomatic; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(fst)].Borders[xlEdgeRight].LineStyle:=xlContinuous; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(fst)].Borders[xlEdgeRight].Weight:=xlMedium; ws.Range['A'+inttostr(fst)+':'+Chr(Ord('A')+col)+inttostr(fst)].Borders[xlEdgeRight].ColorIndex:=xlAutomatic;

for i:=ord('A')to ORD('A')+col do begin ws.Range[Chr(i)+inttostr(fst)+':'+Chr(i)+inttostr(maxrow)].Borders[xlEdgeLeft].LineStyle:=xlContinuous; ws.Range[Chr(i)+inttostr(fst)+':'+Chr(i)+inttostr(maxrow)].Borders[xlEdgeLeft].Weight:=xlMedium; ws.Range[Chr(i)+inttostr(fst)+':'+Chr(i)+inttostr(maxrow)].Borders[xlEdgeLeft].ColorIndex:=xlAutomatic; ws.Range[Chr(i)+inttostr(fst)+':'+Chr(i)+inttostr(maxrow)].Borders[xlEdgeTop].LineStyle:=xlContinuous; ws.Range[Chr(i)+inttostr(fst)+':'+Chr(i)+inttostr(maxrow)].Borders[xlEdgeTop].Weight:=xlMedium;

ws.range['A1:'+chr(Ord('A')+col)+'1'].merge;

if (Groups.ItemIndex>=0)and(Groups.ItemIndex<groups.Items.Count)then

ws.range['A1:'+chr(Ord('A')+col)+'1'].value:='Список телефонов "'+Groups.Items[Groups.ItemIndex].Caption+'"'

else

ws.range['A1:'+chr(Ord('A')+col)+'1'].value:='Список телефонов';

ws.range['A1:'+chr(Ord('A')+col)+'1'].font.bold:=true;

ws.range['A'+inttostr(fst)+':'+chr(Ord('A')+col)+inttostr(fst)].font.bold:=true;

//подгоним размеры

ws.Columns['A:'+chr(Ord('A')+col)].EntireColumn.AutoFit;

xl.ActiveWindow.SplitRow:=fst;

xl.ActiveWindow.FreezePanes:=True;

xl.ActiveSheet.PageSetup.Orientation:=xlLandscape;

xl.ActiveSheet.PageSetup.PrintArea:='$A:$G';

finally

//выход из экселя

// xl.quit;

end;

end;

procedure TForm1.commentExit(Sender: TObject);

var i:integer;

begin

if CommentChanged then begin

for i:=0 to 100 do

ini.DeleteKey(phones.ItemFocused.Caption,'c'+inttostr(i));

for i:=0 to comment.Lines.Count-1 do

ini.WriteString(phones.ItemFocused.Caption,'c'+inttostr(i),comment.lines[i]);

end;

end;

procedure TForm1.PopupListPopup(Sender: TObject);

begin

Groups.SetFocus;

end;

procedure TForm1.commentChange(Sender: TObject);

begin

CommentChanged:=true;

end;

procedure TForm1.ToolButton7Click(Sender: TObject);

begin

Form1.Close;

end;

procedure TForm1.ToolButton6Click(Sender: TObject);

begin

Form8.show;

end;

end.