![]() |
Von Pointern und Timern (Problem mit Sender)
Moin moin,
Delphi-Quellcode:
DummyList ist einfach nur TList...und KillDummy ist das OnTimer Event von tmrDestroy.
type
TData = Record tmrDestroy : TTimer; end; Data = ^TData;
Delphi-Quellcode:
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.
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; Also wie könnte man herausbekommen, welcher Pointer in der Liste DummyList das onTimer Event aufgerufen hat? mfg NeoXan |
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; |
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. |
Re: Von Pointern und Timern (Problem mit Sender)
Zitat:
[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; |
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 |
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:
|
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 10:25 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 by Thomas Breitkreuz