Autor Beitrag
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2411
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Delphi 10.3 Community Edition, Lazarus 2.0.6
BeitragVerfasst: Di 19.05.20 21:11 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Nun tritt aber der SIGSEGV-Fehler wieder auf, wenn ich RTF-Text aus dem alten Word verwende. Er tritt auf beim Sichern der Formate in der Schleife:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
for i := 0 to n-1 do
begin
  aFormats[i] := ClipBoard.Formats[i];  //<- Hier!
  //...
end;
Ok, der Fehler tritt so oder so auf, mit oder ohne temporärem RichMemo. Denn er tritt ja an einer Stelle auf, wo ein RichMemo noch gar nicht vorkommt.

Aber er tritt nur manchmal auf. Ich möchte gerene darauf reagieren, aber das Programm rumpelt drüber und dann knallts... Wie gesagt, immer nur bei ClipBoard-Daten alter Programme.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18827
Erhaltene Danke: 1650

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 19.05.20 21:33 
Den kompletten Stacktrace von dem Fehler haben wir bisher aber noch nicht gesehen. ;-)
Und da wir das ohne die passenden Daten nicht reproduzieren können, können wir auch nicht überlegen wo der Fehler sein könnte.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2411
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Delphi 10.3 Community Edition, Lazarus 2.0.6
BeitragVerfasst: Di 19.05.20 22:17 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Den kompletten Stacktrace von dem Fehler haben wir bisher aber noch nicht gesehen. ;-)
Und da wir das ohne die passenden Daten nicht reproduzieren können, können wir auch nicht überlegen wo der Fehler sein könnte.
Wenn das weiterhilft, gerne!
Einloggen, um Attachments anzusehen!
_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18827
Erhaltene Danke: 1650

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 19.05.20 23:37 
Hmm, dann ist da schon richtig etwas kaputt, wenn es nicht einmal mehr einen richtigen Stacktrace gibt. Dann bleibt nur manuell durch debuggen...

Nach meinen bisherigen Erfahrungen mit Lazarus ist es durchaus nicht unwahrscheinlich, dass du dabei einen Bug findest.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2411
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Delphi 10.3 Community Edition, Lazarus 2.0.6
BeitragVerfasst: Mi 20.05.20 06:30 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Hmm, dann ist da schon richtig etwas kaputt, wenn es nicht einmal mehr einen richtigen Stacktrace gibt. Dann bleibt nur manuell durch debuggen...
Das Komische ist ja, dass es unter Lazarus, wenn man es im Debug-Modus ausführt, und dann, nach dem Auftreten des Fehlers, weiter ausführt, einfach ganz normal weiterläuft. Alles funktioniert, als sei nicht passiert. Nur ohne Lazarus, also "alleine", beendet sich das Programm einfach. Und ich kann das wie gesagt nicht abfangen. Zumindest weiss ich nicht, wie.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18827
Erhaltene Danke: 1650

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 20.05.20 06:44 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Und ich kann das wie gesagt nicht abfangen. Zumindest weiss ich nicht, wie.
try..except klappt nicht?

Aber wie gesagt, interessant wäre ja an welcher Stelle genau der Fehler auftritt, wenn du durch den Quelltext debuggst, also durch TClipboard.GetFormats usw. (ich sehe dort z.B. eine Unterscheidung nach CanReadFromCache).
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2411
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Delphi 10.3 Community Edition, Lazarus 2.0.6
BeitragVerfasst: Mi 20.05.20 07:27 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Und ich kann das wie gesagt nicht abfangen. Zumindest weiss ich nicht, wie.
try..except klappt nicht?
Nein. Ich habe es zwar eingebaut, aber es ist in diesem Fall nutzlos.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Aber wie gesagt, interessant wäre ja an welcher Stelle genau der Fehler auftritt, wenn du durch den Quelltext debuggst, also durch TClipboard.GetFormats usw. (ich sehe dort z.B. eine Unterscheidung nach CanReadFromCache).
Das werde ich mir jedenfalls ansehen!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4232
Erhaltene Danke: 892

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: Mi 20.05.20 09:02 
Tja, manchmal hilft Doku lesen. ;-)

Und auch bzgl. des SIGSEGV-Fehlers: Exceptions: Exception Classes
Füge die Unit SysUtils mal hinzu.

Dann solltest du aber zusätzlich einen try..except-Block um die fehlerhafte Funktion packen.

