Sunday, January 23, 2011

Class Mapinfo Callback menggunakan Bahasa C#.

Jika kita mendownload applikasi MapBasic disini. Terdapat beberapa sample applikasi untuk menggunakan mepbasic dan applikasi integrated mapping menggunakan MapInfo melalui Bahasa programming (VB, DELPHI dan .NET).
Kemudian setelah dieksplorasi mapinfocallback class untuk applikasi .NET(VB net, C#), ternyata terjadi beberapa error disaat kita menjalankan perintah mapbasic untuk memanggil Dialog Box mapinfo, misal disaat kita ingin menampilkan Temathic Layer dengan perintah "Mapinfoapp.RunMenuCommand(307)", maka akan terjadi stack applikasi.
Untuk mengantisipasi hal ini, berikut beberapa modifikasi mapinfo callback class yang sudah terbukti berjalan baik....

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Text;

namespace Master
{
public interface IMapInfoCallback
{
// Methode untuk mamanggil mapinfo callback saat terjadi perubahan pada map window applikasi, misal nambah layer, atau geser map window
        int WindowContentsChanged(UInt32 windowID);


// Metode untuk memanggil mapinfo callback status bar, jadi fungsi status bar di mapinfo akan di embed secara penuh di status bar applikasi kita.
int SetStatusText(string message);
}
public interface ICallbackNotify : ISynchronizeInvoke
{
      
// Metode memanggil class perubahan status bar.
void OnStatusBarTextChanged(string text);


// Metode memanggil class perubahan yang terjadi di map window applikasi.
        void OnWindowContentsChanged(uint windowId);
}


[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class MapInfoCallBack : IMapInfoCallback
{
private ICallbackNotify _callbackClient;


public delegate void OnStatusBarTextChangedDelegate(string text);
public OnStatusBarTextChangedDelegate _onStatusBarTextChangedDelegate;

// Variabel yang digunakan untuk menangani error yang terjadi saat pemanggilan dialog box mapinfo, seperti dialog box Temathic layer.
        public static bool aman;


        public delegate void OnWindowContentsChangedDelegate(uint windowId);
        public OnWindowContentsChangedDelegate _onWindowContentsChangedDelegate;


public MapInfoCallBack(ICallbackNotify callbackClient)
{
_callbackClient = callbackClient;


_onStatusBarTextChangedDelegate = new OnStatusBarTextChangedDelegate(_callbackClient.OnStatusBarTextChanged);
            _onWindowContentsChangedDelegate = new OnWindowContentsChangedDelegate(_callbackClient.OnWindowContentsChanged);
}


        public int WindowContentsChanged(uint windowId)
        {
            if (_callbackClient != null)
            {


                if (_callbackClient.InvokeRequired)
                {
                    _callbackClient.Invoke(this._onWindowContentsChangedDelegate, new Object[] { windowId });
                }
                else
                {
                    _callbackClient.OnWindowContentsChanged(windowId);
                }
            }
            return 0;
        }


public int SetStatusText(string text)
{
            if (_callbackClient != null)
            {


                if (aman == true)
                {


                    if (_callbackClient.InvokeRequired)
                    {
                        _callbackClient.Invoke(this._onStatusBarTextChangedDelegate, new Object[] { text });
                    }
                    else
                    {
                        _callbackClient.OnStatusBarTextChanged(text);
                    }
                }
                else
                {
                    _callbackClient.OnStatusBarTextChanged(text);
                }
            }
                    return 0;
}

//Ini metode yang digunakan untuk mendapatkan informasi koordinat object
public void selectkoor(string commandInfo)
        {
            string[] spl = commandInfo.Split(',');
            Form1.sLastUserEventY = spl[1];
            Form1.PostMessage(Form1.hwndMain, Form1.WM_USER, 0, 0);
        }
}
}


mudah-mudahan bisa bermanfaat........

1 comment:

Terima Kasih...