[ itf @ 15.09.2006. 08:13 ] @
Sinoć sam zamalo uspio natjerati Indy komponente da rade u Turbo C++u. Zapravo, nije mi ni jasno zašto ne radi?

Naime, u BCB6 sam napravio LIB u koji sam stavio formu na kojoj se nalaze Indy komponente. Test aplikacija koja koristi LIB dinamički alocira tu formu i preko tog pointera test aplikacija se koristi Indy komponentama. Stvar je u tome što to bez ikakvih problema radi na BCB6. Kada se ista test aplikacija compajlira u Turbo C++u onda za svaku funkciju članicu bilo koje Indy komponente javi grešku;

unresolved extrenal....

E sad... zašto to uspješno radi u BCB6 a zašto ne u Turbo C++u???

Pokušao sam i sa DLL-om (statičkim povezivanjem) no tad me već u startu sreže jer mi neda da u test aplikaciji dinamički alociram instancu nikakve VCL klase koja se nalazi u Dllu. Tada sam stavio da se memorija alocira u Dll-u i exportirao funkciju koja vraća pokazivač na taj alocirani prostor. Ipak, ni tad testna aplikacija neće da radi dobro jer opet javlja unresolved external...

Ideje?
[ kiklop74 @ 15.09.2006. 16:33 ] @
Verovatno ti fali indy.bpi u listi prikljucenih paketa.

Otvori bdsproj file u nekom editory i u
<property category="build.node" name="packages" value="paketi"/>

dodaj indy


[ itf @ 18.09.2006. 08:46 ] @
Citat:
kiklop74: Verovatno ti fali indy.bpi u listi prikljucenih paketa.

Otvori bdsproj file u nekom editory i u
<property category="build.node" name="packages" value="paketi"/>

dodaj indy
To ne mogu unutar Turbo C++a, a u BCBu sam to već napravio. Čak sam i sve spremio u dll tako da sam isključio korištenje runtime paketa i rtl-a...
[ kiklop74 @ 18.09.2006. 13:33 ] @
Citat:
itf: To ne mogu unutar Turbo C++a, a u BCBu sam to već napravio. Čak sam i sve spremio u dll tako da sam isključio korištenje runtime paketa i rtl-a...


Pa znam da ne moze zato sam i rekao "otvori bdsproj u nekom editoru". Dakle notepad, ultraedit, wordpad bilo sta.

[ itf @ 18.09.2006. 13:48 ] @
Sad sam na poslu pa ću večeras probati, no sumnjam da su tako glupi da bi to dopustili... Pokušat ću i zamjeniti neke od već postojećih paketa sa indy.bpl-om.
[ kiklop74 @ 18.09.2006. 14:25 ] @
Citat:
itf: Sad sam na poslu pa ću večeras probati, no sumnjam da su tako glupi da bi to dopustili... Pokušat ću i zamjeniti neke od već postojećih paketa sa indy.bpl-om.


A sto da ne moze? bdsproj je najobicniji xml fajl i mozes da ga menjas kako hoces u bilo kom tekstualnom editoru.

Ako imas rezerve prema rucnom editovanju jednostavno stavi bilo koji indy komponentu na formu tvoje aplikacije i indy.bpi ce biti automatski dodat u projektni fajl.

[ itf @ 19.09.2006. 08:05 ] @
Ja govorim sad o Turbo C++u (Explorer). Ne mogu tamo staviti nikakvu Indy komponentu na formu ili sl..
[ kiklop74 @ 19.09.2006. 11:08 ] @
Citat:
itf: Ja govorim sad o Turbo C++u (Explorer). Ne mogu tamo staviti nikakvu Indy komponentu na formu ili sl..


??????

Onda nesto kod tebe nije u redu. Probao na dve masine i bez ikakvog problema mogu da dodam bilo koju indy kontrolu na formu.

[ itf @ 19.09.2006. 11:17 ] @
Pa Turbo Explorer C++ NEMA Indy komponente, ZAR NE? Kako da ju onda stavim na formu? Hoćeš reći da na onaj način editiram projekt datoteku i da će mi se u tool paleti pojaviti Indy komponente?
[ kiklop74 @ 19.09.2006. 13:39 ] @
Ovo je bas cudno. Prekjuche sam napravio projekat i stavio indy kontrolu na formu (kontrole su bile prikazane na paleti). Juce sam instalirao onaj update i danas (po prvi put) turbo c++ mi kaze da ne moze da koristi third-party komponente...

U svakom slucaju nije sve izgubljeno. Turbo C++ express te sprecava da koristis third-party kontrole u dizajn modu - dakle ne mozes da ih dodas na paletu ili na formu direktno ali ono sto mozes je da kreiras komponente dinamicki. Indy je ionako vec instaliran u <BDS>\include\Indy<9/10>

