Quelltext /~heha/messtech/matdde.zip/source/ddeadv/i_field.cpp

#include <windows.h>
#include <ddeml.h>
#include <string.h>

#include "..\header\i_field.h"	 //Klassendefinition


#define TABLE_DEF_SIZE	5     //Anfangsgroesse der Tabelle
#define DELTA	     5	   //Betrag, um den die Anzahl der Tabelleneintraege erhoeht wird




void InfoField::AddEntry( HCONV hConv, HSZ hszItem, WORD cbFormat, char* szCallback, char* szDestMatrix, BOOL isString )
{
   int strLength;

//doppelte Eintraege vermeiden
// InfoField::DelEntry( hConv, hszItem );

   int nextFreeEntry = InfoField::GetNextFreeEntry();

   Field[nextFreeEntry] = new DDEAdviseInfoField;  //neues InfoField-Objekt erzeugen

//und mit Daten auffuellen
   Field[nextFreeEntry]->hConv	       = hConv;
   Field[nextFreeEntry]->hszItem    = hszItem;
   Field[nextFreeEntry]->cbFormat      = cbFormat;

   if ( szCallback )	//wenn Callbackstring ungleich ''
   {
      strLength = strlen( szCallback );
      Field[nextFreeEntry]->szCallback = new char[strLength+1];
      strcpy( Field[nextFreeEntry]->szCallback, szCallback );
   }
   else
      Field[nextFreeEntry]->szCallback = NULL;


   if ( szDestMatrix )	   //nur bei Hot-Link String reservieren
   {
      strLength = strlen( szDestMatrix );
      Field[nextFreeEntry]->szDestMatrix = new char[strLength+1];
      strcpy( Field[nextFreeEntry]->szDestMatrix, szDestMatrix );

      Field[nextFreeEntry]->isString = isString;

   }
   else
   {
      Field[nextFreeEntry]->szDestMatrix = NULL;
      Field[nextFreeEntry]->isString = FALSE;
   }

}



BOOL InfoField::DelEntry( HCONV hConv, HSZ hszItem, WORD cbFormat )
{
   int entry2Del = InfoField::SearchEntry( hConv, hszItem, cbFormat );

    if ( entry2Del == -1 )
      return FALSE;

   delete [] Field[entry2Del]->szCallback;	//Strings freigeben
   delete [] Field[entry2Del]->szDestMatrix;

   delete Field[entry2Del];		  //InfoField-Objekt freigeben

   Field[entry2Del] = NULL;   //Tabelleneintrag als frei markieren

   return TRUE;
}


char* InfoField::GetCallback( HCONV hConv, HSZ hszItem, WORD cbFormat )
{
   int entryReq = InfoField::SearchEntry( hConv, hszItem, cbFormat );

   if ( entryReq == -1 )
      return NULL;

   return Field[entryReq]->szCallback;
}

char* InfoField::exGetCallback( HCONV hConv, int* index )
{

   for ( int count = *index; count < tableSize; count++ )
   {
      if ( Field[count] )     //nur in belegten Tabelleneintraegen suchen
      {
	 if ( Field[count]->hConv == hConv )	//Tabelleneintrag gefunden
	 {
	    *index = ( count + 1 ); //naechste Suche eine Position nach diesem Eintrag beginnen
	    return Field[count]->szCallback;
	 }
      }
   }

   return (char*)-1; //Ende erreicht
}


char* InfoField::GetDestMatrix( HCONV hConv, HSZ hszItem, WORD cbFormat )
{
   int entryReq = InfoField::SearchEntry( hConv, hszItem, cbFormat );

   if ( entryReq == -1 )
      return NULL;

   return Field[entryReq]->szDestMatrix;
}



BOOL InfoField::IsStringMatrix( HCONV hConv, HSZ hszItem, WORD cbFormat )
{
   int entryReq = InfoField::SearchEntry( hConv, hszItem, cbFormat );

   if ( entryReq == -1 )
      return FALSE;

   return Field[entryReq]->isString;
}






///////////////////////////////////////////Hilfsfunktionen der Klasse (protected)

//Suche eines freien Tabelleneintrages, wenn AddEntry() aufgerufen wurde
int InfoField::GetNextFreeEntry()
{
   int count;

   for ( count = 0; count < tableSize; count++ )
   {
      if ( Field[count] == NULL )      //freier Tabelleneintrag
	 return count;
   }

   InfoField::ResizeTable();	    //Tabelle muss vergroessert werden...

   return count;
}


//Durchsuchen der Tabelle nach gegebenen hConv und hszItem
int InfoField::SearchEntry( HCONV hConv, HSZ hszItem, WORD cbFormat )
{
   int count;

   for ( count = 0; count < tableSize; count++ )
   {
      if ( Field[count] )     //nur in belegten Tabelleneintraegen suchen
      {
	 if ( Field[count]->hConv == hConv &&
	      Field[count]->hszItem == hszItem &&
	      Field[count]->cbFormat == cbFormat )
	    return count;		     //Tabelleneintrag gefunden
      }
   }

   return -1;  //Error, Eintrag nicht gefunden.
}


//wenn alte Tabelle zu klein ist, wird sie in eine neue, groessere kopiert und dann geloescht.
void InfoField::ResizeTable()
{
   DDEAdviseInfoField** Temp;

   tableSize += DELTA;

   Temp = new DDEAdviseInfoField* [tableSize];
   InfoField::InitTable( Temp );

//alte Tabelle in neue kopieren
   for ( int i = 0; i < (tableSize - DELTA); i++ )
      Temp[i] = Field[i];

   delete [] Field;

   Field = Temp;
}


//Initialisierung einer Tabelle mit NULL
void InfoField::InitTable( DDEAdviseInfoField** ResetField)
{
   for ( int i = 0; i < tableSize; i++ )
      ResetField[i] = NULL;
}




//Constructor
InfoField::InfoField()
{
    tableSize  = TABLE_DEF_SIZE; //Startgroesse

   Field = new DDEAdviseInfoField* [tableSize]; //Tabellenobjekt mit Zeigern auf InfoFields

   InfoField::InitTable( Field );
}


//Destructor
InfoField::~InfoField()
{
   for ( int i = 0; i < tableSize; i++ )
   {
      delete [] Field[i]->szCallback;	  //Strings freigeben
      delete [] Field[i]->szDestMatrix;
      delete Field[i];		    //InfoField-Objekt freigeben
   }

   delete [] Field;
}
Vorgefundene Kodierung: ASCII (7 bit)2