PS: Das Erzeugen der Stream-Objekte kannst du auch in die 2. Schleife packen (wie für das Formats-Array).
Und wenn du den Code wiederverwendbar machen möchtest, dann solltest du die Funktionalität in eine eigene Klasse packen (z.B. ClipboardSaver).

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2411
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Delphi 10.3 Community Edition, Lazarus 2.0.6
BeitragVerfasst: Mi 20.05.20 12:47 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Aber wie gesagt, interessant wäre ja an welcher Stelle genau der Fehler auftritt, wenn du durch den Quelltext debuggst, also durch TClipboard.GetFormats usw. (ich sehe dort z.B. eine Unterscheidung nach CanReadFromCache).
In clipbrd.pas ist GetFormats zwar deklariert, aber im implementation-Teil nicht vorhanden. Wo also finde ich CanReadFromCache?

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Und auch bzgl. des SIGSEGV-Fehlers: Exceptions: Exception Classes
Füge die Unit SysUtils mal hinzu.

Dann solltest du aber zusätzlich einen try..except-Block um die fehlerhafte Funktion packen.
Seh ich mir an!

Danke für eure Tipps!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18827
Erhaltene Danke: 1650

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 20.05.20 13:29 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
In clipbrd.pas ist GetFormats zwar deklariert, aber im implementation-Teil nicht vorhanden. Wo also finde ich CanReadFromCache?
Debugge doch einfach von der Zeile in deinem Quelltext aus durch. ;-)
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2411
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Delphi 10.3 Community Edition, Lazarus 2.0.6
BeitragVerfasst: Mi 20.05.20 15:59 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Füge die Unit SysUtils mal hinzu.
SysUtils ist eingebunden.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Dann solltest du aber zusätzlich einen try..except-Block um die fehlerhafte Funktion packen.
Nützt leider nichts.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
PS: Das Erzeugen der Stream-Objekte kannst du auch in die 2. Schleife packen (wie für das Formats-Array).
Und wenn du den Code wiederverwendbar machen möchtest, dann solltest du die Funktionalität in eine eigene Klasse packen (z.B. ClipboardSaver).
Habe ich vor! Erstmal herausfinden, was da los ist.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Debugge doch einfach von der Zeile in deinem Quelltext aus durch. ;-)
Zwei Möglichkeiten:
1. Das Programm wird mit einer SIGSEGV-Meldung abgebrochen, mit oder ohne try/except. Debuggen von der Zeile im Quelltext? Ich setzt einen Haltepunkt bei aFormats[i] := ClipBoard.Formats[i];, der Debugger hält mehrfach dort an, dann kracht es. Das except wird erst gar nicht angesprungen. (ClipBoard.Formats; verwendet ja ClipBoard.GetFormats, da ist ein Haltepunkt also prinzipiell sinnvoll).
2. Es klappt alles wie gewünscht.
Mal so, mal so, aber nie mit RTF-Text oder Grafiken aktueller Programme. Wenn ich den RTF-Text mit LibreOffice in die Zwischenablage kopiere, befindet sich dort ein Format namens "Richtext Format". Wenn ich den RTF-Text mit Word in die Zwischenablage kopiere, gibt es dieses Format nicht. Ob das die Ursache ist, weiss ich nicht.

Ich kann leider nirgendwo CanReadFromCache finden, geschweige denn den Code von ClipBoard.GetFormats.

Welche Möglichkeiten gibt es noch, wenn try/except nichts nützen?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18827
Erhaltene Danke: 1650

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 20.05.20 16:50 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Debugge doch einfach von der Zeile in deinem Quelltext aus durch. ;-)
Zwei Möglichkeiten:
1. Das Programm wird mit einer SIGSEGV-Meldung abgebrochen, mit oder ohne try/except. Debuggen von der Zeile im Quelltext? Ich setzt einen Haltepunkt bei aFormats[i] := ClipBoard.Formats[i];, der Debugger hält mehrfach dort an, dann kracht es. Das except wird erst gar nicht angesprungen.
Ja, aber was passiert dort?
Hast du noch nie schrittweise debuggt? Sprich F7 um in eine Methode hinein zu debuggen, F8 um darüber hinweg zu debuggen?

Beispiel:
LazarusDebugging
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4232
Erhaltene Danke: 892

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: Mi 20.05.20 16:52 
Läuft das Programm denn außerhalb der IDE (mit aktiviertem try..except) durch?
Hast du evtl. in der IDE "Halt on exception" in den Optionen aktiviert?

Und hast du nur einen leeren except-Block? Dann versuche mal
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
try
  { ... }
except 
  on E : Exception do ShowMessage(E.Message);
end
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2411
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Delphi 10.3 Community Edition, Lazarus 2.0.6
BeitragVerfasst: Do 21.05.20 20:53 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Hast du noch nie schrittweise debuggt? Sprich F7 um in eine Methode hinein zu debuggen, F8 um darüber hinweg zu debuggen?
F7 nicht so oft, aber F8 doch, natürlich, aber es war noch nie so mühsam wie diesmal, weil es ja nicht jedesmal zu diesem SIGSEGV kommt. Aber ich denke, ich habe die Stelle gefunden in win32winapi.inc in Prozedur TWin32WidgetSet.ClipboardGetData bei Size := Windows.GlobalSize(DataHandle);:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
function TWin32WidgetSet.ClipboardGetData(ClipboardType: TClipboardType;
  FormatID: TClipboardFormat; Stream: TStream): Boolean;
