Разработка клиентского и серверного приложений для информационных систем с адаптивным интерфейсом

Анализ предметной области, формулировка общих и специальных требований к информационной системе с адаптивным интерфейсом. Разработка структур данных, программного обеспечения, модуля бизнес-логики, клиентского приложения; администрирование сервера.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 20.07.2014
Размер файла 2,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

При проведении наладочных работ, а так же в процессе эксплуатации ВДТ и ПК человек может прикоснуться к находящимся под напряжением проводникам электрического тока. Персональные ЭВМ относятся к электроустановкам напряжением до 1000 В., исключение составляют дисплеи, в которых напряжение питания анодов электронно-лучевых трубок составляет несколько киловольт.

При организации рабочего места пользователя ВДТ и ПЭВМ обеспечивается соответствие конструкции всех элементов рабочего места и их взаимного положения эргономическим требованиям.

Конструкция рабочего стола обеспечивает оптимальное размещение на рабочей поверхности используемого оборудования с учетом его количества и конструктивных особенностей (размер ВДТ и ПЭВМ, клавиатуры, пюпитра и др.) характера работы.

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

Экран видеомонитора находится от глаз пользователя на оптимальном расстоянии 600-700 мм, но не ближе 500 мм с учетом размеров алфавитно-цифровых знаков и символов. Конструкция монитора обеспечивает возможность фронтального наблюдения экрана путем поворота корпуса в горизонтальной плоскости вокруг вертикальной оси в пределах 30 и в вертикальной плоскости вокруг горизонтальной оси в пределах 30 с фиксацией в заданном положении.

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

Рабочие места с ВДТ и ПЭВМ по отношению к световым проемам располагаются так, чтобы естественный свет падал сбоку, преимущественно слева.

Схемы размещения рабочих мест с ВДТ и ПЭВМ учитывают расстояния между рабочими столами с видеомониторами (в направлении тыла поверхности одного видеомонитора и экрана другого), которые составляют не менее 2,0 м, а расстояния между боковыми поверхностями видеомониторов не менее 1,2 м.

Естественное освещение осуществляется через светопроемы, ориентированные, преимущественно на север и северо-восток и обеспечивать коэффициент естественной освещенности (к.е.о.) не ниже 1,2% в зонах с устойчивым снежным покровом. Искусственное освещение в помещениях эксплуатации ВДТ и ПЭВМ осуществляется системой общего равномерного освещения. В случаях преимущественной работы с документами, допускается применение системы комбинированного освещения.

Освещенность на поверхности стола в зоне размещения рабочего документа составляет 300-500 лк. Для подсветки документов допускается установка светильников местного освещения.

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

Работы на ВДТ и ПЭВМ по тяжести и энергозатратам относятся к категории - легкие физические работы (1а,1б). К категории 1а относятся работы, производимые сидя и не требующие физического напряжения, при которых энергозатраты составляют до 120 ккал/ч. При выполнении таких работ, температура воздуха должна быть в холодный период года не более 2224°C, в теплый период года не более 23ч25°С. При работе с программой, работа относится к категории 1а.

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

Площадь на одно рабочее место с ВДТ или ПЭВМ для взрослых пользователей должна составлять не менее 6,0 кв. м., а объем не менее 20,0 куб. м.

Для внутренней отделки интерьера помещений с мониторами и ПЭВМ должны использоваться диффузно - отражающиеся материалы с коэффициентом отражения для потолка - 0,7-0,8; для стен - 0,5-0,6; для пола - 0,3-0,5.

В помещениях с ВДТ и ПК присутствуют все три основных фактора, необходимых для возникновения пожара.

Особенностью современных электронных устройств является очень высокая плотность расположения элементов электронных схем. При прохождении электрического тока по проводникам и деталям выделяется тепло, что в условиях высокой плотности может привести к перегреву.

В качестве изоляции проводов и кабелей применяют полиэтилен, являющийся горючим материалом. Если монтажные провода с такой изоляцией соприкоснуться с сильно нагретой поверхностью, то изоляция расплавится, провод оголится и произойдет короткое замыкание. Под действием электрических искр изоляция проводов может загореться.

