First commit 11/12/1999
This commit is contained in:
909
CtrlPPal.cpp
Normal file
909
CtrlPPal.cpp
Normal file
@ -0,0 +1,909 @@
|
||||
//---------------------------------------------------------------------------
|
||||
#include <io.h>
|
||||
#include <vcl.h>
|
||||
#pragma hdrstop
|
||||
|
||||
#include <registry.hpp>
|
||||
#include <ShellAPI.hpp>
|
||||
#include <SysUtils.hpp>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "CtrlPPal.h"
|
||||
#include "TStatus.h"
|
||||
#include "CtrlSocket.h"
|
||||
#include "CtrlCfg.h"
|
||||
#include "CtrlElemento.h"
|
||||
//---------------------------------------------------------------------------
|
||||
#pragma package(smart_init)
|
||||
#pragma link "CoolForm"
|
||||
#pragma resource "*.dfm"
|
||||
TCtrlPPal *CtrlPPal;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
#define MsgDEMO "No olvide que esto es solo una demostraci<63>n.\nPara adquirir la aplicaci<63>n completa:\nPongase en contacto con JD soft.\n\te-mail: jd@infdj.com\n\tTlf: 95561-58-54 Fax: 95561-49-13"
|
||||
#define DEMOSTRACION
|
||||
#ifdef DEMOSTRACION
|
||||
#define CnElementosMAX 3
|
||||
#else
|
||||
#define CnElementosMAX 11 // Num. m<>ximo de elementos permitidos
|
||||
#endif
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define opLOG "Historic.log"
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
__fastcall TCtrlPPal::TCtrlPPal(TComponent* Owner)
|
||||
: TForm(Owner)
|
||||
{
|
||||
// Remote Control
|
||||
ClientHook = false;
|
||||
ServerHook = false;
|
||||
RemoteStart -> Visible = true;
|
||||
|
||||
|
||||
remoteBack->Visible = false;
|
||||
remoteLog->Visible = false;
|
||||
remoteClose->Visible = false;
|
||||
// Remote Control
|
||||
|
||||
siMinimizar = new TStringList(); // Listado de Aplicaciones Especiales
|
||||
noMinimizar = new TStringList(); // Listado de Aplicaciones Especiales
|
||||
snMinimizar = new TStringList(); // Listado de Aplicaciones Especiales
|
||||
noAbrir = new TStringList(); // Listado de Aplicaciones Especiales
|
||||
|
||||
LoadProtectedList(); // Carga los listados de Aplicaicones protegidas
|
||||
|
||||
nElementosMAX = CnElementosMAX; // N<>mero maximos de elementos
|
||||
Elementos = new TList(); // Lista de Elementos en funcionamiento
|
||||
AnySocketActive = 0; // N<> de socket REALMENTE activos
|
||||
pCache = new TThreadList; // Lista de Hilos de comunicaci<63>n
|
||||
|
||||
ChangePositionEnabled = false; // Permiso para mover la posici<63>n de los elementos
|
||||
|
||||
CheckAppIntegrity(); // El directorio de instalacion no puede moverse
|
||||
StartEventRecorder(); // Comenzamos la grabaci<63>n de eventos
|
||||
TbElementosCFG->Active = true; // Abrimos la tabla de elementos para hacerlos visibles
|
||||
TbPersonas->Active = true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::LoadProtectedList(void)
|
||||
{
|
||||
//LoadProtectedList();
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::StartEventRecorder(void)
|
||||
{
|
||||
TbHistorial->Active = true; // Tabla de eventos del sistema
|
||||
try {
|
||||
// Cargamos todos los eventos anteriores
|
||||
Memo1->Lines->LoadFromFile( opLOG );
|
||||
// Si hay demasiados registros
|
||||
if ( Memo1->Lines->Count > 700 )
|
||||
{
|
||||
for ( int i=0; i<100; i++ ) // Eliminamos las 100 <20>ltimas entradas
|
||||
Memo1->Lines->Delete( 3 );
|
||||
}
|
||||
} catch(...) {
|
||||
Memo1->Lines->Clear(); // En caso de error, las eliminamos todas
|
||||
}
|
||||
//Fecha y hora del inicio de sesi<73>n
|
||||
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Inicio de la sesi<73>n" );
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::iCloseDblClick(TObject *Sender)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::iMinClick(TObject *Sender)
|
||||
{
|
||||
Application->Minimize();
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::iPosVClick(TObject *Sender)
|
||||
{
|
||||
#ifdef DEMOSTRACION
|
||||
ShowMessage( MsgDEMO );
|
||||
#endif
|
||||
if ( ChangePositionEnabled || ( !ChangePositionEnabled && InputBox( "Programa BETA!!!", "Modificar:", "<EFBFBD>Que Modificar?") == "Esto es una beta" ) )
|
||||
{
|
||||
Graphics::TBitmap *Picture;
|
||||
|
||||
ChangePositionEnabled = !ChangePositionEnabled;
|
||||
|
||||
Picture = iPosV->GlyphNormal;
|
||||
iPosV->GlyphNormal = iPosV->GlyphPress;
|
||||
iPosV->GlyphPress = Picture;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
/**
|
||||
Comprueba que el directorio de la aplicaci<63>n es siempre el mismo
|
||||
|
||||
(De este modo, la aplicaci<63>n no correra en ning<6E>n directorio distinto, del
|
||||
que se eligi<67> para instalar)
|
||||
**/
|
||||
void __fastcall TCtrlPPal::CheckAppIntegrity(void)
|
||||
{
|
||||
TRegistry *Registro;
|
||||
Registro = new TRegistry;
|
||||
Registro -> OpenKey( "\\Software\\JDsoft\\CtrlMstr", true );
|
||||
AnsiString AppPath;
|
||||
|
||||
if ( ! Registro->ValueExists( "AppPath" ) )
|
||||
{
|
||||
Registro -> WriteString( "AppPath", Application->ExeName );
|
||||
} else {
|
||||
AppPath = Registro -> ReadString( "AppPath" );
|
||||
if ( AppPath != Application->ExeName )
|
||||
{
|
||||
ShowMessage( "Copia corrupta o ilegal del programa.\nVuelva a reinstalar el producto." );
|
||||
nElementosMAX = 0;
|
||||
}
|
||||
}
|
||||
|
||||
AnsiString DiskSerial;
|
||||
char VolumeLabel[255], FileSystem[255];
|
||||
DWord SerialNumber, DW, SysFlags;
|
||||
|
||||
GetVolumeInformation( "C:\\", VolumeLabel, 250, &SerialNumber, &DW, &SysFlags, FileSystem, 250);
|
||||
DiskSerial = AnsiString( ltoa(SerialNumber, FileSystem,10) );
|
||||
|
||||
|
||||
if ( ! Registro->ValueExists( "SerialNum" ) )
|
||||
{
|
||||
AnsiString Serial;
|
||||
Serial = InputBox( "Registrando el Programa:", "N<EFBFBD>mero de Serie:", DiskSerial );
|
||||
if ( ! Manipula2( DiskSerial, Serial ) )
|
||||
{
|
||||
Registro -> WriteString( "SerialNum", Serial );
|
||||
}
|
||||
}
|
||||
if ( Manipula( DiskSerial, Registro -> ReadString( "SerialNum" ) ) )
|
||||
{
|
||||
ShowMessage( "Copia corrupta o ilegal del programa.\nVuelva a reinstalar el producto." );
|
||||
nElementosMAX = 0;
|
||||
Registro -> DeleteValue( "SerialNum" );
|
||||
Registro -> DeleteKey( "\\Software\\JDsoft\\CtrlMstr\\SerialNum" );
|
||||
}
|
||||
}
|
||||
//-----------------
|
||||
bool __fastcall TCtrlPPal::Manipula2(AnsiString Serial, AnsiString Image)
|
||||
{
|
||||
char buffer[80];
|
||||
AnsiString Sol;
|
||||
double ser = Serial.ToDouble();
|
||||
if ( ser < 0 ) ser = -1*ser;
|
||||
Sol = ltoa(sqrtl(ser), buffer, 10);
|
||||
#ifndef DEMOSTRACION
|
||||
if ( Image == Sol )
|
||||
#endif
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
//-----------------
|
||||
bool __fastcall TCtrlPPal::Manipula(AnsiString Serial, AnsiString Image)
|
||||
{
|
||||
char buffer[80];
|
||||
AnsiString Sol;
|
||||
double ser = Serial.ToDouble();
|
||||
if ( ser < 0 ) ser = -1*ser;
|
||||
Sol = ltoa(sqrtl(ser), buffer, 10);
|
||||
#ifndef DEMOSTRACION
|
||||
if ( Image == Sol )
|
||||
#endif
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::FormDestroy(TObject *Sender)
|
||||
{
|
||||
delete siMinimizar;
|
||||
delete noMinimizar;
|
||||
delete snMinimizar;
|
||||
delete noAbrir;
|
||||
|
||||
for( int i=0; i < Elementos->Count; i++ )
|
||||
delete (TElemento *)Elementos->Items[i];
|
||||
delete Elementos;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::NewElementAt(int X, int Y, int NumEl, AnsiString IP, AnsiString Name )
|
||||
{
|
||||
TElemento *Elemento; // Elemento a ser insertado
|
||||
Elemento = new TElemento(this); // Pedimos memoria para <20>l
|
||||
Elemento->Left = X; //
|
||||
Elemento->Top = Y; // FIJAMOS SUS PROPIEDADES
|
||||
Elemento->AutoSize = true; //
|
||||
Elemento->Transparent = true; //
|
||||
Elemento->PopupMenu = mElementoCFG; // Men<65> contextual
|
||||
Elemento->OnDblClick = ElementoDblClick; //
|
||||
|
||||
Elementos->Add( Elemento ); // A<>adimos el elemento a la lista
|
||||
// Lo hacemos visible
|
||||
Pizarra->InsertControl( Elemento );
|
||||
|
||||
Elemento->SetElemento( NumEl, IP, Name ); // Y comenzamos la comunicaci<63>n
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::PizarraDblClick(TObject *Sender)
|
||||
{
|
||||
POINT MousePos;
|
||||
int X, Y;
|
||||
|
||||
// Si lo que quiere es reubicar un nuevo elemento
|
||||
if ( ChangePositionEnabled )
|
||||
{
|
||||
#ifndef DEMOSTRACION
|
||||
// Anexamos un nuevo elemento a la lista (Si no hemos llegado al l<>mite)
|
||||
if ( Elementos->Count < nElementosMAX )
|
||||
{
|
||||
GetCursorPos(&MousePos);
|
||||
X = MousePos.x - Left - Pizarra->Left - iElementoV->Picture->Width / 2;
|
||||
Y = MousePos.y - Top - Pizarra->Top - iElementoV->Picture->Height / 2 ;
|
||||
try {
|
||||
// Lo damos de Alta en la tabla
|
||||
/*
|
||||
TbElementosCFG -> InsertRecord( ARRAYOFCONST(
|
||||
( Null, // Numero de Elemento
|
||||
X, // Posici<63>n X
|
||||
Y, // Posici<63>n Y
|
||||
false, "0.0.0.0", "new"+AnsiString(Elementos->Count)
|
||||
) ) );
|
||||
*/
|
||||
|
||||
AnsiString NameOfElement = "new"+AnsiString(TbElementosCFG->FieldByName("NumElement")->AsInteger);
|
||||
|
||||
TbElementosCFG -> Insert();
|
||||
TbElementosCFG -> Edit();
|
||||
TbElementosCFG -> FieldByName( "PosX" )-> AsInteger = X;
|
||||
TbElementosCFG -> FieldByName( "PosY" )-> AsInteger = Y;
|
||||
TbElementosCFG -> FieldByName( "Activo" )-> AsBoolean = false;
|
||||
TbElementosCFG -> FieldByName( "IP" )-> AsString = "0.0.0.0";
|
||||
TbElementosCFG -> FieldByName( "Name" )-> AsString = NameOfElement;
|
||||
TbElementosCFG -> Post();
|
||||
|
||||
NewElementAt( X, Y, TbElementosCFG->FieldByName("NumElement")->AsInteger, "0.0.0.0", NameOfElement );
|
||||
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Inserci<63>n de nuevos elementos" );
|
||||
} catch (...) {
|
||||
ShowMessage( "<EFBFBD><EFBFBD><EFBFBD> SIN MEMORIA ???\nTu G<>indows est<73> petando" );
|
||||
}
|
||||
} else
|
||||
ShowMessage( "Ha superado el m<>ximo n<>mero de elementos\n<EFBFBD><EFBFBD><EFBFBD> IMPOSIBLE A<>ADIR MAS !!!" );
|
||||
#else
|
||||
ShowMessage( MsgDEMO );
|
||||
#endif
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::EliminarElemento(TObject *Sender)
|
||||
{
|
||||
if ( ServerHook ) return;
|
||||
|
||||
int TraceMeHacker;
|
||||
TraceMeHacker = Elementos->Count;
|
||||
|
||||
#ifndef DEMOSTRACION
|
||||
if ( ChangePositionEnabled )
|
||||
{
|
||||
TElemento *Elemento = (TElemento *)(mElementoCFG->PopupComponent);
|
||||
|
||||
// Eliminamos el objeto de la tabla
|
||||
if ( TbElementosCFG -> Locate( "NumElement", Elemento->NumElemento, TLocateOptions() << loCaseInsensitive ) )
|
||||
{
|
||||
TbElementosCFG -> Delete(); // Eliminamos el elemento de la TABLA
|
||||
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Elemento n<> " + AnsiString( Elemento->NumElemento ) + ", eliminado." );
|
||||
|
||||
Pizarra->RemoveControl( Elemento ); // Eliminamos el elemento de la PIZARRA
|
||||
Elementos->Remove( Elemento ); // Eliminamos el elemento de la MEMORIA
|
||||
Elementos->Pack();
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
||||
ShowMessage( MsgDEMO );
|
||||
|
||||
#endif
|
||||
|
||||
if ( TraceMeHacker == Elementos->Count )
|
||||
ShowMessage( "Lo siento pero carece de permisos para modificar los terminales.\n<EFBFBD><EFBFBD>Su intento ha quedado registrado!!" );
|
||||
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::TbElementosCFGBeforeOpen(TDataSet *DataSet)
|
||||
{
|
||||
// Si la tabla no existe, la creamos
|
||||
if ( access( (TbElementosCFG -> TableName).c_str(), 0 ) != 0 )
|
||||
{
|
||||
// Usamos la propiedad FielDefs para definir
|
||||
// las columnas que contendr<64> la tabla
|
||||
TbElementosCFG -> FieldDefs -> Clear();
|
||||
|
||||
TbElementosCFG -> FieldDefs -> Add("NumElement", ftAutoInc, 0, false );
|
||||
TbElementosCFG -> FieldDefs -> Add("PosX", ftInteger, 0, false );
|
||||
TbElementosCFG -> FieldDefs -> Add("PosY", ftInteger, 0, false );
|
||||
TbElementosCFG -> FieldDefs -> Add("Activo", ftBoolean, 0, false );
|
||||
TbElementosCFG -> FieldDefs -> Add("IP", ftString, 15, false );
|
||||
TbElementosCFG -> FieldDefs -> Add("Name", ftString, 8, false );
|
||||
TbElementosCFG -> FieldDefs -> Add("Comienzo", ftDateTime, 0, false );
|
||||
TbElementosCFG -> FieldDefs -> Add("Tiempo", ftDateTime, 0, false );
|
||||
|
||||
TbElementosCFG -> IndexDefs-> Clear();
|
||||
TbElementosCFG->IndexDefs->Add("Primary", "NumElement", TIndexOptions() << ixPrimary << ixUnique );
|
||||
|
||||
// Creamos la base...
|
||||
TbElementosCFG -> CreateTable();
|
||||
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Iniciando sistema por primera vez..." );
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::TbElementosCFGAfterOpen(TDataSet *DataSet)
|
||||
{
|
||||
int i; HoraActual = TDateTime::CurrentTime();
|
||||
|
||||
// Cargamos todos los elementos
|
||||
TbElementosCFG -> First(); i = 0;
|
||||
while ( ! TbElementosCFG->Eof && i < nElementosMAX )
|
||||
{
|
||||
|
||||
/*
|
||||
if ( TbElementosCFG->FieldByName( "Activo" )->AsBoolean )
|
||||
{
|
||||
if ( MessageBox( NULL, AnsiString("El equipo arriba indicado se encuentra \"ocupado\"\n<> Desea dejar libre este equipo ?").c_str(), AnsiString("Equipo " + TbElementosCFG->FieldByName( "NumElement" )->AsString + " <20>Activo?").c_str(), MB_YESNO ) != IDNO )
|
||||
{
|
||||
TbElementosCFG->Edit();
|
||||
TbElementosCFG->FieldByName( "Activo" )->AsBoolean = false;
|
||||
TbElementosCFG->Post();
|
||||
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Elemento n<>" + TbElementosCFG->FieldByName( "NumElement" )->AsString + ", estaba activo" );
|
||||
} else {
|
||||
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Elemento n<>" + TbElementosCFG->FieldByName( "NumElement" )->AsString + ", SIGUE activo" );
|
||||
}
|
||||
}
|
||||
*/
|
||||
NewElementAt( TbElementosCFG->FieldByName( "PosX" )->AsInteger,
|
||||
TbElementosCFG->FieldByName( "PosY" )->AsInteger,
|
||||
TbElementosCFG->FieldByName( "NumElement" )->AsInteger,
|
||||
TbElementosCFG->FieldByName( "IP" )->AsString,
|
||||
TbElementosCFG->FieldByName( "Name" )->AsString
|
||||
);
|
||||
TbElementosCFG -> Next(); i++;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::Estado1Click(TObject *Sender)
|
||||
{
|
||||
if ( !ServerHook )
|
||||
ElementoDblClick(mElementoCFG->PopupComponent);
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::ElementoDblClick(TObject *Sender)
|
||||
{
|
||||
// Abrimos el cuadro de dialogo de Status...
|
||||
if ( ((TElemento *)Sender)->StatusCode != -1 )
|
||||
{
|
||||
TStatus *Status;
|
||||
Status = new TStatus(this);
|
||||
Status->SetElement( (TElemento *)Sender );
|
||||
Status -> ShowModal();
|
||||
delete Status;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::FormClose(TObject *Sender, TCloseAction &Action)
|
||||
{
|
||||
#ifdef DEMOSTRACION
|
||||
ShowMessage( MsgDEMO );
|
||||
#endif
|
||||
clientHook->Close();
|
||||
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Fin de la sesi<73>n" );
|
||||
Memo1->Lines->SaveToFile( opLOG );
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::FormDeactivate(TObject *Sender)
|
||||
{
|
||||
FreeThreads();
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::Propiedades1Click(TObject *Sender)
|
||||
{
|
||||
if ( ServerHook ) return;
|
||||
|
||||
if ( ChangePositionEnabled )
|
||||
{
|
||||
TElementosCFG *ElementosCFG;
|
||||
ElementosCFG = new TElementosCFG(this);
|
||||
ElementosCFG -> ShowModal();
|
||||
delete ElementosCFG;
|
||||
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Se han modificado las direcciones IP" );
|
||||
|
||||
LoadProtectedList();
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::CerrarWindows1Click(TObject *Sender)
|
||||
{
|
||||
TElemento *Elemento = (TElemento *)(mElementoCFG->PopupComponent);
|
||||
|
||||
if ( MessageBox( NULL, "<EFBFBD> Realmente quiere cerrar el equipo ?", AnsiString("Equipo n: -- " + AnsiString( Elemento->NumElemento ) + " --" +" Nombre: \""+Elemento->GiveMyName()+"\"" ).c_str(), MB_OKCANCEL ) == IDOK )
|
||||
{
|
||||
if ( ServerHook )
|
||||
{
|
||||
ServerHookCode = 5660; ServerHookElement = Elemento->NumElemento;
|
||||
serverHook->Active = true;
|
||||
} else
|
||||
Elemento->CerrarWindows();
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
TThread * TCtrlPPal::GetThread(void)
|
||||
{
|
||||
TList *pList = pCache->LockList();
|
||||
TThread *NewThread;
|
||||
if (pList->Count) // cache is not empty
|
||||
{
|
||||
NewThread = (TThread *)pList->Items[0];
|
||||
pList->Delete(0); // remove from cache
|
||||
}
|
||||
else
|
||||
NewThread = (TThread *)new ThreadSocket(true); // create but don<6F>t run
|
||||
pCache->UnlockList();
|
||||
return NewThread;
|
||||
};
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::FreeThreads(void)
|
||||
{
|
||||
TList *pList = pCache->LockList();
|
||||
for (int i = pList->Count - 1; i >= 0; i--)
|
||||
{
|
||||
|
||||
delete pList->Items[i];
|
||||
pList->Delete(i);
|
||||
}
|
||||
pCache->UnlockList();
|
||||
};
|
||||
//---------------------------------------------------------------------------
|
||||
//###########################################################################
|
||||
//###########################################################################
|
||||
void __fastcall TCtrlPPal::FormCloseQuery(TObject *Sender, bool &CanClose)
|
||||
{
|
||||
// Esperamos a que se cierren los Sockets...
|
||||
if ( AnySocketActive > 0 )
|
||||
{
|
||||
if ( Application->MessageBox("La aplicaci<63>n sigue intentando comunicarse\ncon alg<6C>n terminal.\nPor favor, espere...\n(Cancelar el proceso dejar<61> la aplicaci<63>n\nen un estado Altamente INESTABLE)", AnsiString("<EFBFBD><EFBFBD><EFBFBD> " + AnsiString( AnySocketActive ) + " Alerta(s) !!!").c_str(), MB_OKCANCEL + MB_DEFBUTTON1) != ID_CANCEL )
|
||||
{
|
||||
CanClose = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::ActualizarEstado1Click(TObject *Sender)
|
||||
{
|
||||
if ( ServerHook )
|
||||
{
|
||||
ServerHookCode = 5661; ServerHookElement = ( (TElemento *)(mElementoCFG->PopupComponent) )->NumElemento;
|
||||
serverHook -> Active = true;
|
||||
} else {
|
||||
( (TElemento *)(mElementoCFG->PopupComponent) ) -> RefreshElement();
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TCtrlPPal::SinTIEMPO1Click(TObject *Sender)
|
||||
{
|
||||
TElemento *Elemento = (TElemento *)(mElementoCFG->PopupComponent);
|
||||
|
||||
if ( MessageBox( NULL, "<EFBFBD> Realmente quiere QUITAR EL TIEMPO al equipo ?", AnsiString("Equipo n: -- " + AnsiString( Elemento->NumElemento ) + " --"+" Nombre: \""+Elemento->GiveMyName()+"\"").c_str() , MB_OKCANCEL ) == IDOK )
|
||||
{
|
||||
// Actualizamos el historial
|
||||
TbHistorial -> InsertRecord( ARRAYOFCONST(( Elemento->NumElemento,
|
||||
(Variant)TDateTime::CurrentDateTime(),
|
||||
(Variant)Elemento->TiempoRestante(), 0, 998, 0 )) );
|
||||
TbHistorial -> FlushBuffers();
|
||||
if ( ServerHook )
|
||||
{
|
||||
ServerHookCode = 5668; ServerHookElement = Elemento->NumElemento;
|
||||
serverHook -> Active = true;
|
||||
} else
|
||||
Elemento -> ForcedTimeOut();
|
||||
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TCtrlPPal::TbHistorialBeforeOpen(TDataSet *DataSet)
|
||||
{
|
||||
// Si la tabla no existe, la creamos
|
||||
if ( access( (TbHistorial -> TableName).c_str(), 0 ) != 0 )
|
||||
{
|
||||
// Usamos la propiedad FielDefs para definir
|
||||
// las columnas que contendr<64> la tabla
|
||||
TbHistorial -> FieldDefs -> Clear();
|
||||
|
||||
TbHistorial -> FieldDefs -> Add("NumElement", ftInteger, 0, false );
|
||||
TbHistorial -> FieldDefs -> Add("FComienzo", ftDateTime, 0, false );
|
||||
TbHistorial -> FieldDefs -> Add("Tiempo", ftTime, 0, false );
|
||||
TbHistorial -> FieldDefs -> Add("idc", ftInteger, 0, false );
|
||||
TbHistorial -> FieldDefs -> Add("idtc", ftInteger, 0, false );
|
||||
TbHistorial -> FieldDefs -> Add("precio", ftCurrency, 0, false );
|
||||
|
||||
TbHistorial -> IndexDefs -> Clear();
|
||||
TbHistorial -> IndexDefs -> Add("Primary", "NumElement;FComienzo", TIndexOptions() << ixPrimary << ixUnique );
|
||||
|
||||
// Creamos la base...
|
||||
TbHistorial -> CreateTable();
|
||||
}
|
||||
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TCtrlPPal::AsignarHora1Click(TObject *Sender)
|
||||
{
|
||||
/*
|
||||
iAnclada = GetNumElement( Sender );
|
||||
if ( iAnclada != -1 )
|
||||
{
|
||||
Elementos[ iAnclada ]-> EnviarListasAppl();
|
||||
}
|
||||
*/
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
void __fastcall TCtrlPPal::RemoteStartClick(TObject *Sender)
|
||||
{
|
||||
// Remote Start...
|
||||
if ( AnySocketActive > 0 )
|
||||
{
|
||||
ShowMessage( "Imposible enganche remoto,\nhasta que todos los terminales\nacaben su comunicaci<63>n" );
|
||||
return;
|
||||
}
|
||||
if ( ClientHook )
|
||||
{
|
||||
ShowMessage( "Alguien nos tiene enganchados.\nImposible realizar enganche remoto.\n(Pruebe en otro orden)" );
|
||||
return;
|
||||
}
|
||||
|
||||
RemoteStart -> Visible = false;
|
||||
ServerHook = true;
|
||||
|
||||
remoteBack->Visible = true;
|
||||
remoteLog->Visible = true;
|
||||
remoteClose->Visible = true;
|
||||
|
||||
|
||||
remoteLog->Caption= "Inicializando sistema remoto...";
|
||||
|
||||
serverHook->Address = InputBox("Conexi<EFBFBD>n Control Remoto", "IP Destino:", "0.0.0.0");
|
||||
|
||||
|
||||
remoteLog->Caption= "Eliminando terminales actuales" ;
|
||||
Elementos->Pack();
|
||||
for( int i=0; i < Elementos->Count; i++ )
|
||||
{
|
||||
Pizarra->RemoveControl( (TElemento *)Elementos->Items[i] );
|
||||
delete (TElemento *)Elementos->Items[i];
|
||||
}
|
||||
Elementos->Clear();
|
||||
|
||||
remoteLog->Caption= "Accediendo a los terminales remotos" ;
|
||||
ServerHookCode = 5650; ServerHookElement = 5650;
|
||||
serverHook->Active = true;
|
||||
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TCtrlPPal::remoteCloseDblClick(TObject *Sender)
|
||||
{
|
||||
if ( ClientHook )
|
||||
{
|
||||
ShowMessage( "Alguien nos tiene enganchados.\nImposible des-enganche remoto.\nRiesgo de incomunicaci<63>n parcial" );
|
||||
return;
|
||||
}
|
||||
|
||||
remoteLog->Caption= "Eliminando terminales actuales" ;
|
||||
Elementos->Pack();
|
||||
for( int i=0; i < Elementos->Count; i++ )
|
||||
{
|
||||
Pizarra->RemoveControl( (TElemento *)Elementos->Items[i] );
|
||||
delete (TElemento *)Elementos->Items[i];
|
||||
}
|
||||
Elementos->Clear();
|
||||
|
||||
ServerHook = false;
|
||||
|
||||
remoteLog->Caption= "Cargando Terminales Locales" ;
|
||||
TbElementosCFGAfterOpen(0);
|
||||
|
||||
RemoteStart -> Visible = true;
|
||||
|
||||
remoteBack->Visible = false;
|
||||
remoteLog->Visible = false;
|
||||
remoteClose->Visible = false;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TCtrlPPal::clientHookClientConnect(TObject *Sender,
|
||||
TCustomWinSocket *Socket)
|
||||
{
|
||||
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Nos han enganchado :: " + Socket->LocalAddress );
|
||||
ClientHook = true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TCtrlPPal::clientHookClientDisconnect(TObject *Sender,
|
||||
TCustomWinSocket *Socket)
|
||||
{
|
||||
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Desenganche " );
|
||||
ClientHook = false;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TCtrlPPal::clientHookClientError(TObject *Sender,
|
||||
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
|
||||
{
|
||||
Memo1->Lines->Insert( 0, (Now()).DateTimeString() + " :: Cliente <20> ERROR ! " + AnsiString( ErrorCode ) + "::" + Socket->LocalAddress );
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::SetActiveTimeElement( TElemento *Elemento, TDateTime Tiempo, int L_idc, int L_idtc, Currency L_Precio )
|
||||
{
|
||||
if ( ServerHook )
|
||||
{
|
||||
ServerHookCode = 5669; ServerHookElement = Elemento->NumElemento;
|
||||
ServerTiempo = Tiempo; ServerL_idc = L_idc; ServerL_idtc = L_idtc; ServerL_Precio = (double)L_Precio;
|
||||
serverHook -> Active = true;
|
||||
} else
|
||||
Elemento->SetActiveTime( Tiempo, L_idc, L_idtc, L_Precio );
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
TElemento * __fastcall TCtrlPPal::SearchElement( int NumEl )
|
||||
{
|
||||
for (int i = Elementos->Count - 1; i >= 0; i--)
|
||||
{
|
||||
if ( ((TElemento *)(Elementos->Items[i]))->NumElemento == NumEl )
|
||||
return (TElemento *)(Elementos->Items[i]);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::clientHookAccept(TObject *Sender,
|
||||
TCustomWinSocket *Socket)
|
||||
{
|
||||
int CodOp, dev;
|
||||
double Tiempo;
|
||||
TElemento *Elemento;
|
||||
TWinSocketStream *pStream;
|
||||
|
||||
Memo1->Lines->Insert( 0, "Conexi<EFBFBD>n aceptada de " + Socket->RemoteAddress );
|
||||
|
||||
try {
|
||||
pStream = new TWinSocketStream( Socket, 60000 );
|
||||
try{
|
||||
// Socket->ReceiveBuf( &CodOp, sizeof(int) );
|
||||
pStream->WaitForData(30000); pStream->Read( &CodOp, sizeof(int) );
|
||||
|
||||
if ( CodOp != 5650 )
|
||||
{
|
||||
dev = ( Elemento = SearchElement( CodOp ) ) == NULL ? 1 : 0;
|
||||
// Socket->SendBuf( &dev, sizeof(int) );
|
||||
pStream->Write( &dev, sizeof(int) );
|
||||
if ( dev ) return;
|
||||
}
|
||||
|
||||
ClientHook = true;
|
||||
|
||||
// Socket->ReceiveBuf( &CodOp, sizeof(int) );
|
||||
pStream->WaitForData(30000); pStream->Read( &CodOp, sizeof(int) );
|
||||
|
||||
switch( CodOp )
|
||||
{
|
||||
// On
|
||||
case 5669:
|
||||
int L_idc, L_idtc;
|
||||
float L_Precio;
|
||||
/*
|
||||
Socket->ReceiveBuf( &Tiempo, sizeof(double) );
|
||||
Socket->ReceiveBuf( &L_idc, sizeof(int) );
|
||||
Socket->ReceiveBuf( &L_idtc, sizeof(int) );
|
||||
Socket->ReceiveBuf( &L_Precio, sizeof(float) );
|
||||
*/
|
||||
pStream->WaitForData(30000); pStream->Read( &Tiempo, sizeof(double) );
|
||||
pStream->WaitForData(30000); pStream->Read( &L_idc, sizeof(int) );
|
||||
pStream->WaitForData(30000); pStream->Read( &L_idtc, sizeof(int) );
|
||||
pStream->WaitForData(30000); pStream->Read( &L_Precio, sizeof(float) );
|
||||
|
||||
SetActiveTimeElement( Elemento, Tiempo, L_idc, L_idtc, (Currency)L_Precio );
|
||||
break;
|
||||
// Off
|
||||
case 5668:
|
||||
Elemento -> ForcedTimeOut();
|
||||
break;
|
||||
// CERRAR WINDOWS
|
||||
case 5660:
|
||||
Elemento->CerrarWindows();
|
||||
break;
|
||||
// Query TIME (Refresh)
|
||||
case 5661:
|
||||
Elemento -> RefreshElement();
|
||||
Tiempo = Elemento->iTiempoPedido();
|
||||
// Socket->SendBuf( &Tiempo, sizeof(double) );
|
||||
pStream->WaitForData(30000); pStream->Read( &Tiempo, sizeof(double) );
|
||||
Tiempo = Elemento->RTiempoRestante;
|
||||
// Socket->SendBuf( &Tiempo, sizeof(double) );
|
||||
pStream->WaitForData(30000); pStream->Read( &Tiempo, sizeof(double) );
|
||||
break;
|
||||
// Lista de elementos...
|
||||
case 5650:
|
||||
dev = Elementos->Count;
|
||||
// Socket->SendBuf( &dev, sizeof(int) );
|
||||
pStream->Write( &dev, sizeof(int) );
|
||||
|
||||
for (int i = Elementos->Count - 1; i >= 0; i--)
|
||||
{
|
||||
Elemento = (TElemento *)(Elementos->Items[i]);
|
||||
//void __fastcall TCtrlPPal::NewElementAt(int X, int Y, int NumEl, AnsiString IP, AnsiString Name )
|
||||
/*
|
||||
Socket->SendBuf( &(Elemento->Left), sizeof(int) );
|
||||
Socket->SendBuf( &(Elemento->Top), sizeof(int) );
|
||||
Socket->SendBuf( &(Elemento->NumElemento), sizeof(int) );
|
||||
Socket->SendBuf( Elemento->GiveMyIP().c_str(), 70 );
|
||||
Socket->SendBuf( Elemento->GiveMyName().c_str(), 70 );
|
||||
|
||||
Tiempo = Elemento->iTiempoPedido(); Socket->SendBuf( &Tiempo, sizeof(double) );
|
||||
Tiempo = Elemento->RTiempoRestante; Socket->SendBuf( &Tiempo, sizeof(double) );
|
||||
|
||||
*/
|
||||
pStream->Write( &(Elemento->Left), sizeof(int) );
|
||||
pStream->Write( &(Elemento->Top), sizeof(int) );
|
||||
pStream->Write( &(Elemento->NumElemento), sizeof(int) );
|
||||
pStream->Write( Elemento->GiveMyIP().c_str(), 70 );
|
||||
pStream->Write( Elemento->GiveMyName().c_str(), 70 );
|
||||
|
||||
Tiempo = Elemento->iTiempoPedido(); pStream->Write( &Tiempo, sizeof(double) );
|
||||
Tiempo = Elemento->RTiempoRestante; pStream->Write( &Tiempo, sizeof(double) );
|
||||
|
||||
Elemento -> RefreshElement();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
Memo1->Lines->Insert( 0, "Mensaje desconocido ::" + Socket->RemoteAddress );
|
||||
}
|
||||
}
|
||||
catch (Exception &E)
|
||||
{
|
||||
if (!E.ClassNameIs("EAbort"))
|
||||
{
|
||||
Memo1->Lines->Insert( 0, "ERROR en la comunicaci<63>n ::" + Socket->RemoteAddress );
|
||||
}
|
||||
}
|
||||
}
|
||||
__finally
|
||||
{
|
||||
delete pStream;
|
||||
Socket->Close();
|
||||
}
|
||||
Memo1->Lines->Insert( 0, "Tramites Finalizados ::" + Socket->RemoteAddress );
|
||||
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::serverHookConnect(TObject *Sender,
|
||||
TCustomWinSocket *Socket)
|
||||
{
|
||||
double TiempoPedido, TiempoRestante;
|
||||
TWinSocketStream *pStream;
|
||||
int Data;
|
||||
// create a TWinSocketStream for reading and writing
|
||||
try {
|
||||
pStream = new TWinSocketStream( Socket, 60000 );
|
||||
|
||||
try
|
||||
{
|
||||
pStream->Write( &ServerHookElement, sizeof(int) );
|
||||
|
||||
if ( ServerHookCode != 5650 )
|
||||
{
|
||||
pStream->WaitForData(30000);
|
||||
pStream->Read( &Data, sizeof(int) );
|
||||
if ( Data == 1 )
|
||||
{
|
||||
Socket->Close();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pStream->Write( &ServerHookCode, sizeof(int) );
|
||||
|
||||
// Comunicamos seg<65>n c<>digo en ServerHookCode
|
||||
switch ( ServerHookCode )
|
||||
{
|
||||
// On
|
||||
case 5669:
|
||||
pStream->Write( &ServerTiempo, sizeof(double) );
|
||||
pStream->Write( &ServerL_idc, sizeof(int) );
|
||||
pStream->Write( &ServerL_idtc, sizeof(int) );
|
||||
pStream->Write( &ServerL_Precio, sizeof(float) );
|
||||
break;
|
||||
// Off
|
||||
case 5668:
|
||||
// Nada mas
|
||||
break;
|
||||
// CERRAR WINDOWS
|
||||
case 5660:
|
||||
// Nada mas
|
||||
break;
|
||||
// Lista de elementos...
|
||||
case 5650:
|
||||
pStream->WaitForData(30000); // Inicio
|
||||
pStream->Read( &Data, sizeof(int) );
|
||||
int X,Y, NumEl; char IP[80], Name[80];
|
||||
for (int i = Data - 1; i >= 0; i--)
|
||||
{
|
||||
pStream->WaitForData(30000); pStream->Read( &X, sizeof(int) );
|
||||
pStream->WaitForData(30000); pStream->Read( &Y, sizeof(int) );
|
||||
pStream->WaitForData(30000); pStream->Read( &NumEl, sizeof(int) );
|
||||
pStream->WaitForData(30000); pStream->Read( &IP, 70 );
|
||||
pStream->WaitForData(30000); pStream->Read( &Name, 70 );
|
||||
|
||||
NewElementAt( X, Y, NumEl, IP, Name );
|
||||
|
||||
pStream->WaitForData(30000); pStream->Read( &TiempoPedido, sizeof(double) );
|
||||
pStream->WaitForData(30000); pStream->Read( &TiempoRestante, sizeof(double) );
|
||||
|
||||
SearchElement( NumEl ) -> ClientTimeIs( TiempoPedido, TiempoRestante );
|
||||
}
|
||||
break;
|
||||
// Query TIME (Refresh)
|
||||
case 5661:
|
||||
pStream->WaitForData(30000); // Inicio
|
||||
pStream->Read( &TiempoPedido, sizeof(double) );
|
||||
|
||||
pStream->WaitForData(30000); // Restante
|
||||
pStream->Read( &TiempoRestante, sizeof(double) );
|
||||
|
||||
SearchElement( ServerHookElement ) -> ClientTimeIs( TiempoPedido, TiempoRestante );
|
||||
break;
|
||||
default:
|
||||
Memo1->Lines->Insert( 0, "Mensaje desconocido ::" + Socket->RemoteAddress );
|
||||
}
|
||||
}
|
||||
catch (Exception &E)
|
||||
{
|
||||
if (!E.ClassNameIs("EAbort"))
|
||||
{
|
||||
Memo1->Lines->Insert( 0, "ERROR en la comunicaci<63>n ::" + Socket->RemoteAddress );
|
||||
}
|
||||
}
|
||||
}
|
||||
__finally
|
||||
{
|
||||
delete pStream;
|
||||
Socket->Close();
|
||||
}
|
||||
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TCtrlPPal::ActiveImage3Click(TObject *Sender)
|
||||
{
|
||||
clientHook -> Active = !clientHook -> Active;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
void __fastcall TCtrlPPal::Image1Click(TObject *Sender)
|
||||
{
|
||||
char zFileName[80], zParams[80], zDir[80];
|
||||
ShellExecute(Application->MainForm->Handle, 0, StrPCopy(zFileName, "http:\\\\www.infdj.com"),
|
||||
StrPCopy(zParams, ""), StrPCopy(zDir, ""), SW_SHOWNOACTIVATE > 32);
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TCtrlPPal::TbPersonasNewRecord(TDataSet *DataSet)
|
||||
{
|
||||
TbPersonas->FieldByName( "FAlta" )->AsDateTime = TDateTime::CurrentDateTime();
|
||||
TbPersonas->FieldByName( "FModif" )->AsDateTime = TDateTime::CurrentDateTime();
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user