Na primer kako dodati Indy telnet komponentu dinamicki:

1. U header forme dodati sledece includove:
Code:
#include <IdBaseComponent.hpp>
#include <IdComponent.hpp>
#include <IdTCPClient.hpp>
#include <IdTCPConnection.hpp>
#include <IdTelnet.hpp>


2. u private deo form klase dodati clan TIdTelnet* kao ovde:
Code:
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton   *Button1;
    void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
    TIdTelnet *myTelnet; //mora ovde a ne u published
    void __fastcall OnDataAvailable(TIdTelnet* Sender, const AnsiString Buffer); //jedan event handler
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
};


3. Na kraju u konstruktoru inicijalizovati komponentu:
Code:
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    myTelnet = new TIdTelnet(this);
    myTelnet->OnDataAvailable = OnDataAvailable; //kacenje event handlera
}


[ itf @ 19.09.2006. 13:53 ] @
Misliš da to već nisam probao? :) Problem je u ovom trećem dijelu - dinamičkoj alokaciji. Ajd probaj dinamički alocirati npr TcpServer komponentu, pa ako uspiješ onda mi javi jer to bi bilo rješenje problema... Meni javlja da konstruktor nije dobro napisan iako znam da sam sve dobro ukucao..
[ kiklop74 @ 19.09.2006. 14:19 ] @
Meni radi a evo sta sam ja uradio:

1. Kreirao default VCL forms aplikaciju
2. Dodao sledeci include u header:
Code:
#include <Sockets.hpp>

3. Dodao clanicu TTcpSocketServer u form klasu
Code:
class TForm1 : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
    TTcpServer *myTcpServer;
    void __fastcall OnTcpServerListening(TObject *Sender);
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
};

3. I na kraju konstruktor:
Code:
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    myTcpServer = new TTcpServer(this);
    myTcpServer->OnListening = OnTcpServerListening;
}


[ itf @ 19.09.2006. 14:25 ] @
Mislio sam na onaj Indy TcpServer... mislim da je klasa IdTcpServer ili već kako... pokušaj je samo dinamički alocirati jer ja ne uspjevam... Hvala
[ kiklop74 @ 19.09.2006. 14:44 ] @
Radi i sa indy tcp serverom:

Evo koda u celini da se ne ponavljam previse u kucanju:
Code:
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <IdComponent.hpp>
#include <Idtcpserver.hpp>

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
    TIdTCPServer *myTcpServer;
    void __fastcall OnTIdServerConnect(TIdPeerThread* AThread);
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Code:
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    myTcpServer = new TIdTCPServer(this);
    myTcpServer->OnConnect = OnTIdServerConnect;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnTIdServerConnect(TIdPeerThread* AThread) {

}
[ itf @ 20.09.2006. 07:58 ] @
Da... i meni je sinoć to uspjelo. Naime, ja sam dodao indy paket, ali sam isključio Build with runtime packages... pa je zato stvar štekla...


Evo malog primjera Chat aplikacije pod Turbo C++om koji sam napravio da testiram Indy komponente....

Unit1.h
Code:
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <IdBaseComponent.hpp>
#include <IdComponent.hpp>
#include <IdIPWatch.hpp>
#include <IdTCPClient.hpp>
#include <IdTCPConnection.hpp>
#include <IdTCPServer.hpp>

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TEdit *E1;
    TButton *Button1;
    TListBox *L1;
    TLabel *Label1;
    TEdit *EHost;
    void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
    TIdTCPServer* S1;
    TIdTCPClient* C1;
    __fastcall TForm1(TComponent* Owner);
    void __fastcall S1Execute(TIdPeerThread *AThread);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Unit1.cpp
Code:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
void __fastcall TForm1::S1Execute(TIdPeerThread *AThread)
{
    L1->Items->Add(AThread->Connection->ReadString(AThread->Connection->ReadInteger()));
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    // Indy TCP server...
    S1 = new TIdTCPServer(this);
    S1->Bindings->Add();
    S1->Bindings->Items[0]->Port = 15000;
    S1->Active = true;
    S1->OnExecute = S1Execute;

    // Indy TCP klijent...
    C1 = new TIdTCPClient(this);
    C1->Port = 15000;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    C1->Host = EHost->Text;
    C1->Connect();
    C1->WriteInteger(E1->Text.Length());
    C1->Write(E1->Text);
    C1->Disconnect();
}
//---------------------------------------------------------------------------


[Ovu poruku je menjao itf dana 20.09.2006. u 10:57 GMT+1]