ShortString-Property in Komponenten

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

ShortString-Property in Komponenten

Beitrag von wolf_z »

Hallo,
ich bin gerade dabei, ein Delphi-Programm nach Lazarus zu portieren. Dabei ist mir folgendes aufgefallen. Folgende Verwendung von Shortstrings führt zu totalem Programm-Ausstieg ("Project raised exception class "External SIGSEGV"):

Code: Alles auswählen

unit someTest; 
 
  {$mode objfpc}{$H+} // {$MODE Delphi}
 
interface
 
uses
  Classes, SysUtils; 
 
type
 
  sstring = ShortString;  {works in Delphi, fatal error in Lazarus}
  // sstring = string; {Lazarus, works!}
 
  { tIceTest }
 
  TStrTest = class(TComponent)
  private
    FaText: sstring;
    procedure setaText(s: sstring); // without this it works!
  public
    constructor Create(AOwner: TComponent); override;
  published
    property aText:sstring read FaText write setaText;
  end;
 
implementation
 
{ tIceTest }
 
procedure TStrTest.setaText(s: sstring);
begin
  FaText := s;
end;
 
constructor TStrTest.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FaText := 'Somewhat';
end;
 
end.
Wenn ich die Property-Methode "setaText" weglasse, tritt kein Fehler auf. Allerdings benötigt ich häufiger Property-Methoden für den Typ Shortstring. Bisher behelfe ich mich damit, einfach "string" statt "shortstring" zu verwenden. Es würde aber meine Portierung etwas beschleunigen, wenn ich das vermeiden könnte, z.B. durch irgendeinen Compiler-Switch. Bin noch ziemlich unerfahren mit Lazarus, weshalb ich mich mit Compiler-Einstellungen nicht auskenne.

Ich verwende Laz Vers. 0.9.26 (beta) FPC-Vers. 2.2.2). Ist das ein Bug oder sollte ShortString grundsätzlich nicht verwendet werden? {mode Delphi} macht übrigens keinen Unterschied.

Danke jedenfalls überhaupt erst schon mal für's Lesen :)

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: ShortString-Property in Komponenten

Beitrag von theo »

Grundsätzlich würde ich das so schreiben:
sstring = type ShortString;

Aber k.A. ob das mit deinem Problem zu tun hat.

Die ganze Unit auf ShortString umstellen kannst du mit {$H-} (Du hast den Schalter auf $H+ }.

Aber warum eigentlich? Haben die langen Strings einen Nachteil für deine Komponente?

wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

Re: ShortString-Property in Komponenten

Beitrag von wolf_z »

Danke! Hilft leider aber beides nicht. Natürlich kann ich strings verwenden. Aber es handelt sich (nur) teilweise um alten Code, der sehr stabil ist und den ich nicht nochmal ausführlich durchtesten möchte, wenn ich da was ändere. Und Typ-Änderungen haben meiner Erfahrung nach häufig unerwünschte Seiteneffekte, weshalb ich alten Code so weit wie möglich erhalten möchte.

Scheint mir aber wohl ein Lazarus-Bug zu sein. sollte ich wohl mal melden, wenn ich wüsste, wie das genau geht, hab ich noch nie gemacht, aber krieg ich schon raus und mach ich auch sobald ich Zeit habe. Es sei denn das Verhalten sollte irgendwie normal sein. Will mich ja nicht blamieren :oops:

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: ShortString-Property in Komponenten

Beitrag von knight »

wolf_z hat geschrieben: Scheint mir aber wohl ein Lazarus-Bug zu sein. sollte ich wohl mal melden, wenn ich wüsste, wie das genau geht, hab ich noch nie gemacht, aber krieg ich schon raus und mach ich auch sobald ich Zeit habe. Es sei denn das Verhalten sollte irgendwie normal sein. Will mich ja nicht blamieren :oops:
http://wiki.lazarus.freepascal.org/How_ ... _report/de" onclick="window.open(this.href);return false;

knight

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: ShortString-Property in Komponenten

Beitrag von theo »

wolf_z hat geschrieben: Es sei denn das Verhalten sollte irgendwie normal sein. Will mich ja nicht blamieren :oops:
Also das würde ich mir nochmal genauer ansehen vor dem Bugreport.
Dass SIGSEGV was mit ShortStrings zu tun hat, liegt nicht wirklich auf der Hand.
Ich tippe, dass da der Hund woanders begraben liegt.

Kannst du mal eine Demo mit Quelltext machen die crasht? Möglichst auf's nötigste reduziert?

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: ShortString-Property in Komponenten

