Курсовая работа: Разработка вспомогательной системной программы в системе программирования Delphi с использованием средств WinApi
procedure ToolButton1Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N2Click(Sender: TObject);
private
procedure AppHint(Sender: TObject);
public
HMutex:THandle;
ThreadRec:TThreadReceiver;
HEvent:THandle;
HFileSender:Thandle;
NicName:string;
end;
var
Form1: TForm1;
TxtFile:TextFile;// пременная файла
St:PansiChar;
lincInt:Boolean;
TxtContaningStr:String;
userName:string;
implementation
{$R *.dfm}
//процедура для показа кртких справок
procedure TForm1.AppHint(Sender: TObject);
begin
StatusBar1.SimpleText:=Application.Hint; //для отображения ииформации в панели соостояния
end;
//закрытие всех хендлов в этой копии программы
procedure TForm1.CloseHandles();
begin
CloseHandle(HFileSender);
CloseHandle(HMutex);
CloseHandle(HEvent);
end;
// создание всех необходимых объектов
procedure TForm1.CreateHandles;
begin
// проекция файла
HFileSender:=CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SHARED_MEMORY_SIZE,MMFName);
lincInt:=(GetLastError() <> ERROR_ALREADY_EXISTS);
if HFileSender = 0 then
begin
st:='не удалось создать проекцию файла';
Application.MessageBox(st,'Сообщение...',MB_OK);
exit;
end;
// мьютекс
HMutex:=CreateMutex(nil,false,MutxName);
if HMutex = 0 then
begin
CloseHandle(HFileSender);
st:='не удалось синхронизировать приложение';
Application.MessageBox(st,'Сообщение...',MB_OK);
exit;
end;
// событие
HEvent:=CreateEvent(nil,true,false,EvntName);
if HEvent = 0 then
begin
CloseHandle(HFileSender);
CloseHandle(HMutex);
st:='не удалось осуществить обмен сообщениями';
Application.MessageBox(st,'Сообщение...',MB_OK);
exit;
end;
end;
// отсоединиться
procedure TForm1.Button1Click(Sender: TObject);
begin
ThreadRec.Terminate;
WriteDataInMMF('Пользователь '+NicName+' отключился');
ThreadRec.WaitFor;
ThreadRec.Free;// правильно уничтожаем поток
CloseHandles();
button2.Visible:=true;
button1.Visible:=false;
bitbtn2.Visible:=false;
end;
// загрузить историю переписки
procedure TForm1.N4Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
AssignFile(TxtFile,OpenDialog1.FileName);
Reset(TxtFile);
Memo1.Text:=Memo1.Text +'{-----------Загруженная переписка ниже-------------}' + #13#10;
while not eof(TxtFile) do
begin
readln(TxtFile,TxtContaningStr);
Memo1.Text:=Memo1.Text + TxtContaningStr + #13#10;
end;
Memo1.Text:=Memo1.Text +'{-----------Загруженная переписка выше -------------}' + #13#10;
CloseFile(TxtFile);
end;
end;
//процедура записи данных в MMF
procedure TForm1.WriteDataInMMF(s:string);
var
PBaseAdress:Pointer;
begin
WaitForSingleObject(HMutex, INFINITE);
PBaseAdress:=MapViewOfFile(HFileSender,FILE_MAP_WRITE,0,0,Length(s)+4);
if(PBaseAdress = nil) then
begin
CloseHandle(HFileSender);
st:='не удалось передать данные';
Application.MessageBox(st,'Сообщение...',MB_OK);
exit;
end;
begin
integer(PBaseAdress^):=length(s);
CopyMemory(Pointer(Integer(PBaseAdress)+4),PChar(s),length(s));
UnmapViewOfFile(PBaseAdress);
SetEvent(HEvent);
ReleaseMutex(HMutex);
end;
end;
// процедура записи данных в PBaseAdress
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
if Edit1.Text <> '' then
begin
WriteDataInMMF(Nicname+' написал:'+#13#10+string(Edit1.Text));
Edit1.Text:='';
end
else
exit;
end;
// Закрытия формы
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
close;
end;
//создаём хендлы и потоки
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;
// создание потока принимающего данные из файла
ThreadRec:=TThreadReceiver.Create(false);
ThreadRec.Priority:=tpLowest;
CreateHandles();// создаем хендлы
end;
// соединение
procedure TForm1.Button2Click(Sender: TObject);
begin
CreateHandles();
ThreadRec:=TThreadReceiver.Create(false);
button2.Visible:=false;
button1.Visible:=true;
bitbtn2.Visible:=true;
WriteDataInMMF(NicName+' Cоединился!');
end;
// Запрос подтверждения при закрытии формы
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
case messageBox(Handle,'Действительно выйти?','Внимание!', MB_YESNO) of
IDYES:
begin
if Button1.Visible = true then
begin
ThreadRec.Terminate;
WriteDataInMMF('Пользователь '+NicName+' отключился');
ThreadRec.WaitFor;
ThreadRec.Free;
CanClose:=true;
end
else
CanClose:=true;
end;
IDNO: CanClose:=false;
end;
end;
//Сохранить историю переписки
procedure TForm1.N5Click(Sender: TObject);
begin
If SaveDialog1.Execute then
begin
AssignFile(TxtFile,SaveDialog1.FileName);
rewrite(TxtFile);
TxtContaningStr:= Memo1.Text;
Write(TxtFile,TxtContaningStr);
CloseFile(TxtFile);
St:='Файл сохранён';
Application.MessageBox(St,'Сообщение...',MB_OK);
exit;
end
else
begin
St:='файл не сохранён';
Application.MessageBox(St,'Сообщение...',MB_OK);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Form1.Visible = true then
begin
Application.OnHint:=AppHint;
Timer1.Enabled:=false;
Timer1.Destroy;
end;
end;
procedure TForm1.ToolButton3Click(Sender: TObject);
begin
Application.CreateForm(TForm3, Form3);
Application.ShowMainForm:=false;
Form3.Visible:=true;
end;
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
//вызов справки (основная форма программы)
Application.HelpContext(2);
end;
procedure TForm1.N8Click(Sender: TObject);
begin
Application.HelpCommand(HELP_FINDER,0);
end;
procedure TForm1.N2Click(Sender: TObject);
begin
ShowMessage('Программу подготовил студент группы 742:'+#13#10+'Шипилов Д.А.');
end;
end.
3) Текст модуля Unit2 (Модуль формы «Авторизация»):
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Unit1, ComCtrls, Buttons;
type
TForm2 = class(TForm)
Button2: TButton;
Edit1: TEdit;
Label1: TLabel;
BitBtn1: TBitBtn;
procedure Button2Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
formClose:boolean=false;
implementation
{$R *.dfm}
// закрытие формы
procedure TForm2.Button2Click(Sender: TObject);
begin
close;
end;
// запрос подтверждения при завершении программы из дочерней формы
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if formClose = true then
begin
CanClose:=true;
end
else
begin
case messageBox(Handle,'Действительно выйти?','Внимание!', MB_YESNO) of
IDYES:
begin
Application.Terminate;
end;
IDNO: CanClose:=false;
end;
end;
end;
procedure TForm2.BitBtn1Click(Sender: TObject);
var
St:PansiChar;
begin
if Edit1.Text <> '' then
begin
formClose:=true;
Form1.Memo1.Clear;
Form1.NicName:=Edit1.Text;
Form1.WriteDataInMMF('Пользователь '+Form1.NicName+' подключился');
Application.ShowMainForm:=true;
Form1.Visible:=true;
Form2.Close;
end
else
begin
st:='Пожалуйста введите псевдоним для авторизации';
Application.MessageBox(st,'Сообщение...',MB_OK);
exit;
end;
end;
end.
4) Модуль Unit 3 (Модуль формы, осуществляющей работу с носителями информации в системе):
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, FileCtrl, ExtCtrls, Grids, ValEdit,HDDInfo, Buttons,
ComCtrls;
const
IOCTL_DISK_GET_DRIVE_GEOMETRY = $70000;
type
// версия ОС
TWinVersion = (wvUnknown,wv95,wv98,wvME,wvNT3,wvNT4,wvW2K,wvXP,wv2003,wvVista,wv7);
//геометрия
TDiscGeometry = packed record
Cylinders: Int64; // колличество цилиндров
MediaType: DWORD; // тип носителя
TracksPerCylinder: DWORD; // дорожек на цилиндре
SectorsPerTrack: DWORD; // секторов на дорожке
BytesPerSector: DWORD; // байт в секторе
end;
//TForm
TForm3 = class(TForm)
Button1: TButton;
DriveComboBox1: TDriveComboBox;
Panel1: TPanel;
Button2: TButton;
Grid1: TStringGrid;
Button3: TButton;
GroupBox1: TGroupBox;
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11