Наиболее пожароопасным местом являются кабельные линии. Наличие горючего изоляционного материала, вероятных источников зажигания в виде электрических искр и дуг, разветвленность и недоступность делают кабельные линии местом вероятного возникновения и развития пожара.

По взрыво-пожароопасности помещения с ВДТ и ПК относятся к категории В - пожароопасные (в помещениях имеются твердые сгораемые вещества и материалы).

5.2 Решение поставленной задачи

5.2.1 Режим труда и отдыха при работе с ПК

Профессиональные пользователи ВДТ и ПЭВМ должны проходить обязательные предварительные (при поступлении на работу) и периодические осмотры в порядке и в сроки, установленные Минздравмедпромом России и Госкомсанэпиднадзором России.

Рациональный режим труда и отдыха предусматривает соблюдение определенной длительности непрерывной работы на ПК и перерывов, регламентированных с учетом продолжительности рабочей смены, вида и категории трудовой деятельности.

Выделяют три вида работ, выполняемых на ПК: группа А - работа по считыванию информации с экрана с предварительным запросом, группа Б - работа по выводу информации, группа В - творческая работа в режиме диалога с ПК. Работа пользователей системы относится к группе В. Категории тяжести и напряженности работы на ПК (I, II, III) определяются уровнем нагрузки за рабочую смену: для группы В - по суммарному времени непосредственной работы на ПК (таблица 5.2).

Таблица 5.2

Виды и категории трудовой деятельности с ПК

Категория работы (по тяжести и напряженности работы с ВДТ и ПЭВМ)

Уровень нагрузки за рабочую смену при видах работы на ПК

Группа В, час

I

до 2,0

II

до 4,0

III

до 6,0

5.2.2 Электромагнитные излучения

Мероприятия по снижению излучений включают:

мероприятия по сертификации ПЭВМ (ПК) и аттестации рабочих мест;

– применение мониторов с антибликовым и антистатическим покрытием;

– применение экранов и фильтров;

– организационно-технические мероприятия.

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

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

При эксплуатации защитный фильтр плотно устанавливается на экране дисплея и надежно заземляется. Заземление подключается к общему контуру заземления.

5.2.3 Шум

Снижение шума, создаваемого на рабочих местах внутренними источниками, а также шума, проникающего извне, осуществляется следующими методами:

уменьшением уровня шума в источнике с помощью упругих прокладок между основанием машины и опорной поверхностью;

– рациональной планировкой помещения и правильностью расположения оборудования;

– уменьшением шума по пути его распространения;

– применением звукоизолирующих кожухов, когда это не мешает технологическому процессу;

– с помощью шумозащитных экранов;

– уменьшением уровня шума, проникающего в помещение через воздуховоды, кондиционеры и вентиляционные системы, с помощью глушителей;

При планировке помещения наиболее шумящее оборудование необходимо располагать вдали от терминалов и другого сервисного оборудования.

5.2.4 Электробезопасность

Для соблюдения электробезопасности конструкция электрических устройств соответствует условиям их эксплуатации и обеспечивает защиту персонала от соприкосновения с токоведущими частями.

Заземление является основной технической мерой защиты в сетях с изолированной централью.

Защитное отключение представляет собой быстродействующую защиту, обеспечивающую автоматическое отключение электроустановок при возникновении опасности поражения человека.

Еще одним средством защиты является недоступность токоведущих частей. Все токоведущие части ВДТ и ПК закрыты корпусом. Снимать корпус при включенном оборудовании запрещается.

5.2.5 Естественное и искусственное освещение

Местное освещение на рабочих местах операторов обеспечивается светильниками, которые устанавливаются непосредственно на рабочем столе или на вертикальных панелях специального оборудования с вмонтированными в него экранами видеотерминалов.

Общее освещение выполняется в виде сплошных или прерывистых линий светильников.

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

В качестве источников света при искусственном освещении применяются преимущественно люминесцентные лампы типа ЛБ и ТЛБ, мощностью 20, 40 и 80 Вт.

Располагать компьютер надо так, чтобы окно не находилось спереди. В противном случае необходимо занавесить окно плотными шторами или жалюзи.

5.2.6 Микроклимат

Вентиляцию по месту действия подразделяют на общеобменную и местную. В помещениях, где работают пользователи ПЭВМ, применяется общеобменная проточно-вытяжная вентиляция в сочетании с местной, как искусственной, так и естественной. Общеобменная вентиляция используется в помещении для создания соответствующих микроклиматических параметров, местная -- для охлаждения ЭВМ и вспомогательных устройств.

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

Для повышения влажности воздуха в помещениях с мониторами ПЭВМ следует применять увлажнители воздуха, заправляемые ежедневно дистиллированной или прокипяченной питьевой водой.

5.2.7 Пожарная безопасность

Для увеличения пожарной безопасности при эксплуатации ПЭВМ применяются следующие меры:

- оборудовать помещения противопожарной сигнализацией;

- оборудовать помещения средствами пожаротушения;

- установить контроль нагрузки в электрической сети;

- установить контроль качества электрических соединений;

- строго соблюдается режим эксплуатации;

Для тушения пожаров в начальной стадии их возникновения широко применяются огнетушители.

Заключение

Предложенная реализация разработки многоуровневой информационной системы с адаптивным интерфейсом обеспечивает разработчику кардинальное снижение трудозатрат и сроков на разработку систем (на программирование и отладку клиентской части приложения) за счет минимизации программирования, замены программирования работой с мастерами и оболочками для настроек приложения. Предлагаемый подход позволяет существенно упростить процедуру разработки и повысить гибкость приложений баз данных.

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

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

Приложение 1

Листинг файла RDM.pas

unit RDM;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses

Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom,

DataBkr,

DBClient, JobsAppSrv_TLB, StdVcl, Provider, DB, DBTables, DBLocal,

Variants,

StrUtils, JobAppSrvForm_U;

type

DynArrayOfVariant = array of Variant;

TExecProc= procedure (var CDSetBuf : TClientDataSet;ParamsList :

DynArrayOfVariant);

TProcGetDataFromMemory = procedure (var CDSetBuf :

TClientDataSet;ParamsList : DynArrayOfVariant) of object;

TProcSetDataToMemory = procedure (ParamsList : DynArrayOfVariant) of

object;

TXMLFldDescr = record

attrname : string[64];

fieldtype: string[9];

width : longword;

end;

procs=record

procname:string;

procCal :string;

end;

TJobs = class(TRemoteDataModule, IJobs)

Database1: TDatabase;

TmpQuery1: TQuery;

TmpQuery2: TQuery;

TmpQuery3: TQuery;

procedure RemoteDataModuleCreate(Sender: TObject);

procedure RemoteDataModuleDestroy(Sender: TObject);

procedure Database1AfterDisconnect(Sender: TObject);

private

{ Private declarations }

TempStream : TMemoryStream;

TempXMLRecordSet :TStringList;

FldArr : array of TXMLFldDescr;

TmpRecord : DynArrayOfVariant;

ParamsArray : DynArrayOfVariant;

PRocName,FieldsStr,WhereStr,OrderByStr,GroupByStr : string;

SelectProcedure: TProcGetDataFromMemory;

ExecuteProcedure: TProcSetDataToMemory;

procedure OpenQuery(TmpQuery : TQuery; SqlCmd : string);

procedure ExecuteQuery(TmpQuery : TQuery; SqlCmd : string);

procedure ExecuteProcedure(ParamsList : DynArrayOfVariant);

protected

class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID:

string); override;

function ExecQuery(const SqlCmd: WideString): WideString; safecall;

function SelectQuery(const SqlCmd: WideString): OleVariant; safecall;

function AppSrvConnect(const hostname, username, pwd: WideString):

WideString; safecall;

function AppSrvInit(const DBSrvName, username,

pwd: WideString): WideString; safecall;

public

{ Public declarations }

Host,User,PID : string;

end;

