Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Problem bei Benutzung eigener Komponente (https://www.delphipraxis.net/121754-problem-bei-benutzung-eigener-komponente.html)

ol_le 3. Okt 2008 22:07


Problem bei Benutzung eigener Komponente
 
hi,

ich hab mir heute eine Komponente geschrieben (erbt von TComponent).
die hab ich auch compiliert und installiert und sie erscheint in der Komponentenleiste.

Mein Problem ist, wenn ich sie auf ne Form ziehen will, kommt folgender Fehler:

"Access violation at adresse 51001A78 in module 'dclusr70.bpl' Read of adress 00000000."

Das heißt ja, das er es nicht finden, kann, aber wie kann es dazu kommen, installiert ist es ja, liegt auch im richtigen Ordner.

Habt ihr ne idee? Vielen Dank im Vorraus

Ist schon nen gutes Jahr her seit dem ich das letzte Mal Komponenten geschrieben habe, hatte bisher keine Probleme

Warscheinlich irgend ne gleichigkeit, die ich übesehen habe?

gruss Olav

mkinzler 3. Okt 2008 22:13

Re: Problem bei Benutzung eigener Komponente
 
Benutzt du eine Subklasse, welche du nicht instantiierst?

Meflin 3. Okt 2008 22:29

Re: Problem bei Benutzung eigener Komponente
 
Zitat:

Zitat von ol_le
hiDas heißt ja, das er es nicht finden, kann, aber wie kann es dazu kommen, installiert ist es ja, liegt auch im richtigen Ordner.

Nö. Das heißt, das irgendwas im Package (in dem Fall deine Komponente) auf etwas zugreift, was noch nicht initialisiert wurde (Klassen, Arrays, etc).

ol_le 4. Okt 2008 19:20

Re: Problem bei Benutzung eigener Komponente
 
So, hatte eben ein bisschen Zeit und hab noch mal den Code druchgeguckt.

innerhalb der Komponente brauche ich einen Timer, wenn ich diesen inclusive dekleration herausnehme, funktoniert es ohne Fehlermeldung, wenn ich ihn wieder reinnehme klappt es nicth mehr.
Vor längere Zeit hab ich mal ne andre Komponente (ne Graphische Binäre Uhr von TGraghicControl)
gemacht und dort auch einen Timer benutzt, da hat es funktioniert, ich habs mal verglichen, aber keinen elementaren unterschied gefunden.

Anbei der Code meiner Komponente, könnt ihr da nen Fehler finden?

vielen DAnk im Vorraus

gruss Olav

Delphi-Quellcode:
unit DriveControl;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Math,StdCtrls, ExtCtrls;

type
  TDriveControl = class(TGraphicControl)
  private
    { Private declarations }
    FForm : TForm;             //Plattformground
    FGeschwindigkeit : integer; //Geschwindigkeitswert
    FLenkung : integer;        //Lenkwert
    FMaxGE: integer;           //Maximale Geschwindigkeit
    FMaxLE: integer;           //Maximaler Lenkeinschlag
    Timer1: TTimer;
    l,k,p,o: integer;

    procedure SetForm(Form: TForm);
    procedure SetGE(Wert: Integer);
    procedure SetLE(Wert: Integer);
    procedure SetMGE(Wert: Integer);
    procedure SetMLE(Wert: Integer);
    function GetForm: TForm;
    function GetGE: Integer;
    function GetLE: Integer;
    function GetMGE: Integer;
    function GetMLE: Integer;


   
    procedure Timer1Timer(Sender: TObject);
  protected
    { Protected declarations }
  public
    { Public declarations } 
    constructor create(AOwner: TComponent); Override; {
    procedure KeyDown(Key: Word);
    procedure KeyUp(Key: Word);    }
  published
    { Published declarations }
    property Form : TForm Read GetForm Write SetForm;
    property Geschwindigkeit : Integer Read GetGE Write SetGE;
    property Lenkung : Integer Read GetLE Write SetLE;
    property MaxGE : Integer Read GetMGE Write SetMGE;
    property MaxLE : Integer Read GetMLE Write SetMLE;
  end;

procedure Register;

implementation

procedure TDriveControl.Timer1Timer(Sender: TObject);
begin
  k := 0;
  if (FGeschwindigkeit < FMaxGE) then
    begin
      inc(FGeschwindigkeit);
    end;
end;

constructor TDriveControl.create(AOwner: TComponent);
begin
  inherited;
  Timer1.Create(self);
  Timer1.Interval := 500;
  Timer1.Enabled := False;

  l := 0;
  k := 0;
  p := 0;
  o := 0;
end;
 {
procedure TDriveControl.KeyDown(Key : Word);
begin
  If (Key = VK_UP) then
    begin
      Timer2.Enabled := False;
      Timer3.Enabled := False;
        if (l = 0) then
          begin
            Timer1.Enabled := True;
          end;
    end;
end;

procedure TDriveControl.KeyUp(Key : Word);
begin
  If (Key = VK_UP) then
    begin
      Timer1.Enabled := False;
      if (l = 1) then l := 0 else l := 1;
      Timer2.Enabled := True;
      Timer3.Enabled := True;
    end;
end;
}
procedure TDriveControl.SetForm(Form: TForm);
begin
  FForm := Form;
end;

procedure TDriveControl.SetGE(Wert: Integer);
begin
  FGeschwindigkeit := Wert;
end;

procedure TDriveControl.SetLE(Wert: Integer);
begin
  FLenkung := Wert;
end;

procedure TDriveControl.SetMGE(Wert: Integer);
begin
  FMaxGE := Wert;
end;

procedure TDriveControl.SetMLE(Wert: Integer);
begin
  FMaxLE := Wert;
end;

function TDriveControl.GetForm: TForm;  
begin
  result := FForm;
end;

function TDriveControl.GetGE: Integer;
begin
  result := FGeschwindigkeit;
end;

function TDriveControl.GetLE: Integer;
begin
  result := FLenkung;
end;

function TDriveControl.GetMGE: Integer;
begin
  result := FMaxGE;
end;

function TDriveControl.GetMLE: Integer;
begin
  result := FMaxLE
end;

procedure Register;
begin
  RegisterComponents('Standard', [TDriveControl]);
end;

end.

Hawkeye219 4. Okt 2008 20:02

Re: Problem bei Benutzung eigener Komponente
 
Herzlich willkommen in der Delphi-PRAXiS, Olav!

Die Ursache für die Fehlermeldung liegt im Konstruktor deiner Komponente. Die Instanziierung des Timers muss so aussehen:

Delphi-Quellcode:
//  Timer1.Create(self);
  Timer1 := TTimer.Create(self);
Du weißt, dass du den Event-Handler für den Timer noch nicht zugewiesen hast?

Gruß Hawkeye

ol_le 4. Okt 2008 21:29

Re: Problem bei Benutzung eigener Komponente
 
hi, danke schonmal.

wie weise ich den Event-Handler zu?

gruss Olav

Hawkeye219 4. Okt 2008 21:47

Re: Problem bei Benutzung eigener Komponente
 
Das ist ganz einfach:

Delphi-Quellcode:
Timer1.OnTimer := Timer1Timer;
Gruß Hawkeye

DP-Maintenance 4. Okt 2008 22:05

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz