Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem bei Komponenten-Erstellung (https://www.delphipraxis.net/5288-problem-bei-komponenten-erstellung.html)

Chewie 31. Mai 2003 12:41


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.

Jens Schumann 31. Mai 2003 15:19

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:
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.
Ich konnte keinen Fehler feststellen. D.h. Dein Code läuft bei mir einwandfrei.

Chewie 31. Mai 2003 16:55

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.

tommie-lie 31. Mai 2003 18:09

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)?

Jens Schumann 31. Mai 2003 18:47

Hallo,
entschuldige bitte, ich habe Deinen Code nicht sorgfältig genug gelesen.
Dein constructor ist nicht ganz richtig.
Du schreibst:
Delphi-Quellcode:
constructor TBlinkLabel.Create(AOwner: TComponent);
begin
  inherited;
  fTimer := TTimer.Create(AOwner);
  fTimer.OnTimer := TimerEvent;
end;
Bei Deinem Code wird das Formular der Besitzer des Timers !!!
Damit gibt das Formular auch den Timer wieder frei.
Der Besitzer sollte aber Deine Komponente sein.
Es muss aber so lauten:
Delphi-Quellcode:
constructor TBlinkLabel.Create(AOwner: TComponent);
begin
  inherited;
  fTimer := TTimer.Create(Self); // Durch Self wird Deine Komponente zum Besitzer
  fTimer.OnTimer := TimerEvent;
end;
Jetzt fehlt Dir noch der passende destructor.
Du musst ja den Timer wieder freigeben.
Delphi-Quellcode:
destructor TBlinkLabel.Destroy;
begin
  fTimer.Free;
  inherited;
end;

Chewie 31. Mai 2003 20:35

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:46 Uhr.

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