/****************/ /* autoldde.cpp */ /****************/ // Esimerkki Autolaskurista, joka pystyy välittämään tietoa muille ohjelmille // ja toisaalta lukemaan tieto muista ohjelmista // // OWL : Testattu: 2.5 ja 5.0 // PURPOSE: Autolaskuri mallina DDE-palvelimesta ja asiakkaasta. // Mahdollisuus kopioida leikekirjaan valmis viite. // Toinen ikkuna, johon saadaan DDE-asiakas. // Asiakas ikkunan linkit voidaan ottaa leikekirjasta // tai Edit-ikkunaan kirjoitetun linkin mukaan. // Yksinkertaistettu versio. // USAGE: // Esim EXCELissä kirjoitetaan kaava =AUTOLDDE|LKM!HA // Quattro Prossa kaava @DDELINK([AUTOLDDE|LKM]"HA") // Tässä tapauksessa nämä kaavat voidaan kopoida automaattisesti // aktivoimalla joku laskurin nappula ja Edit/Copy // Sitten esim. taulukkolaskennassa Edit/Paste Link ja DDE-linkki // on valmis! // Asiakas ikkunan 2 pientä linkkikenttää saadaan aktivoimalla // jompikumpi niistä ja valitsemalla sen jälkeen Edit/Paste Link // Mikäli kumpikaan ei ole valittu tulee linkki aina isoon ikkunaan. // Ison ikkunan linkki saadaan myös edit-ikkunan tekstin mukaan // valitsemalla Edit/Do Edit Link. // // HUOM! // Toteutuksessa on molemmille ikkunoille laiskuuden vuoksi // sama menu. Oikeassa ohjelmassa tämä ei ole suotavaa! // Mallissa palvelin toimii toisesta ikkunasta ja asiakas // toisesta. Tarvittaessa molemmat voivat toimia samassa // ikkunassa! // // Editor: Vesa Lappalainen ( DDE-palvelin yleiskäytöiseksi+leikekirja) // ( DDE-asiakas ) // Kari Heikkilä ( DDE-palvelin ) // // Projektiin (= jaettu luennolla) // autoldde.cpp = tämä tiedosto // autoldde.rc - resurssit kahdelle dialogille // ALI\ddeser.c - DDE-palvelimen rutiinit // ALI\ddecli.c - DDE-asiakkaan rutiinit // ALI\clipboar.c - leikekirjan aliohjelmat (dde??? tarvitsee) // Lisäksi tarvitaan: // autoldde.rh - resurssien tunnusnumerot // ALI\owl\ddeint.h = kokonaislukulaskuri, joka käyttää DDE:tä // ALI\owl\intlabel.h - kokonaislukuikkuna, ddeint.h tarvitsee // ALI\ddeser.h - DDE palvelimen otsikkotiedot, ddeint.h tarvii // ALI\clipboar.h - leikekirjan otsikkotiedot // // Ohjelman "opettavaiset" kohdat merkitty seuraavasti: // Toisen riippumattoman ikkunan käyttö // 2wnd // Toimiminen DDE-palvelimena // ds // Toimiminen DDE-asiakkaana // dc // #include #include "owl\ddeint.h" #include "ddecli.h" // dc #include "autoldde.rh" #define SERVICE "AutolDDE" // ds #define TOPIC "Lkm" // ds /*----------------------------------------------------------------------------*/ int UpdateData(HWND hWnd,int n,HDDEDATA hData,LONG size) /* dc */ /* Tällä aliohjelmalla päivitetään näyttöön DDE-serverin ilmoittamat ** muutokset. Aliohjelmaa ei tarvita, mikäli muutokset tulevat suoraan ** johonkin ikkunaan, jonka sisältö voidaan muuttaa SetWindowTextillä. ** Tässä tapauksessa aliohjelma on kirjoitettu mallin vuoksi. */ { #pragma argsused char ddedata[100]; HWND hswnd = GetDlgItem(hWnd,ID_LINK+n); DdeGetData(hData,(unsigned char *)ddedata,sizeof(ddedata),0); SetWindowText(hswnd,ddedata); return 0; } //------------------------------------------------------------------------------ class TClientDialog : public TDialog { public: TClientDialog(TWindow *parent, TResId resId, TModule *module = 0) : TDialog(parent,resId,module) {} virtual ~TClientDialog() { CloseAllDDEClients(); // dc PostQuitMessage(0); } // 2wnd void BNExitClicked() { CloseWindow(); } virtual void EV_command_IDM_EDIT_PASTE_LINK() { // dc int id = ::GetDlgCtrlID(GetFocus()); if ( ID_LINK<=id && id<=ID_LINK2 ) /* Tämä tarvitsee funktion */ LinkFromClipboard(id-ID_LINK,*this,UpdateData,NULL,CF_TEXT); else /* Tämä toimii automaattisesti */ AutoLinkFromClipboard(9,*this,ID_AUTOLINK); } virtual void EV_command_IDM_EDIT_DO_EDIT_LINK() { // dc char link[100]; // Otetaan edit-ikkunan teksti ja siitä linkki GetDlgItemText(ID_EDITLINK,link,sizeof(link)); AutoLinkFromText(8,*this,ID_AUTOLINK,link); } virtual void EV_command_IDM_EDIT_RESET_CLIENT_LINKS() { // dc CloseAllDDEClients(); } DECLARE_RESPONSE_TABLE(TClientDialog); }; DEFINE_RESPONSE_TABLE1(TClientDialog, TDialog) EV_BN_CLICKED(EXIT,BNExitClicked), EV_COMMAND(IDM_FILE_EXIT ,BNExitClicked), EV_COMMAND(IDM_EDIT_PASTE_LINK,EV_command_IDM_EDIT_PASTE_LINK), EV_COMMAND(IDM_EDIT_DO_EDIT_LINK,EV_command_IDM_EDIT_DO_EDIT_LINK), EV_COMMAND(IDM_EDIT_RESET_CLIENT_LINKS,EV_command_IDM_EDIT_RESET_CLIENT_LINKS), END_RESPONSE_TABLE; //------------------------------------------------------------------------------ class TLaskuriDialog : public TDialog { TDDEIntLabel hal; // ds TDDEIntLabel kal; // ds public: TLaskuriDialog(TWindow *parent, TResId resId, TModule *module = 0) : TDialog(parent,resId,module), hal(TOPIC,"ha",this,HAL), kal(TOPIC,"ka",this,KAL) // ds { } virtual ~TLaskuriDialog() { } void BNHAClicked() { hal++; } void BNKAClicked() { kal++; } void BNNollaaClicked() { hal = 0; kal = 0; } void BNExitClicked() { CloseWindow(); } void EV_command_IDM_EDIT_COPY() // ds { // Leikekirjaan se laskuri, jonka nappula akt. int id = ::GetDlgCtrlID(GetFocus()); // Mikä nappula aktiivinen? if ( id < HA || HA+LASKUREITA-1 < id ) return; LinkToClipboardSN(*this,id-HA+HAL); // ds } DECLARE_RESPONSE_TABLE(TLaskuriDialog); }; DEFINE_RESPONSE_TABLE1(TLaskuriDialog, TDialog) EV_BN_CLICKED(HA,BNHAClicked), EV_BN_CLICKED(KA,BNKAClicked), EV_BN_CLICKED(NOLLAA,BNNollaaClicked), EV_BN_CLICKED(EXIT,BNExitClicked), EV_COMMAND(IDM_FILE_EXIT ,BNExitClicked), EV_COMMAND(IDM_EDIT_COPY ,EV_command_IDM_EDIT_COPY), END_RESPONSE_TABLE; //------------------------------------------------------------------------------ class TLaskuriDDEApp : public TApplication { TDDEServer server; // ds public: TLaskuriDDEApp(const char *title) : TApplication(title), server(*Module,SERVICE) // ds {} void InitMainWindow() { TDialog *dlg1 = new TLaskuriDialog(0, IDD_LASKURI); // Tyyli WS_CHILD TDecoratedFrame *fw1 = new TDecoratedFrame(0, Name,dlg1); fw1->SetFlag(wfShrinkToClient); fw1->SetIcon(this, IDI_IKONI); #if (__BORLANDC__ >= 0x500) fw1->SetIconSm(this, IDI_IKONI); #endif fw1->AssignMenu(IDM_PAAMENU); SetMainWindow(fw1); TDialog *dlg2 = new TClientDialog(0, IDD_CLIENT); // Tyyli WS_CHILD TDecoratedFrame *fw2 = new TDecoratedFrame(0, Name,dlg2); fw2->SetFlag(wfShrinkToClient); fw2->SetIcon(this, IDI_IKONI); #if (__BORLANDC__ >= 0x500) fw2->SetIconSm(this, IDI_IKONI); #endif fw2->AssignMenu(IDM_PAAMENU); fw2->Create(); // 2wnd fw2->Show(SW_NORMAL); // 2wnd } }; /********************* Pääohjelma *********************************************/ int OwlMain(int ,char far * []) { return TLaskuriDDEApp("Autolaskuri DDE").Run(); }