Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi EInvalidPointer bei Zerstörung einer Klasse (https://www.delphipraxis.net/46953-einvalidpointer-bei-zerstoerung-einer-klasse.html)

Phantom1 4. Jun 2005 09:52

Re: EInvalidPointer bei Zerstörung einer Klasse
 
Den Fehler konnte ich jetzt auch nicht direkt finden, daher hab ich einfachmal den Code teilweise geändert/vereinfacht. Damit gehts.

Delphi-Quellcode:
unit Flughafen;

interface

uses
  StdCtrls, ExtCtrls, Classes;

type
  TFlughafen = class
  private
    vLabel1: TLabel;
    vSearch: TTimer;
    vEnabled: Boolean;
    vInterval: Integer;
    vText: String;
    procedure SetEnabled(Status: Boolean);
    procedure SetInterval(Value: Integer);
    procedure SetText(Value: String);
    function GetStart(Character: Char): Char;
    procedure SearchTimer(Sender: TObject);
  public
    constructor Create(aLabel: TLabel);
    destructor Destroy; override;
    property Output: TLabel read vLabel1 write vLabel1;
    property Enabled: Boolean read vEnabled write SetEnabled;
    property Interval: Integer read vInterval write SetInterval;
    property Text: String read vText write SetText;
  end;

implementation

constructor TFlughafen.Create(aLabel: TLabel);
begin
  vSearch := TTimer.Create(nil);
  vSearch.OnTimer := SearchTimer;
  vSearch.Enabled := False;
  vSearch.Interval := 21;
  vLabel1:=aLabel;
end;

destructor TFlughafen.Destroy;
begin
  vSearch.Free;
end;

procedure TFlughafen.SetEnabled(Status: Boolean);
begin
  vEnabled := (Status) and Length(vText)>0;
  vSearch.Enabled := vEnabled;
end;

procedure TFlughafen.SetInterval(Value: Integer);
begin
  vInterval := Value;
  vSearch.Interval := Value;
end;

procedure TFlughafen.SetText(Value: String);
begin
  vText := Value;
  vLabel1.Caption:='';
end;

function TFlughafen.GetStart(Character: Char): Char;
begin
 case Character of
       #0..#9: result := #0;
          #10: result := #10;
     #11..#31: result := #0;
          #32: result := #32;
     #33..#47: result := #33;
     #48..#57: result := #48;
     #58..#64: result := #33;
     #65..#90: result := #65;
     #91..#96: result := #91;
    #97..#122: result := #97;
  else
    result := #123;
  end;
end;

procedure TFlughafen.SearchTimer(Sender: TObject);
var
  capt: String;
  len: Integer;
begin
  capt:=vLabel1.Caption;
  len:=Length(capt);
  if (len=0) or (capt[len]=vText[len]) then begin
    if len=Length(vText) then
      vSearch.Enabled:=False
    else
      capt:=capt+GetStart(vText[len+1]);
  end else
    Inc(capt[len]);
  vLabel1.Caption:=capt;
end;

end.
MfG
Phantom1

Muetze1 4. Jun 2005 12:46

Re: EInvalidPointer bei Zerstörung einer Klasse
 
Moin!

Und wenn ihr Destroy schon überschreibt, dann seit wenigstens so nett am Ende der überschriebenen Methode noch ein Inherited aufzurufen - das habe ich bisher bei noch keinem von euch gesehen...

MfG
Muetze1

Phantom1 4. Jun 2005 12:52

Re: EInvalidPointer bei Zerstörung einer Klasse
 
Zitat:

Zitat von Muetze1
Und wenn ihr Destroy schon überschreibt, dann seit wenigstens so nett am Ende der überschriebenen Methode noch ein Inherited aufzurufen - das habe ich bisher bei noch keinem von euch gesehen...

Ja normalerweise schon bei Create und Destroy, aber da TFlughafen von TObject abgeleitet wurde, ist es nicht zwingend nötig.

mfg
Phantom1

Muetze1 4. Jun 2005 13:29

Re: EInvalidPointer bei Zerstörung einer Klasse
 
Moin!

Zitat:

Zitat von Phantom1
Zitat:

Zitat von Muetze1
Und wenn ihr Destroy schon überschreibt, dann seit wenigstens so nett am Ende der überschriebenen Methode noch ein Inherited aufzurufen - das habe ich bisher bei noch keinem von euch gesehen...

Ja normalerweise schon bei Create und Destroy, aber da TFlughafen von TObject abgeleitet wurde, ist es nicht zwingend nötig.

mfg
Phantom1

1. Nicht bei Create, so lange es kein virtueller Constructor ist.
2. Ich habe nicht geschrieben das es zwingend ist, aber der vollständigkeitshalber könnte man es ja mal einfügen - weil so merkt sich jeder eine Sonderbehandlung das es nicht braucht und vergisst es später mal woanders. Auch wenn man den Vorfahren mal schnell ändert, hat man ein Problem.

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 Uhr.
Seite 2 von 2     12   

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