Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Data-aware ActiveX kontrola, kako da se napravi u msvcpp6?

[es] :: C/C++ programiranje :: Data-aware ActiveX kontrola, kako da se napravi u msvcpp6?

[ Pregleda: 3190 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

TheAlas
Bojan Sala
Senior Programmer Analyst
GTECH
Beograd

Član broj: 36584
Poruke: 117
*.nat-pool.bgd.sbb.co.yu.



+1 Profil

icon Data-aware ActiveX kontrola, kako da se napravi u msvcpp6?07.12.2004. u 19:19 - pre 205 meseci
Kako da dodam property "DataSource" u svoju ActiveX kontrolu, trebalo bi znaci da bude cRecordSet odnosno RecordSet tipa?
99% data aware kontrola za vb su pisane u cppu, tako da sumnjam da ne moze, kao sto recimo DataGrid ima DataSource...
Automatizacija u msvcpp-u podrzava samo neke osnovne tipove podataka... kako da dodam klasu "DataSource", ili recimo kolekciju klasa "Columns" i sl. ?
Pitanje je mozda opsirno, pocetnik sam sa activex objektima u c++-u ...
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.3.133.130.ptr.us.xo.net.



+1000 Profil

icon Re: Data-aware ActiveX kontrola, kako da se napravi u msvcpp6?08.12.2004. u 01:56 - pre 205 meseci
Daj malo vise detalja o tome sta tacno pokusavas da uradis.
 
Odgovor na temu

TheAlas
Bojan Sala
Senior Programmer Analyst
GTECH
Beograd

Član broj: 36584
Poruke: 117
*.nat-pool.bgd.sbb.co.yu.



+1 Profil

icon Re: Data-aware ActiveX kontrola, kako da se napravi u msvcpp6?08.12.2004. u 11:42 - pre 205 meseci
Radi se o ATL kontroli zapravo koja ce biti koriscena u visual vasic 6 okruzenju. Naime, meni je potrebno da dodam property DataSource u svoju kontrolu, ali to je izuzetno tesko jer ATL (c++ uopste) ima nikakvu podrsku za ADO (COM-bazirana komponenta). Znaci trebam da koristim klasu "Recordset" iz biblioteke msado25.tlb, ta klasa povezuje okruzenje (vb6 u ovom slucaju) i kontrolu preko "DataSource" svojstva, jer preko te klase vadim podatke iz sql upita, tabele, itd.

Znam samo da trebam da da importujem ado biblioteku:

importlib("C:\Program Files\Common Files\System\ADO\MSADO25.TLB");

i da popravim neke probleme sa imenima:
#import "C:\Program Files\Common Files\System\ADO\MSADO25.TLB" rename_namespace("ADOPrimer") rename("EOF","EndOfFile")
using namespace ADOPrimer;

Ali posto nema nikakve dokumentacije za koriscenje ADO-a u c++-u, logicno da nemam pojma kako se koriste .

Da stvar bude jos gora, pocetnik sam sa kompleksnim klasama u cppu (nikad mi nisu trebale klase, a ni COM objekti), pa ne znam ni kako se koriste one QueryInterface i AddRef funkcije (ne znam ni cemu sluze, ali compiler mi izbacuje da su "vitalne" )

Evo, ako pomaze, kako izgleda taj property (koji ne sluzi nicemu jer ne znam kako da koristim prokletu klasu):

[propget, id(1), helpstring("property DataSource")] HRESULT DataSource([out, retval] _Recordset **pVal);
[propput, id(1), helpstring("property DataSource")] HRESULT DataSource([in] _Recordset* newVal);

Code ovih svojstava u vbu izgleda ovako:

Code:

Public Property Get DataSource() As ADODB.Recordset
   Set DataSource = mvarDataSource
End Property

Public Property Let DataSource(ByVal vNewValue As ADODB.Recordset)
   Set mvarDataSource = vNewValue
   PropertyChanged "DataSource"
End Property


Meni treba isto u cppu, ali ovaj _Recordset ne podrzava New keyword, ne znam ni kako da je kreiram (uvek je prazna, ne sluzi nicemu).

Probao sam ovo, ali opet isto (sto je i logicno):

Code:

STDMETHODIMP CDataGridCtrl::get_DataSource(_Recordset **pVal)
{
    // TODO: Add your implementation code here
    CoInitialize (NULL);

    pVal = &m_DataSource;
    
    CoUninitialize ();
    return S_OK;
}

STDMETHODIMP CDataGridCtrl::put_DataSource(_Recordset *newVal)
{
    // TODO: Add your implementation code here
    CoInitialize (NULL);

    m_DataSource = newVal;

    CoUninitialize ();
    return S_OK;
}
 
Odgovor na temu

TheAlas
Bojan Sala
Senior Programmer Analyst
GTECH
Beograd

Član broj: 36584
Poruke: 117
*.nat-pool.bgd.sbb.co.yu.



+1 Profil

icon Re: Data-aware ActiveX kontrola, kako da se napravi u msvcpp6?08.12.2004. u 11:46 - pre 205 meseci
U vbu kada koristim kontrolu:

Code:

Option Explicit

Private DB As New ADODB.Connection

Private Sub Form_Load()
   Dim r&, c&, strDataBaseFile$
   
   strDataBaseFile = App.Path & "\sim_trade97.mdb"
   DB.Open "Driver={Microsoft Access Driver (*.mdb)};Dbq=" & strDataBaseFile & ";DefaultDir=" & App.Path & ";"
   
   With Grid
      
      .DataSource = DB.Execute("SELECT * FROM tblRoba")

      If (.DataSource Is Nothing) Then MsgBox "Opet nista": GoTo e
      .DataSource.MoveFirst
      Debug.Print .DataSource.Fields(0).Value
e:
   End With
End Sub


Uvek mi javlja "Opet nista" ...

Taj Grid je zapravo ta ATL kontrola, radi se o nekoj primitivnoj tabeli .
 
Odgovor na temu

TheAlas
Bojan Sala
Senior Programmer Analyst
GTECH
Beograd

Član broj: 36584
Poruke: 117
*.nat-pool.bgd.sbb.co.yu.



+1 Profil

icon Re: Data-aware ActiveX kontrola, kako da se napravi u msvcpp6?08.12.2004. u 14:17 - pre 205 meseci
Uspeo sam da otvorim ADO Recordset u ATL kontroli, posle 4 sata intezivnog mucenja i maltretiranja.
Sada je problem sledeci, kompilacijom konfiguracije "Release Minimum Size" javlja error:

Creating library ReleaseMinSize/DataGrid.lib and object ReleaseMinSize/DataGrid.exp
LIBCMT.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
ReleaseMinSize/DataGrid.dll : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

Zbog OVOG:
Code:

m_DataSource->MoveFirst ();


Klasa ne moze da se koristi u release verzijama :S... videcu sta je problem, ali glavni problem je u sustini resen :P.

Necu vise postovati u ovom topicu dok neko ne odgovori.


Pa zar je moguce da niko ziv ne zna kako se koristi ADO u c++-u???? VB je za baze podataka kralj, cak ni jedan c++ nije bolji za to (msvcpp ne samo da je nemoguce zakomplikovan, nego je jednostavno losiji i cak sporiji od vba... ado je izgleda vb-only >:( ).

 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.client.comcast.net.



+1000 Profil

icon Re: Data-aware ActiveX kontrola, kako da se napravi u msvcpp6?08.12.2004. u 15:36 - pre 205 meseci
Na brzinu (jutro pre odlaska na posao):

Nisam nista radio sa ADO, ali sam sa ActiveX proveo dosta vremena. Nesto ti sigurno
mogu pomoci, sacekaj da (kasnije tokom dana) pogledam detaljnije ovaj tvoj opis
problema.
 
Odgovor na temu

_Super_Ellite_Bug_
Novi Sad, konacno!!!

Član broj: 41318
Poruke: 145
*.nat-pool.nsad.sbb.co.yu.

Sajt: www.searchlores.org


Profil

icon Re: Data-aware ActiveX kontrola, kako da se napravi u msvcpp6?08.12.2004. u 18:06 - pre 205 meseci
Pozdrav,
ima ljudi koji se razumeju u ADO istale Micro$oft-ove Frankenstajne, ali tebi to ne resava problem, osim da ti dam gotov kod.

Postoji razlika izmedju COM tehnologije i ActiveX tehnologije.
ActiveX jeste COM ali COM nije uvek ActiveX jer je COM temelj na kome je nastao ActiveX ali i druge tehnologije.

QueryInterface() i cemu sluzi
------------------
Veoma prosta stvar:
COM objekti mogu da imaju vise interfejsa.
Na pocetku imas jedan inicijanli pointer na neki od specifiranih interfejsa.Da bi pristupio nekom drugom interface-u treba ti mehanizmom QueryInterface() koji je metoda IUnknown interfejsa da bi kao resultat dobio pointer na novi interfejs.

AddRef() i cemu sluzi:
--------------------
AddRef je druga od tri metode IUnknown interface-a i to je najprostije receno brojac referenci na interface(s) datog objekta.

OK, idemo dalje...
To sto ti treba je rasuto u par knjiga tako da je jako tesko da ti pomognem
tako sto su ti reci sta da radis, sve dok ne budes potpuno razumeo sta se tu desava. Dok ne ovladas malo bolje svim tim u MS C++--, ali mogu da te uputim.
To sto si zamislio je OK, ali radis na pogresan nacin.
Evo linka za primer necega slicnog stim sto se ne koristi ADO, ali razlika je samo u inteface-ima.
http://www.codeguru.com/Cpp/CO...ex/controls/article.php/c2659/
Izanaliziraj ovaj kod i vec ce ti puno stvari biti jasnije, bar za pocetak.O ADO tehnologiji imas prilicno tekstova na netu a i knjiga tako da me cudi da nista nisi pronasao.
Srecno i samo napred. Kad ponovo zapne a ti se javi.






ISO/IEC JTC1/SC22/WG14-ISO/IEC 9899:1999
 
Odgovor na temu

TheAlas
Bojan Sala
Senior Programmer Analyst
GTECH
Beograd

Član broj: 36584
Poruke: 117
*.nat-pool.bgd.sbb.co.yu.



+1 Profil

icon Re: Data-aware ActiveX kontrola, kako da se napravi u msvcpp6?08.12.2004. u 19:31 - pre 205 meseci
Ok, sada su mi bar neke misterije jasnije , _Super_Ellite_Bug_ mi je objasnio (koliko moze za moj nivo znanja) te com-specific funkcije.
Znam nesto osnovno o COM objektima, pravio sam ActiveX objekte u visual basicu. Sto se literature tice, jedina "savremena" kniga koju sam procitao je "Microsoft Visual C++ Biblija" za msvcpp 5.0, u njoj ima nesto malo o com/activex tehnologiji.

Dobar je taj DAO (data access objects) primer, ali dao je star i vise se ne koristi jer ne moze da se update-uje, i bugovi su popravljeni u novom ADO-u (activex data objects). C++ 5 i 6 podrzavaju DAO, ODBS i SQL Server (t-sql zapravo), ali ne i ADO, na msdnu jos nema dokumentacije za c++, samo za vb/asp. Na internetu sam trazio dosta, ali svi imaju isti problem i zaobilaze te komplikacije kao sto radi ovaj dao primer, preko sql drajvera najcesce (sql sintaksa je uvek ista).

Nasao sam i neke artikle koji objasnjavaju koriscenje msado15.dll-a.

Pa, ako iko pozeli da koristi ADO u cppu, evo kako se to radi na najlaksi nacin:

1.) Prvo se importuje dll (u stdafx.h ako je afx prisutan, ili mfc):

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" rename_namespace("ADOCust")
rename("EOF","EndOfFile")
using namespace ADOCust;

Mora se zameniti EOF jer vec postoji, "ADOCust" nije potreban, moze i ovako:

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")

Isto mora i sa importlib ako je u pitanju ATL kontrola, a i mora da se ukloni _ATL_MIN_CRT preprocesorska definicija u release verziji.

2.) Lista klasa:
_Connection, _ConnectionPtr
_Recordset, _RecordsetPtr

(Ptr=pointer)

Evo nekih primera :
Otvaranje konekcije:
Code:

pConnection->Open(strConectIt, "", "", 
adConnectUnspecified);

Ovo je samo primer, ali isto je kao u vbu.

Otvaranje tabele/pogleda, itd:
Code:

pRecordset->Open(commandString, strConectIt, 
adOpenStatic, adLockReadOnly, adCmdText);


Otvaranje polja:
Code:

my_String = _strdup((char*) ((_bstr_t)(pRecordset->GetFields()->
GetItem("ImePolja")->GetValue())) );

my_String je LPCSTR, a ADO daje/trazi samo BSTR odnosno _bstr_t, pa ih treba konvertovati, jer je nemoguce obradjivati BSTR (mada postoje osnovne funkcije).
_strdup je simpaticna funkcija iz win98, pa nece raditi u starijim verzijama, ja je cesto koristim na mesto strcpy :P.

Ovako moze da se koristi ADO bez (vecih) problema, a ja se sada vracam na osnove COM odnosno ActiveX programiranja.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Data-aware ActiveX kontrola, kako da se napravi u msvcpp6?

[ Pregleda: 3190 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.