Ms Project OLE Automation

September 17, 2009 herux 1 comment

Melihat documentasi microsoft tentang Microsoft Office Project … brrr…. buanyakkk !!. sebagai bentuk catatan bagi saya dan mungkin bantuan bagi pembaca maka saya sharing dikit mengenai Object-object yang ada di microsoft Office Project. ini unit interfacenya, yang dipake aja


unit MSProject_Intf;

interface

uses
ActiveX;

Const
Class_ProjectApplication: TGUID = '{36D27C48-A1E8-11D3-BA55-00C04F72F325}';
Class_Projects: TGUID = '{1019A320-508A-11CF-A49D-00AA00574C74}';

type
PjPoolOpen = TOleEnum;
const
pjPromptPool = $00000000;
pjPoolReadOnly = $00000001;
pjPoolReadWrite = $00000002;
pjPoolAndSharers = $00000003;
pjDoNotOpenPool = $00000004;

type
PjMergeType = TOleEnum;
const
pjDoNotMerge = $00000000;
pjMerge = $00000001;
pjPrompt = $00000002;
pjAppend = $00000003;

type
PjSaveType = TOleEnum;
const
pjDoNotSave = $00000000;
pjSave = $00000001;
pjPromptSave = $00000002;

type
PjResourceTypes = TOleEnum;
const
pjResourceTypeWork = $00000000;
pjResourceTypeMaterial = $00000001;
pjResourceTypeCost = $00000002;

type
MSProjectApplication = dispinterface;
Project = dispinterface;
Tasks = dispinterface;

ProjectApplication = MSProjectApplication;

Assignment = dispinterface
['{000C0C45-0000-0000-C000-000000000046}']
property TaskID: Integer dispid 255852547;
property ResourceID: Integer dispid 255852548;
property TaskName: WideString dispid 255852549;
property ResourceName: WideString dispid 255852550;
property Units: OleVariant dispid 255852551;
property Work: OleVariant dispid 255852552;
property Start: OleVariant dispid 255852564;
property Finish: OleVariant dispid 255852565;
property ActualStart: OleVariant dispid 255852566;
property ActualFinish: OleVariant dispid 255852567;
property Delay: OleVariant dispid 255852569;
property Cost: OleVariant dispid 255852570;
property OvertimeCost: OleVariant readonly dispid 255852571;
property ActualCost: OleVariant dispid 255852572;
property RemainingCost: OleVariant readonly dispid 255852573;
property ActualOvertimeCost: OleVariant readonly dispid 255852574;
property RemainingOvertimeCost: OleVariant readonly dispid 255852575;
procedure Delete; dispid 255852680;
property ResourceType: PjResourceTypes readonly dispid 255852820;
property BudgetWork: OleVariant dispid 255853213;
property BudgetCost: OleVariant dispid 255853214;
end;

Assignments = dispinterface
['{000C0C46-0000-0000-C000-000000000046}']
property Application: ProjectApplication readonly dispid 65524;
property Parent: Project readonly dispid 65523;
property Count: Integer readonly dispid 65525;
property UniqueID[Index: Integer]: Assignment readonly dispid 65521;
function Add(TaskID: OleVariant; ResourceID: OleVariant; Units: OleVariant): Assignment; dispid 65526;
property Item[Index: OleVariant]: Assignment readonly dispid 0; default;
property _NewEnum: IUnknown readonly dispid -4;
end;

Resource = dispinterface
['{F59E841B-1518-4466-85EB-CCE914D59AF6}']
property ID: Integer readonly dispid 205520896;
property Name: WideString dispid 205520897;
property Cost: OleVariant readonly dispid 205520908;
property Work: OleVariant readonly dispid 205520909;
property Assignments: Assignments readonly dispid 205520951;
property Index: Integer readonly dispid 205521149;
property type_: PjResourceTypes dispid 205521196;
property CostPerUse: OleVariant dispid 205520914;
end;

