БАЛТИЙСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ

УНИВЕРСИТЕТ “ВОЕНМЕХ” им. Д. Ф.УСТИНОВА

Кафедра И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.