AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Von Pointern und Timern (Problem mit Sender)
Thema durchsuchen
Ansicht
Themen-Optionen

Von Pointern und Timern (Problem mit Sender)

Ein Thema von NeoXan · begonnen am 12. Sep 2004 · letzter Beitrag vom 13. Sep 2004
Antwort Antwort
NeoXan
(Gast)

n/a Beiträge
 
#1

Von Pointern und Timern (Problem mit Sender)

  Alt 12. Sep 2004, 12:20
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
  Mit Zitat antworten Zitat
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Von Pointern und Timern (Problem mit Sender)

  Alt 12. Sep 2004, 12:32
Ich denke so:
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;
Francis Obikwelu
greetz
mytar
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#3

Re: Von Pointern und Timern (Problem mit Sender)

  Alt 12. Sep 2004, 12:53
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.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
NeoXan
(Gast)

n/a Beiträge
 
#4

Re: Von Pointern und Timern (Problem mit Sender)

  Alt 12. Sep 2004, 13:30
Zitat von mytar:
Ich denke so:
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;
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Von Pointern und Timern (Problem mit Sender)

  Alt 12. Sep 2004, 22:52
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
  Mit Zitat antworten Zitat
NeoXan
(Gast)

n/a Beiträge
 
#6

Re: Von Pointern und Timern (Problem mit Sender)

  Alt 12. Sep 2004, 23:56
Ja klar...nur er soll dann ja die gesamte Prozedur verlassen und nicht nur die Schleife
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Von Pointern und Timern (Problem mit Sender)

  Alt 13. Sep 2004, 00:35
Moin!

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

MfG
Muetze1
  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 13:26 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