Resources = dispinterface
['{000C0C42-0000-0000-C000-000000000046}']
property Application: ProjectApplication readonly dispid 65524;
property Parent: Project readonly dispid 65523;
property Count: Integer readonly dispid 65525;
property UniqueID[Index: Integer]: Resource readonly dispid 65521;
function Add(Name: OleVariant; Before: OleVariant): Resource; dispid 65526;
property Item[Index: OleVariant]: Resource readonly dispid 0; default;
property _NewEnum: IUnknown readonly dispid -4;
end;

Task = dispinterface
['{4A4829B2-31DA-4F61-AF00-8F5CE32B9442}']
property Cost: OleVariant dispid 188743685;
property ID: Integer readonly dispid 188743703;
property Resources: Resources readonly dispid 188743919;
property Assignments: Assignments readonly dispid 188743886;
property Index: Integer readonly dispid 188744040;
property OutlineLevel: Smallint dispid 188743765;
property ActualStart: OleVariant dispid 188743721;
property ActualFinish: OleVariant dispid 188743722;
property Name: WideString dispid 188743694;
property OutlineChildren: Tasks readonly dispid 188743817;
end;

Tasks = dispinterface
['{000C0C40-0000-0000-C000-000000000046}']
property Application: ProjectApplication readonly dispid 65524;
property Parent: Project readonly dispid 65523;
property Count: Integer readonly dispid 65525;
property UniqueID[Index: Integer]: Task readonly dispid 65521;
function Add(Name: OleVariant; Before: OleVariant): Task; dispid 65526;
property Item[Index: OleVariant]: Task readonly dispid 0; default;
property _NewEnum: IUnknown readonly dispid -4;
end;

Project = dispinterface
['{B948BE90-9E17-42B1-88D4-03E6B7B27B8A}']
procedure Activate; dispid 13;
property ID: Integer readonly dispid 47;
property Resources: Resources readonly dispid 2;
property Tasks: Tasks readonly dispid 1;
property Index: OleVariant readonly dispid 65527;
property Parent: IDispatch readonly dispid 65523;
property Application: ProjectApplication readonly dispid 65524;
property Work: OleVariant readonly dispid 100;
property ActualStart: OleVariant readonly dispid 141;
property ActualFinish: OleVariant readonly dispid 142;
property Name: WideString dispid 0;
end;

Projects = dispinterface
['{574E0861-265A-4E1A-AB8C-9A2864D5F6F4}']
property Application: ProjectApplication readonly dispid 65524;
property Parent: IDispatch readonly dispid 65523;
property Count: Integer readonly dispid 65525;
function Add(DisplayProjectInfo: OleVariant; Template: OleVariant; FileNewDialog: OleVariant): Project; dispid 65526;
property Item[Index: OleVariant]: Project readonly dispid 0; default;
property _NewEnum: IUnknown readonly dispid -4;
function CanCheckOut(FileName: OleVariant): WordBool; dispid 1;
function CheckOut(FileName: OleVariant): WordBool; dispid 2;
end;

MSProjectApplication = dispinterface
['{00020AFF-0000-0000-C000-000000000046}']
function FileOpen(Name: OleVariant; ReadOnly: OleVariant; Merge: OleVariant;
TaskInformation: OleVariant; Table: OleVariant; Sheet: OleVariant;
NoAuto: OleVariant; UserID: OleVariant; DatabasePassWord: OleVariant;
FormatID: OleVariant; Map: OleVariant; openPool: PjPoolOpen;
Password: OleVariant; WriteResPassword: OleVariant;
IgnoreReadOnlyRecommended: OleVariant; XMLName: OleVariant): WordBool; dispid 102;
function OpenXML(const XML: WideString): SYSINT; dispid 5079;
function AppMaximize: WordBool; dispid 2008;
function AppMinimize: WordBool; dispid 2009;
function FileClose(Save: PjSaveType; NoAuto: OleVariant): WordBool; dispid 103;
function DocClose: WordBool; dispid 2007;
property Projects: Projects dispid 5000;
end;

implementation

end.

Categories: Delphi

Kylix webservice using fastCGI

July 10, 2009 herux Leave a comment

Aplikasi web yang di bangun dengan Kylix menggunakan CGI, bagaimana jika kita ingin menggunakan FastCGI ?

Begini caranya :

1. Download FastCGI header file for pascal  … linknya kemana yah kemaren ??

2. nah ini … blom dicobain!!. ntar yah ?