var
  DataHandle: HGLOBAL;
  Data: pointer;
  Size: integer;
  {$IFDEF VerboseWin32Clipbrd}
  DbgFormatID: integer;
  {$ENDIF}
  Bitmap: TBitmap;
  BufferStream: TMemoryStream;
  BufferWideString: widestring;
  BufferString: ansistring;

  function ReadClipboardToStream(DestStream: TStream): Boolean;
  begin
    Result := false;

    DataHandle := Windows.GetClipboardData(FormatID);
    if DataHandle<>HWND(0then
    begin
      Size := Windows.GlobalSize(DataHandle);  //Nach F7 hier kommt dann die SIGSEGV-Meldung!
//...

Warum klappt es manchmal, dann wieder nicht? Und: Wenn ich das Programm einfach trotzdem weiter laufen lasse, wird die Grafik eingefügt und der ursprüngliche Inhalt der Zwischanablage ist wieder vorhanden!

Vor allem aber: Wie kann ich das nun beheben?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2411
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Delphi 10.3 Community Edition, Lazarus 2.0.6
BeitragVerfasst: Do 21.05.20 21:27 
Mittlerweile bin ich mir nicht mehr sicher, dass das die einzige Stelle ist, bei der der Fehler auftritt. Denn wenn ich dort einen Haltepunkt setze und dann F8 drücke, läuft der Code weiter und dann erst kommt SIGSEGV.

Auch das Ummanteln der Codestelle mit try/except nützt nichts.

Weil der Fehler ja nicht jedesmal auftriff, ist das Debuggen wirklich mühselig.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2411
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Delphi 10.3 Community Edition, Lazarus 2.0.6
BeitragVerfasst: Do 21.05.20 21:35 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Läuft das Programm denn außerhalb der IDE (mit aktiviertem try..except) durch?
Nein. Es bricht mit der Meldung "... funktioniert nicht mehr ... muss beendet werden" ab.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Hast du evtl. in der IDE "Halt on exception" in den Optionen aktiviert?
Ich finde diese Einstellung nicht, ich weiss es nicht

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Und hast du nur einen leeren except-Block?
Nein, egal ob leer oder nicht, es geht nie ins except.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4232
Erhaltene Danke: 892

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: Fr 22.05.20 16:36 
Versuche mal einen eigenen "Runtime error" wie DivideByZero (x/0) auszulösen und zu fangen - klappt das denn?
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2411
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Delphi 10.3 Community Edition, Lazarus 2.0.6
BeitragVerfasst: Fr 22.05.20 17:00 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Versuche mal einen eigenen "Runtime error" wie DivideByZero (x/0) auszulösen und zu fangen - klappt das denn?

Ja, das klappt mit dem try/except. Ich habe mir eine kleine Prozedur gebastelt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  x, y: Double;
begin
  try
    x := 1;
    y := 0;
    Caption := IntToStr(Round(x / y));

  except
    ShowMessage('Fehler.');
  end;
end;

Mit der IDE kommt zunächst eine SIGFPE-Fehlermeldung und die IDE markiert die Zeile Caption := IntToStr. Wenn ich das Programm weiter ausführe, springt es ins except und ShowMessage erscheint.
Ohne IDE springt es gleich ins except und ShowMessage erscheint.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4232
Erhaltene Danke: 892

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: Fr 22.05.20 18:07 
Das, was mir dann noch einfällt, wäre die Source-Unit von TClipboard zu duplizieren (und einen anderen Klassennamen bzw. Namensbereich geben), dort dann uses SysUtils hinzufügen und mit dieser neuen Klasse noch mal auszuprobieren.

Edit: Oh, sehe gerade, daß der SIGSEGV-Fehler ja noch tiefer in der Klasse TWin32WidgetSet auftritt: Ist das eine Basisklasse von TClipboard?
Trotzdem probiere mal (zuerst) das oben beschriebene.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2411
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Delphi 10.3 Community Edition, Lazarus 2.0.6
BeitragVerfasst: Fr 22.05.20 18:20 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Das, was mir dann noch einfällt, wäre die Source-Unit von TClipboard zu duplizieren (und einen anderen Klassennamen bzw. Namensbereich geben), dort dann uses SysUtils hinzufügen und mit dieser neuen Klasse noch mal auszuprobieren.
Aber in clipbrd.pp ist SysUtils bereits angegeben. Was meinst du?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!