var

NullDate: TDateTime;

implementation

{$R *.DFM}

var

MemoryState: integer; { -1 - незагружена, 0 - загружается, 1 - готова к

работе}

function getproc(procname:string):string;stdcall; external 'MemProc.dll';

function HourToDateTime(P: PDouble): PChar; cdecl; external 'StrAdd.dll'

name 'HOURTODATETIME';

function DateTimeToHour(S: PChar): Double; cdecl; external 'StrAdd.dll'

name 'DATETIMETOHOUR';

function AndBit(A, B: PInteger): Integer; cdecl; external 'StrAdd.dll' name

'AANDBIT';

function PosStr (S1, S2: PChar): Integer; cdecl; external 'StrAdd.dll' name

'APOSSTR';

function FirstWord (S: PChar; Ch: PChar): PChar; cdecl; external

'StrAdd.dll' name 'AFIRSTWORD';

function DelFirstWord (S: PChar; Ch: PChar): PChar; cdecl; external

'StrAdd.dll' name 'ADELFIRSTWORD';

function RoundExt(E: PDouble; L: PInteger): Double; cdecl; external

'StrAdd.dll' name 'AROUNDEXT';

function Trim(s : string) : string;

begin

while Copy(s,1,1)=' ' do Delete(s,1,1);

while Copy(s,Length(s),1)=' ' do Delete(s,Length(s),1);

Result:=s;

end;

function EnteringInSet(Value : integer; SetValues : Variant):boolean;

var

i : integer;

tmp : array of Variant;

begin

Result:=false;

tmp:=SetValues;

for i:=0 to High(tmp) do

if Value=SetValues[i] then begin

Result:=true;

exit

end;

end;

function DateTimeToStrLatMonth(DateTime :TDateTime): string;

Const

LatMonth = 'JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV

DEC';

var

sRus,sLat : string[3];

i : integer;

begin

Result:=FormatDateTime('dd-mmm-yyyy',DateTime);

sRus:=Copy(Result,Pos('-',Result)+1,3);

i:=Pos(AnsiUpperCase(sRus),RusMonth);

if i>0 then begin

sLat:=Copy(LatMonth,i,3);

Result:=AnsiReplaceStr(Result,sRus,sLat);

end;

end;

class procedure TJobs.UpdateRegistry(Register: Boolean; const ClassID,

ProgID: string);

begin

if Register then

begin

inherited UpdateRegistry(Register, ClassID, ProgID);

EnableSocketTransport(ClassID);

EnableWebTransport(ClassID);

end else

begin

DisableSocketTransport(ClassID);

DisableWebTransport(ClassID);

inherited UpdateRegistry(Register, ClassID, ProgID);

end;

end;

procedure TJobs.OpenQuery(TmpQuery : TQuery; SqlCmd : string);

begin

TmpQuery.Active:=false;

TmpQuery.SQL.Text:=SqlCmd;

TmpQuery.Active:=true;

end;

procedure TJobs.ExecuteQuery(TmpQuery : TQuery; SqlCmd : string);

begin

TmpQuery.Active:=false;

TmpQuery.SQL.Text:=SqlCmd;

TmpQuery.ExecSQL;

end;

procedure TJobs.GetParamsFromCommandText(var SqlCmd : string;out

ParametersArray: DynArrayOfVariant);

var

i,j,ColParam,L : integer;

TmpArray : array of string;

s,ParamStr : string;

begin

SqlCmd:=Trim(SqlCmd);

i:=Pos(' FROM ',SqlCmd);

FieldsStr:=Copy(SqlCmd,8,i-8);

Delete(SqlCmd,1,i+5);

s:=SqlCmd;

i:=Pos(' WHERE ',SqlCmd);

if i=0 then begin

i:=Pos(' ORDER ',SqlCmd);

j:=Pos(' GROUP ',SqlCmd);

if (i>j) and (j>0) or (i=0) then i:=j;

end;

if i=0 then i:=Length(SqlCmd);

ParamStr:=Copy(SqlCmd,1,i);

