Access violation

Rund um die LCL und andere Komponenten
Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Access violation

Beitrag von Maik81ftl »

Moin Moin,

Bin gerade dabei mir eine Combi aus TTimer und TImage zu basteln, beim Testen des Objektes TRunImage erhalte ich einen Fehler der geliebten Access Vioation

die Section schaut wie folgt aus.

Code: Alles auswählen

unit RunImage;
 
{$mode objfpc}
 
interface
 
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls;
 
type
  TRunImage = class(TTimer)
  private
    { Private declarations }
    Pic: TImage;
    FLines: TStrings;
  protected
    { Protected declarations }
    procedure SetLines(const Value: TStrings);
  public
    { Public declarations }
  published
    { Published declarations }
    constructor Create(AOwner: TComponent);
    property Enabled;
    property Interval;
    property OnTimer;
    property OnStartTimer;
    property OnStopTimer;
    property Lines: TStrings read FLines write SetLines;
  end;
 
procedure Register;
 
implementation
 
constructor TRunImage.Create(AOwner: TComponent);
begin
  inherited;
  Pic.Width     := 65;
  Pic.Height    := 65;
  fLines        := TStrings.Create;
  fLines.Add('Lines');
  Interval      := 100;
  Enabled       := False;
end;
 
procedure TRunImage.SetLines(const Value: TStrings);
var Count: Integer;
begin
  if (Value <> nil) then
    for Count:= 0 to Value.Count do
      fLines.Add(Value[Count-1]);
end;
 
procedure Register;
begin
  RegisterComponents('Additional',[TRunImage]);
end;
 
end.


Ursprünglich sah die SetLines() wie folgt aus

Code: Alles auswählen

procedure TRunImage.SetLines(const Value: TStrings);
begin
  if (Value <> nil) then
    FLines.Assign(Value);
end;


Grund der neuen Combonente ist eine art laufschrift in einem TImage; innerhalb einer Form läuft es Perfekt, nun wollte ich dies in ein Seperates Package erstellen.

FIndet Ihr das für zuviel aufwand oder was wäre eure Meinung dazu?
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Access violation

Beitrag von Socke »

Maik81ftl hat geschrieben:Bin gerade dabei mir eine Combi aus TTimer und TImage zu basteln, beim Testen des Objektes TRunImage erhalte ich einen Fehler der geliebten Access Vioation

Wo genau?
Maik81ftl hat geschrieben: fLines := TStrings.Create;

Ich bin mir sicher, der Compiler wird dir zu dieser Zeile mindestens eine Warnmeldung ausgeben. Hast du die schon gelesen?

BTW: ich finde es etwas umständliche ein Steuerelement (d.h. grafisch) von einer reinen Komponente (d.h. nicht grafisch) abzuleiten. Mein Ansatz wäre TCustomControl oder ähnliches (in diesem Fall evtl. sogar TImage) -- das Laden und Zeichnen von Bildern ist auch nicht so aufwändig, als das man TImage dafür bräuchte.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Keifor
Beiträge: 31
Registriert: Sa 28. Aug 2010, 15:15
OS, Lazarus, FPC: pc-linux-gnu - Funtoo stable, L trunk, FPC trunk
CPU-Target: i686/x86_64

Re: Access violation

Beitrag von Keifor »

Hmm... ich rate mal.. :mrgreen:

Versuch mal statt TString.Create zum erzeugen eines TStrings Objekts das folgende zu nutzen.

Code: Alles auswählen

fLines := TStringList.Create;


Ein wenig Info dazu steht in http://www.freepascal.org/docs-html/rtl ... rings.html
Laut der Dokumentation dort Implementiert TStrings nicht die gesamte Funktionalität und ebenso keinen Speicher für die eigentlichen Infos. Das macht TStringList.

Eine weitere Möglichkeit für SetLines wäre evt. "fLines.AddStrings(Value)".. sollte das selbe machen wie deine aktuelle SetLines.
Könntest noch ein Clear vor packen. :mrgreen:

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Access violation

Beitrag von Maik81ftl »

Maik81ftl hat geschrieben:Bin gerade dabei mir eine Combi aus TTimer und TImage zu basteln, beim Testen des Objektes TRunImage erhalte ich einen Fehler der geliebten Access Vioation

Wo genau?
Maik81ftl hat geschrieben: fLines := TStrings.Create;

Ich bin mir sicher, der Compiler wird dir zu dieser Zeile mindestens eine Warnmeldung ausgeben. Hast du die schon gelesen?[/quote] Da erzählz dir deiner aber mehr als meiner. wenn ich 'nen Aufruf via Opj-inspektor Den Text ändere erhalte ich nur des Fehlerfenster. Bildanhang 1