Beitrag von monta »

Ich glaub fast, das ist ein Bug, der aber inzwischen gefixt wurde.

Ich hab es gerade probiert, allerdings mit FPC 2.2.4. und Lazarus 0.9.26.2

Da läuft folgendes wunderbar:

Code: Alles auswählen

sstring = ShortString;  {works in Delphi, fatal error in Lazarus}
  // sstring = string; {Lazarus, works!}
 
  { tIceTest }
  TStrTest = class(TComponent)
  private
    FaText: sstring;
    procedure setaText(s: sstring); // without this it works!
  public
    constructor Create(AOwner: TComponent); override;
  published
    property aText:sstring read FaText write setaText;
  end;
 
var
  Form1: TForm1; 
 
implementation
 
procedure TStrTest.setaText(s: sstring);
begin
  FaText := s;
end;
 
constructor TStrTest.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FaText := 'Somewhat';
end;
 
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var teststring: TStrTest;
begin
  ShowMessage('test');
  teststring := TStrTest.create(self);
  teststring.setaText('Test');
  ShowMessage(teststring.aText);
end;
und so wie ich dich verstanden hab, sollte da der Fehler schon auftreten. Vielleicht probierst du mal FPC 2.2.4.
Johannes

wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

Re: ShortString-Property in Komponenten

Beitrag von wolf_z »

@monta: Danke für die Mühe. Dynamisches Laden der Komponente geht bei mir aber auch. Ich hab ja den Verdacht, dass das irgendwie mit der Formularspeicherung zusammenhängt.

@theo: Gerne. Folgendes ist die Komponenten-Unit. Einfach in irgendeinem Package installieren, dann auf ein leeres Formular ziehen und das Programm starten. Dann kommen übrigens drei Fehlermeldungen hintereinander, unter anderem: ... TYPINFO.....PPROPINFO$ANSISTRING ...

Code: Alles auswählen

unit StrTest;
 
  {$mode objfpc}{$H+} // {$MODE Delphi}
 
 
interface
 
uses
  Classes, SysUtils; 
 
type
 
  sstring = ShortString;  {works in Delphi, fatal error in Lazarus}
  // sstring = type ShortString;
  // sstring = string; {Lazarus, works!}
 
  { TStrTest }
 
  TStrTest = class(TComponent)
  private
    FaText: sstring;
    procedure setaText(s: sstring); // without this, it works!
  public
    constructor Create(AOwner: TComponent); override;
  published
    property aText:sstring read FaText write setaText;
  end;
 
  procedure Register;
 
implementation
 
procedure Register;
begin
  RegisterComponents('hrAppl', [TStrTest]);
end;
 
{ TStrTest }
 
procedure TStrTest.setaText(s: sstring);
begin
  FaText := s;
end;
 
 
constructor TStrTest.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FaText := 'Somewhat';
end;
 
end.
Oder hättest Du gerne die kompletten Sourcen im Anhang? Da muss ich erst die Test-Komponente aus meinem Package herausfummeln. Ich hab deshalb erst mal nur das kompilierte Programm im Anhang eingefügt. Da kommt dann noch eine andere Fehlermeldung: "Error reading StrTest1.aText Access violation", wenn man das Programm direkt, also nicht aus Lazarus heraus startet.

Nachtrag: Irgendwie geht das Uploaden gerade nicht. Bleibt ewig hängen. Also muss es erst mal ohne Anhang gehen.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: ShortString-Property in Komponenten

Beitrag von theo »

Ja, da würde ich mal 'nen Bugreport machen.
ShortString Properties funzen offenbar nicht richtig.
Ich glaube es hat nichts mit dem Alias zu tun (sstring = ShortString;), bei mir geht's auch nicht, wenn ich alle Dekl. durch "ShortString" ersetzte. Mit AnsiString kein Problem.

wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

Re: ShortString-Property in Komponenten

Beitrag von wolf_z »

Danke an alle für die Mühe. Ich werde mich nächstes Wochenende mal an einem Bugreport versuchen.

Ich hab übrigens gerade gesehen, dass es hier einen eigenen Themen-Bereich für Bugreports gibt. Bin ja noch neu hier. Von mir aus hätte ich nichts dagegen, wenn der Thread dorthin verlagert würde.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: ShortString-Property in Komponenten

Beitrag von monta »

@wolf_z ja, ich verschieb es, da es ja wohl ein Bug ist, dahin
Johannes

Antworten