БАЛТИЙСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ “ВОЕНМЕХ” им. Д. Ф.УСТИНОВА
Кафедра И5
Лабораторная работа №3
по учебной дисциплине: «Визуальное программирование»
на тему «Компонент Listview. Коллекция списков»
Вариант № 12
студента
группы И-512
Преподаватель
/ /
« » 2013г.
САНКТ-ПЕТЕРБУРГ
2013
Содержание
1. Постановка задачи……………………………………………………………3
2. Содержание форм…………………………………………………………….4
3. Описание работы программы………………………………………………..6
Заключение………………………………………………………………………8
Приложение. Исходные тексты программы…………………………………9
1 Постановка задачи
Цель работы – получить навыки работы с компонентом ListView, научиться работать с коллекциями на примере класса TObjectList.
В соответствии с индивидуальным вариантом, написать программу «Протокол выбора лидера в распределенной системе». Пользователь задает, количество серверов, которое требуется ему для работы с системой, после чего автоматически выбирается сервер и начинается эмуляция процесса. Программа разработана, как для работы в “консольном” режиме, так и в режиме “приложения”.
2 Содержание формы
В соответствии с индивидуальным заданием, было разработано ядро системы, работающее без привязки к интерфейсу. Ядро позволяет работать, как в консольном режиме, так и с привязкой к интерфейсу.
{ TServer }
TServer = class(TObject)
protected
TimerList1, TimerHost : TStringList;
number, host : integer;
ar_act_ser : array of integer;
active : Boolean;
public
constructor Create(Sender : Tobject);
destructor delete;
function NumberServers(): integer;
end;
type
{ ArrayServer }
TArrayServer = class(TObject)
public
ArrayServer_: array of TServer;
constructor Create(Sender : Tobject);
end;
Как видно из текста программы, у нас имеется класс “Сервер”, который содержит в себе подсервера, выделяющиеся динамически, так как пользователь сам выбирает количество нужных ему объектов. На объекты установлены ограничения – 2000. Система способна работать с любым количеством объектов, но вместе с этим растет потребность в ресурсах, в связи с этиv было установлено данное ограничение. При привязке к интерфейсу, в ядро были добавлены некоторые переменные и класс, для создания более реалистичной модели интерфейса
type
{ TForm1 }
TForm1 = class(TForm)
Start: TButton;
Number: TEdit;
Timer : TTimer;
ScrollBox1: TScrollBox;
Q: TTimer;
procedure QTimer(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure StartClick(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
type
{ TServer }
TServer = class(TObject)
protected
TimerList : TStringList;
number, host : integer;
ar_act_ser : array of integer;
active : Boolean;
public
label1:TLabel;
TimerList1 : array [0..2000] of TStringList;
TimerHost : TStringList;
Timer1 : array[0..2000] of TTimer;
Memo1 : array[0..2000] of TMemo;
constructor Create(Sender : Tobject);
destructor delete;
function NumberServers(): integer;
end;
type
{ ArrayServer }
TArrayServer = class(TObject)
public
ArrayServer_: array of TServer;
constructor Create(Sender : Tobject); end;
3 Описание работы программы
При запуске программы в консольном режиме, пользователя просят ввести количество серверов, при этом если пользователь вводит, например, число 100, то доступны сервера от 0 до 99, так как 0 сервер является лидером (по умолчанию). У пользователя есть три возможных операции: добавить данные в сервер, посмотреть данные с определенного сервера и выход. При добавлении данных с сервера, при определенной последовательности символов, может произойти отказ сервера, при этом, если он является хозяином, то его “должность” переходит к следующему по порядку серверу. При этом к этому серверу мы можем обращаться только для просмотра информации с него. При определенной последовательности символов, сервер может заработать, так же как и отключится. Если все “хозяева” отказали в работе, то пользователь видит сообщение о том, что работа объектов приостановлена.
При привязке программы к интерфейсу, пользователь, при работе, видит окно, где ему нужно ввести количество желаемых объектов, после чего нажать на соответствующую кнопку, запускающую эмуляцию “протокола выбора”. После чего данная кнопка исчезает, для предотвращения сбоя в работе. На экране происходит загрузка серверов (при выбранном большом количестве) и отображаются поля, напротив поля являющегося “хозяином”, выводится надпись «Host». При изменении хозяина, изменяется соответственно положение надписи. Помимо этой надписи, отображаются, соответственно “сервера”, а если быть точнее время. Каждый из рабов, при изменении хозяина, делает проверку и устанавливает время в соответствии с хозяином. Так же любой из серверов, с течением времени, может приостанавливать работу и возобновлять. Все происходит случайно, следовательно, любой объект, в любую секунду, может, как и отказать, так и возобновить работу. Или же, отклонятся, с течением времени от времени сервера. Все результаты: время на сервере, кто, когда был хозяином, записываются в структуру TStringList. Поэтому, при желании, можно посмотреть, что происходило на определенном объекте в любой момент времени. Объекты, эмулирующие работы сервера и вспомогательный “указатель” на то, кто сейчас хозяин, создаются в режиме run-time, что позволяет нам создавать неограниченное количество объектов, при заполнении поля и нажатием одной клавиши.
Заключение
В ходе выполнения данной лабораторной работы были получены навыки работы с компонентами ListView, коллекциями на примере объектов класса TObjectList.
Приложение. Исходные тексты программы
Консольный режим:
program project1;
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp;
type
{ TServer }
TServer = class(TObject)
protected
TimerList : TStringList;
number, host : integer;
ar_act_ser : array of integer;
active : Boolean;
public
constructor Create(Sender : Tobject);
destructor delete;
function NumberServers(): integer;
end;
type
{ ArrayServer }
TArrayServer = class(TObject)
public
ArrayServer_: array of TServer;
constructor Create(Sender : Tobject);
end;
var
Server : Tserver;
Aserver : TArrayServer;
procedure Main(Sender: Tobject); forward;
var i:integer;
constructor TArrayServer. Create(Sender: Tobject);
begin
SetLength( ArrayServer_, Server. number);
for i:=0 to Server. number-1 do
ArrayServer_[i] := TServer. Create(self);
end;
constructor TServer. Create(Sender: TObject); // Конструктор
var s:string;
begin
TimerList := TStringList. Create;
end;
destructor TServer. delete; // Деструктор
begin
Server. Free;
Aserver. Free;
end;
function TServer. NumberServers(): integer; // Вводим количество серверов и создаем их
var kol, i : integer;
begin
Write('Please enter number server: ');
Readln(kol);
number := kol;
NumberServers := number; // "return
SetLength(ar_act_ser, number);
host := 0;
for i:=0 to number do
ar_act_ser[i]:=1;
end;
procedure Main(Sender: Tobject);// Консолька
var
i, num, check, j, kol, z,kol_z, kk : integer;
vsp : string;
begin
kol_z:=0;
kk:=0;
Write('You have ');
Write(Server. number);
Writeln(' servers.');
Repeat
Writeln('1 - Add information');
Writeln('2 - Show');
Writeln('0 - Exit');
Readln(i);
if(i = 1) then
begin
Write('Please check server: ');
Readln(check);
Write('Please write number: ');
Readln(num);
if((check<0) or (Server. number<=check)) then
begin
Writeln('This is server absent!');
kk:=1;
end
else
begin
vsp:=IntToStr(num);
if(Server. ar_act_ser[check] <> 0) then
(Aserver. ArrayServer_[check] As TServer).TimerList. Add(vsp)
else
Writeln('This is server disable');
if (num = 7) then
begin
Server. ar_act_ser[Server. host]:=0;
Write('Server ');
Write(Server. host);
Write(' disabled.');
Server. host:=Server. host+1;
Write('New host: ');
Writeln(Server. host);
end;
if (num = 17) then
begin
Server. ar_act_ser[Server. host]:=1;
Write('Server ');
Write(Server. host);
Writeln(' active.');
end;
for z:=0 to Server. number do
begin
if (Server. ar_act_ser[z] = 0) then
kol_z:=kol_z+1;
if (kol_z = Server. number) then
writeln ('All server disabled. Please respawn system');
end;
end;
end
else
if(i = 2) then
begin
Write('Please check server: ');
Readln(check);
if((check<0) or (Server. number<=check)) then
begin
Writeln('This is server absent!');
kk:=1;
end
else
begin
if((Aserver. ArrayServer_[check] As TServer).TimerList. Count = 0) then
writeln('Information absence!')
else
begin
kol:=(Aserver. ArrayServer_[check] As TServer).TimerList. Count;
for j:=0 to kol-1 do
begin
Writeln((Aserver. ArrayServer_[check] As TServer).TimerList[j]);
end;
end;
end;
end
else
Writeln('Ups, uncorrect change');
// if (i=3)
// begin
// end;
until i = 0
end;
var j:integer;
begin; // Main
Server:=TServer. Create(nil); // Узнали количество
Server. NumberServers(); //
Aserver:=TArrayServer. Create(nil);
Main(nil);
// for j:=0 to Server. number-1 do
// Writeln((Aserver. ArrayServer_[j] As TServer).TimerList[0]);
end.
С привязкой к интерфейсу:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Start: TButton;
Number: TEdit;
Timer : TTimer;
ScrollBox1: TScrollBox;
Q: TTimer;
procedure QTimer(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure StartClick(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
type
{ TServer }
TServer = class(TObject)
protected
TimerList : TStringList;
number, host : integer;
ar_act_ser : array of integer;
active : Boolean;
public
label1:TLabel;
// TimerList1 : array [0..2000] of TStringList;
TimerHost : TStringList;
Timer1 : array[0..2000] of TTimer;
Memo1 : array[0..2000] of TMemo;
constructor Create(Sender : Tobject);
destructor delete;
function NumberServers(): integer;
end;
type
{ ArrayServer }
TArrayServer = class(TObject)
public
ArrayServer_: array of TServer;
constructor Create(Sender : Tobject);
end;
var
Server : Tserver;
Aserver : TArrayServer;
sum : double = 0;
i1 : integer = 0;
num_server : integer = 0;
old_s : integer =2000;
var i:integer;
var h : integer = 240;
constructor TArrayServer. Create(Sender: Tobject);
begin
SetLength( ArrayServer_, Server. number);
for i:=0 to Server. number-1 do
ArrayServer_[i] := TServer. Create(self);
end;
constructor TServer. Create(Sender: TObject); // Конструктор
var s:string;
i:integer;
begin
TimerHost := TStringList. Create;
end;
destructor TServer. delete; // Деструктор
begin
Server. Free;
Aserver. Free;
end;
procedure TForm1.StartClick(Sender: TObject);
var str, strin : string;
vsp: integer;
sum : double;
begin
Form1.Start. Visible := False;
Server:=TServer. Create(nil); // Узнали количество
str := Number. Text;
Server. number := StrToInt(str);
if(Server. number<0 ) then
ShowMessage('Please enter correct number servers')
else
begin
Form1.FormCreate(ScrollBox1);
Aserver:=TArrayServer. Create(nil);
Server. NumberServers();
Q. Enabled:=True;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
end;
procedure TForm1.QTimer(Sender: TObject);
var str, strin, vsp1 : string;
vsp, help1,disable: integer;
help: double;
begin
ScrollBox1.Height:=Form1.Height;
sum:=sum+0.1;
help:=sum;
i1:=0 ;
help1:=Random(Server. number);
disable:=Random(Server. number);
while (i1 < Server. number) do
begin
with Server. Label1 do begin
Parent := ScrollBox1;
Server. Label1.top := 30+52*num_server;
Server. Label1.left := 200;
Server. Label1.Caption := 'Host';
Server. Label1.Visible := True
end;
if(i1=old_s) then
i1:=i1+1
else
begin
strin := FloatToStrF(sum, fffixed,3,1);
Server. Memo1[i1].Lines. Add(strin);
i1:=i1+1;
end;
end;
if(help1 <> num_server) then
begin
strin := FloatToStrF(sum+sum, fffixed,3,1);
Server. Memo1[help1].Lines. Add(strin);
end;
if(disable = num_server) then
begin
if(num_server<Server. number-1) then
begin
vsp1 := IntToStr(num_server);
Server. TimerHost. Add(vsp1);
old_s:=num_server;
num_server:=num_server+1;
for i:=0 to Server. number-1 do
begin
Server. Memo1[i].Lines. Add(strin);
// Server. TimerList1[i].Add(strin);
end;
end
else
begin
num_server:=0;
vsp1 := IntToStr(num_server);
Server. TimerHost. Add(vsp1);
end;
end;
end;
function TServer. NumberServers(): integer;
var kol, i : integer;
begin
SetLength(ar_act_ser, Server. number);
host := 0;
for i:=0 to Server. number do
ar_act_ser[i]:=1;
end;
procedure TForm1.FormCreate(Sender: TObject);
var i, jj:integer;
begin
i:=0;
jj:=0;
for i:=0 to Server. number-1 do
begin
Server. Memo1[i] := TMemo. Create(Form1);
Server. label1 := TLabel. Create(Form1);
jj:=jj+15;
with Server. Memo1[i] do begin
Parent := ScrollBox1;
Server. Memo1[i].top :=jj+40*i;
Server. Memo1[i].left := 10;
Server. Memo1[i].height := 40;
Server. Memo1[i].Caption := ' ';
Server. Memo1[i].Visible := True;
Server. Memo1[i].TabStop:= True;
end;
end;
end;
end.
end.