Socke hat geschrieben:BTW: ich finde es etwas umständliche ein Steuerelement (d.h. grafisch) von einer reinen Komponente (d.h. nicht grafisch) abzuleiten. Mein Ansatz wäre TCustomControl oder ähnliches (in diesem Fall evtl. sogar TImage) -- das Laden und Zeichnen von Bildern ist auch nicht so aufwändig, als das man TImage dafür bräuchte.
Na ableitung von TImage habe ich a schon versucht, war ja auch mein erster gedanke. nur wenn ich denne des z.B. die Zeile

Code: Alles auswählen

property Interval;
einfüge erhalt ich meldungen wie

Code: Alles auswählen

/home/maik81ftl/Programming/My_Package/elektro/runimage.pas(19,20) Error: No property found to override

Glaube das ich da g'rage an den Fehler auf dem leim gehe, das ich eine 2te Combonente in die eine reinlegen will. soll zwar gehen, aber wird auf jeden fall arg schwer.

@Keifor ob TString oder TStringlist macht keinen unterschied, auf den Gedanken bin ich auch schon gekommen.
Dateianhänge
Bildschirmfoto.png
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Access violation

Beitrag von Maik81ftl »

Könnte als einziges eine Große Ableitung von TControl schreiben.

Hätte sogar den Vorteil, das alles Überflüssiges gleich drausen wäre.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Access violation

Beitrag von Socke »

Dein Fehler:

Code: Alles auswählen

procedure TRunImage.SetLines(const Value: TStrings);
var Count: Integer;
begin
  if (Value <> nil) then
    for Count:= 0 to Value.Count do
      fLines.Add(Value[Count-1]);
end;

Du versuchst schon im ersten Schleifendurchlauf auf den Index -1 zuzugreifen. Das wird nie funktionieren.

Maik81ftl hat geschrieben:Na ableitung von TImage habe ich a schon versucht, war ja auch mein erster gedanke. nur wenn ich denne des z.B. die Zeile

Code: Alles auswählen

property Interval;
einfüge erhalt ich meldungen wie

Code: Alles auswählen

/home/maik81ftl/Programming/My_Package/elektro/runimage.pas(19,20) Error: No property found to override

Glaube das ich da g'rage an den Fehler auf dem leim gehe, das ich eine 2te Combonente in die eine reinlegen will. soll zwar gehen, aber wird auf jeden fall arg schwer.

Der Fehler sagt doch schon alles: TImage.Intveral gibt es nicht, also musst du die Methoden, die die Werte direkt an deinen Timer übergeben, selbst dazu schreiben.

Maik81ftl hat geschrieben:Da erzählz dir deiner aber mehr als meiner. wenn ich 'nen Aufruf via Opj-inspektor Den Text ändere erhalte ich nur des Fehlerfenster. Bildanhang 1

Ehrlich gesagt kann ich mir nicht vorstellen, dass dein FPC nicht anmeckert, dass einige Methoden abstrakt sind, wenn du TStrings direkt instantiierst.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Access violation

Beitrag von pluto »

@Keifor ob TString oder TStringlist macht keinen unterschied, auf den Gedanken bin ich auch schon gekommen.

Das ist aber trotzdem Falsch.TString ist nur eine Art Abstracte Klasse. Die sollten man selbst nie mals direkt Installisieren. Du musst schon genau sagen, was du haben möchtest. Eigentlich müsste es sogar Fehlermeldungen deshalb geben. Aber vielleicht kommt der andere Fehler früher *G*.
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Access violation

Beitrag von Socke »

pluto hat geschrieben:
@Keifor ob TString oder TStringlist macht keinen unterschied, auf den Gedanken bin ich auch schon gekommen.

Das ist aber trotzdem Falsch.TString ist nur eine Art Abstracte Klasse. Die sollten man selbst nie mals direkt Installisieren. Du musst schon genau sagen, was du haben möchtest. Eigentlich müsste es sogar Fehlermeldungen deshalb geben. Aber vielleicht kommt der andere Fehler früher *G*.

Es sind nur Warnungen :D, aber davon gleich 5 Stück. Eine AccessViolation kann grundsätzlich erst zur Laufzeit auftreten, die Compilermeldungen werden grundsätzlich vor einer eventuellen Laufzeit ausgegeben.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Access violation

Beitrag von Maik81ftl »

pluto hat geschrieben:
@Keifor ob TString oder TStringlist macht keinen unterschied, auf den Gedanken bin ich auch schon gekommen.

Das ist aber trotzdem Falsch.TString ist nur eine Art Abstracte Klasse. Die sollten man selbst nie mals direkt Installisieren. Du musst schon genau sagen, was du haben möchtest. Eigentlich müsste es sogar Fehlermeldungen deshalb geben. Aber vielleicht kommt der andere Fehler früher *G*.


Meinst du solche Warnungen?

Code: Alles auswählen

