Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ein Objekt um ein selbst definiertes Ereignis erweitern (https://www.delphipraxis.net/11172-ein-objekt-um-ein-selbst-definiertes-ereignis-erweitern.html)

ustra 1. Nov 2003 12:43


Ein Objekt um ein selbst definiertes Ereignis erweitern
 
Hallo,

ich habe mir ein kleines Objekt geschrieben, das überprüft, ob ein Programm mit dem Titel "CAD-Server" geöffnet ist (Stichwort Findwindow). Ich überprüfe mit einem Timer, ob das Programm geöffnet ist. Der Timer läuft solange, bis das Programm geöffnet ist. So weit auch alles kein Problem. Nun ich will dem Objekt ein eigenes Ereignis definieren(ich nenne es onOnline). Das soll ausgelöst werden, wenn das Programm geöffnet ist. Und nun stellt sich mir die Frage, wie ich das mache. ich habe schon auf Delphi-treff.de nachgesehen und schon gebastelt, bis jetzt funktioniert es noch nicht. Ich will es so haben, das der Aufruf des Objektes so aussieht:

Delphi-Quellcode:
 
Server:=TServer.create;
Server.onOnline:=TReadInBoxTimer;
So sieht der Quellcode der Unit aus (Ich weiss, der Destruktor fehlt noch):

Delphi-Quellcode:
unit UServer;

interface

uses classes, Dialogs, windows, extctrls, shellapi;
                                 
  type TFehlerEvent = procedure(Param1: String) of object;
  type TServer = class(Tcomponent)
    private
      FOnFehler: TFehlerEvent;
      TWarten : TTimer;
      function getBoServer : boolean;
      procedure SetOnOnline(Value: TFehlerEvent);
      procedure TWartenOnTimer(Sender : TObject);

    published
      property OnOnline: TFehlerEvent read FOnFehler write SetonOnline;

    protected

    public
      constructor create;
  end;

implementation

  constructor TServer.create;
  begin
    if getBoServer
    then self.SetonOnline(FonFehler)
    else begin
      TWarten := TTimer.create(nil);
      TWarten.interval:=500;
      Twarten.OnTimer := TwartenOnTimer;
      TWarten.enabled:=true;
      ShellExecute(0, 'open', 'Server.exe', nil, 'C:\buco_bwp\Server', SW_SHOWNORMAL);
    end;
  end;

  function TServer.getBoServer : boolean;
  begin
    if FindWindow(nil, 'CAD-Server') = 0
    then
       result := false
    else
      result := true;
  end;

  procedure TServer.SetonOnline(Value: TFehlerEvent);
  begin
    ShowMessage('hallo');
  end;

  procedure TServer.TWartenOnTimer(Sender : TObject);
  begin
    if getBoServer
    then begin
      TWarten.enabled:=false;
      TWarten.free;
      self.SetonOnline(FOnFehler);
    end;
  end;

end.
Besten Grüße
Ulrich

[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]

scp 1. Nov 2003 13:58

Re: Ein Objekt um ein selbst definiertes Ereignis erweitern
 
Delphi-Quellcode:
unit UServer;

interface

uses classes, Dialogs, windows, extctrls, shellapi;
                                 
  type TFehlerEvent = procedure(Param1: String) of object; // "of object" evtl. weglassen, je nach dem, ob später eine normale procedure oder eine procedure, die in einem Form deklariert ist, werwendet wird.
  type TServer = class(Tcomponent)
    private
      FOnFehler: TFehlerEvent;
      TWarten : TTimer;
      function getBoServer : boolean;
      procedure SetOnOnline(Value: TFehlerEvent);
      procedure TWartenOnTimer(Sender : TObject);

    published
      property OnOnline: TFehlerEvent read FOnFehler write SetonOnline;

    protected

    public
      constructor create;
      procedure Execute;
  end;

implementation

  constructor TServer.create;
  begin
    inherited create(nil); // hier noch keine Aktionen
  end;

  procedure TServer.Execute;
  begin
    if getBoServer then
      begin
        If Assigned(FOnFehler) then  // Der Aufruf geht dann so von statten
          FOnFehler('text');
      end
    else begin
      TWarten := TTimer.create(nil);
      TWarten.interval:=500;
      Twarten.OnTimer := TwartenOnTimer;
      TWarten.enabled:=true;
      ShellExecute(0, 'open', 'Server.exe', nil, 'C:\buco_bwp\Server', SW_SHOWNORMAL);
    end;
  end;

  function TServer.getBoServer : boolean;
  begin
    if FindWindow(nil, 'CAD-Server') = 0 
    then
       result := false
    else
      result := true;
  end;

  procedure TServer.SetonOnline(Value: TFehlerEvent);
  begin
    FOnFehler = Value; // Hier wird nur die procedure zugeswiesen
  end;

  procedure TServer.TWartenOnTimer(Sender : TObject);
  begin
    if getBoServer
    then begin
      TWarten.enabled:=false;
      TWarten.free;
      If Assigned(FOnFehler) then // Der Aufruf geht dann so von statten
        FOnFehler('text');
    end;
  end;

end.
Delphi-Quellcode:
var
  EinServer : TServer;

procedure EinServerOnFehler(param1 : string);
begin
  ShowMessage('hallo');
end;

procedure EinServerStarten;
begin
  EinServer := TServer.Create;
  EinServer.OnOnline := EinServerOnFehler;
  EinServer.Execute;
end;

ustra 1. Nov 2003 14:47

Re: Ein Objekt um ein selbst definiertes Ereignis erweitern
 
Hallo,

danke für Deine Hilfe. Jetzt funktioniert ist. Ich schaue mir das noch mal genau an um es zu verstehen. Sollte jetzt aber kein Problem mehr für mich darstellen.

Besten Dank
Ulrich


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