3. kalo ada yg udah bisa mohon share deh..

4. Kalo saya dah bisa tak terusin ini artikel

Ok. thanks

Categories: kylix

SMS Server for linux environment

June 11, 2009 herux 2 comments

Lupa nulis blog, jadi ini aja di tulis… he..he.. , bisa sebagai catatan!

untuk project ini masih berjalan. blom selesai, jadi saya tulis minimal requirmentnya aja dulu.

  • Saya gunakan lazarus sebagai IDE development
  • Namanya server jadi pasti harus mandiri. karena di linux mestinya aplikasi ini ada sebuah Daemon
  • SMS Server ini harus juga bisa di connect oleh client, sebagai user interface (Client bisa Webbase, desktop linux, windows, maupun MAC – itu pula kenapa saya pilih lazarus!! =P )
  • harus di develop dulu sebuah component lazarus yang reusable. mungkin suatu saat di jadikan OpenSource ?.
  • Kemampuan server SMS ini minimal harus bisa;
  1. SendSMS,
  2. ReceiveSMS,
  3. SendUSSD,
  4. SIMToolkit,
  5. KeyPadControl
  6. Connect to DB
  • Trus apalagi ? eh..gitu dulu deh.!
Categories: Product

FastReport Web

January 28, 2009 herux 8 comments

he… he… dengan win32 juga bisa kok jadi web .. hiihi…hi…

frweb

tapi ini aq pake .net!!

Categories: Delphi

install lazarus 0.9.26 on Ubuntu 8

November 16, 2008 herux 12 comments

Gini nih kalo lagi deadline !. nulis blog aja jarang kosakata, maunya code melulu. he.he..he…

langsung aja yah .. Ubuntu 8, versi lazarus defaultnya adalah lazarus 0.9.24, jadi kalo mo install versi 0.9.26 kita harus tahu dependencies paketnya dulu, atau paket yang harus ada ketika kalo lazarus mo diinstall. caranya bisa gini nih:

1. ketik apt-get update (ini untuk update repository info)  tentu saja setelah kita ketik sudo su

apt-get-sudo1

apt-get-update

2. ketik apt-get install lazarus, sehingga tamplil seperti gambar berikut. ingat ! jangan di tekan “Yes” karena itu berarti melakukan instalasi lazarus 0.9.24 juga, sedangkan kita hanya butuh informasi paket yang di perlukan saja.

apt-get-install-lazarus

nah… tuh kelihatan kan paket apa yang belom ada untuk install lazarus ?.

3. Ketik apt-get install … … seperti terlihat di gambar berikut. list ini didapatkan dari informasi pada point no 2. bisa di ketik satu-satu atau di copy aja. tapi hati2 karena character di atas mengandung #13 yang berarti enter atau execusi perintah.

apt-get-install-dependc

4. Download lazarus 0.9.26 dari sini kita gunakan paket nya debian. download semua aja yah ?.

5. Install semua paket yang telah didownload. paket-paket tersebut punya depencencies juga antara mereka jadi sebaiknya satukan aja perintahnya menjadi

> gdebi nama-paket1 nama-paket2 … … , dst.

6. dah .. selesai. shortcut ada di menu application > programming > lazarus.  ….. ga tampil ?

bagaimana buat webservice pake lazarus ?. okey . kita tunggu posting saya berikutnya. sekarang waktunya ngerjain next project …. (rahasia!!!).

eh iya ini screenshotnya lazarus.
laz-screenshoot

Banyak komponen punya TurboPower masuk sana. Indy ada juga . tapi ga default.

Categories: lazarus

TNewMessageReceived, sebuah event TSmsGateway

September 21, 2008 herux 2 comments

Bagaimana mendeteksi sms masuk secara otomatis, seperti handphone kita ?. Enggak usah banyak kata deh, mari kita ikuti langkah berikut.
buat sebuah event !, Kita kasih nama TNewMessageReceived yang menjadi.


TNewMessageReceived = Procedure (Sender: TObject; From, Content: String) of Object;

pada kelas TSmsGateway kita buat variable menjadi

FOnNewMessageReceived: TNewMessageReceived;

dan tentu saja pada section published kita deklasikan property seperti

