BMS-HOSxP Community
HOSxP => Development => ข้อความที่เริ่มโดย: manoi ที่ พฤษภาคม 31, 2013, 11:13:37 AM
-
ช่วงนี้ผมกำลัง port ระบบจาก HOSxP 3.0 ไปเป็น HOSxP XE 4.0 ตอนนี้ทำถึงส่วน Core Development Package ก็เลยมี แนวทางการพัฒนาระบบเสริมใน HOSxP XE มานำเสนอครับ
หลายๆ ท่านที่ได้อบรม Delphi หรือ มีพื้นฐาน Delphi มาแล้ว คงจะต้องชอบแน่ๆ ครับ เพราะโปรแกรมที่ท่านพัฒนาจะสามารถมาอยู่ใน Application เดียวกันกับ HOSxP ได้เลย เพียงแต่เวลา compile ต้องเลือก Compile แบบ Package
มาดูวิธีการกำหนดค่ากันนะครับ
ตอนนี้ตัวเลือกจะอยู่ที่หน้าจอกำหนดค่าการเชื่อมต่อระบบ นะครับ ให้เลือกเปิดใช้งาน Development Package เอาไว้
-
การที่จะบอกให้ HOSxP XE ทำการ Load Development Package ที่เราพัฒนาขึ้นมาเองนั้น ตอนนี้ทำได้ ด้วยการสร้าง file ชื่อ developer_package_list.txt ไว้ที่ Folder เดียวกับ Application นะครับ โดยใส่ชื่อ package ที่เราต้องการให้ Load ไว้ในไฟล์นี้ ตามตัวอย่างนี้ครับ
ในตัวอย่างเราบอกให้ load package ชื่อ HOSxPDeveloperPackageTest.bpl นะครับ
-
ใน Package ตัวอย่างนี้ไม่มีอะไรแค่ 1 Unit ครับ
ตัวอย่าง Source Code ของ Package นี้
package HOSxPDeveloperPackageTest;
{$R *.res}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$IMPLICITBUILD ON}
requires
rtl,
vcl;
contains
HOSxPDeveloperTestUnit in 'HOSxPDeveloperPackageTest\HOSxPDeveloperTestUnit.pas' {HOSxPDeveloperTestForm};
end.
-
แต่สิ่งที่สำคัญจริงๆ จะอยู่ใน Unit ที่เป็น MainForm ของระบบงานของเรานะครับ ตัวอย่าง
unit HOSxPDeveloperTestUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
THOSxPDeveloperTestForm = class(TForm)
Panel1: TPanel;
private
{ Private declarations }
public
{ Public declarations }
class procedure MenuButtonClick(Sender:TObject);
end;
var
HOSxPDeveloperTestForm: THOSxPDeveloperTestForm;
implementation
uses RTTI;
var MenuButtonClickEvent : TNotifyEvent;
{$R *.dfm}
function ExecuteRTTIFunction(UnitClassname, FunctionName: String;
Args: Array of Tvalue): Tvalue;
var
c: TRttiContext;
m: TRttiMethod;
t: TRttiInstanceType;
begin
c := TRttiContext.Create;
t := (c.FindType(UnitClassname) as TRttiInstanceType);
c.Free;
if assigned(t) then
begin
m := t.GetMethod(FunctionName);
if assigned(m) then
begin
Result := m.Invoke(t.MetaclassType, Args);
end;
end
else
begin
showmessage('Type not found : ' + UnitClassname);
end;
end;
function ExecuteRTTIObjectMethod(Obj: TObject; MName: String;
Args: Array of Tvalue): Tvalue;
var
c: TRttiContext;
r: TRttiType;
t: TRttiInstanceType;
Method: TRttiMethod;
begin
c := TRttiContext.Create;
try
r := c.FindType(Obj.UnitName + '.' + Obj.ClassName);
for Method in r.GetDeclaredMethods do
begin
if SameText(Method.Name, MName) then
begin
Result := Method.Invoke(Obj, Args);
break;
end;
end;
finally
c.Free;
end;
end;
{ THOSxPDeveloperTestForm }
class procedure THOSxPDeveloperTestForm.MenuButtonClick(Sender: TObject);
begin
showmessage('Click');
end;
var Mainform:TForm;
initialization
MainForm:= TForm(ExecuteRTTIFunction('MainFormUnit.TMainForm','GetMainForm',[]).AsObject);
{ ExecuteRTTIObjectMethod(Mainform, 'AddLargeMenuButton',
['TabName', 'GroupName', 'ButtonCaption','HOSxPDeveloperTestUnit.THOSxPDeveloperTestForm',
true, // showmodal or show
false // reuse old form case mdichild
,-1]); }
ExecuteRTTIObjectMethod(Mainform, 'AddLargeMenuButton',
['TabName', 'GroupName', 'ButtonCaption','HOSxPDeveloperTestUnit.THOSxPDeveloperTestForm',
false, // showmodal or show
true // reuse old form case mdichild
,-1]);
end.
-
ตัวอย่าง SourceCode ใน rar ครับเอาไป แก้ไข และ Compile เพื่อทดสอบได้
ใช้ Delphi XE นะครับ
ตัว HOSxP XE Download ได้จากกระทู้นี้ครับ
http://hosxp.net/index.php?option=com_smf&Itemid=28&topic=29961.0
หมายเหตุ เวลาเอา Package ไปแก้ ให้เปลี่ยนชื่อ package และ unit ใน Package ใหม่นะครับ เพราะ Package ชื่อ HOSxPDeveloperPackageTest จะมีอยู่แล้ว ไม่งั้นจะถูกระบบ auto upgrade download มาทับครับ
-
ขอถามตอนะครับพอดีผมเป็นมือใหม่ :D
1. Hosxp ต้องเป็นเวอร์ชั่นไหนครับ
2 developer_package_list.txt ไว้ที่ Folder เดียวกับ Application หมายถึง hosxp หรือโปรแกรมที่ผมสร้างขึ้นครับ
-
ตัวโปรแกรมที่สร้างขึ้น จะต้อง compile แบบ Package ครับ จะได้แฟ้มเป็น .bpl แทนที่จะเป็น .exe
นำไฟล์นี้มาไว้ใน Folder เดียวกับ HOSxP XE ครับ แล้วไปเขียนบอกให้ Load แฟ้มนี้ใน file developer_package_list.txt ที่อยู่ใน Folder ของ HOSxP XE เช่นเดียวกันครับ
-
... สุดยอดเลยครับ อ.mn ... :D :D :D ...
-
คราวนี้มาดูตัวอย่างการเรียกใช้งานระบบการเชื่อมต่อกับ Database ที่อยู่ใน HOSxP XE บ้าง เราจะใช้ RTTI มาช่วยครับ ตัวอย่าง
procedure THOSxPDeveloperTestForm.Button1Click(Sender: TObject);
begin
ClientDataset1.Data:=ExecuteRTTIFunction('BMSDBClientUtil.TBMSDBClient','hosxp_getdataset',['select * from '+edit1.Text]).AsVariant;
end;
หรือการ Update clientdataset ก็สามารถทำได้ดังนี้
procedure THOSxPDeveloperTestForm.Button2Click(Sender: TObject);
var
tc: TClientDataSet;
tc_string: string;
begin
if ClientDataSet1.changecount > 0 then
begin
tc := TClientDataSet.Create(nil);
tc.Data := ClientDataSet1.Delta;
tc_string := ExecuteRTTIFunction('BMSDBClientUtil.TBMSDBClient',
'ComponentToString', [tc]).AsString;
ExecuteRTTIFunction('BMSDBClientUtil.TBMSDBClient', 'hosxp_updatedelta',
[tc_string, 'select * from ' + Edit1.Text]);
tc.Free;
ClientDataSet1.mergechangelog;
end;
end;
-
ระบบ RTTI นี้ยังสามารถเข้าถึง Object Class อื่นๆ ที่มีอยู่ใน Application เดียวกันได้ด้วย อย่างเช่น การค้นหาชื่อผู้ป่วย ก็สามารถเรียกใช้งานได้แบบนี้
procedure THOSxPDeveloperTestForm.Button3Click(Sender: TObject);
var s:string;
begin
s:=vartostr(ExecuteRTTIFunction('PatientSearchFormUnit.TPatientSearchForm','GetPatientSearchHNResultDialog',[]).AsVariant);
if s<>'' then
edit2.text:=s;
end;
-
สอบถามครับ เราสามารถ get connection มาใช้ใน dataset ที่เขียนใน unit ใหม่อย่างไรครับ
-
หรือการ Load Frame ของการทำงานต่างๆ มาใช้งาน (ใน HOSxP XE 4.0 ระบบการทำงานต่างๆ จะถูก แยกออกมาให้สามารถ Reuse ได้ในระบบงานอื่นๆทุกระบบครับ เช่น ระบบสั่งยา ระบบลงผลวินิจฉัย ฯลฯ )
procedure THOSxPDeveloperTestForm.Button4Click(Sender: TObject);
var vn:string;
begin
SafeLoadPackage('HOSxPSubModulePackage.bpl');
if not assigned(HOSxPSubModuleOneStopServiceDM) then
begin
HOSxPSubModuleOneStopServiceDM:= TDataModule(ExecuteRTTIFunction('HOSxPSubModuleOneStopServiceDMU.THOSxPSubModuleOneStopServiceDM', 'Create',
[Application]).AsObject);
end;
vn:= ExecuteRTTIFunction('BMSDBClientUtil.TBMSDBClient', 'GetSQLData',['select vn from ovst order by vn desc limit 1']).AsString;
ExecuteRTTIObjectMethod(HOSxPSubModuleOneStopServiceDM,'PrepareVisitData',[vn]);
FHOSxPSubModuleOneStopServiceDiagnosisEntryFrame :=
TFrame(ExecuteRTTIFunction
('HOSxPSubModuleOneStopServiceDiagnosisEntryUnit.THOSxPSubModuleOneStopServiceDiagnosisEntryFrame', 'create',
[Self]).AsObject);
FHOSxPSubModuleOneStopServiceDiagnosisEntryFrame.Parent := groupbox1;
FHOSxPSubModuleOneStopServiceDiagnosisEntryFrame.Align := alclient;
SetRTTIObjectProperty(FHOSxPSubModuleOneStopServiceDiagnosisEntryFrame,'HOSxPSubModuleOneStopServiceDM',HOSxPSubModuleOneStopServiceDM);
end;
Download ตัวอย่างจาก attachment ของ reply นี้นะครับ
-
สอบถามครับ เราสามารถ get connection มาใช้ใน dataset ที่เขียนใน unit ใหม่อย่างไรครับ
ไม่จำเป็นต้องใช้ connection ตรงๆ ครับ เรียกใช้คำสั่ง SQL เอาผลลัพท์มาเป็น data ของ ClientDataset ได้เลยครับ
-
ใครกำลังทดสอบครั้งแรก ฝาก Download ใหม่นะครับ ตัว HOSxP-XE ตัวเดิมเข้าครั้งแรก จะกดปุ่ม Connection ไม่ได้ครับ
http://hosxp.net/bms/BMS-HOSxP-XE-Beta.rar
-
เดี๋ยวรอให้มีคนตามทันแล้วผมจะอธิบายต่อนะครับ :)
-
ใครกำลังทดสอบครั้งแรก ฝาก Download ใหม่นะครับ ตัว HOSxP-XE ตัวเดิมเข้าครั้งแรก จะกดปุ่ม Connection ไม่ได้ครับ
http://hosxp.net/bms/BMS-HOSxP-XE-Beta.rar
บันทึกแล้วขึ้นแบบนี้ครับ
-
กดปุ่ม Show bugreport ครับ ไปลบแฟ้ม HOS-WIN32.ini ออกก่อน
-
ลองรันโปรแกรมแล้วขึนแบบนี้ครับ ???
-
ต้อง Run แฟ้มชื่อ StartApplication ครับ
-
;D ;D ;D
-
ขึ้นแบบนี้แทนครับอาจารย์
ต้อง Run แฟ้มชื่อ StartApplication ครับ
-
ลองแก้แฟ้มนี้ใหม่ เพิ่มไปตามนี้ครับ แก้ให้ cd ไปที่ Application folder ก่อนครับ
-
ผมลองสร้าง Package แล้วลองกด Run เจอ error ตามรูปครับ กด compile ผ่านนะครับ
-
ตัว Package เวลา compile แล้วจะ Run ไม่ได้ครับ ต้องเอาไป Load ใช้ ซึ่งกรณีนี้ก็คือไปกำหนดให้ HOSxP XE โหลด จาก แฟ้ม developer_package_list.txt นะครับ