Advertisement

03.10.2005 at 12:42PM PST, ID: 21346071
[x]
Attachment Details
[x]
The Solution Rating System

With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.

  • The Grade of the Solution
  • The Zone Rank of the Expert Providing the Solution
  • The Number of Author and Expert Comments
  • The Number of Experts Contributing
  • The Feedback of the Community

Your Input Matters
Because of the way the system is set up, the most important variable in this equation is you. As a member of Experts Exchange, you are able to cast your vote on the quality of the solutions in regard to how complete, accurate, helpful and easy to understand each solution is. When you provide your feedback, each rating is adjusted accordingly. So, if you see a solution that has a poor rating that you think is a good solution, let us know by rating it. As you do, the rating will be adjusted and will become more accurate for other members of our site.

If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support.

Thank you!

Threads in C++ Builder 6

Zone: C++ Builder
Tags: builder, thread
I was making a little app that acts as a server and i borrowed code from one I allready had, made on MFC though, that creates a thread that executes the server code. So, although everything (else) works, I wasn't able to find a function to replace AfxBeginThread() that executes a new thread in MFC.
I need to know how I can create threads in Builder.
Sorry if it's a newbie question, i just got into Borland Builder.
Thanx in advance!!
Start your free trial to view this solution
Question Stats
Zone: Programming
Question Asked By: skiritis13
Solution Provided By: gtokas
Participating Experts: 2
Solution Grade: A
Views: 196
Translate:
Loading Advertisement...
03.10.2005 at 01:29PM PST, ID: 13511062

Rank: Guru

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
03.10.2005 at 01:45PM PST, ID: 13511235

Rank: Master

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
03.14.2005 at 06:04AM PST, ID: 13534889

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
03.15.2005 at 04:24AM PST, ID: 13543647

Rank: Guru

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
03.17.2005 at 09:37AM PST, ID: 13567273

Rank: Guru

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Loading Advertisement...
Microsoft
  • Internet Protocols
  • Applications
  • Development
  • OS
  • Hardware
  • Windows Security
Apple
  • Operating Systems
  • Hardware
  • Programming
  • Networking
  • Software
Internet
  • Search Engines
  • File Sharing
  • WebTrends / Stats
  • Spy / Ad Blockers
  • Web Browsers
  • New Net Users
  • Web Development
  • Chat / IM
  • Anti Spam
  • Web Servers
  • Anti-Virus
  • Email Clients
Gamers
  • Tips
  • Online / MMORPG
  • Puzzle
  • Emulators
  • Action / Adventure
  • Role Playing
  • Consoles
  • Game Programming
  • Strategy
  • Sports
  • Misc
  • Computer Games
Digital Living
  • Hardware
  • Automotive
  • New Net Users
  • New Users
  • Software
  • Digital Music
  • Gaming World
  • Home Security
  • Apple
  • Networking Hardware
Virus & Spyware
  • Vulnerabilities
  • IDS
  • Encryption
  • Anti-Virus
  • Operating Systems Security
  • Software Firewalls
  • WebApplications
  • Cell Phones
  • Operating Systems
  • Internet
  • Hardware Firewalls
Hardware
  • Displays / Monitors
  • Handhelds / PDAs
  • Components
  • Peripherals
  • Laptops/Notebooks
  • Servers
  • Misc
  • Apple
  • Embedded Hardware
  • Networking Hardware
  • Storage
  • Desktops
  • New Users
Software
  • System Utilities
  • Industry Specific
  • Network Management
  • Photos / Graphics
  • Page Layout
  • VMware
  • Misc
  • Web Development
  • OS
  • CYGWIN
  • Voice Recognition
  • Virtualization
  • Message Queue
  • Quality Assurance
  • Security
  • Firewalls
  • MultiMedia Applications
  • Development
  • Database
  • Office / Productivity
  • Business Management
  • OS/2 Apps
  • Server Software
  • Internet / Email
ITPro
  • OS
  • Storage
  • Encryption
  • Operating Systems Security
  • Apple Hardware
  • Laptops & Notebooks
  • Servers
  • Networking Hardware
  • Peripherals
  • Devices
  • Displays / Monitors
  • WebTrends / Stats
  • Search Engines
  • Firewalls
  • Web Computing
  • WebApplications
  • IDS
  • Vulnerabilities
  • Email Clients
  • File Sharing
  • Spy / Ad Blockers
  • Web Browsers
  • Web Servers
  • Networking
  • Anti-Virus
  • Consulting
  • Chat / IM
  • Anti Spam