/home/maik81ftl/Programming/My_Package/My_Components/runimage.pas(21,17) Warning: An inherited method is hidden by "constructor TRunImage.Create;"
/home/maik81ftl/Programming/My_Package/My_Components/runimage.pas(43,35) Warning: Constructing a class "TStrings" with abstract method "Get"
/home/maik81ftl/Programming/My_Package/My_Components/runimage.pas(43,35) Warning: Constructing a class "TStrings" with abstract method "GetCount"
/home/maik81ftl/Programming/My_Package/My_Components/runimage.pas(43,35) Warning: Constructing a class "TStrings" with abstract method "Clear"
/home/maik81ftl/Programming/My_Package/My_Components/runimage.pas(43,35) Warning: Constructing a class "TStrings" with abstract method "Delete"
/home/maik81ftl/Programming/My_Package/My_Components/runimage.pas(43,35) Warning: Constructing a class "TStrings" with abstract method "Insert"


Socke hat geschrieben:
pluto hat geschrieben:
@Keifor ob TString oder TStringlist macht keinen unterschied, auf den Gedanken bin ich auch schon gekommen.

Das ist aber trotzdem Falsch.TString ist nur eine Art Abstracte Klasse. Die sollten man selbst nie mals direkt Installisieren. Du musst schon genau sagen, was du haben möchtest. Eigentlich müsste es sogar Fehlermeldungen deshalb geben. Aber vielleicht kommt der andere Fehler früher *G*.

Es sind nur Warnungen :D, aber davon gleich 5 Stück. Eine AccessViolation kann grundsätzlich erst zur Laufzeit auftreten, die Compilermeldungen werden grundsätzlich vor einer eventuellen Laufzeit ausgegeben.
wenn du die constructorwarnung mitrechnest komm ich auf 6 :D aber ich glaube zu Ahnen, auf was Ihr hinaus wollt.

a) eine Neue klasse con TCustomImage ableiten,
b) den Timer seberat reinschreiben und
c) ein virtuelles Textfeld einbinden.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Access violation

Beitrag von pluto »

Ja genau sowas meine ich. Das muss eigentlich zu einem Laufzeit Fehler führen. TStrings <> TStringList
MFG
Michael Springwald

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Access violation

Beitrag von Maik81ftl »

naja! vom Text erst mal abgesehen, was ich im Nachhinein machen, habe ich auch meldungen, auf welche ich mir total kein reim machen kann.

Code: Alles auswählen

/home/maik81ftl/Programming/My_Package/My_Components/runimage.pas(32,15) Warning: An inherited method is hidden by "TRunImage.SetEnabled(Boolean);"
/home/maik81ftl/Programming/My_Package/My_Components/runimage.pas(41,17) Warning: An inherited method is hidden by "constructor TRunImage.Create(TComponent);"
/home/maik81ftl/Programming/My_Package/My_Components/runimage.pas(42,16) Warning: An inherited method is hidden by "destructor TRunImage.Destroy;"
/home/maik81ftl/Programming/My_Package/My_Components/runimage.pas(28,5) Note: Private field "TRunImage.fText" is never used
»Kompiliere Package Maik81ftl 0.2.4.5« beendet
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Access violation

Beitrag von pluto »

Für mich sieht es danach aus, als ob du eine Falsche Klasse nutzt.
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Access violation

Beitrag von Socke »

Maik81ftl hat geschrieben:naja! vom Text erst mal abgesehen, was ich im Nachhinein machen, habe ich auch meldungen, auf welche ich mir total kein reim machen kann.

Code: Alles auswählen

/home/maik81ftl/Programming/My_Package/My_Components/runimage.pas(32,15) Warning: An inherited method is hidden by "TRunImage.SetEnabled(Boolean);"
/home/maik81ftl/Programming/My_Package/My_Components/runimage.pas(41,17) Warning: An inherited method is hidden by "constructor TRunImage.Create(TComponent);"
/home/maik81ftl/Programming/My_Package/My_Components/runimage.pas(42,16) Warning: An inherited method is hidden by "destructor TRunImage.Destroy;"
/home/maik81ftl/Programming/My_Package/My_Components/runimage.pas(28,5) Note: Private field "TRunImage.fText" is never used
»Kompiliere Package Maik81ftl 0.2.4.5« beendet

Die letzten beiden Meldungen sollten klar sein (Kompilieren beendet und TRunImage.fText nie genutzt). Alle anderen weisen darauf hin, dass es in vorgängerklassen gleichnamige Methoden gibt, die nicht richtig im Sinne der Objektorientierung überschrieben werden. Dazu empfehle ich dir ein allgemeines ObjectPascal- oder Delphi-Tutorial zu, damit du überhaupt weißt, was du da machst.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: Access violation

Beitrag von theo »

Sagt dir "override" etwas?

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Access violation

Beitrag von Maik81ftl »

theo hat geschrieben:Sagt dir "override" etwas?


Hmmm orginal lautet die Zeile ja

Code: Alles auswählen

procedure SetEnabled(Value: Boolean); virtual;
, aber

Code: Alles auswählen

procedure SetEnabled(Value: Boolean); {virtual;} override;
macht wohl dadurch sin, da ich dies ja überschreibe wenn ich das recht seh
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Antworten