cs_mounjetado
Messages postés
66
Date d'inscription
lundi 13 mars 2006
Statut
Membre
Dernière intervention
4 août 2008
25 oct. 2007 à 10:20
la variable tableau et son type sont déclarés dans une unité commune à tous les processus:
unit uCommonTypesandValues;
interface
const
mcMax = 4;
type
TMeasure = Array[0..ChValFormat-1] of Word;
TWholeMeasure = Array[0..mcMax-1] of TMeasure;
TCompleteMeasure = Record
elSystemClockCount : Int64;
elDeviceClockCount : Int64;
elMeasureCount : Int64;
elDeviceValues : TWholeMeasure;
elTORStatus : Byte;
End;
TCompleteMeasureArray = Array[0..1999] of TCompleteMeasure;
CompleteMeasureArray : Array[0..1] of TCompleteMeasureArray;
implementation
begin
end.
le programme console de mesure:
program prjMesConsole;
{$APPTYPE CONSOLE}
{%File 'ModelSupport\uParalPortR\uParalPortR.txvpck'}
{%File 'ModelSupport\uCommonTypesandValues\uCommonTypesandValues.txvpck'}
{%File 'ModelSupport\Par défaut.txvpck'}
uses
SysUtils,
Windows,
Dialogs,
Classes,
Consts,
uCommonTypesandValues in '..\MesSources\uCommonTypesandValues.pas',
uParalPortR in '..\MesSources\uParalPortR.pas';
const BUFSIZE = 4096;
var
WalkMeasureAcquirer : TMeasureAcquirer;
MeasureShouldCloseEvent: THandle;
MeasureClosedEvent: THandle;
MeasuresFullArrayEvent : THandle;
ShouldClose: Boolean = False;
sStoreDefaultPath : String;
JournalList : TStringList;
ConfigList : TStringList;
TestInfoList : TStringList;
sRead, sWrite : String;
MeasureRTLCriticSection : TRTLCriticalSection;
CpltMeasureArrayPtr : PCompleteMeasureArray;
pchCmdLn : PAnsiChar;
a : SmallInt;
// Liste de paires nom=valeur sauvegardées dans les fichiers textes
// en regard de la variable locale correspondante et de son type:
iConverterAccuracy : SmallInt; // ---> ConverterAccuracy=12
iPresentModulesCount : SmallInt; // ---> PresentModulesCount=1
iMeasureSize : Integer; // ---> MeasureSize=96
bTOREnabled : Boolean; // ---> TOREnabled=False
iFrequency : Int64; // ---> HRFrequency=3579545
iMovingWay : SmallInt; // ---> MovingWay=1
iMeasuresCount : Int64; // ---> MeasuresCount=16469
bTestValidation : Boolean; // ---> TestValidation=True
procedure ProceedMeasure;
begin
with WalkMeasureAcquirer do
begin
iMeasuresCount := ProcessWholeMeasure;
if iMeasuresCount<0
then begin
//Définit ExitCode pour indiquer la condition d'erreur (par convention)
ExitCode := GetLastError;
//Gérer la condition d'erreur
if ExitCode<=3700 // Message d'erreur système
then begin
sWrite := SysErrorMessage(ExitCode);
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
RaiseLastOSError(ExitCode);
end
else begin
sWrite := 'Exception imprévue ' + IntToStr(ExitCode)
+ ' dans la procédure de mesure. Mesure ratée à MeasuresCount='
+ IntToStr(WalkMeasureAcquirer.GetMeasuresCount)
+ '. iMeasuresCount=' + IntToStr(iMeasuresCount);
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
raise Exception.Create(sWrite);
end;
end
else if (((iMeasuresCount mod 1000) = 0) and (iMeasuresCount>0))
then begin
if Odd(iMeasuresCount div 1000) then a := 1
else a := 0;
CpltMeasureArrayPtr^ := CompleteMeasureArray[a];
SetEvent(MeasuresFullArrayEvent);
end;
with CpltMeasureArrayPtr^[iMeasuresCount mod 1000]
do begin
elMeasureCount := GetMeasuresCount;
elDeviceClockCount := GetDeviceClockCount;
elSystemClockCount := GetSystemClockCount;
elTORStatus := GetTORStatus;
elDeviceValues := GetWholeMeasure;
end;
end;
//////////////////////////////////////////////////////////////
// TRAITEMENT DES ALARMES //
// A PERSONNALISER //
//////////////////////////////////////////////////////////////
end;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////// PROGRAMME PRINCIPAL /////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
begin // de main
//////////////////////////////////////////////////////////////
// PARAMETRES A ENVOYER LORS DE L'EXECUTION //
// PAR LIGNE DE COMMANDE OU //
// EN TANT QUE SERVICE //
//////////////////////////////////////////////////////////////
// Lecture des paramètres de la ligne de commande pour déterminer
// le fichier de configuration à prendre en compte
pchCmdLn := PAnsiChar('StrengthPlate');
// pchCmdLn := GetCommandLine;
sConfigFileName := String(pchCmdLn) + 'Config.txt';
// Récupère le handle sur l'évenement créé par le programme principal
// grâce à son nom (il faut évidemment mettre le même dans les deux applis !!)
MeasureShouldCloseEvent := OpenEvent(EVENT_ALL_ACCESS, False, 'MEASURE_CONSOLE_SHOULD_CLOSE_EVENT');
MeasureClosedEvent := OpenEvent(EVENT_ALL_ACCESS, False, 'MEASURE_CONSOLE_CLOSED_EVENT');
MeasuresFullArrayEvent := CreateEvent(nil, True, False, 'MEASURES_FULL_ARRAY_EVENT');
sStoreDefaultPath := GetEnvironmentVariable(sStoreDirectory);
// Initialisation des variables globales
sRead := '';
iMeasuresCount := -1;
// Creation des variables listes de chaînes de caractères
JournalList := TStringList.Create;
JournalList.Clear;
ConfigList := TStringList.Create;
ConfigList.Clear;
TestInfoList := TStringList.Create;
TestInfoList.Clear;
try // ..finally n°1
// Informations TextFile Opening for Reading
try // ..except n°2
TestInfoList.LoadFromFile(sStoreDefaultPath + sResultsDirectory + sTestInfoFileName);
iMovingWay := StrToInt(TestInfoList.ValueFromIndex[TestInfoList.IndexOfName('MovingWay')]);
except // de try n°2
//Définit ExitCode pour indiquer la condition d'erreur (par convention)
ExitCode := GetLastError;
//Gérer la condition d'erreur
sWrite := 'Exception imprévue dans la lecture du fichier texte d''informations ('
+ IntToStr(ExitCode) + ')';
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
raise Exception.Create(sWrite);
ExitProcess(ExitCode);
end; // de try..except n°2
// Configuration TextFile Opening for Reading
try // ..except n°3
ConfigList.LoadFromFile(sStoreDefaultPath + sResultsDirectory + sConfigFileName);
iConverterAccuracy := StrToInt(ConfigList.ValueFromIndex[ConfigList.IndexOfName('ConverterAccuracy')]);
bTOREnabled := StrToBool(ConfigList.ValueFromIndex[ConfigList.IndexOfName('TOREnabled')]);
iPresentModulesCount := StrToInt(ConfigList.ValueFromIndex[ConfigList.IndexOfName('PresentModulesCount')]);
except // de try n°3
//Définit ExitCode pour indiquer la condition d'erreur (par convention)
ExitCode := GetLastError;
//Gérer la condition d'erreur
sWrite := 'Exception imprévue dans la lecture du fichier texte de configuration ('
+ IntToStr(ExitCode) + ')';
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
raise Exception.Create(sWrite);
ExitProcess(ExitCode);
end; // de try..except n°3
finally // de try n°1
// Libération de la mémoire
ConfigList.Free;
TestInfoList.Free;
end; // de try..finally n°1
try // ..finally n°4
// Acquisition Board Object Creation
try // ..except n°6
WalkMeasureAcquirer := TMeasureAcquirer.CreateSelf( iPresentModulesCount,
iConverterAccuracy,
iMovingWay,
bTOREnabled );
except //de try n°6
//Définit ExitCode pour indiquer la condition d'erreur (par convention)
ExitCode := GetLastError;
//Gérer la condition d'erreur
sWrite := 'Exception imprévue dans la définition du système ('
+ IntToStr(ExitCode) + ')';
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
raise Exception.Create(sWrite);
ExitProcess(ExitCode);
end; // de try..except n°6
// Once Critical Section Initialization
try // ..except n°7
InitializeCriticalSection(MeasureRTLCriticSection);
except // de try n°7
//Définit ExitCode pour indiquer la condition d'erreur (par convention)
ExitCode := GetLastError;
//Gérer la condition d'erreur
sWrite := 'Exception imprévue dans la création de la variable de données ('
+ IntToStr(ExitCode) + ')';
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
raise Exception.Create(sWrite);
ExitProcess(ExitCode);
end; // de try..except n°7
New( CpltMeasureArrayPtr );
sWrite := 'TestBegin=' + DateTimeToStr(Now);
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
// Program Main Loop
while not ShouldClose // Closing Condition
do try // ..except n°8
// Prise de mesure
EnterCriticalSection(MeasureRTLCriticSection);
ProceedMeasure;
LeaveCriticalSection(MeasureRTLCriticSection);
// Test de la condition de fermeture de l'application console ShouldClose :WaitForSingleObject( MeasureShouldCloseEvent, 0) WAIT_OBJECT_0;
if ShouldClose
then begin
sWrite := 'TestEnd=' + DateTimeToStr(Now);
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
sWrite := 'MeasuresCount=' + IntToStr(Integer(WalkMeasureAcquirer.GetMeasuresCount));
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
if ExitCode=MEASURE_NO_ERROR
then bTestValidation := TRUE
else bTestValidation := FALSE;
sWrite := 'TestValidation=' + BoolToStr(bTestValidation,TRUE);
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
// Sauvegarde des évenements survenus pendant le test
JournalList.SaveToFile(sStoreDefaultPath + sResultsDirectory + sJournalFileName);
end;
except // de try n°8
//Définit ExitCode pour indiquer la condition d'erreur (par convention)
ExitCode := GetLastError;
//Gérer la condition d'erreur
sWrite := SysErrorMessage(ExitCode);
sWrite := sWrite + 'Fin de programme dûe à une exception dans la boucle principale ('
+ IntToStr(ExitCode) + ').';
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
raise Exception.Create(sWrite);
// ExitProcess(ExitCode);
end; // de try..except n°8
finally // de try n°4
sWrite := 'TestEnd=' + DateTimeToStr(Now);
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
sWrite := 'MeasuresCount=' + IntToStr(Integer(WalkMeasureAcquirer.GetMeasuresCount));
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
if ExitCode=MEASURE_NO_ERROR
then bTestValidation := TRUE
else bTestValidation := FALSE;
sWrite := 'TestValidation=' + BoolToStr(bTestValidation,TRUE);
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
JournalList.SaveToFile(sStoreDefaultPath + sResultsDirectory + sJournalFileName);
// Libération de la mémoire des objets et de l'événement
Dispose( CpltMeasureArrayPtr );
DeleteCriticalSection(MeasureRTLCriticSection);
// CloseHandle(hMeasuresFileHandle);
JournalList.Free;
ResetEvent(MeasureShouldCloseEvent);
SetEvent(MeasureClosedEvent);
CloseHandle(MeasureShouldCloseEvent);
CloseHandle(MeasureClosedEvent);
CloseHandle(MeasuresFullArrayEvent);
WalkMeasureAcquirer.Destroy;
end; // de try..finally n°4
end. // de main
le programme console de calcul:
program prjCalConsole;
{$APPTYPE CONSOLE}
{%File 'ModelSupport\uCommonTypesandValues\uCommonTypesandValues.txvpck'}
{%File 'ModelSupport\Par défaut.txvpck'}
uses
SysUtils,
Windows,
Types,
Classes,
Math,
uCommonTypesandValues in '..\MesSources\uCommonTypesandValues.pas';
const BUFSIZE = 4096;
libCalcFct = 'C:\Documents and Settings\bq\Mes documents\Plateforme\CalculationDLL\libCalcFct.dll';
//..
// déclaration des méthodes de calcul de la dll libCalcFct.dll
//..
var dwRead, dwWritten : DWORD;
cmReadMeasure : TCompleteMeasure;
CalculRTLCriticSection : TRTLCriticalSection;
CalcShouldCloseEvent : THandle;
CalcClosedEvent : THandle;
CalcCanCloseEvent : THandle;
CalcCanTreatEvent : THandle;
MeasuresFilledArrayEvent : THandle;
ShouldClose : Boolean = False;
CanClose : Boolean = False;
CanTreat : Boolean = False;
ConfigList : TStringList;
TestInfoList : TStringList;
JournalList : TStringList;
sStoreDefaultPath : String;
sRead, sWrite : String;
mc : Integer;
milliers : Integer = -1;
SysFirstMeasureTime, DevFirstMeasureTime : TLargeInteger;
SystemTime : TLargeInteger;
DeviceTime : TLargeInteger;
sz : SmallInt;
blRslt : Boolean;
pchCmdLn : PAnsiChar;
// Liste de paires nom=valeur sauvegardées dans les fichiers textes
// en regard de la variable locale correspondante et de son type:
iConverterAccuracy : SmallInt; // ---> ConverterAccuracy=12
iPresentModulesCount : SmallInt; // ---> PresentModulesCount=1
iMeasureSize : Integer; // ---> MeasureSize=96
bTOREnabled : Boolean; // ---> TOREnabled=False
iFrequency : Int64; // ---> HRFrequency=3579545
iIPU : Integer; // ---> IPU=4316469
iFootLength : SmallInt; // ---> FootLength=31
iWeight : SmallInt; // ---> Weight=83
iAge : SmallInt; // ---> Age=47
iMovingWay : SmallInt; // ---> MovingWay=1
dtDepart : Extended; // ---> Démarrage=39245,6600260417
dtArret : Extended; // ---> Arrêt=39245,6601119329
iMeasureCount : Int64; // ---> MeasuresCount=16469
bValidTest : Boolean; // ---> TestValidation=True
// Paramètres calculés ou déduits de la configuration
iConverterRange : SmallInt; // Nombre de quanta sur la pleine échelle
dQuantum : Double; // Valeur calculée du quantum = FullScaleVoltRange/iConverterRange
ch,modid : SmallInt;
CpltMeasArrPtr : PCompleteMeasureArray;
procedure ProceedTreatment;
var a,i : Integer;
begin
// New(CpltMeasArrPtr);
if not Odd(milliers) then a := 0
else a := 1;
// CpltMeasArrPtr^ := CompleteMeasureArray[a];
// for i:=Low(CpltMeasArrPtr^) to High(CpltMeasArrPtr^)
for i:=Low(CompleteMeasureArray[a]) to High(CompleteMeasureArray[a])
do begin
cmReadMeasure := CompleteMeasureArray[a][i];
try
blRslt := WriteFile( hMeasuresFileHandle,
cmReadMeasure,
SizeOf(cmReadMeasure),
dwWritten,
nil );
if blRslt then WriteLn(IntToStr(dwWritten));
except
//Définit ExitCode pour indiquer la condition d'erreur (par convention)
ExitCode := GetLastError;
//Gérer la condition d'erreur
sWrite := 'Exception imprévue dans la création du fichier de données ('
+ IntToStr(ExitCode) + ')';
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
raise Exception.Create(sWrite);
ExitProcess(ExitCode);
end;
if ShouldClose
then if i=High(CompleteMeasureArray[a]) then SetEvent(CalcCanCloseEvent);
end;
// Dispose(CpltMeasArrPtr);
end;
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/////////////////////// PROGRAMME PRINCIPAL //////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
begin
//////////////////////////////////////////////////////////////
// PARAMETRES A ENVOYER LORS DE L'EXECUTION //
// PAR LIGNE DE COMMANDE OU //
// EN TANT QUE SERVICE //
//////////////////////////////////////////////////////////////
try
// Lecture des paramètres de la ligne de commande pour déterminer
// le fichier de configuration à prendre en compte
pchCmdLn := PAnsiChar('StrengthPlate');
// pchCmdLn := GetCommandLine;
sConfigFileName := String(pchCmdLn) + 'Config.txt';
// Récupère le handle sur l'évenement créé par le programme principal
// grâce à son nom (il faut évidemment mettre le même dans les deux applis !!)
CalcShouldCloseEvent := OpenEvent(EVENT_ALL_ACCESS, False, 'CALCULATE_CONSOLE_SHOULD_CLOSE_EVENT');
CalcCanCloseEvent := OpenEvent(EVENT_ALL_ACCESS, False, 'CALC_CAN_CLOSE_EVENT');
CalcClosedEvent := OpenEvent(EVENT_ALL_ACCESS, False, 'CALCULATE_CONSOLE_CLOSED_EVENT');
MeasuresFilledArrayEvent := OpenEvent(EVENT_ALL_ACCESS, False, 'MEASURES_FULL_ARRAY_EVENT');
sStoreDefaultPath := GetEnvironmentVariable(sStoreDirectory);
sRead := '';
ConfigList := TStringList.Create;
ConfigList.Clear;
JournalList := TStringList.Create;
JournalList.Clear;
TestInfoList := TStringList.Create;
TestInfoList.Clear;
dwRead := 0;
try
// Lecture des listes de chaînes depuis les fichiers texte
// Journal TextFile Creation for reading
JournalList.LoadFromFile(sStoreDefaultPath + sResultsDirectory + sJournalFileName);
// Informations TextFile Creation for reading
TestInfoList.LoadFromFile(sStoreDefaultPath + sResultsDirectory + sTestInfoFileName);
// Configuration TextFile Creation for reading
ConfigList.LoadFromFile(sStoreDefaultPath + sResultsDirectory + sConfigFileName);
// Chargement des paramètres depuis les listes de chaînes
// Paramètres de configuration
iConverterAccuracy := SmallInt(StrToInt(ConfigList.ValueFromIndex[ConfigList.IndexOfName('ConverterAccuracy')]));
iPresentModulesCount := SmallInt(StrToInt(ConfigList.ValueFromIndex[ConfigList.IndexOfName('PresentModulesCount')]));
bTOREnabled := StrToBool(ConfigList.ValueFromIndex[ConfigList.IndexOfName('TOREnabled')]);
iFrequency := StrToInt64(ConfigList.ValueFromIndex[ConfigList.IndexOfName('Frequency')]);
// Paramètres de conditions de test
iIPU := StrToInt(TestInfoList.ValueFromIndex[TestInfoList.IndexOfName('IPU')]);
iFootLength := SmallInt(StrToInt(TestInfoList.ValueFromIndex[TestInfoList.IndexOfName('FootLength')]));
iWeight := SmallInt(StrToInt(TestInfoList.ValueFromIndex[TestInfoList.IndexOfName('Weight')]));
iAge := SmallInt(StrToInt(TestInfoList.ValueFromIndex[TestInfoList.IndexOfName('Age')]));
iMovingWay := SmallInt(StrToInt(TestInfoList.ValueFromIndex[TestInfoList.IndexOfName('MovingWay')]));
// Résultats de validité de test
dtDepart := StrToDateTime(JournalList.ValueFromIndex[JournalList.IndexOfName('TestBegin')]);
dtArret := StrToDateTime(JournalList.ValueFromIndex[JournalList.IndexOfName('TestEnd')]);
iMeasureCount := StrToInt(JournalList.ValueFromIndex[JournalList.IndexOfName('MeasuresCount')]);
bValidTest := StrToBool(JournalList.ValueFromIndex[JournalList.IndexOfName('TestValidation')]);
case iConverterAccuracy of
caLow : iConverterRange := crLow;
caHigh : iConverterRange := crHigh;
end;
dQuantum := FullScaleVoltRange / iConverterRange;
finally
// On libère la variable chaînes
ConfigList.Free;
TestInfoList.Free;
end;
SetLength(DynRawMeasuresArray, iMeasureCount);
SetLength(DynRawDataArray, iMeasureCount);
mc := 0;
// Initialize the critical section one time only.
try
InitializeCriticalSection(CalculRTLCriticSection);
except
//Définit ExitCode pour indiquer la condition d'erreur (par convention)
ExitCode := GetLastError;
//Gérer la condition d'erreur
sWrite := 'Exception imprévue dans la création de la variable de données '
+ IntToStr(GetLastError) + ' (' + IntToStr(ExitCode) + ')';
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
raise Exception.Create(sWrite);
ExitProcess(ExitCode);
end;
// Measures File Creation
try
// Ouverture du fichier de mesure
hMeasuresFileHandle := CreateFile( PAnsiChar( sStoreDefaultPath
+ sResultsDirectory
+ sMeasuresFileName ),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ,
saMeasuresFileSecAttr,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0 );
except
//Définit ExitCode pour indiquer la condition d'erreur (par convention)
ExitCode := GetLastError;
//Gérer la condition d'erreur
sWrite := 'Exception imprévue dans la création du fichier de données ('
+ IntToStr(ExitCode) + ')';
Dec(mc);
JournalList.BeginUpdate;
JournalList.Add(sWrite);
JournalList.EndUpdate;
raise Exception.Create(sWrite);
ExitProcess(ExitCode);
end;
while not ( ShouldClose and CanClose )
do begin
Inc(milliers); CanTreat :WaitForSingleObject(MeasuresFilledArrayEvent, 0) WAIT_OBJECT_0;
if CanTreat
then try
ResetEvent(MeasuresFilledArrayEvent);
EnterCriticalSection(CalculRTLCriticSection);
ProceedTreatment;
finally
LeaveCriticalSection(CalculRTLCriticSection);
end;
// Condition de fermeture de l'application console ShouldClose :WaitForSingleObject(CalcShouldCloseEvent, 0) WAIT_OBJECT_0;
if ShouldClose then begin CanClose :WaitForSingleObject(CalcCanCloseEvent, 0) WAIT_OBJECT_0;
ExitProcess(0);
end;
end;
finally
// Consignation des informations du test
JournalList.SaveToFile(sStoreDefaultPath + sResultsDirectory + sJournalFileName);
// Libération de la mémoire
JournalList.Free;
DeleteCriticalSection(CalculRTLCriticSection);
CloseHandle(hMeasuresFileHandle);
// Libération de l'évenement
CloseHandle(CalcShouldCloseEvent);
CloseHandle(CalcCanTreatEvent);
CloseHandle(CalcCanCloseEvent);
SetEvent(CalcClosedEvent);
CloseHandle(CalcClosedEvent);
end;
end.
voilà, je crois qu'avec ça tu as toutes les billes pour comprendre mon problème, puisque j'arrive à exécuter sans souci les 2 appli console en mm tps sous le débogueur, et à les arrêter. et pour l'affichage, je lis le fichier sauvegardé dans l'appli console de calcul dans un TStringList que j'affiche ensuite dans un TMemo.
mon chef m'a expliqué qu'en faisant New(monpointeur) dans chaque appli console, en fait je créais 2 instances différentes de la variable, et donc qu'il est normal que j'aie des 0 partout dans mon appli de calcul.
pourtant je pensais instancier 2 pointeurs distincts sur une même variable.
j'attends de tes nouvelles, avec commentaires, critiques et recommendations à l'appui.
<hr />
si Delphi m'était conté...