Access violation in tee9170.bpl

TeeChart VCL for Borland/CodeGear/Embarcadero RAD Studio, Delphi and C++ Builder.
Magic
Newbie
Newbie
Posts: 11
Joined: Mon Apr 08, 2013 12:00 am

Access violation in tee9170.bpl

Post by Magic » Mon Apr 08, 2013 8:48 pm

Greetings,

I had used the TeeChart standard edition on C++Builder XE3.
Occasionally, a read access violation was happened in Tee9170.bpl.
This problem was happens in TFastLineSeries@DrawAllValues at every time.
I bought the latest TeeChart PRO for to fix this problem.
Currently this problem still is happened in same place.

Could you please teach how to check the this problem with TeeChart source code by C++ Builder XE3?

Best regards,
Magic

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Access violation in tee9170.bpl

Post by Yeray » Tue Apr 09, 2013 11:16 am

Hi

Here is how you could debug the TeeChart sources in BCB:
http://www.teechart.net/support/viewtop ... bug#p47005

If you can isolate the problem in a simple example project we can run as is here, we'll be pleased to take a look at it.
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

Magic
Newbie
Newbie
Posts: 11
Joined: Mon Apr 08, 2013 12:00 am

Re: Access violation in tee9170.bpl

Post by Magic » Sat Apr 13, 2013 3:53 am

Thank you for information.
But I could not show the source code when exception happens.

Our sample code is following.

This sample is drawing 4 series.
The AddXY function calls per 2ms.
The buttom axis is changed by OnAfterAdd event.
This problem rarely happens.

I think these would not be special.
Please tell me what do I do.

Best regards,
Magic

Main Header

Code: Select all

//---------------------------------------------------------------------------

#ifndef Unit_MainH
#define Unit_MainH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>

#include "MultiMediaTimer.hpp"
#include <Vcl.ExtCtrls.hpp>
#include <VCLTee.Chart.hpp>
#include <VCLTee.Series.hpp>
#include <VCLTee.TeEngine.hpp>
#include <VCLTee.TeeProcs.hpp>