property OnNewMessageReceived: TNewMessageReceived read FOnNewMessageReceived write FOnNewMessageReceived;

Kemudian kita buat event trigerring menggunakan TThread, kenapa pake thread ? .. coba deh buat pake timer !. lihatlah bedanya?


TSmsThread = class(TThread) // background monitoring event
private
FSmsGateway: TSmsgateaway; // ini udah ada di artikel saya sebelumnya
protected
procedure execute; override;
public
constructor Create(aSmsGateway: TSmsgateaway);
end;

pada procedure execute kita isi seperti ini :

procedure TSmsThread.execute;
const
secs = 3;
var
I: Integer;
begin
inherited;
I := 0;
while not Terminated do
begin
Inc(I);
if I >= Secs then
begin
I := 0;
FSmsGateway.DetectNewMessage(FSmsGateway);
end;
Sleep(1000); // 1 detik, secs = 3. jadi cek modem setiap 3 x 1 = 3 detik
end;
end;

Kemudian kita lihat procedure DetectNewMessage, yang bisa berisi input AT Command seperti TE+CNMI akan tetapi karena banyak perbedaan penggunaan perintah ini, di masing-masing modem maka saya lebih suka pake AT+CMGL=0 atau AT+CMGL=”REC UNREAD” tergantung dari AT+CMGF nya. sehingga isi dari procedure DetectNewMessage adalah

procedure TSmsgateaway.DetectNewMessage(Sender: TObject);
var
sres : String;
Strings: TStrings;
msTemp: TMessageSpec;
begin
if SerrialUsed = False then // antisipasi penggunaan modem bersamaan !!
begin
msTemp := FMessageSpecs;
FMessageSpecs := msRECUNREAD; // set property untuk sms blom terbaca
try
RetrieveSMS; // perintah at+cmgl ada disini yg langsung tersimpan di TCollectionItem
if Assigned(FOnNewMessageReceived) then // jika terjadi event maka otomatis masuk
FOnNewMessage(Self,FSmsList.Item[0].sender,FSmsList.Item[0].body); // kesini
except on ex:ESynaSerError do
FMessageSpecs := msTemp;
end;
FMessageSpecs := msTemp;
end;
SerrialUsed := False;
end;

nah … sudah selesai, silakan coba!!,

Membuat aplikasi kirim sms lewat web

September 5, 2008 herux Leave a comment

Pernah baca postingan saya soal sms gateway blom jadi ?. nah … anda salah !! bukan itu yang akan saya publish disini untuk buat aplikasi kirim sms lewat web!. hi..hi… !!, tapi kita akan gunakan sms library .net gratisan. kenapa gak pake punya sendiri ? karena komponenku blom sempurna, malu nih mau di taruh disini walaupun sudah mulai saya porting ke .net.

yang akan saya jabarkan disini adalah sedikit pengetahuan (Sedikiiiiit sekali) tentang pembuatan webservice menggunakan asp.net dengan codebehind delphi, tentu saja!, untuk aksesnya atau client web bisa menggunakan apa saja baik itu asp .net sendiri maupun php, asp, coldfusion, java, dll atau intraweb delphi (namanya juga XML khan bisa dimakan oleh siapa saja toh ?? tapi pokoknya web, karena judulnya ketahuan khan?). nah ikutan langkahnya sebagai berikut :

1. Delphi berapa yg anda punya nih ? (yg penting ada asp.net bisa 8, turbo 2006 for .net, ato 2007 lebih bagus tapi mahal he..h.ehh) mbah emarcadero di murahin donk !! khan saya cucu!!

2. Download atsms library nya di sini

3. Install komponen atsms dengan cara klik menu component -> installed .net component … wait for a second yah ??

4. Nah muncul tuh ! component .net yg di load oleh IDE, sekarang pada category tulis terserah maumu ! misalnya “ATSMS” kemudian klik tombol select an assembly … cari file atsms.dll yang tadi kamu download trus open. maka terlihat di list adalah serialdriver dengan category (ATSMS) yg anda tulis tadi !

