システムのメンテナンスに使用される VCL フォームを備えたマルチスレッド サーバーで作業しています。各スレッドは MainForm の RichEdit に書き込み、リアルタイムで何を行うかを表示できます (問題が発生した場合は、これをすぐに修正する必要があります)。
しかし、スレッドが RichEdit に書き込むと、「EOutOfResource」エラーが発生することがあります。「Erreur d'insertion de ligne RichEdit」(Google 翻訳: エラー挿入行 RichEdit)。リッチエディットの内容がぐちゃぐちゃになります。
これは、RichEdit に行を追加するメイン フォーム プロシージャです。
procedure Main.MajRichEdit(S1,S2:string;tform:TFontStyles;i1:integer)
begin
CriticalSection.Acquire
if S2='C' then
begin
RichEditC.SelAttributes.Style:=tform;
RichEditC.SelAttributes.Color:=i1;
RichEditC.Lines.Add:=S1;
end
else if S2='CN' then
RichEditC.Lines.Add:=S1;
else if S2='T' then
begin
RichEditT.SelAttributes.Style:=tform;
RichEditT.SelAttributes.Color:=i1;
RichEditT.Lines.Add:=S1;
end
else if S2='TN' then
RichEditT.Lines.Add:=S1;
else if S2='S' then
begin
RichEditS.SelAttributes.Style:=tform;
RichEditS.SelAttributes.Color:=i1;
RichEditS.Lines.Add:=S1;
end
else if S2='SN' then
RichEditS.Lines.Add:=S1;
CriticalSection.Release;
end;
これらは私のスレッドからの呼び出しです:
//..Declaration Variable..//
public
sCall1,sCall2:string;
tFontCall1:TFontStyles;
iNbColor1:integer;
//..Appel MajRichEdit..//
procedure Mythread.CallREMajTelforIHM;
begin
LockIHM.BeginWrite;
Main.MajRichEdit(sCall1,sCall2,tFontCall1,iNbColor1);
LockIHM.EndWrite;
end;
//..Appel CallRe ..//
//My code
sCall1:="un petit peu de français , c'est pas plus mal ;) "
sCall2:="C";
tFontCall1:=[fsBold]; //If i want a txt in bold ;)
iCall1:=clRed;
Queue(CallREMajTelforIHM);
私は同様のものを正常に動作させています(ちょっとしたことのEAccessViolationですが、後でそれを修復します;))
例外は、try/except でバイパスできますか? システムで変更を行っていないため、TRichEdit ポリシーが変更された理由がわかりません...