Delete(SqlCmd,1,i);

if SqlCmd<>'' then SqlCmd:=' '+SqlCmd;

i:=Pos('(',ParamStr);

if i=0 then i:=Length(ParamStr)+1;

ProcName:=Copy(ParamStr,1,i-1);

GetSelectProcAdress(ProcName);

Delete(ParamStr,1,i);

if ParamStr='' then exit;

i:=Pos(')',ParamStr);

Delete(ParamStr,i,Length(ParamStr)-i+1);

ColParam:=0;

while ParamStr<>'' do begin

Inc(ColParam);

SetLength(TmpArray,ColParam);

L:=Pos(',',ParamStr);

if L=0 then L:=Length(ParamStr)+1;

s:=Copy(ParamStr,1,L-1);

while (s<>'') and (s[1]=' ') do Delete(s,1,1);

while (s<>'') and (s[Length(s)]=' ') do Delete(s,Length(s),1);

if s[1]='''' then Delete(s,1,1);

if s[Length(s)]='''' then Delete(s,Length(s),1);

Delete(ParamStr,1,L);

TmpArray[ColParam-1]:=s;

end;

ParametersArray:=VarArrayCreate([0,ColParam-1],varVariant);

for i:=0 to ColParam-1 do begin

ParametersArray[i]:=TmpArray[i];

end;

end;

procedure TJobs.ExecuteProcedure(ParamsList : DynArrayOfVariant);

const

RecCount = 2500;

var

intParam1 : integer;

dblParam2 : double;

dtParam3 : TDateTime;

strParam4 : string;

i : integer;

TmpArr :DynArrayOfVariant;

begin

try

intParam1:=StrToInt(ParamsList[0]);

dblParam2:=StrToFloat(ParamsList[1]);

dtParam3:=StrToDateTime(ParamsList[2]);

strParam4:=ParamsList[3];

except

on E:Exception do

raise EExternalException.CreateFmt('Error');

end;

end;

function TJobs.ExecQuery(const SqlCmd: WideString): WideString;

var

CmdText : string;

i,j,ColParam,L : integer;

TmpArray : array of string;

s,ParamStr : string;

begin

try

JobAppSrvForm.ModifyUserInfo(User,Host,PID);

CmdText:=AnsiUpperCase(Trim(SqlCmd));

ParamStr:=CmdText;

i:=Pos('(',CmdText);

if i=0 then i:=Length(CmdText)+1;

ProcName:='';

for j:=i-1 downto 1 do begin

if CmdText[j]=' ' then break;

ProcName:=CmdText[j]+ProcName;

end;

GetExecuteProcAdress(ProcName);

Delete(ParamStr,1,i);

ColParam:=0;

SetLength(TmpArray,ColParam);

if ParamStr<>'' then begin

i:=Pos(')',ParamStr);

Delete(ParamStr,i,Length(ParamStr)-i+1);

while ParamStr<>'' do begin

Inc(ColParam);

SetLength(TmpArray,ColParam);

L:=Pos(',',ParamStr);

if L=0 then L:=Length(ParamStr)+1;

s:=Copy(ParamStr,1,L-1);

while (s<>'') and (s[1]=' ') do Delete(s,1,1);

while (s<>'') and (s[Length(s)]=' ') do Delete(s,Length(s),1);

if s[1]='''' then Delete(s,1,1);

if s[Length(s)]='''' then Delete(s,Length(s),1);

Delete(ParamStr,1,L);

TmpArray[ColParam-1]:=s;

end;

end;

ParamsArray:=VarArrayCreate([0,ColParam-1],varVariant);

for i:=0 to ColParam-1 do begin

ParamsArray[i]:=TmpArray[i];

end;

ExecuteProcedure(ParamsArray);

Result:='OK';

except

Result:='ER';

end;

end;

function TJobs.AppSrvConnect(const hostname, username, pwd:

WideString): WideString;

begin

try

if not JobAppSrvForm.ServerReady then begin

Result:='Can''t connect';

exit;

end;

Host:=HostName;

User:=UserName;

with DataBase1 do begin