Developer
  • Web Servers
  • Web Browsers
  • Game Programming
  • Dev Tools
  • Industry Specific
  • Office / Productivity
  • Database
  • CYGWIN
  • Web Development
  • Search Engines
  • File Sharing
  • WebTrends / Stats
  • Programming
  • Content Management
  • Application Servers
  • Protocols
Storage
  • Removable Backup Media
  • Storage Technology
  • Servers
  • Grid
  • Remote Access
  • Backup / Restore
  • Misc
  • Hard Drives
OS
  • Miscellaneous
  • Security
  • Development
  • Linux
  • VMware
  • MainFrame OS
  • Unix
  • Apple
  • OS / 2
  • AS / 400
  • BeOS
  • Microsoft
  • VMS / OpenVMS
Database
  • Oracle
  • Miscellaneous
  • MySQL
  • Software
  • Sybase
  • Contact Management
  • PostgreSQL
  • Data Manipulation
  • Clarion
  • InterSystems Cache
  • Siebel
  • MUMPS
  • OLAP
  • SQLBase
  • SAS
  • GIS & GPS
  • 4GL
  • Berkeley DB
  • DB2
  • Informix
  • Interbase / Firebird
  • FoxPro
  • Reporting
  • LDAP
  • Filemaker Pro
  • MS SQL Server
  • dBase
  • MS Access
Security
  • Misc
  • Web Browsers
  • Software Firewalls
  • Operating Systems Security
  • File Sharing
  • Spy / Ad Blockers
  • Vulnerabilities
  • WebApplications
  • IDS
  • Anti-Virus
  • Encryption
  • Anti Spam
  • Email Clients
  • VPN
  • Chat / IM
Programming
  • Editors IDEs
  • Installation
  • Handhelds / PDAs
  • Multimedia Programming
  • System / Kernel
  • Automation
  • Algorithms
  • Game
  • Signal Processing
  • Project Management
  • Open Source
  • Database
  • Misc
  • Languages
  • Processor Platforms
  • Theory
Web Development
  • Scripting
  • Blogs
  • Web Servers
  • Software
  • Search Engines
  • Web Graphics
  • Web Services
  • Images
  • Internet Marketing
  • Images and Photos
  • Components
  • Document Imaging
  • Web Languages/Standards
  • Illustration
  • WebApplications
  • Fonts
  • WebTrends / Stats
  • Authoring
  • Digital Camera Software
  • Miscellaneous
Networking
  • Protocols
  • Apple Networking
  • Network Management
  • Message Queue
  • Application Servers
  • Content Management
  • File Servers
  • Email Servers
  • Misc
  • Java Editors & IDEs
  • Wireless
  • Networking Hardware
  • Backup / Restore
  • System Utilities
  • ISPs & Hosting
  • Web Servers
  • Storage Technology
  • Removable Backup Media
  • Servers
  • Web Computing
  • Broadband
  • Grid
  • OS / 2
  • Novell Netware
  • Unix Networking
  • Windows Networking
  • Security
  • Telecommunications
  • Operating Systems
  • Linux Networking
Other
  • Lounge
  • Business Travel
  • Community Support
  • New Net Users
  • Philosophy / Religion
  • Math / Science
  • Miscellaneous
  • URLs
  • Expert Lounge
  • Politics
  • Puzzles / Riddles
  • Automotive
Community Support
  • Suggestions
  • New to EE
  • New Topics
  • CleanUp
  • Announcements
  • General
  • Feedback
  • Input
  • EE Bugs
 
03.10.2005 at 01:29PM PST, ID: 13511062

Rank: Guru

Hello there...
Server?? What kind??
If it is TCP/IP then:
Drop a TServerSocket at your form(Internet tab)...
By default the connection type is nonblocking...
THAT MEANS each connection to the socket executed at its own thread...

Those are for your information...
It is a bit different than MFC... Anyway those sockets at the internet tab are wrappers around winsock... They handle MOST of your needs ...

One more thing.. At BCB\Examples\Internet you will find an example called chat...
Explore it and feel free to post again if you have questions...

gtokas.
 
03.10.2005 at 01:45PM PST, ID: 13511235

Rank: Master

Lucky for you threads are quite simple in Builder.  Just create a descendant from the TThread class by writing a Execute method.  CBuilder will make the basic file for you from File->New,  New Tab at the bottom - Thread Object.

