- •Перечень условных обозначений
- •Введение
- •Результаты прохождения общей ознакомительной части практики
- •Описание вычислительной техники
- •Программные продукты, используемые в организации
- •Охрана труда и техника безопасности при работе на пэвм
- •Требования безопасности перед началом работы
- •Требование безопасности при выполнении работ
- •Требования безопасности в аварийных ситуациях
- •Требования безопасности по окончании работы
- •Инструкция по технике безопасности при работе на компьютере
- •Основная часть
- •Актуальность создания программного проекта
- •Цели и задачи программного проекта
- •Объект и предмет программного проекта
- •Новизна и практическая значимость проекта
- •Сравнительный анализ аналогов и прототипов
- •Техническое задание
- •Эскизный проект
- •Рабочий проект
- •Охрана труда
- •Заключение
- •Список используемых источников
- •Приложение а. Техническое задание
- •Приложение б
- •Спецификация процессов
- •Структурный анализ
- •Приложение в Листинг Программы
Структурный анализ
Диаграмма - это графическое представление совокупности элементов, чаще всего изображаемое в виде связного графа, состоящего из вершин (сущностей) и ребер (отношений). С помощью диаграмм можно визуализировать систему с различных точек зрения.
Диаграммы прецедентов применяются для моделировании вида системы с точки зрения прецедентов (или вариантов использования). Чаще всего это предполагает моделирование контекста системы, подсистемы или класса либо моделирование требований, предъявляемых к поведению указанных элементов.
Диаграммы прецедентов имеют большое значение для визуализации, специфицирования и документирования поведения элемента. Они облегчают понимание систем, подсистем или классов, представляя взгляд извне на то, как данные элементы могут быть использованы в соответствующем контексте. Кроме того, такие диаграммы важны для тестирования исполняемых систем в процессе прямого проектирования и для понимания их внутреннего устройства при обратном проектировании.
Рис.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> Телефон</b></td>');
if cb2.Checked then f.Add(' <td><b> Рабочий</b></td>');
if cb3.Checked then f.Add(' <td><b> Сотовый</b></td>');
if cb4.Checked then f.Add(' <td><b> Адрес</b></td>');
if cb5.Checked then f.Add(' <td><b> E-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> '+Phones.items[i].Caption+'</td>')
else f.Add(' <td> </td>');
if cb1.Checked then
if length(Phones.items[i].SubItems[0])>0 then f.Add(' <td> '+Phones.items[i].SubItems[0]+'</td>')
else f.Add(' <td> </td>');
if cb2.Checked then
if length(Phones.items[i].SubItems[1])>0 then f.Add(' <td> '+Phones.items[i].SubItems[1]+'</td>')
else f.Add(' <td> </td>');
if cb3.Checked then
if length(Phones.items[i].SubItems[2])>0 then f.Add(' <td> '+Phones.items[i].SubItems[2]+'</td>')
else f.Add(' <td> </td>');
if cb4.Checked then
if length(Phones.items[i].SubItems[3])>0 then f.Add(' <td> '+Phones.items[i].SubItems[3]+'</td>')
else f.Add(' <td> </td>');
if cb5.Checked then
if length(Phones.items[i].SubItems[4])>0 then f.Add(' <td> '+Phones.items[i].SubItems[4]+'</td>')
else f.Add(' <td> </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.
