![]() |
Event verursacht Riched32.dll Exception
Hallo ich habe eine ActiveX-Komponente die in unregelmässigen Abständen Events abfeuert.
In meinem Projekt greift der Event auf das RichEdit-Objekt wie folgt zu:
Delphi-Quellcode:
Mit dieser Prozedur kommt es zu unregelmässigen Application Exceptions.
procedure TForm1.AddLog(s: String);
begin Log.SelStart := Log.GetTextLen; Log.SelText := '[' + TimeToStr(Time) + '] ' + s + #13 + #10; end; Erstaunlicherweise nehmen die Abbrüche ab, wenn ich folgendes als RichEdit-Ereignis einfüge:
Delphi-Quellcode:
Wie geht man richtig vor um einen Text in das RichEdit-Fenster zu schreiben?
procedure TForm1.LogChange(Sender: TObject);
begin Log.Perform(EM_SCROLLCARET, 0, 0); // Autoscroll Funktion für das RichEdit end; Gruss Alois ;) |
Re: Event verursacht Riched32.dll Exception
Wie und was für Events sind das?
Laufen dieses im Kontext des Hauptthreads ab? Wenn nicht, rufst du diese Prozedur synchronisiert auf? (threadsicher) ... |
Re: Event verursacht Riched32.dll Exception
Hallo,
Delphi-Quellcode:
Ich glaube nicht das die Application Exceptions in dem von Dir geposteten Code begründet sind.
RichEdit.Lines.Add('[' + TimeToStr(Time) + '] ' + s);
|
Re: Event verursacht Riched32.dll Exception
Bei solchen unerklärlichen Probleme hilft es ab un zu sich die Daten des Events zu merken und sich dann per PostMessage mit User-Message-Id sich selbst ein Event zu geben und dann dort die nachricht zu bearbeiten. Ist dann der Fall wenn man durch Aktionen im Event ansonsten den Aufrufstack "beschädigen" würde (z. B. Freigabe von Elementen welche das Event ausgelöst haben).
|
Re: Event verursacht Riched32.dll Exception
Zitat:
Zitat:
@Bernhard Geyer: Ja, über die Lösung über PostMessage habe ich schon gelesen. Ich weiss aber nicht wie man folgende Befehle an das RichEdit-Objekt sendet:
Delphi-Quellcode:
Gibt's dafür ein Beispiel?
Log.SelAttributes.Color := clBlack;
Log.SelStart := Log.GetTextLen; Log.SelText := '[' + TimeToStr(Time) + '] ' + s + #13 + #10; Gruss Alois ;) |
Re: Event verursacht Riched32.dll Exception
Hi,
ich konnte mein Problem inzwischen selber lösen.
Delphi-Quellcode:
Gruss Alois ;)
const
WMWriteLog = WM_USER + 101; type TForm1 = class(TForm) procedure ReadWMWriteLog(var Msg: TMessage); message WMWriteLog; ... private { Private declarations } public { Public declarations } end; procedure TForm1.AddLog(s: String); var wParam: Word; begin wParam := GlobalAddAtom(PChar(s)); PostMessage(Self.Handle, WMWriteLog, wParam, 0); end; procedure TForm1.ReadWMWriteLog(var Msg: TMessage); var Buffer: PChar; s: string; begin Buffer := nil; try s := ''; GetMem(Buffer, 255); if GlobalGetAtomName(Msg.wParam, Buffer, 255) > 0 then s := StrPas(Buffer); Log.SelStart := Log.GetTextLen; Log.SelText := '[' + TimeToStr(Time) + '] ' + s + #13 + #10; finally GlobalDeleteAtom(Msg.wParam); FreeMem(Buffer); end; end; |
Re: Event verursacht Riched32.dll Exception
Delphi-Quellcode:
und von extern dann AddLog aufrufen
const
WM_ADDMESSAGE = WM_USER + 1; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } _CS: TRTLCriticalSection; _SL: TStrings; procedure WMAddMessage(var Message: TMsg); message WM_ADDMESSAGE; public { Public-Deklarationen } procedure AddLog(const S: String); end; procedure TForm1.FormCreate(Sender: TObject); begin InitializeCriticalSection(_CS); _SL := TStringList.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin _SL.Free; DeleteCriticalSection(_CS); end; procedure TForm1.WMAddMessage(var Message: TMsg); begin EnterCriticalSection(_CS); try Log.SelAttributes.Color := clBlack; Log.SelStart := Log.GetTextLen; Log.SelText := _SL.Text; _SL.Clear; finally LeaveCriticalSection(_CS); end; end; procedure TForm1.AddLog(const S: String); begin EnterCriticalSection(_CS); try _SL.Add('[' + TimeToStr(Time) + '] ' + s); finally LeaveCriticalSection(_CS); end; PostMessage(Handle, WM_ADDMESSAGE, 0, 0); end; |
Re: Event verursacht Riched32.dll Exception
Hi @himitsu,
das mit den CriticalSection kannte ich bisher auch noch nicht. Vielen Dank für das Beispiel :cheers: Gruss Alois ;) |
Re: Event verursacht Riched32.dll Exception
Es gibt auch noch die Klasse TCriticalSection, aber ich arbeite aus Gewohnheit lieber mit dieser Variante aus der Unit Windows.
(in der Unit SyncObjs sind auch noch andere nette Dinge drin) PS: die Zeit hatte ich absichtlich in der Add-Methode schon zuaddiert, damit dieses die Zeit des Hinzufügens ist und nicht die Zeit, wo die GUI sich endlich mal im diese Message kümmerte :) |
Re: Event verursacht Riched32.dll Exception
Zitat:
Gruss Alois ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz