Разработка клиентского и серверного приложений для информационных систем с адаптивным интерфейсом
Анализ предметной области, формулировка общих и специальных требований к информационной системе с адаптивным интерфейсом. Разработка структур данных, программного обеспечения, модуля бизнес-логики, клиентского приложения; администрирование сервера.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 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
Подобные документы
Автоматизация системы снятия показаний счетчиков энергии. Разработка базы данных и клиентского приложения для структур жилищно-коммунального хозяйства, занимающихся составлением квитанций. Описание предметной области. Тестирование клиентского приложения.
курсовая работа [953,3 K], добавлен 01.09.2016Системный анализ предметной области. Выбор инструментальных средств для создания программного обеспечения. Программирование на стороне SQL-сервера. Создание клиентского Win-приложения, пользовательский интерфейс. Физическое проектирование базы данных.
курсовая работа [3,7 M], добавлен 20.11.2013Анализ предметной области. Выработка требований и ограничений. Серверная часть информационной системы. Запросы клиентского приложения. Триггеры для поддержки сложных ограничений целостности в базе данных. Пользовательский интерфейс клиентского приложения.
курсовая работа [2,6 M], добавлен 21.02.2016Разработка базы данных для информационной системы "Библиотека". Системный анализ, инфологическое, даталогическое и физическое проектирование. Программирование бизнес-логики, разработка клиентского приложения. Создание web-приложения, web-доступ.
курсовая работа [3,3 M], добавлен 15.09.2014Разработка клиент-серверного приложения, позволяющего взаимодействовать друг с другом с использованием доступа к базам данных. Проектирование связи сервера с базой данных с помощью технологии ODBC. Разработка интерфейса программы, ее тестирование.
курсовая работа [352,0 K], добавлен 24.08.2016Эксплуатация анализатора качества электроэнергии Satec PM175. Создание документов "Видение" и "Спецификация требований" для системы сбора данных с анализатора. Проектирование серверного и клиентского приложения в среде программного обеспечения LabVIEW.
курсовая работа [830,6 K], добавлен 25.09.2013Понятие баз данных и принципы проектирования информационных систем. Разработка программы для отслеживания финансовой стороны работы компании в среде Delphi 7. Создание таблиц и схемы данных. Разработка клиентского приложения и процедуры добавления данных.
курсовая работа [1,4 M], добавлен 25.04.2012Разработка функциональной модели предметной области. Построение UML диаграмм в среде Pacestar UML Diagrammer. Выбор программных средств разработки. Разработка логической и физической модели данных. Разработка клиентского приложения ИС в среде Access.
курсовая работа [2,2 M], добавлен 09.03.2011Требования, предъявленные к полноценному локальному чату. Протокол передачи данных TCP. Описание программы сервера. Этапы разработки программного продукта. Функция приема сообщений от сервера. Принятие и отправка сообщений всем пользователям чата.
курсовая работа [447,0 K], добавлен 21.01.2016Разработка клиентского приложения для работы с базой данных (БД) санатория. Классификации БД и приложений для работы с ними. Алгоритмическое и программное конструирование БД. Описание объектов предметной области, их атрибутов и связей между ними.
курсовая работа [1,9 M], добавлен 08.01.2014