5. Sekarang mulai pembuatan webservice application! pada menu delphi .net klik menu file -> new -> other pilih delphi for .net project dan pilih ASP.Net Web Service application maka muncul dialog untuk nama aplikasi beserta folder yang otomatis berapa di baway wwwroot milik IIS. silakana kasih nama misal sms_ws

6. Terlihat sekarang tampilan file webservice1.asmx. cari komponen serialdriver yg berada pada tab ATSMS, double klik aja tuh!

7. Sekarang tekan F12, maka hal yang familiar bagi programmer delphi terlihat ya toh ?? pada section public secara default delphi membuat function helloword seperti ini

[WebMethod]
function HelloWorld: string;

dengan isi seperti ini

// Sample Web Service Method
// The following method is provided to allow for testing a new web service.
function TWebService1.HelloWorld: string;
begin
Result := 'Hello World';
end;

8. contoh helloword biarin aja dulu.. kita tambahin aja [WebMethod] menjadi [WebMethod(description='Function yang Menghasilkan output "Hello Word"')]

9. Sekarang ketik function sebagai berikut

[WebMethod(Description='function kirim SMS, string result adalah message yg terjadi')]
function SendSMS(Nomor,Pesan:String): String; // lalu tekan ctrl+shift+c

10. lalu ketik isi function menjadi seperti ini

function TWebService1.SendSMS(Nomor, Pesan: String): String;
var
ModemGSM: GSMModem;

MsgNo: String;

begin
Result := '';
ModemGSM := GSMModem.Create;
ModemGSM.Port := 'COM12'; // gunakan sesuai dengan port modem nya
ModemGSM.BaudRate := 115200; // sesuaikan dengan baudrate modem kalian
ModemGSM.DataBits := 8;
ModemGSM.Parity := EnumParity.None; // tambahkan di uses ATSMS.Common
ModemGSM.StopBits := EnumStopBits.One;
ModemGSM.FlowControl := EnumFlowControl.RTS_CTS;
try
ModemGSM.Connect;
if ModemGSM.IsConnected then
begin
MsgNo := ModemGSM.SendSMS(Nomor,Pesan);
Result := 'Message have been sent. Response: '+MsgNo;
end;
except on Ex:Exception do
Result := 'Error sending message : '+Ex.Message;
end;

ModemGSM.disconnect;

ModemGSM.free;
end;

11. nah sekarang silakan di tekan F9, hasilnya terlihat dua function yang kita buat tadi beserta comment, dan bisa langsung anda coba tanpa kita membuat aplikasi di sisi web service client !!,

12. Selamat mencoba !! eh … blom mau tahu cara akses dari client ? ntar tunggu ya ? buka puasa dulu emhmmm…aemm

Raw printing pake web (ActiveX)

August 4, 2008 herux 3 comments

Kekuatan aplikasi webbase memang tidak bisa diragukan dalam hal deployment. akan tetapi kekurangan lain masih banyak juga terutama dalam hal interaksi dengan user, ketika memakai aplikasi desktop kita tidak perlu menunggu hasil dari event onclick pada suatu combobox dengan menunggu seluruh halaman untuk proses load dan langsung melakukan aktifitas lainnya. sayangnya ini tidak terjadi pada aplikasi webbase !!.

Tapi dengan adanya AJAX (Asynchronous Javascript And XML), yaitu suatu technic pencampuran pemrograman, masalah diatas bisa di atasi! ..

nah sekarang bagaimana mengatasi masalah raw printing pada aplikasi webbase ??.

kalo kita pernah buat aplikasi untuk sistem inventory (Kasir) webbase saya kira pertanyaan diatas pernah juga timbul srimulat …. eh salah… muncul !!! hi..hi..

.. salah satu jawabannya mungkin adalah activex !! walaupun ini bukan jawaban mutlak tapi setidaknya bisa melengkapi.. ya kan ? iya dong ! he.he.. cuma ini juga menimbulkan masalah baru. apa itu ? activex hanya bisa di jalankan di browser IE (internet explorer punyae mikocok !). jadi … yah ga papa lah kan setidaknya melengkapi ya..tho ???

berikut adalah cara-cara saya membuat activex nya … ya !! anda benar. tentu saya pake delphi !! (isone iku thok!! he..he.. )