The CBuilder helpfile is quite useful as well.  Look under 'TThread' and also 'Using TThread'
Borland Example files in the Borland  ..\Borland\CBuilder5\Examples\Apps\Threads area.

Heres a small tutorial
http://www.temporaldoorway.com/programming/cbuilder/threads/basics.htm

Another basic thread example
http://cc.borland.com/ccweb.exe/listing?id=21393

To get this one to work just make a new project and stick in Unit1 and Unit2.  It has a project but it is more work to clean it up to compile and run.  Unit2 is a very basic TThread class example and Unit1 is a GUI frontend to start and stop the threads.

Also chapter 7 of the Developers guide (that came with my CBuilder5) covers threads - not sure if v6 also has the book.  I think there is a chapter in the CBuilder 5 or 6 Developers Guides as well.  Useful books in any case.

As gtokas mentions there may be some components that do most of the thread management work for you depending on what you are doing.  eg most internet servers.
 
03.14.2005 at 06:04AM PST, ID: 13534889
thanx kode99 for the thread links but since i can make a tcpip server using ready components i think i'll go that way for now.
gtokas can you simply tell me how reading and writing works between the server and the client compo?
I understand that the moment the client connects the onwrite function is called.
I use client->Socket->SendBuf(buffer,sizeof(buffer)) inside the OnWrite func to send to the server.
Is this correct?
Simply put, I try sending a file via a 512byte buffer like that:

        do {
                memset(buffer,0,sizeof(buffer));

                bytes_read += fread( buffer, sizeof(BYTE), sizeof(buffer), source );

                client->Socket->SendBuf(buffer,strlen(buffer));

                progress->StepBy(file_size/(bytes_read+1));
        }
        while( feof(source) == 0 );

this code exists inside OnWrite;
Am doing the write thing?

On the other side, at the server's OnClientRead func i have:

        int rec;
        do {
                memset(buffer,0,sizeof(buffer));

                rec = server->Socket->ReceiveBuf(buffer,sizeof(buffer));

                fwrite( buffer, sizeof(BYTE), strlen(buffer), dest );
        }
        while(rec>0);

and to tell you the truth I do not know what the ReceiveBuf func returns since the builder's help is not very thorough. I assume that it returns the bytes that it read.

thanx for any xtra help on this...
 
03.15.2005 at 04:24AM PST, ID: 13543647

Rank: Guru

Check out this:
Its an example I downloaded and helped me some years ago...

The header:
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ScktComp.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:      // IDE-managed Components
    TServerSocket *Server;
    TMemo *Memo1;
    TButton *cmdClose;
    TTimer *Timer1;
    TLabel *Label1;
    TLabel *Label2;
    TLabel *Label3;
    TBevel *Bevel1;
    TButton *Button1;
    TEdit *Edit1;
    TLabel *Label4;
    TEdit *txtPort;
    TButton *cmdChangePort;
    void __fastcall cmdCloseClick(TObject *Sender);
    void __fastcall ServerAccept(TObject *Sender,
          TCustomWinSocket *Socket);
    void __fastcall ServerClientDisconnect(TObject *Sender,
          TCustomWinSocket *Socket);
    void __fastcall ServerClientError(TObject *Sender,
          TCustomWinSocket *Socket, TErrorEvent ErrorEvent,
          int &ErrorCode);
    void __fastcall ServerClientRead(TObject *Sender,
          TCustomWinSocket *Socket);
    void __fastcall ServerClientWrite(TObject *Sender,
          TCustomWinSocket *Socket);
    void __fastcall ServerGetSocket(TObject *Sender, int Socket,
          TServerClientWinSocket *&ClientSocket);
    void __fastcall ServerListen(TObject *Sender,
          TCustomWinSocket *Socket);
    void __fastcall FormActivate(TObject *Sender);
    void __fastcall ServerGetThread(TObject *Sender,
          TServerClientWinSocket *ClientSocket,
          TServerClientThread *&SocketThread);
    void __fastcall ServerThreadStart(TObject *Sender,
          TServerClientThread *Thread);
    void __fastcall ServerThreadEnd(TObject *Sender,
          TServerClientThread *Thread);
    void __fastcall Timer1Timer(TObject *Sender);
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall ServerClientConnect(TObject *Sender,
          TCustomWinSocket *Socket);
    void __fastcall cmdChangePortClick(TObject *Sender);

