TComport SIGSEGV bei Esintellungsdialog

Rund um die LCL und andere Komponenten
PhilmacFLy
Beiträge: 18
Registriert: Do 13. Dez 2012, 13:49

TComport SIGSEGV bei Esintellungsdialog

Beitrag von PhilmacFLy »

Moin

Ich hab folgendes Problem:
Ich wollte ein Programm von Delphi 2007 nach lazarus portieren, und verwende in dem Programm TComport.
Soweit so gut. Jetzt hab ich mir TComport für lazarus installiert (http://sourceforge.net/projects/cportlaz/).
Es kompiliert auch ohne Probleme, nur sobald ich auf den Einstellungsbuttone klick bekomm ich eine SIGSEGV
hier:

Code: Alles auswählen

procedure TComComboBox.SetComPort(const Value: TCustomComPort);
begin
  if FComSelect.ComPort <> Value then //<--- HIER
  begin
    FComSelect.ComPort := Value;
    if FComSelect.ComPort <> nil then
    begin
      FComSelect.ComPort.FreeNotification(Self);
      // transfer settings from ComPort to this control
      UpdateSettings;
    end;
  end;
end;
Code von dem button:

Code: Alles auswählen

comport1.ShowSetupDialog;      //Setup anzeigen und verbinden enable
btt_connect.Enabled := true;
memo1.Enabled := true;  
Könnte mir da jemand helfen?

wp_xyz
Beiträge: 5176
Registriert: Fr 8. Apr 2011, 09:01

Re: TComport SIGSEGV bei Esintellungsdialog

Beitrag von wp_xyz »

Sieht so aus als wäre in der mit "HIER" markierten Zeile FComSelect noch nil. Wo wird denn das erzeugt? Wird diese Stelle in dem Komponentencode aufgerufen?

PhilmacFLy
Beiträge: 18
Registriert: Do 13. Dez 2012, 13:49

Re: TComport SIGSEGV bei Esintellungsdialog

Beitrag von PhilmacFLy »

Ja das hab ich getestet:

Code: Alles auswählen

constructor TComComboBox.Create(AOwner: TComponent);
begin
  FComSelect := TComSelect.Create;
  inherited Create(AOwner);
  FComSelect.Items := Items;
  Style := csDropDownList;
end;
Hab nen Breakpoint drauf gesetzt und der wird auch durchlaufen.

wp_xyz
Beiträge: 5176
Registriert: Fr 8. Apr 2011, 09:01

Re: TComport SIGSEGV bei Esintellungsdialog

Beitrag von wp_xyz »

Und wenn du den Breakpoint in TComComboBox.SetComPort auf der 1. Zeile setzst, was ist dann FComSelect, und was ist Value? Ist FComSelect nil? Oder hat Value unsinnige Werte?

PhilmacFLy
Beiträge: 18
Registriert: Do 13. Dez 2012, 13:49

Re: TComport SIGSEGV bei Esintellungsdialog

Beitrag von PhilmacFLy »

Hab jetzt mal ein paar überwachte Ausdrücke erstellt:
FComSelect.ComPort: <Error: Type TCOMSELECT has no component named ComPort.>

Value: <TCUSTOMCOMPORT> = {<TCOMPONENT> = {<TPERSISTENT> = {<TOBJECT> = {_vptr$ = {0x623a80, 0x24dec0}}, }, FOWNER = $24dec0, FNAME = $22df60 'ComPort1', FTAG = 0, FCOMPONENTS = $0, FFREENOTIFIES = $0, FDESIGNINFO = 524960, FVCLCOMOBJECT = $0, FCOMPONENTSTATE...

FComSelect: <TCOMSELECT> = Cannot access memory at address 0x618

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TComport SIGSEGV bei Esintellungsdialog

Beitrag von mse »

wp_xyz hat geschrieben:Sieht so aus als wäre in der mit "HIER" markierten Zeile FComSelect noch nil. Wo wird denn das erzeugt? Wird diese Stelle in dem Komponentencode aufgerufen?
Vielleicht ist auch self (TComComboBox) nil. Die Adresse 0x618 scheint eher darauf hinzudeuten.

Martin
Zuletzt geändert von mse am Fr 14. Dez 2012, 09:21, insgesamt 1-mal geändert.

PhilmacFLy
Beiträge: 18
Registriert: Do 13. Dez 2012, 13:49

Re: TComport SIGSEGV bei Esintellungsdialog

Beitrag von PhilmacFLy »

Ich kann ja mal den Aufrufs verlauf posten:

Code: Alles auswählen

comport1.ShowSetupDialog; 
nach

Code: Alles auswählen

  EditComPort(Self); 
nach

Code: Alles auswählen

procedure EditComPort(ComPort: TCustomComPort);
begin
  with TComSetupFrm.Create(nil) do
  begin
    Combo1.ComPort := ComPort; //Hier ist der Sprung
    Combo2.ComPort := ComPort;
    Combo3.ComPort := ComPort;
    Combo4.ComPort := ComPort;
    Combo5.ComPort := ComPort;
    Combo6.ComPort := ComPort;
    Combo1.UpdateSettings;
    Combo2.UpdateSettings;
    Combo3.UpdateSettings;
    Combo4.UpdateSettings;
    Combo5.UpdateSettings;
    Combo6.UpdateSettings;
    if ShowModal = mrOK then
    begin
      ComPort.BeginUpdate;
      Combo1.ApplySettings;
      Combo2.ApplySettings;
      Combo3.ApplySettings;
      Combo4.ApplySettings;
      Combo5.ApplySettings;
      Combo6.ApplySettings;
      ComPort.EndUpdate;
    end;
    Free;
  end;
end; 
nach

Code: Alles auswählen

procedure TComComboBox.SetComPort(const Value: TCustomComPort);
begin
  if FComSelect.ComPort <> Value then
  begin
    FComSelect.ComPort := Value;
    if FComSelect.ComPort <> nil then
    begin
      FComSelect.ComPort.FreeNotification(Self);
      // transfer settings from ComPort to this control
      UpdateSettings;
    end;
  end;
end;

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TComport SIGSEGV bei Esintellungsdialog

Beitrag von mse »

Teste mal die Instanz von combo1.

Code: Alles auswählen

 
var
 testvar: tcomcombobox;
 
procedure EditComPort(ComPort: TCustomComPort);
begin
  with TComSetupFrm.Create(nil) do
  begin
   testvar:= combo1; 
 
    Combo1.ComPort := ComPort; //<<<----breakpoint hier, was zeigt testvar?
 

PhilmacFLy
Beiträge: 18
Registriert: Do 13. Dez 2012, 13:49

Re: TComport SIGSEGV bei Esintellungsdialog

Beitrag von PhilmacFLy »

Das scheint das Problem zu sein:
<TCOMCOMBOBOX> = nil

Edit:
Ich verstehs nur nicht weil:

Code: Alles auswählen

  TComSetupFrm = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ComComboBox1: TComComboBox;
    ComComboBox2: TComComboBox;
    ComComboBox3: TComComboBox;
    ComComboBox4: TComComboBox;
    ComComboBox5: TComComboBox;
    ComComboBox6: TComComboBox;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Combo2: TComComboBox;
    Combo3: TComComboBox;
    Combo4: TComComboBox;
    Combo5: TComComboBox;
    Combo6: TComComboBox;
    Combo1: TComComboBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end; 

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TComport SIGSEGV bei Esintellungsdialog

Beitrag von mse »

PhilmacFLy hat geschrieben:Das scheint das Problem zu sein:
<TCOMCOMBOBOX> = nil

Edit:
Ich verstehs nur nicht weil:

Code: Alles auswählen

  TComSetupFrm = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ComComboBox1: TComComboBox;
 
Da scheint was mit dem Laden aus der resource nicht zu klappen. Wie du weisst, kenne ich mich mit Lazarus nicht gut aus. Wird die resource für TComSetupFrm eingelinkt? Wird sie von Lazarus bei TForm.Create verwendet oder muss application.createform aufgerufen werden? Hast du eventuell inherited in TComSetupFrm.create vergessen?

Edit:
Oder hast du Combo1 selbst eingetragen und in der resource steht ComComboBox1?

PhilmacFLy
Beiträge: 18
Registriert: Do 13. Dez 2012, 13:49

Re: TComport SIGSEGV bei Esintellungsdialog

Beitrag von PhilmacFLy »

Jo ic kenn das Problem ich kenn mich mit Lazarus auch nicht so gut aus, ich hatte halt gehoft, Komponente installieren und läuft -.-

Code: Alles auswählen

procedure TComSetupFrm.FormCreate(Sender: TObject);
begin
  {TP_Ignore(self,'Combo1');
  TP_Ignore(self,'Combo2');
  TP_Ignore(self,'Combo3');
  TP_Ignore(self,'Combo4');
  TP_Ignore(self,'Combo5');
  TP_Ignore(self,'Combo6');
  TranslateProperties (self,'cport');  }
end;
Wenn ich aber inherited create; eingfüge dann:
C:\lazarus\components\Cportlaz_v1.0.0\CPortSetup.pas(104,21) Error: Wrong number of parameters specified for call to "Create"

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TComport SIGSEGV bei Esintellungsdialog

Beitrag von mse »

Sorry, TComSetupFrm hat ja gar keinen eigenen Create() constructor.

PhilmacFLy
Beiträge: 18
Registriert: Do 13. Dez 2012, 13:49

Re: TComport SIGSEGV bei Esintellungsdialog

Beitrag von PhilmacFLy »

mse hat geschrieben:Wird die resource für TComSetupFrm eingelinkt? Wird sie von Lazarus bei TForm.Create verwendet oder muss application.createform aufgerufen werden? Hast du eventuell inherited in TComSetupFrm.create vergessen?
Wie schau ich denn nach was Lazarus damit macht?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TComport SIGSEGV bei Esintellungsdialog

Beitrag von mse »

Hast du geprüft, ob Combo1 nicht etwa ComComboBox1 sein sollte?
Zuletzt geändert von mse am Fr 14. Dez 2012, 13:12, insgesamt 1-mal geändert.

PhilmacFLy
Beiträge: 18
Registriert: Do 13. Dez 2012, 13:49

Re: TComport SIGSEGV bei Esintellungsdialog

Beitrag von PhilmacFLy »

Das wars vielen Dank jetzt scheints zu gehen.

Antworten