Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Von Pointern und Timern (Problem mit Sender) (https://www.delphipraxis.net/29631-von-pointern-und-timern-problem-mit-sender.html)

NeoXan 12. Sep 2004 11:20


Von Pointern und Timern (Problem mit Sender)
 
Moin moin,

Delphi-Quellcode:
type
 TData = Record
  tmrDestroy  : TTimer;
 end;
 Data = ^TData;
DummyList ist einfach nur TList...und KillDummy ist das OnTimer Event von tmrDestroy.
Delphi-Quellcode:
procedure TDummy.KillDummy(Sender: TObject);
var i: integer;
    pDummy: Data;
begin
 for i := 0 to DummyList.Count-1 do
  begin
   pDummy := DummyList[i];
   if Sender = pDummy^.tmrDestroy then
    begin
     pDummy^.tmrDestroy.Enabled := false;
     pDummy^.tmrDestroy.Free;
     DummyList.Delete(DummyList.IndexOf(pDummy));
     Dispose(pDummy);
    end;
  end;
end;
Das Problem ist jetzt, wie kann ich herausfinden, welcher Pointer das OnTimer Event aufgerufen hat. Bis jetzt klappt es ganz gut, WENN es sich nur um einen Pointer handelt. Sobald aber mehrere in der Liste sind kommt ein Listindex out of bounds...da ja ein Pointer schon gelöscht wurde.

Also wie könnte man herausbekommen, welcher Pointer in der Liste DummyList das onTimer Event aufgerufen hat?

mfg
NeoXan

mytar 12. Sep 2004 11:32

Re: Von Pointern und Timern (Problem mit Sender)
 
Ich denke so: :-D
Delphi-Quellcode:
procedure TDummy.KillDummy(Sender: TObject);
var
  pDummy: Data;
begin
while DummyList.Count > 0 do
  begin
   pDummy := DummyList[0];
   if Sender is pDummy^.tmrDestroy then
    begin
     pDummy^.tmrDestroy.Enabled := False;
     FreeAndNil(pDummy^.tmrDestroy);
     with DummyList do
       Delete(IndexOf(pDummy));
     Dispose(pDummy);
    end;
  end;
end;

Sprint 12. Sep 2004 11:53

Re: Von Pointern und Timern (Problem mit Sender)
 
Du könntest TTimer einen Namen geben und/oder TObjectList benutzen. Das könnte z.B. so aussehen...
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure OnTimerEvent(Sender: TObject);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  Contnrs, ExtCtrls;

var
  TimerList: TObjectList;

procedure TForm1.OnTimerEvent(Sender: TObject);
begin

  with (Sender as TTimer) do
  begin
    Enabled := False;
    Self.Refresh;
    Self.Canvas.TextOut(10, 10, 'Das Ereignis von ' + Name +
      ' ($' + IntToHex(LongInt(Sender), 8) + ') wurde ausgelöst.');
    TimerList.Delete(TimerList.IndexOf(Sender));
    Self.Canvas.TextOut(10, 30, 'TimerList hat noch ' + IntToStr(TimerList.Count) + ' Objekte.');
   Free;
  end;

end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Timer: TTimer;
  I: Integer;
begin

  for I := 1 to 10 do
  begin
    Timer := TTimer.Create(Self);
    Timer.Name := 'TimerNo' + IntToStr(I);
    Timer.OnTimer := OnTimerEvent;
    Timer.Interval := 11000 - (I * 1000);
    Timer.Enabled := True;
    TimerList.Add(Timer);
  end;

end;

initialization
  TimerList := TObjectList.Create(False);

finalization
  if Assigned(TimerList) then
    TimerList.Free;

end.

NeoXan 12. Sep 2004 12:30

Re: Von Pointern und Timern (Problem mit Sender)
 
Zitat:

Zitat von mytar
Ich denke so: :-D
Delphi-Quellcode:
procedure TDummy.KillDummy(Sender: TObject);
var
  pDummy: Data;
begin
while DummyList.Count > 0 do
  begin
   pDummy := DummyList[0];
   if Sender is pDummy^.tmrDestroy then
    begin
     pDummy^.tmrDestroy.Enabled := False;
     FreeAndNil(pDummy^.tmrDestroy);
     with DummyList do
       Delete(IndexOf(pDummy));
     Dispose(pDummy);
    end;
  end;
end;

:/ da kommt glaube ich eine Endlosschleife....jedenfals reagiert die App nicht mehr.


[EDIT]
Prob gelöst...hoffe ich
===>
Delphi-Quellcode:
for i := 0 to DummyList.Count-1 do
  begin
   pDummy := DummyList[i];
   if Sender = pDummy^.tmrDestroy then
    begin
     pDummy^.tmrDestroy.Enabled := false;
     pDummy^.tmrDestroy.Free;
     DummyList.Delete(DummyList.IndexOf(pDummy));
     Dispose(pDummy);
     frmDebug.WriteLog('> Dummy has gone home...');
     Exit;            // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    end;
  end;

Muetze1 12. Sep 2004 21:52

Re: Von Pointern und Timern (Problem mit Sender)
 
Moin!

Anstatt dem "harten" Exit könntest du auch einfach ein Break verwenden um die Schleife zu verlassen...

Und das andere ergibt eine Endlosschleife, wenn die Bedingung zum Löschen des Eintrages nicht beim ersten Beitrag zutrifft....

MfG
Muetze1

NeoXan 12. Sep 2004 22:56

Re: Von Pointern und Timern (Problem mit Sender)
 
Ja klar...nur er soll dann ja die gesamte Prozedur verlassen und nicht nur die Schleife :wink:

Muetze1 12. Sep 2004 23:35

Re: Von Pointern und Timern (Problem mit Sender)
 
Moin!

Macht er ja auch, weil nach der Schleife kommt bei dir ja nix mehr in der Procedure :wink:

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 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