1. Berhubung udah hampir jam 3 dinihari !! … maka tulisan ini berlanjut aja yah .. saya mo tidur dulu . ngantuk nih!!

Categories: Delphi Tags: , , , , ,

Kenapa Why ?

July 30, 2008 herux 7 comments

Eh tahu gak ? kenapa orang ato perusahaan ato institusi ato dll.. ato lowongan kerja kalo ngomong soal dot Net selalu ke arah VB, C# .. dsb

emang pada ga tahu yah kalo pake delphi juga bisa ?? coba kasih tahu saya, apa yg tidak bisa dilakukan untuk pemrograman dot net framework dengan delphi ??

pembaca tahu ga bagaimana dotnet framework bekerja ? (saya ga tahu lho .. tak baca dulu deh..!! ).

Categories: Binun

Customize TListView pake grouping ?

July 22, 2008 herux 2 comments

Pernahkah anda berpikir, bagaimana membuat listview dengan tampilan data per group?
Seperti terlihat pada explorer windows XP?, mari kita ikuti caranya sebagai berikut ..

  1. Pada IDE delphi (Sample pake 2006 ) menu Component :. New VCL Component
  2. Pilih TCustomListview klik next kemudian kasih nama component baru TLVGroup
  3. Install ntar aja .. langsung pilih create unit hasilnya :


unit LVGroup;

interface

uses
Windows, SysUtils, Classes, Controls, ComCtrls, commctrl;

Type
TLVGroup = class(TCustomListView)
public
published
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents(‘heruX’, [TLVGroup]);
end;
end.

Tambahkan constanta untuk listview message

const
LVM_ENABLEGROUPVIEW = LVM_FIRST + 157; // Nilai message utk enable/ disable
LVM_INSERTGROUP = LVM_FIRST + 145; //
LVIF_GROUPID = $0100;
LVGF_HEADER = $00000001;
LVGF_ALIGN = $00000008;
LVGF_GROUPID = $00000010;
LVGA_HEADER_LEFT = $00000001;
LVGA_HEADER_CENTER = $00000002;
LVGA_HEADER_RIGHT = $00000004;

kemudian tambahkan pada seciton Type record seperti ini

type
TLVG = record
cbSize: UINT;
mask: UINT;
pszHeader: LPWSTR;
cchHeader: Integer;
pszFooter: LPWSTR;
cchFooter: Integer;
iGroupIdL: Integer;
stateMask: UINT;
state: UINT;
uAlign: UINT;
end;

Sebelumnya tambahkan unit commctrls yah ..
nah sekarang tinggal kita tambahkan method pada section public ato kalo mo jadiin property juga boleh.


public
function IsLVGrouped(Yup: Boolean): Boolean;
procedure MakeGroup(GroupName: PWidechar; GroupID: Integer);

dan ..


function TLVGroup.IsLVGrouped(Yup: Boolean): Boolean;
begin
if Yup = True
then begin
SendMessage(Handle, LVM_ENABLEGROUPVIEW, 1, 0);
Result := true;
end else begin
Result := false;
SendMessage(Handle, LVM_ENABLEGROUPVIEW, 0, 0);
end;
end;

procedure TLVGroup.MakeGroup(GroupName: PWidechar; GroupID: Integer);
var
LvGroup: TLVG;
begin
FillChar(LvGroup, SizeOf(TLVG), 0);
with LvGroup do
begin
cbSize := SizeOf(TLVG);
mask := LVGF_HEADER or LVGF_ALIGN or LVGF_GROUPID;
pszHeader := GroupName;
cchHeader := Length(LvGroup.pszHeader);
iGroupIdL := GroupID;
uAlign := LVGA_HEADER_LEFT;
end;
SendMessage(Handle, LVM_INSERTGROUP, GroupID, Longint(@LvGroup));
end;

dan listing lengkap nya adalah …


Wah ... gabungin sendiri aja yah?? bisa khan.. males nih kalo kepanjangan!!!

udah gitu ajah. eh..lupa kalo hasilnya ga sesuai perkiraan tambahin komponen XPMan yah ..
ini khan buat xp ajah !!
property TCustomListView di published juga yah .. bisa donk ??!!

Categories: Delphi