private:      // User declarations
public:            // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Source File:
/*******************************************************
This is an example of how to set up a server listening
to incomming Telnet connections. I've tried to make it
as well structured as possible with the possibility to,
without any major modifications, build up a fully
functional telnet server for whatever use there might be.
I have commented it heavily, but if there still are any
questions (or suggestions) mail them to karlpest@home.se

Please visit KTRK's webpage at http://www.ktrk.net or
http://ktrk.tripod.com

Coded by Karl Tillstr&#966;m 2000-10-11

*******************************************************/

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

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



const Max_Connections = 30;  //Set how many sockets you wish to have open

struct Connected_User
{
    int SocketHandle;   //The Socket the user is connected to
    AnsiString Name;    //If you want to attatch a name to the user
    AnsiString Data;    //To get whole lines (look into ClientRead())
    AnsiString IP;      //The clients IP
    //Add more if needed, like TimeOut, PasswordAccepted, AccessLevel etc...
};

Connected_User User[Max_Connections];   //Handles the connected users
int ConnectionCount;    //Index used by User[]

void RemoveUser(TCustomWinSocket *Socket);      //Removes a user from a socket
int GetConnectionNo(int SocketHandle);  //Finds which User[] that represents the SocketHandle
void ClearUser(int SocketHandle);   //Clears the User[] for the specific user
void BroadCastMessage(AnsiString Message, int SkipUser);  //Use this to send a message to all connected users except SkipUser (SocketHandle)

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{

}
//---------------------------------------------------------------------------