Params.Values['SERVER NAME'] :=

JobAppSrvForm.MainDB.Params.Values ['SERVER NAME'];

Params.Values['USER NAME'] := JobAppSrvForm.MainDB.Params.Values

['USER NAME'];

Params.Values['PASSWORD'] := JobAppSrvForm.MainDB.Params.Values

['PASSWORD'];

end;

if not DataBase1.Connected then begin

DataBase1.Connected:=true;

JobAppSrvForm.UserDBConnectInfo(JobAppSrvForm.DBSERVER_NAM

E,User,Host,PID)

end;

Result:=JobAppSrvForm.DBSERVER_NAME;

except

on E:Exception do

Result:=E.Message;

end;

end;

procedure TJobs.RemoteDataModuleCreate(Sender: TObject);

begin

TempStream:=TMemoryStream.Create;

TempXMLRecordSet:=TStringList.Create;

end;

procedure TJobs.RemoteDataModuleDestroy(Sender: TObject);

begin

TempStream.Free;

TempXMLRecordSet.Free

end;

function TJobs.SelectQuery(const SqlCmd: WideString): OleVariant;

var

CmdText,str : string;

i,j : integer;

CDSetPart,CDSetFull : TClientDataSet;

function withoutGroupByFunc : OleVariant;

var

i,j : integer;

begin

TempStream.Position:=0;

CDSetPart.LoadFromStream(TempStream);

CDSetPart.EmptyDataSet;

j:=CDSetFull.FieldCount-1;

while not CDSetFull.Eof do begin

CDSetPart.Insert;

for i:=0 to j do

CdSetPart.Fields[i].Value:= CdSetFull.Fields[i].Value;

CDSetFull.Next;

end;

Приложение 2

Листинг файла MemProc.dpr

library MemProc;

uses

sharemem, DB, Dialogs, DBClient, variants, SysUtils, Classes, windows;

{$R *.res}

type

DynArrayOfVariant=array of Variant;

TXMLFldDescr = record

attrname : string[64];

fieldtype: string[9];

width : longword;

end;

TModelInfo = record

description : string;

version : double;

end;

var

NullDate:TDateTime;

FldArr : array of TXMLFldDescr;

TempXMLRecordSet :TStringList;

TempStream : TMemoryStream;

procedure Suspend(var CDSetBuf : TClientDataSet;var

TmpRecord:DynArrayOfVariant);

var

j: integer;

begin

CDSetBuf.Insert;

for j:=0 to CDSetBuf.FieldCount-1 do

if (CDSetBuf.Fields[j].DataType=ftInteger) or

(CDSetBuf.Fields[j].DataType=ftSmallint) then

CDSetBuf.Fields[j].asInteger:=TmpRecord[j]

else

if (CDSetBuf.Fields[j].DataType=ftFloat) then

CDSetBuf.Fields[j].AsFloat:=TmpRecord[j]

else

if (CDSetBuf.Fields[j].DataType=ftDateTime) then

CDSetBuf.Fields[j].asDateTime:=TmpRecord[j]

else

CDSetBuf.Fields[j].AsString:=TmpRecord[j];

CDSetBuf.Post;

SetLength(TmpRecord,0);

end;

procedure MakeRecordSet(var CDSetBuf : TClientDataSet);

const

XMLMetaHeader='<?xml version="1.0" standalone="yes"?>

<DATAPACKET Version="2.0"><METADATA><FIELDS>';

XMLNumFld='<FIELD attrname="%s" fieldtype="%s"/>';

XMLVarcharFld='<FIELD attrname="%s" fieldtype="string"

WIDTH="%d"/>';

XMLCharFld='<FIELD attrname="%s" fieldtype="string"

SUBTYPE="FixedChar" WIDTH="%d"/>';

XMLMetaEnd='</FIELDS><PARAMS

LCID="0"/></METADATA><ROWDATA>';

XMLDataEnd='</ROWDATA></DATAPACKET>';

var

i,j,FieldsCount : integer;

TmpStr : string;

