FortesReport und DBMemo

Rund um die LCL und andere Komponenten
Antworten
MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

FortesReport und DBMemo

Beitrag von MacWomble »

Hallo,

ich setze in einem Projekt FortesReport ein. Nun stehe ich vor dem Problem, dass die Anwendung bei Start ein AcessViolation verurscht, sobald ich ein DBMemo im Report verwende. Gestern hat das noch funktioniert, aber im laufe der Erweiterung des Reports muss irgend etwas schief gegangen sein.
Im Debug-Modus komme ich auch nicht weiter, weil es mir dann die komplette IDE zerschießt.

Zum Dateianhang:
Im zweiten Detailband soll ein Memofeld eingefügt werden. Es sollen dann noch zwei weitere Bänder auf diese Art folgen.

Der Debugger meldet: (Kann ich nichts mit anfangen)
Error: Projekt varta hat Exception-Klasse »External: SIGSEGV« ausgelöst.

Bei Adresse 7FFFF693B7ED


Code: Alles auswählen

g_type_check_instance_is_fundamentally_a 
00007FFFF693B7E0 4885ff                   test   %rdi,%rdi
00007FFFF693B7E3 7444                     je     0x7ffff693b829 <g_type_check_instance_is_fundamentally_a+73>
00007FFFF693B7E5 488b07                   mov    (%rdi),%rax
00007FFFF693B7E8 4885c0                   test   %rax,%rax
00007FFFF693B7EB 743c                     je     0x7ffff693b829 <g_type_check_instance_is_fundamentally_a+73>
00007FFFF693B7ED 488b00                   mov    (%rax),%rax                                           
00007FFFF693B7F0 483dfc030000             cmp    $0x3fc,%rax
00007FFFF693B7F6 7728                     ja     0x7ffff693b820 <g_type_check_instance_is_fundamentally_a+64>
00007FFFF693B7F8 488d1561de2100           lea    0x21de61(%rip),%rdx        # 0x7ffff6b59660
00007FFFF693B7FF 48c1e802                 shr    $0x2,%rax
00007FFFF693B803 488b04c2                 mov    (%rdx,%rax,8),%rax
00007FFFF693B807 4885c0                   test   %rax,%rax
00007FFFF693B80A 741d                     je     0x7ffff693b829 <g_type_check_instance_is_fundamentally_a+73>
00007FFFF693B80C 0fb65014                 movzbl 0x14(%rax),%edx
00007FFFF693B810 483974d048               cmp    %rsi,0x48(%rax,%rdx,8)
00007FFFF693B815 0f94c0                   sete   %al
00007FFFF693B818 0fb6c0                   movzbl %al,%eax
00007FFFF693B81B c3                       retq   
 


Gruß
Klaus
Dateianhänge
Report.zip
Die Report-Dateien
(2.86 KiB) 42-mal heruntergeladen
Zuletzt geändert von MacWomble am Sa 18. Feb 2017, 19:28, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: FortesReport und Memo

Beitrag von MacWomble »

So, ein kleines Stück bin ich weiter. Der Fehler wird in RLMetaVCL ausgelöst und zwar in folgender Prozedur:

Code: Alles auswählen

procedure CanvasTextRectEx(aCanvas:TCanvas; const aRect:TRect; aX,aY:integer; const aText:string; aAlignment:TRLMetaTextAlignment; aLayout:TRLMetaTextLayout; aTextFlags:TRLMetaTextFlags);
var
  delta,left,top,txtw,txth,wid,i:integer;
  buff:string;
begin
  buff :=aText;
  delta:=aCanvas.TextWidth(' ') div 2;
  txtw :=aCanvas.TextWidth(buff+' ');
  txth :=aCanvas.TextHeight(buff+' ');
  case aAlignment of
    MetaTextAlignmentCenter: left:=(aRect.Left+aRect.Right-txtw) div 2+delta;
    MetaTextAlignmentRight : left:=aRect.Right-txtw+delta;
  else
    left:=aX+delta;
  end;
  case aLayout of
    MetaTextLayoutCenter: top:=(aRect.Top+aRect.Bottom-txth) div 2;
    MetaTextLayoutBottom: top:=aRect.Bottom-txth;
  else
    top:=aY;
  end;
  if aAlignment=MetaTextAlignmentJustify then
  begin
    wid:=aRect.Right-left;
    i  :=Length(buff);
    while (aCanvas.TextWidth(buff+#32)<=wid) and IterateJustification(buff,i) do;
  end;
  if (aTextFlags and MetaTextFlagAutoSize)=MetaTextFlagAutoSize then
    aCanvas.TextOut(left,top,buff)
  else
    aCanvas.TextRect(aRect,left,top,buff); // Hier knallt es: left (2), top (15), buff (zweite Zeile des Memos) haben plausible Daten. aRect s.u.
end;   



aRect:

aRect = <TRECT> = {
LEFT = 0,
TOP = 15,
RIGHT = 185,
BOTTOM = 30,
TOPLEFT = {
X = 0,
Y = 15},
BOTTOMRIGHT = {
X = 185,
Y = 30},
VECTOR = {
0,
15,
185,
30}}

Was mir auffällt ist, dass es erst bei der zweiten Zeile knallt. Nur wenn das Memo leer ist, funktioniert der Report.
Allerdings funktioniert es auch nicht, wenn nur eine Zeile eingegeben ist.

Wie oben schon erwähnt, hatte das gestern mal funktioniert, bevor ich den Report um einige DBText erweitert habe.
Heute habe ich den Report bis auf das Memo gelöscht und auch dies hatte keinen Erfolg. Der Eintrag des Memofeldes wurde nicht verändert.
Zugriff erfolgt über Zeos und Datasource auf MySQL. Das ganze unter Linux Mint 18.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: FortesReport und DBMemo

Beitrag von Michl »

Keine Ahnung, warum es dort knallt. Mir ist es aber schon passiert, daß der Debugger an der falschen Stelle gestoppt hat. Könntest ja mal probieren unter Projekt -> Projekteinstellungen -> Compilereinstellungen -> Debuggen -> Groupbox Info für GDB -> Debugging-Info-Typ auf "Dwarf2 (-gw2)" zu stellen. Damit liefert mir der Debugger die besten Ergebnisse. Ob es weitere Kenntnisse bringt kann ich dir nicht sagen.

Außerdem ist es sinnvoll Lazarus mit Debugsymbolen zu bauen, evtl. ergibt sich daraus etwas.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: FortesReport und DBMemo

Beitrag von MacWomble »

Danke!

Ich habe das Programm gestoppt und bin Zeile für Zeile durch gesprungen bis es krachte.

Mit Deinen Debuggereinstellungen komme ich zum selben Resultat. Die oben genannte Zeile löst die Exception aus.
Keine neuen Erkenntnisse mit Debug-IDE

Gruß Klaus

PS: Wenn ich die Zeile auskommentiere, dann läuft der Report. allerdings kann man diesen dann nicht mehr editieren - was in jedem Fall äußerst schlecht funktioniert, sobald Memofelder im Spiel sind. Mir ist die IDE bestimmt 20 mal abgestürzt (aufgehängt) bis die drei Memos drin waren,
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten