AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem bei Komponenten-Erstellung

Ein Thema von Chewie · begonnen am 31. Mai 2003 · letzter Beitrag vom 31. Mai 2003
Antwort Antwort
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#1

Problem bei Komponenten-Erstellung

  Alt 31. Mai 2003, 12:41
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.
Miniaturansicht angehängter Grafiken
dp_189.jpg  
Angehängte Dateien
Dateityp: pas blinklabel.pas (1,4 KB, 8x aufgerufen)
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#2
  Alt 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.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#3
  Alt 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
Wenn ich das Label via IDE auf die Form zieh, bekomm ich den Fehler.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#4
  Alt 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)?
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#5
  Alt 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;
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#6
  Alt 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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 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