function DateTimeToXMLFmt(DT :TDateTime) : string;

begin

DateTimeToString(Result,'yyyymmddhh:nn:sszzz',DT);

Insert('T',Result,9);

end;

function VariantToStr(FldValue : Variant;FldType : string) : string;

begin

if FldType='i4' then Result:=IntToStr(Integer(FldValue)) else

if FldType='r8' then Result:=FloatToStr(Extended(FldValue)) else

if FldType='dateTime' then

Result:=DateTimeToXMLFmt(TDateTime(FldValue)) else

Result:=String(FldValue);

end;

begin

TempXMLRecordSet.Clear;

TempXMLRecordSet.Add(XMLMetaHeader);

FieldsCount:=High(FldArr);

for i:=Low(FldArr) to FieldsCount do begin

with FldArr[i] do

if fieldtype='string' then

TmpStr:=Format(XMLVarcharFld,[attrname,width])

else

if fieldtype='FixedChar' then

TmpStr:=Format(XMLCharFld,[attrname,width])

else

TmpStr:=Format(XMLNumFld,[attrname,fieldtype]);

TempXMLRecordSet.Add(TmpStr);

end;

TempXMLRecordSet.Add(XMLMetaEnd);

TmpStr:='<ROW ';

for j:=0 to FieldsCount do

with FldArr[j] do

if (fieldtype='string') or (fieldtype='FixedChar') then

TmpStr:=TmpStr+attrname+ '="" '

else

if fieldtype='dateTime' then

TmpStr:=TmpStr+FldArr[j].attrname+

'="'+VariantToStr(Now,FldArr[j].fieldtype)+'" '

else

TmpStr:=TmpStr+FldArr[j].attrname+ '="0" ';

TmpStr:=TmpStr+'/>';

TempXMLRecordSet.Add(TmpStr);

TempXMLRecordSet.Add(XMLDataEnd);

TempStream.Clear;

TempXMLRecordSet.SaveToStream(TempStream);

TempStream.Position:=0;

CDSetBuf.LoadFromStream(TempStream);

CDSetBuf.EmptyDataSet;

end;

procedure XMLFieldDescription(FieldName,FieldType : string;Length :

integer=0);

var

FieldCount : integer;

begin

FieldCount:=High(FldArr)+1;

SetLength(FldArr,FieldCount+1);

with FldArr[FieldCount] do begin

attrname:=FieldName;

if AnsiUppercase(FieldType)='INTEGER' then fieldtype:='i4' else

if AnsiUppercase(FieldType)='SMALLINT' then fieldtype:='i2' else

if AnsiUppercase(FieldType)='FLOAT' then fieldtype:='r8' else

if AnsiUppercase(FieldType)='DOUBLE PRECISION' then fieldtype:='r8'

else

if AnsiUppercase(FieldType)='NUMERIC' then fieldtype:='r8' else

if AnsiUppercase(FieldType)='DECIMAL' then fieldtype:='r8' else

if AnsiUppercase(FieldType)='DATE' then fieldtype:='dateTime' else

if AnsiUppercase(FieldType)='CHAR' then fieldtype:='FixedChar' else

if AnsiUppercase(FieldType)='VARCHAR' then fieldtype:='string';

width:=Length;

end;

end;

procedure GetDataFromMemory(var CDSetBuf :

TClientDataSet;ParamsList : DynArrayOfVariant);

const

RecCount = 2500;

var

intParam1 : integer;

dblParam2 : double;

dtParam3 : TDateTime;

strParam4 : string;

i : integer;

TmpArr :DynArrayOfVariant;

begin

try

intParam1:=0;

dblParam2:=0;

dtParam3:=NullDate;

strParam4:='';

if Length(ParamsList) > 0 then begin

intParam1:=StrToInt(ParamsList[0]);

dblParam2:=StrToFloat(ParamsList[1]);

dtParam3:=StrToDateTime(ParamsList[2]);

strParam4:=ParamsList[3];

end;

Приложение 3

Листинг файла WorkClientForm_U.pas

unit WorkClientForm_U;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, UCDM, Grids, DBGrids, DB, DBClient, MConnect, DBTables,

StdCtrls, Buttons, JobsAppSrv_TLB, Mask, DBCtrls, ComCtrls, ExtCtrls,

ObjBrkr, SConnect;

type

TWorkClientTestForm = class(TForm)

DataSource3: TDataSource;

ClientDataSet3: TClientDataSet;

Panel1: TPanel;

BitBtn2: TBitBtn;

PageControl1: TPageControl;

TabSheet2: TTabSheet;

TabSheet3: TTabSheet;

DBGrid3: TDBGrid;

Panel2: TPanel;

Panel3: TPanel;

BitBtn5: TBitBtn;

DBGrid4: TDBGrid;

DataSource4: TDataSource;

ClientDataSet5: TClientDataSet;

Edit1: TEdit;

Label1: TLabel;

Label2: TLabel;

Edit2: TEdit;

BitBtn6: TBitBtn;

SObjBroker: TSimpleObjectBroker;

DCOMConCommon: TDCOMConnection;

Label3: TLabel;

Edit3: TEdit;

Edit4: TEdit;

Label4: TLabel;

SocketConCommon: TSocketConnection;

procedure BitBtn2Click(Sender: TObject);

procedure BitBtn5Click(Sender: TObject);

procedure ClientDataSet5BeforeGetRecords(Sender: TObject;

var OwnerData: OleVariant);

procedure Button2Click(Sender: TObject);

procedure BitBtn6Click(Sender: TObject);

private

{ Private declarations }

JobsInterface : IJobsDisp;

TempStream : TMemoryStream;

TempXMLRecordSet :TStringList;

procedure GetDataFromMemory(Sender : TObject);

public

{ Public declarations }

end;

var

WorkClientTestForm: TWorkClientTestForm;

ELoginFailed : Exception;

Save_Cursor:TCursor;

implementation

uses PasswordDlg_U;

{$R *.dfm}

procedure HourGlassCursor;

begin

Save_Cursor := Screen.Cursor;

Screen.Cursor := crHourGlass;

end;

procedure NormalCursor;

begin

Screen.Cursor := Save_Cursor;

end;

procedure TWorkClientTestForm.BitBtn2Click(Sender: TObject);

var

EncryptedValues: OleVariant;

R : integer;

i : integer;

s,HostName : string;

sbuf : array [0..255] of char;

pBufLen : dword;

begin

while true do

with PasswordDlg do begin

Label4.Caption:='Ok';

if Showmodal= mrOK then begin

try

HourGlassCursor;

DCOMConCommon.Connected:=false;

for i:=0 to SObjBroker.Servers.Count-1 do

SObjBroker.Servers[i].Enabled:=SObjBroker.Servers[i].ComputerName=cb

AppServerName.Text;

DCOMConCommon.Connected:=true;

JobsInterface:=IJobsDisp(IDispatch(DCOMConCommon.AppServer));

HostName:='';

pBufLen:=255;

GetComputerName(@sbuf,pBufLen);

HostName:=string(sbuf);

s:=JobsInterface.AppSrvConnect(HostName,UserName.text,Password.Text)

;

// s:='localhost';

try

if Pos(ch,s)>0 then

R:=StrToInt('');

PageControl1.Enabled:=true;

Edit4.Text:=s;

Edit3.Text:=cbAppServerName.Text;

BitBtn2.Enabled:=false;

break;

except

if MessageDlg(Message, 0) <> mrYes then

break;

end;

except

on E : Exception do

if MessageDlg(Message, 0) <> mrYes then

break;

end;

end

else break;

end;

NormalCursor;

end;

procedure TWorkClientTestForm.BitBtn5Click(Sender: TObject);

begin

ClientDataSet5.CommandText:=Edit1.Text;

GetDataFromMemory(ClientDataSet5) ;

end;

procedure TWorkClientTestForm.ClientDataSet5BeforeGetRecords(

Sender: TObject; var OwnerData: OleVariant);

begin

GetDataFromMemory(Sender);

Abort

end;

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.