Bonjour,
J'utilise les fonctions d'une dll écrit en C++ pour faire de l'acquisition vidéo
j'ai réussi à passer du C au delphi mais un problème subsiste lors de l'appelle d'une fonction
cette fonction sert à ajouter un texte sur la vidéo en cours de visualisation
en C++ le fonction est :
MID2250_API int SN_SetOverlayText( int idx, const POINT *pPos, const overlay_text_t *pOvlText, BOOL bEnable, BOOL bUpdate, int board);
que j'ai traduit en delphi :
function SN_SetOverlayText(idx :longint;position : tab2int;OvlText : overlay_text_t;bEnable : boolean;bUpdate : boolean;board :longint): longint; cdecl; external NomDLL;
AVEC
type
tab2int = array[1..2] of integer;
overlay_text_t = RECORD
text : array[0..95] of char;
fontidx: integer;
reserved : array[0..27] of char;
END;
Ma procedurequi appelle la fonction est :
procedure TForm1.SetOverlayTextClick(Sender: TObject);
var
position : tab2int;
ovltext : overlay_text_t;
begin
position[1]:=10;
position[2]:=15;
ovltext.text := 'montextesurlavideo';//cause du problème
ovltext.fontidx := 2;
ovltext.reserved :='reserved';
SN_SetOverlayText(1, position, ovltext, TRUE, true, 0);
end;
le message d'erreur est :
le projet a provoqué une classe d'exception EAccessViolation avec le message "violation access à l'adresse ... dans le module ..."
c'est après plusieurs test que je me suis rendu compte de la source du probblème : ovltext.tex
si je mets dans ovltext.text 'montextesurlavideo'#0 ma fonction renvoi un chiffre (-8) disant que ca n'a pas marché
si je mets dans ovltext.text #0 ma fonction renvoi un chiffre (0) disant que ca à marché
mais #0 n'affiche rien c'est un caractère de fin de ligne en C++
j'ai essayé de mettre une variable de type array[0..95] of char dans ovltext.text
mais il me disait type incompatible sans préciser pourquoi
voilà pourquoi je suis la car ceux sont deux variables du même type mais incompatibles !!
comme ca j'écris un texte dans un edit (SetOverlayTextEdit) et je l'affiche sur la vidéo (SN_SetOverlayText)
avec un timer on peu afficher la date et l'heure toutes les deux secondes par exemple
procedure TForm1.ClearOverlayClick(Sender: TObject);
var
r :integer;
begin
r:=SN_ClearOverlay(0);
ClearOverlayEdit.Text := inttostr(r);
end;
la variable r affichée dans les edits sert à vérifier le bon fonctionnement des fonctions
elles retournent 0 si tout s'est bien passé
Néanmoins la solution de fOxi doit etre meilleur pour la gestion des erreurs
j'arrive donc à afficher un texte sur ma vidéo en overlay mais je ne peux pas modifié dynamiquement mon texte :
Cela ne marche pas
procedure TForm1.SetOverlayTextClick(Sender: TObject);
var
Rest : integer;
OvlText: TOverlayTextT;
Pos : TPoint;
r :integer;
TexteAffiche : array[0..MAX_OVLTEXT-1] of char; begin
Pos.X:= 10;
Pos.Y:=15;
TexteAffiche:=' Montexteaffiché';
var
S : string;
begin
S := EditX.Text; // le maxlength du TEdit doit etre reglé a MAX_OVLTEXT
FillChar(OvlText.text, MAX_OVLTEXT, #0);
Move(OvlText.text, S[1], Length(S));
{ ... }
end;
Merci pour ces infos et bon week end
j'ai essayé les deux premières méthodes mais il me renvoit -1 on failure
je vais tester ca plus profondement mardi
en tout cas merci pour ton aide