![]() |
Problem bei Komponenten-Erstellung
Liste der Anhänge anzeigen (Anzahl: 2)
Ich probier gerade ein bisschen mit Komponentenerstellung herum. Dazu will ich mir ein Label machen, das in einem einstellbaren Interval blinkt. Dazu benutze ich einen Timer als Feld in der Komponente. Beim Start einer Anwendung mit dieser Komponente bekomme ich die angehängte Fehlermeldung.
Die Unit, in der die Komponente definiert ist, hab ich ebenfalls angehängt. |
Hallo,
mit folgender Testumgebung habe ich Deinen Source getested: Delphi 5 SP1 Win2k SP3 Das ist die Formular -unit, die ich dafür verwendet habe
Delphi-Quellcode:
Ich konnte keinen Fehler feststellen. D.h. Dein Code läuft bei mir einwandfrei.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, BlinkLabel; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } FBLabel : TBlinkLabel; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin FBLabel:=TBlinklabel.Create(Self); FBLabel.Parent:=Self; FBLabel.SetBounds(20,20,FBLabel.Width,FBLabel.Height); FBLabel.Caption:='BlinkLabel'; FBLabel.Blinking:=True; end; end. |
Hm, wenn ich das Label dynamisch erzeuge, so wie du es getan hast, bekomm ich keinen Fehler, aber ich seh es auch nicht :shock:
Wenn ich das Label via IDE auf die Form zieh, bekomm ich den Fehler. |
Wie und wo erzeugst du den TTimer? Achtest du darauf, ob du in der Entwicklungsumgebung bist, oder ob das Programm läuft (dafür gibt's irgendeine Konstante)?
|
Hallo,
entschuldige bitte, ich habe Deinen Code nicht sorgfältig genug gelesen. Dein constructor ist nicht ganz richtig. Du schreibst:
Delphi-Quellcode:
Bei Deinem Code wird das Formular der Besitzer des Timers !!!
constructor TBlinkLabel.Create(AOwner: TComponent);
begin inherited; fTimer := TTimer.Create(AOwner); fTimer.OnTimer := TimerEvent; end; Damit gibt das Formular auch den Timer wieder frei. Der Besitzer sollte aber Deine Komponente sein. Es muss aber so lauten:
Delphi-Quellcode:
Jetzt fehlt Dir noch der passende destructor.
constructor TBlinkLabel.Create(AOwner: TComponent);
begin inherited; fTimer := TTimer.Create(Self); // Durch Self wird Deine Komponente zum Besitzer fTimer.OnTimer := TimerEvent; end; Du musst ja den Timer wieder freigeben.
Delphi-Quellcode:
destructor TBlinkLabel.Destroy;
begin fTimer.Free; inherited; end; |
OK, das Label als Owner zu benutzen ist keine schlechte Idee. Ändert aber leider nix an der Fehlermeldung :(
Was ich aber nicht versteh: Ich dachte, durch das Setzen des Owners wird die Komponente doch freigegeben, wenn der Owner freigegeben wird. Wieso soll ich dann den Timer doch manuell freigeben? Edit: Ach Quatsch, funktioniert doch mit dem Label als Owner. Könntest du mir vielleicht noch erklären, warum das Label der Owner sein muss? ich dachte, der Owner betrifft nur die Speicherfeigabe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:14 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