#define MAX_SERIES_COUNT 4
//---------------------------------------------------------------------------
class TForm_Main : public TForm
{
__published:
	TChart *Chart_Main;
	TPanel *Panel_Main;
	TFastLineSeries *Series1;
	TFastLineSeries *Series2;
	TFastLineSeries *Series3;
	TFastLineSeries *Series4;
	TButton *Button_Start;
	TButton *Button_Stop;
	TButton *Button_Close;
	void __fastcall FormShow(TObject *Sender);
	void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
	void __fastcall Button_StartClick(TObject *Sender);
	void __fastcall Button_StopClick(TObject *Sender);
	void __fastcall Button_CloseClick(TObject *Sender);
private:
	TMultiMediaTimer *m_ptMMTimerMain;
public:
	unsigned long m_uint32Count;
	double m_rl64StartTime;
	double m_arl64Value[MAX_SERIES_COUNT];
	void __fastcall CyclicEvent(void);
	void __fastcall SeriesAfterAdd(TChartSeries *Sender, int ValueIndex);
	__fastcall TForm_Main(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm_Main *Form_Main;
//---------------------------------------------------------------------------
#endif
Main C++ code.

Code: Select all

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit_Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm_Main *Form_Main;
//---------------------------------------------------------------------------
__fastcall TForm_Main::TForm_Main(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm_Main::FormShow(TObject *Sender)
{
	try
	{
		this->m_ptMMTimerMain = new TMultiMediaTimer();
	}
	catch(std::bad_alloc)
	{
		// Critical fault
		Application->MessageBox(L"Memory Allocation Fault", L"Error", MB_OK);
		return;
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm_Main::FormClose(TObject *Sender, TCloseAction &Action)
{
	if( this->m_ptMMTimerMain != NULL ) delete this->m_ptMMTimerMain;
}
//---------------------------------------------------------------------------
void __fastcall TForm_Main::Button_StartClick(TObject *Sender)
{
// Start
	this->m_rl64StartTime = Now().Val;
	for( int i = 0; i < this->Chart_Main->SeriesCount();  i++ )
	{
		this->m_arl64Value[i] = (double)i * 100.0;
	}
	this->m_uint32Count = 0;
	this->Chart_Main->BottomAxis->Automatic = false;
	for(int m = 0; m < this->Chart_Main->SeriesCount(); m++ )
	{
		this->Chart_Main->Series[m]->OnAfterAdd = this->SeriesAfterAdd;
	}
	this->m_ptMMTimerMain->StartTimer(2, this->CyclicEvent); // Drawing callback per 2ms
}
//---------------------------------------------------------------------------
void __fastcall TForm_Main::Button_StopClick(TObject *Sender)
{
// Stop
	this->m_ptMMTimerMain->StopTimer();
}
//---------------------------------------------------------------------------
void __fastcall TForm_Main::Button_CloseClick(TObject *Sender)
{
// Close
	this->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm_Main::CyclicEvent(void)
{
// Cyclic event (callback)
	double rl64Value;
	double rl64Time = (Now().Val - this->m_rl64StartTime) * 86400.0;
	this->m_uint32Count++;
	if( this->m_uint32Count == 500 )
	{
		this->m_uint32Count = 0;
	}
	for( int i = 0; i < MAX_SERIES_COUNT;  i++ )
	{
		if( this->m_uint32Count < 250 )
		{
			this->m_arl64Value[i] += 1.0;
		}
		else
		{
			this->m_arl64Value[i] -= 1.0;
		}
		this->Chart_Main->Series[i]->AddXY(rl64Time, this->m_arl64Value[i], "", this->Chart_Main->Series[i]->SeriesColor);
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm_Main::SeriesAfterAdd(TChartSeries *Sender, int ValueIndex)
{
	double rlVal = Sender->XValues->MaxValue;
	Sender->GetHorizAxis->SetMinMax(rlVal - 10.0, rlVal);
}
//---------------------------------------------------------------------------
Call back by multimedia timer

Code: Select all

//---------------------------------------------------------------------------
#ifndef MultiMediaTimerHpp
#define MultiMediaTimerHpp

#ifndef WIN32
  #define WIN32
#endif

// C function
#include <stdlib.h>

// C++Bulder classses
#include <Classes.hpp>

// Windows header
#include <Mmsystem.h>

#define ST_MMTIMER_INIT			0
#define ST_MMTIMER_STANDBY		1
#define ST_MMTIMER_EXECUTING	2
#define ST_MMTIMER_STOP			3

#define DEFAULT_MMTIMER_INTERVAL	10
#define MMTIMER_TARGET_RESOLUTION	1	// 1-millisecond target resolution

void CALLBACK gMultiMediaTimerProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
//---------------------------------------------------------------------------
// Class Definition
//---------------------------------------------------------------------------
class TMultiMediaTimer
{
private:
	int m_nStatus;			// Status
	UINT m_wTimerRes;		// Timer Resolution
	bool m_flgCallback;		// Flag: Callback Executing
	MMRESULT m_hMMTimer;	// Handle of Multimedia Timer
	void __fastcall (__closure *m_pfncMMTimerProc)(void);	// Handle of function to use in callback
	int __fastcall max(int value1, int value2);
	int __fastcall min(int value1, int value2);
public:

	TMultiMediaTimer();		// Constructor
	~TMultiMediaTimer();	// Destructor
	bool __fastcall StartTimer(int nInterval, void __fastcall (__closure *fnc)(void));
	bool __fastcall StopTimer();
	// for internal public
	bool __fastcall IsTimerProcExecuting();
	void __fastcall SetTimerProcExecuting();
	void __fastcall ClearTimerProcExecuting();
	bool __fastcall IsTimerFuncAvailable();
	void __fastcall ExecuteTimerProc();
};

// Function Definition
//---------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////////////////
/**
 \brief    Constructor
*////////////////////////////////////////////////////////////////////////////////////////
TMultiMediaTimer::TMultiMediaTimer()
{
	this->m_nStatus         = ST_MMTIMER_INIT;
	this->m_wTimerRes       = MMTIMER_TARGET_RESOLUTION;
	this->m_flgCallback     = false;
	this->m_hMMTimer        = NULL;
	this->m_pfncMMTimerProc = NULL;
}
/////////////////////////////////////////////////////////////////////////////////////////
/**
 \brief    Destructor
*////////////////////////////////////////////////////////////////////////////////////////
TMultiMediaTimer::~TMultiMediaTimer()
{
	this->StopTimer();
}
/////////////////////////////////////////////////////////////////////////////////////////
/**
 \param [in] nValue1    Value 1.
 \param [in] nValue2    Value 2.

 \return max value.

 \brief    Compare value 1 and value 2
*////////////////////////////////////////////////////////////////////////////////////////
int __fastcall TMultiMediaTimer::max(int nValue1, int nValue2)
{
	return ( (nValue1 > nValue2) ? nValue1 : nValue2 );
}
/////////////////////////////////////////////////////////////////////////////////////////
/**
 \param [in] nValue1    Value 1.
 \param [in] nValue2    Value 2.

 \return min value.

 \brief    Compare value 1 and value 2
*////////////////////////////////////////////////////////////////////////////////////////
int __fastcall TMultiMediaTimer::min(int nValue1, int nValue2)
{
	return ( (nValue1 > nValue2) ? nValue2 : nValue1 );
}
/////////////////////////////////////////////////////////////////////////////////////////
/**
 \param [in] nInterval  Timer interval value.
 \param [in] fnc        Handle of cyclic function.

 \brief    Start Multi Media Tiemr
*////////////////////////////////////////////////////////////////////////////////////////
bool __fastcall TMultiMediaTimer::StartTimer(int nInterval, void __fastcall (__closure *fnc)(void))
{
	TIMECAPS tTimeCaps;	// Timer resolution
	
	if( this->m_nStatus == ST_MMTIMER_INIT )
	{
		if( timeGetDevCaps(&tTimeCaps, sizeof(TIMECAPS)) != TIMERR_NOERROR )
		{
			return false;
		}
		this->m_wTimerRes = min(max(tTimeCaps.wPeriodMin, MMTIMER_TARGET_RESOLUTION), tTimeCaps.wPeriodMax);
		timeBeginPeriod(this->m_wTimerRes);
		this->m_nStatus = ST_MMTIMER_STANDBY;
	}
	if( this->m_nStatus == ST_MMTIMER_STANDBY )
	{
		this->m_pfncMMTimerProc = fnc;
		this->m_hMMTimer = timeSetEvent(nInterval, 
										this->m_wTimerRes,
										gMultiMediaTimerProc,
										(DWORD)this,
										TIME_PERIODIC);
		if( this->m_hMMTimer == NULL )
		{
			this->m_pfncMMTimerProc = NULL;
			this->StopTimer();
			return false;
		}
		this->m_nStatus = ST_MMTIMER_EXECUTING;
	}
	return true;
}
/////////////////////////////////////////////////////////////////////////////////////////
/**

 \brief    Stop Multi Media Tiemr
*////////////////////////////////////////////////////////////////////////////////////////
bool __fastcall TMultiMediaTimer::StopTimer()
{
	if( this->m_nStatus > ST_MMTIMER_STANDBY )
	{
		if( this->m_hMMTimer != NULL )
		{
			timeKillEvent(this->m_hMMTimer);
			this->m_hMMTimer        = NULL;
			this->m_pfncMMTimerProc = NULL;
			this->m_flgCallback     = false;
			this->m_nStatus         = ST_MMTIMER_STANDBY;
		}
	}
	if( this->m_nStatus == ST_MMTIMER_STANDBY )
	{
		timeEndPeriod(this->m_wTimerRes);
		this->m_wTimerRes = MMTIMER_TARGET_RESOLUTION;
	}
	this->m_nStatus = ST_MMTIMER_INIT;
	return true;
}
/////////////////////////////////////////////////////////////////////////////////////////
/**

 \brief    Check Timer Procedure Executing
*////////////////////////////////////////////////////////////////////////////////////////
bool __fastcall TMultiMediaTimer::IsTimerProcExecuting()
{
	return this->m_flgCallback;
}
/////////////////////////////////////////////////////////////////////////////////////////
/**

 \brief    Set Timer Procedure Executing
*////////////////////////////////////////////////////////////////////////////////////////
void __fastcall TMultiMediaTimer::SetTimerProcExecuting()
{
	this->m_flgCallback = true;
}
/////////////////////////////////////////////////////////////////////////////////////////
/**

 \brief    Clear Timer Procedure Executing
*////////////////////////////////////////////////////////////////////////////////////////
void __fastcall TMultiMediaTimer::ClearTimerProcExecuting()
{
	this->m_flgCallback = false;
}
/////////////////////////////////////////////////////////////////////////////////////////
/**

 \brief    Check Timer Procedure Available
*////////////////////////////////////////////////////////////////////////////////////////
bool __fastcall TMultiMediaTimer::IsTimerFuncAvailable()
{
	bool bRslt = (this->m_pfncMMTimerProc == NULL) ? false : true;
	return bRslt;
}
/////////////////////////////////////////////////////////////////////////////////////////
/**

 \brief    Check Timer Procedure Available
*////////////////////////////////////////////////////////////////////////////////////////
void __fastcall TMultiMediaTimer::ExecuteTimerProc()
{
	this->m_pfncMMTimerProc();
}
/////////////////////////////////////////////////////////////////////////////////////////
/**

 \brief    Callback function for Multi Media Tiemr
*////////////////////////////////////////////////////////////////////////////////////////
void CALLBACK gMultiMediaTimerProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
	TMultiMediaTimer *ptMMTimer = (TMultiMediaTimer *)dwUser;
	if( ptMMTimer->IsTimerProcExecuting() )
	{
		return;
	}
	ptMMTimer->SetTimerProcExecuting();
	try
	{
		if( ptMMTimer->IsTimerFuncAvailable() )
		{
			ptMMTimer->ExecuteTimerProc();
		}
	}
	__finally
	{
		ptMMTimer->ClearTimerProcExecuting();
	}
}
#endif // MultiMediaTimerHpp

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Access violation in tee9170.bpl

Post by Yeray » Mon Apr 15, 2013 2:17 pm

Hello,

I've created a new simple example project to test it. Your multimedia timer gives me some errors so I've used a regular TTimer:
I've only added a TTimer and a TChart with 4 TFastLineSeries at design time, and the following code works fine for me here:
Code added at the .h:

Code: Select all

public:		// User declarations
	int m_uint32Count;
	double m_arl64Value[MAX_SERIES_COUNT];
Code added at the .cpp:

Code: Select all

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   double rl64Value;
   double rl64Time = (Now().Val) * 86400.0;
   this->m_uint32Count++;
   if( this->m_uint32Count == 500 )
   {
	  this->m_uint32Count = 0;
   }
   for( int i = 0; i < MAX_SERIES_COUNT;  i++ )
   {
	  if( this->m_uint32Count < 250 )
	  {
		 this->m_arl64Value[i] += 1.0;
	  }
	  else
	  {
		 this->m_arl64Value[i] -= 1.0;
	  }
	  this->Chart1->Series[i]->AddXY(rl64Time, this->m_arl64Value[i], "", this->Chart1->Series[i]->SeriesColor);
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  m_uint32Count=0;
}
Could you please arrange a simple example project we can run as-is to reproduce the problem here?
Thanks in advance.
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

Magic
Newbie
Newbie
Posts: 11
Joined: Mon Apr 08, 2013 12:00 am

Re: Access violation in tee9170.bpl

Post by Magic » Mon Apr 15, 2013 11:25 pm

Hello,

Thank you for response.
I attached simple project for C++Builder XE3.
Please check it.

Magic
Attachments
TChartTest1.zip
Simple test project for C++Builder XE3
(110.73 KiB) Downloaded 548 times

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Access violation in tee9170.bpl

Post by Yeray » Tue Apr 16, 2013 10:51 am

Hi,

I've run your application for a while and found no error.
2013-04-16_1245.png
2013-04-16_1245.png (16.31 KiB) Viewed 17658 times
Do I have to do anything special to reproduce the error?
If not, it has to be some difference between our environments. If you are using TeeChart v2012.07, please check the paths are correct:
- At "Tools\Options...\Environment Options\C++ Options\Paths and Directories\Selected Platform 32-bit Windows\System Include path", check the following path is on the top of the list and there's no reference to any older TeeChart installation:
C:\Program Files (x86)\Steema Software\TeeChart 2012 for RAD XE3\Delphi17.win32\Include

- At "Tools\Options...\Environment Options\C++ Options\Paths and Directories\Selected Platform 32-bit Windows\Library path", check the following path is on the top of the list and there's no reference to any older TeeChart installation:
C:\Program Files (x86)\Steema Software\TeeChart 2012 for RAD XE3\Delphi17.win32\Lib
C:\Program Files (x86)\Steema Software\TeeChart 2012 for RAD XE3\Delphi17.win32\Lib\Obj
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

Magic
Newbie
Newbie
Posts: 11
Joined: Mon Apr 08, 2013 12:00 am

Re: Access violation in tee9170.bpl

Post by Magic » Wed Apr 17, 2013 5:11 pm

Hello Yeray,

Thank you for testing.
Nothing special requirements.
This problem rarely happens.
In our environment, this problem happens after the software started and 2 or 3 minutes elapsed.

Best regards,
Magic

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Access violation in tee9170.bpl

Post by Yeray » Thu Apr 18, 2013 8:11 am

Hi,

I've ran the application a few times more, for longer, and got an access violation twice.
However I haven't been able to go to the debugger.
We should find a more consistent way to reproduce the problem, and preferably in delphi.
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

Magic
Newbie
Newbie
Posts: 11
Joined: Mon Apr 08, 2013 12:00 am

Re: Access violation in tee9170.bpl

Post by Magic » Thu Apr 18, 2013 10:12 pm

Hello Yeray,

I think If you use the XE3, you should change the native OS exception parameter of debugger option.
- At "Tools\Options...\Debugger Options\Embarcadero Debuggers\Native OS Exceptions"
Select "32-bit Windows OS Exceptions - Access Violation( $C0000005)", and change the "handled by" to debugger.

Also I set the "Debug Source path" option.
- At "Tools\Options\Debugger Options\Embarcadero Debuggers".

If you know about other requirement parameters, could you teach me?

Best regards,
Magic

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Access violation in tee9170.bpl

Post by Yeray » Wed May 15, 2013 3:12 pm

Hi Magic,

Excuse us for the delayed reply here.
Since it's quite randomly reproducible, but you own the TeeChart sources, you could try to debug them to see where the exception occurs.
Here there are some instructions on how to debug delphi sources from a BCB project:
http://www.teechart.net/support/viewtop ... 005#p47005

Alternatively, you could try to move the testing application to delphi so it can be debugged more easily, assuming the moved application still reproduces the problem, rarely or consistently.
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

Magic
Newbie
Newbie
Posts: 11
Joined: Mon Apr 08, 2013 12:00 am

Re: Access violation in tee9170.bpl

Post by Magic » Tue Jul 16, 2013 5:59 pm

Hello Yeray,

I made the sample application by Delphi for testing of access violation.
Same problem happened, but I couldn't find the source file of "VCLTee.TeEngine.pas" in TeeChar2013SourceCode.
Where can I find it?

Best regards,
Magic
Attachments
TChartTest2.zip
Test Application for Delphi
(84.37 KiB) Downloaded 557 times

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Access violation in tee9170.bpl

Post by Yeray » Thu Jul 18, 2013 8:35 am

Hi,

You should find TeEngine.pas at the "Sources" path in the TeeChart SourceCode installation.
After running TeeRecompile, the VCLTee.TeEngine.pas is generated at the "Sources\VCL" path.

To directly use the sources in the IDE, run TeeRecompile to generate the sources with prefixes in the "Sources\VCL" path, and put this path at the IDE Library path making sure it is on the top of the list and there are no other references to other installations, even "Sources\compiled\...".

Regarding the error message, note TeeChart isn't thread safe. This means you have to be careful when manipulating a chart from different threads. For example, you should control manually (with semaphores or something) if you want the chart to be drawn in one thread and to add points to the same chart from another thread, to avoid interferences. In your example, you could disable AutoRepaint before adding points at TForm_Main.CycleEvent, and enable it again after it:

Code: Select all

   Chart_Main.AutoRepaint:=false;
   Chart_Main.Series[I].AddXY(rl64Time, m_arl64Value[I], '', Chart_Main.Series[I].SeriesColor);
   Chart_Main.AutoRepaint:=true;
However, this will stop the chart of being repainted, so you could force the repaints manually. Ie, before ending the CycleEvent, you can add this to repaint the chart each 10 events:

Code: Select all

  if (m_uint32Count mod 10 = 0) then
  begin
   Chart_Main.Refresh;
  end;
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

Magic
Newbie
Newbie
Posts: 11
Joined: Mon Apr 08, 2013 12:00 am

Re: Access violation in tee9170.bpl

Post by Magic » Fri Jul 19, 2013 2:29 am

Hello Yeray,

Thank you for your advice.
I will change and test my program as your advice.

Currently, I have another problem.
I could not recompile by following error.
VCLTee.TeeSpanish.pas(527) E2052
VCLTee.TeeSpanish.pas(528) E2066
Could you tell me about way to fix this issue?

Best regards,
Magic

Yeray
Site Admin
Site Admin
Posts: 9534
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Access violation in tee9170.bpl

Post by Yeray » Fri Jul 19, 2013 10:48 am

Hi,
Magic wrote:Currently, I have another problem.
I could not recompile by following error.
VCLTee.TeeSpanish.pas(527) E2052
VCLTee.TeeSpanish.pas(528) E2066
Could you tell me about way to fix this issue?
Is that the complete error message? When are you getting it?
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

Magic
Newbie
Newbie
Posts: 11
Joined: Mon Apr 08, 2013 12:00 am

Re: Access violation in tee9170.bpl

Post by Magic » Tue Jul 23, 2013 6:49 pm

Hello Yeray,

It happens when run the TeeRecompile program.

Best regards,
Magic

Post Reply