void __fastcall TForm1::cmdCloseClick(TObject *Sender)
{
//Closes the Server Socket
Server->Active = false;
Memo1->Lines->Add("Server shut down!");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerAccept(TObject *Sender,
      TCustomWinSocket *Socket)
{
if (Server->Socket->ActiveConnections-1  == Max_Connections)
    {
        //The server is full!
        Socket->SendText("Too many users!");
        Memo1->Lines->Add("OnAccept: Too many users");
        delete Socket;  //Free memory
        return;
    }



while (User[ConnectionCount].SocketHandle)    //Find free entrypoint
{
    ConnectionCount++;  //Unique indexes for the Connected users!
    if (ConnectionCount > Max_Connections)
        {
            ConnectionCount = 0;
        }
}

//Attatches the SocketHandle to the User[] in use
User[ConnectionCount].SocketHandle = Socket->SocketHandle;
//This is not how it's done when you are really naming the users
User[ConnectionCount].Name = "Guest" + IntToStr(Socket->SocketHandle);
Memo1->Lines->Add("OnAccept");



User[ConnectionCount].IP = Socket->RemoteAddress;
Memo1->Lines->Add(User[ConnectionCount].IP + " connected!");


}
//---------------------------------------------------------------------------


void __fastcall TForm1::ServerClientDisconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{

ClearUser(Socket->SocketHandle);
Memo1->Lines->Add("ClientDisconnected " + IntToStr(Socket->SocketHandle));
//delete Socket;  //free memory (dunno if it's needed here...)
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerClientError(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{

switch (ErrorCode)
{
    case 10054 :
        //Client closed the connection
        RemoveUser(Socket);   //Removes the user
        Memo1->Lines->Add("Client closed connection");
        break;
    //add more error handlers as they are needed (e.g case <ErrorCode>)
    default :
        RemoveUser(Socket);
}

ErrorCode = 0;  //Prevents an error raise
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
//Occurs when a connected user sends some text to the server!

AnsiString Data = Socket->ReceiveText();    //Get the sent data!
int UserNo = GetConnectionNo(Socket->SocketHandle); //Finds out who sent it
if (UserNo == -1)
{
    //This shouldn't happen ever, but if it does you'll at least know about it
    ShowMessage("User cannot be found!");
    return;
}

/* Telnet users doesn't send complete lines at once,
therefore this will store all data in a temporary
AnsiString until a CRLF is received (\r\n)*/

User[UserNo].Data += Data;
if (User[UserNo].Data.AnsiPos("\r\n") == 0)
{
    //Not a complete line sent!
    return;
}
else
{
    //A complete Line sent!
    //SubString removes the ending CRLF ("\n\r") since we don't want them when we Parse out data!
    Memo1->Lines->Add("<" + User[UserNo].Name + "> " + User[UserNo].Data.SubString(1, User[UserNo].Data.Length() -2));
    //An example of how to use the BroadCastMessage function
    BroadCastMessage(User[UserNo].Data.SubString(1, User[UserNo].Data.Length() -2), Socket->SocketHandle);
    User[UserNo].Data = "";
}
       
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerClientWrite(TObject *Sender,
      TCustomWinSocket *Socket)
{
        Memo1->Lines->Add("ClientWrite");

}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerGetSocket(TObject *Sender, int Socket,
      TServerClientWinSocket *&ClientSocket)
{
    //GetSocket is the Socket->SocketHandle
    Memo1->Lines->Add("GetSocket " + IntToStr(Socket));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerListen(TObject *Sender,
      TCustomWinSocket *Socket)
{
Memo1->Lines->Add("Listens on Port: " + IntToStr(Server->Port));

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
//Opens the server (e.g Makes the server start Listening)
//Server->Active = true;

ConnectionCount = 1;    //Start counting on 1
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerGetThread(TObject *Sender,
      TServerClientWinSocket *ClientSocket,
      TServerClientThread *&SocketThread)
{
Memo1->Lines->Add("GetThread");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerThreadStart(TObject *Sender,
      TServerClientThread *Thread)
{
Memo1->Lines->Add("OnThreadStart");

}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerThreadEnd(TObject *Sender,
      TServerClientThread *Thread)
{
Memo1->Lines->Add("OnThreadEnd");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    //Updates the current # of connections
    Label1->Caption = IntToStr(Server->Socket->ActiveConnections) + "/" + IntToStr(Max_Connections);
}
//---------------------------------------------------------------------------

void ClearUser(int SocketHandle)
{
//Use this when a user gets disconnected for whatever reason
int UserNo = GetConnectionNo(SocketHandle);
if (UserNo == -1) return;

/*Don't forget to update this section is you add more stuff to the User struct!*/
    User[UserNo].SocketHandle = 0;
    User[UserNo].Name = "";
    User[UserNo].Data = "";
    User[UserNo].IP = "";
/*_____________________________________________________________________________*/
}
//---------------------------------------------------------------------------

int GetConnectionNo(int SocketHandle)
{
//Retrieves which connection that represents the SocketHandle in question
for (int i=0; i<Max_Connections; i++)
{
    if (User[i].SocketHandle == SocketHandle) return i;
}
return -1;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
//Activates the Server socket (e.g Starts to listen)
Memo1->Lines->Add("Server started!");
Server->Open();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ServerClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
Memo1->Lines->Add("connect");

}
//---------------------------------------------------------------------------

void BroadCastMessage(AnsiString Message, int SkipUser)
{

//Loops through the Socket->Connections array and sends the message to all users but SkipUser
//(You don't always want to broadcast the message to the user who sent it!)
//If you want to send to all the users including the one who sent it, call the function with SkipUser = -1 or something

for (int i=0;i<(Form1->Server->Socket->ActiveConnections); i++)
{
    if (Form1->Server->Socket->Connections[i]->SocketHandle == SkipUser)
    {
        // NOP
    }
    else
    {
        Form1->Server->Socket->Connections[i]->SendText(Message + AnsiString("\r\n"));
    }

}
}

void RemoveUser(TCustomWinSocket *Socket)
{
/*Clears the User[] and removes the Socket instance*/
    Form1->Memo1->Lines->Add("User " + User[GetConnectionNo(Socket->SocketHandle)].Name + " removed!");
    ClearUser(Socket->SocketHandle);
    delete Socket;

/*_________________________________*/
}
void __fastcall TForm1::cmdChangePortClick(TObject *Sender)
{
if (Server->Active == true)
{

 if (Application->MessageBox("Server must be shut down in order to change Listening port! \n Do you wish to continue?", "Temporarily shut down server?", MB_OKCANCEL + MB_DEFBUTTON1) == IDCANCEL)
   return;

    //Server must be shut down to be able to change port!
    cmdClose->Click();
    Server->Port = StrToInt(txtPort->Text);
    Memo1->Lines->Add("Listening port changed to " + txtPort->Text);
    Button1->Click();
}
else
{
    Server->Port = StrToInt(txtPort->Text);
        Memo1->Lines->Add("Listening port changed to " + txtPort->Text);
}

}
//---------------------------------------------------------------------------

Accepted Solution
 
03.17.2005 at 09:37AM PST, ID: 13567273

Rank: Guru

Skiritis13,
Was the example helpfull???
Did you found your way using the Borland's ways??
A reply will be appreciated...

gtokas.
 
 
20080236-EE-VQP-29