AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Event verursacht Riched32.dll Exception

Ein Thema von Alois · begonnen am 30. Okt 2009 · letzter Beitrag vom 31. Okt 2009
Antwort Antwort
Alois

Registriert seit: 23. Jul 2005
71 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Event verursacht Riched32.dll Exception

  Alt 30. Okt 2009, 22:50
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:
procedure TForm1.AddLog(s: String);
begin
  Log.SelStart := Log.GetTextLen;
  Log.SelText := '[' + TimeToStr(Time) + '] ' + s + #13 + #10;
end;
Mit dieser Prozedur kommt es zu unregelmässigen Application Exceptions.


Erstaunlicherweise nehmen die Abbrüche ab, wenn ich folgendes als RichEdit-Ereignis einfüge:
Delphi-Quellcode:
procedure TForm1.LogChange(Sender: TObject);
begin
  Log.Perform(EM_SCROLLCARET, 0, 0); // Autoscroll Funktion für das RichEdit
end;
Wie geht man richtig vor um einen Text in das RichEdit-Fenster zu schreiben?

Gruss Alois
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#2

Re: Event verursacht Riched32.dll Exception

  Alt 30. Okt 2009, 22:57
Wie und was für Events sind das?

Laufen dieses im Kontext des Hauptthreads ab?
Wenn nicht, rufst du diese Prozedur synchronisiert auf? (threadsicher)

...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#3

Re: Event verursacht Riched32.dll Exception

  Alt 30. Okt 2009, 22:57
Hallo,

RichEdit.Lines.Add('[' + TimeToStr(Time) + '] ' + s); Ich glaube nicht das die Application Exceptions in dem von Dir geposteten Code begründet sind.
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Event verursacht Riched32.dll Exception

  Alt 31. Okt 2009, 08:32
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).
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Alois

Registriert seit: 23. Jul 2005
71 Beiträge
 
Delphi 10 Seattle Professional
 
#5

Re: Event verursacht Riched32.dll Exception

  Alt 31. Okt 2009, 12:37
Zitat von himitsu:
Laufen dieses im Kontext des Hauptthreads ab?
Wenn nicht, rufst du diese Prozedur synchronisiert auf? (threadsicher)
Nein sie werden von der ActiveX Komponente gesteuert und laufen nicht threadsicher ab.

Zitat von Lannes:
RichEdit.Lines.Add('[' + TimeToStr(Time) + '] ' + s);
Gibt es das gleiche Problem.



@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:
Log.SelAttributes.Color := clBlack;
Log.SelStart := Log.GetTextLen;
Log.SelText := '[' + TimeToStr(Time) + '] ' + s + #13 + #10;
Gibt's dafür ein Beispiel?

Gruss Alois
  Mit Zitat antworten Zitat
Alois

Registriert seit: 23. Jul 2005
71 Beiträge
 
Delphi 10 Seattle Professional
 
#6

Re: Event verursacht Riched32.dll Exception

  Alt 31. Okt 2009, 13:58
Hi,

ich konnte mein Problem inzwischen selber lösen.

Delphi-Quellcode:
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;
Gruss Alois
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#7

Re: Event verursacht Riched32.dll Exception

  Alt 31. Okt 2009, 14:09
Delphi-Quellcode:
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;
und von extern dann AddLog aufrufen
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Alois

Registriert seit: 23. Jul 2005
71 Beiträge
 
Delphi 10 Seattle Professional
 
#8

Re: Event verursacht Riched32.dll Exception

  Alt 31. Okt 2009, 14:12
Hi @himitsu,
das mit den CriticalSection kannte ich bisher auch noch nicht. Vielen Dank für das Beispiel

Gruss Alois
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#9

Re: Event verursacht Riched32.dll Exception

  Alt 31. Okt 2009, 14:15
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Alois

Registriert seit: 23. Jul 2005
71 Beiträge
 
Delphi 10 Seattle Professional
 
#10

Re: Event verursacht Riched32.dll Exception

  Alt 31. Okt 2009, 14:34
Zitat von himitsu:
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
Das sehe ich genau so. Danke für den Hinweis.

Gruss Alois
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz