BMS-HOSxP Community

HOSxP => Development => ข้อความที่เริ่มโดย: manoi ที่ พฤษภาคม 31, 2013, 11:13:37 AM

หัวข้อ: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: 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 เอาไว้
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ พฤษภาคม 31, 2013, 11:19:40 AM
การที่จะบอกให้ HOSxP XE ทำการ Load Development Package ที่เราพัฒนาขึ้นมาเองนั้น ตอนนี้ทำได้ ด้วยการสร้าง file ชื่อ developer_package_list.txt  ไว้ที่ Folder เดียวกับ Application นะครับ โดยใส่ชื่อ package ที่เราต้องการให้ Load ไว้ในไฟล์นี้  ตามตัวอย่างนี้ครับ


ในตัวอย่างเราบอกให้ load package ชื่อ HOSxPDeveloperPackageTest.bpl นะครับ
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ พฤษภาคม 31, 2013, 11:21:33 AM
ใน 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.
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ พฤษภาคม 31, 2013, 11:24:32 AM
แต่สิ่งที่สำคัญจริงๆ จะอยู่ใน 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.
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ พฤษภาคม 31, 2013, 11:26:32 AM
ตัวอย่าง 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 มาทับครับ
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: Bond_007 ที่ พฤษภาคม 31, 2013, 11:56:35 AM
ขอถามตอนะครับพอดีผมเป็นมือใหม่  :D
1. Hosxp ต้องเป็นเวอร์ชั่นไหนครับ
2 developer_package_list.txt   ไว้ที่ Folder เดียวกับ Application หมายถึง hosxp หรือโปรแกรมที่ผมสร้างขึ้นครับ
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ พฤษภาคม 31, 2013, 11:58:14 AM
ตัวโปรแกรมที่สร้างขึ้น จะต้อง compile แบบ Package ครับ จะได้แฟ้มเป็น .bpl แทนที่จะเป็น .exe

นำไฟล์นี้มาไว้ใน Folder เดียวกับ HOSxP XE ครับ แล้วไปเขียนบอกให้ Load แฟ้มนี้ใน file  developer_package_list.txt ที่อยู่ใน Folder ของ HOSxP XE เช่นเดียวกันครับ
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: Khuad ที่ พฤษภาคม 31, 2013, 12:00:23 PM

... สุดยอดเลยครับ อ.mn ...  :D  :D  :D ...
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ พฤษภาคม 31, 2013, 12:17:06 PM
คราวนี้มาดูตัวอย่างการเรียกใช้งานระบบการเชื่อมต่อกับ 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;
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ พฤษภาคม 31, 2013, 12:51:18 PM
ระบบ 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;
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: tigerfx ที่ พฤษภาคม 31, 2013, 13:03:22 PM
สอบถามครับ เราสามารถ get connection มาใช้ใน dataset ที่เขียนใน unit ใหม่อย่างไรครับ
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ พฤษภาคม 31, 2013, 13:03:43 PM
หรือการ 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 นี้นะครับ
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ พฤษภาคม 31, 2013, 13:04:27 PM
สอบถามครับ เราสามารถ get connection มาใช้ใน dataset ที่เขียนใน unit ใหม่อย่างไรครับ

ไม่จำเป็นต้องใช้ connection ตรงๆ ครับ เรียกใช้คำสั่ง SQL เอาผลลัพท์มาเป็น data ของ ClientDataset ได้เลยครับ
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ พฤษภาคม 31, 2013, 13:17:05 PM
ใครกำลังทดสอบครั้งแรก ฝาก Download ใหม่นะครับ ตัว HOSxP-XE ตัวเดิมเข้าครั้งแรก จะกดปุ่ม Connection ไม่ได้ครับ

http://hosxp.net/bms/BMS-HOSxP-XE-Beta.rar
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ พฤษภาคม 31, 2013, 13:18:36 PM
เดี๋ยวรอให้มีคนตามทันแล้วผมจะอธิบายต่อนะครับ  :)
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: tigerfx ที่ พฤษภาคม 31, 2013, 13:28:17 PM
ใครกำลังทดสอบครั้งแรก ฝาก Download ใหม่นะครับ ตัว HOSxP-XE ตัวเดิมเข้าครั้งแรก จะกดปุ่ม Connection ไม่ได้ครับ

http://hosxp.net/bms/BMS-HOSxP-XE-Beta.rar

บันทึกแล้วขึ้นแบบนี้ครับ
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ พฤษภาคม 31, 2013, 13:31:18 PM
กดปุ่ม Show bugreport ครับ ไปลบแฟ้ม HOS-WIN32.ini ออกก่อน
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: Bond_007 ที่ พฤษภาคม 31, 2013, 13:53:50 PM
ลองรันโปรแกรมแล้วขึนแบบนี้ครับ  ???
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ พฤษภาคม 31, 2013, 13:56:28 PM
ต้อง Run แฟ้มชื่อ StartApplication ครับ
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: SrWooD ที่ พฤษภาคม 31, 2013, 13:59:00 PM
 ;D ;D ;D
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: Bond_007 ที่ พฤษภาคม 31, 2013, 14:02:23 PM
ขึ้นแบบนี้แทนครับอาจารย์
ต้อง Run แฟ้มชื่อ StartApplication ครับ
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ พฤษภาคม 31, 2013, 14:19:54 PM
ลองแก้แฟ้มนี้ใหม่ เพิ่มไปตามนี้ครับ  แก้ให้ cd ไปที่ Application folder ก่อนครับ
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: Bond_007 ที่ พฤษภาคม 31, 2013, 15:19:42 PM
ผมลองสร้าง Package แล้วลองกด Run เจอ  error ตามรูปครับ กด compile ผ่านนะครับ
หัวข้อ: Re: การพัฒนาระบบ HOSxP Addon Package ใน HOSxP XE 4.0
เริ่มหัวข้อโดย: manoi ที่ มิถุนายน 03, 2013, 11:21:29 AM
ตัว Package เวลา compile แล้วจะ Run ไม่ได้ครับ ต้องเอาไป Load ใช้ ซึ่งกรณีนี้ก็คือไปกำหนดให้ HOSxP XE โหลด จาก แฟ้ม developer_package_list.txt นะครับ