Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehler bei Funktionszuweisung (https://www.delphipraxis.net/105358-fehler-bei-funktionszuweisung.html)

Desmulator 20. Dez 2007 12:35


Fehler bei Funktionszuweisung
 
Hallo Leute...

ich erhalte eine Zugriffverletzung, wenn ich einem Event meiner Klasse eine Funktion zuweise, ich weiß jedoch nicht woran es liegt...

Die Klasse
Delphi-Quellcode:
...
type
  TSharkStatusEvent = procedure(Status: string);
  TShark = class
    private
      FOnStatus: TSharkStatusEvent;
      procedure SendStatus(Status: string);
    public
      property OnStatus:TSharkStatusEvent write FOnStatus;
      procedure ParseFile(FilePath : string);
    end;

var
  Shark: TShark;

implementation

procedure TShark.ParseFile(FilePath: string);
begin

  //Statusausgabe
  SendStatus('Erhalte "' + FilePath + '" zum parsern...');

end;

procedure TShark.SendStatus(Status: string);
begin
  //Prüfen ob eine Funktion abgelegt wurde
  if Assigned(FOnStatus) then begin
    //Senden an das Event
    FOnStatus(Status);
    sleep(10);
  end;
end;

und hier der aufruf
Delphi-Quellcode:
program Parser;

{$APPTYPE CONSOLE}
 {$WARNINGS ON}

uses
  SysUtils,
  Classes,
  SharkParser;

{$R *.res}

procedure StatusWrite(Status: string);
begin
  //Anzeigen das Statuses
  Write(Status + #13#10);
  sleep(2000);
end;


//Automatischer aufruf
begin
  //Bildschirm
  Write('#################################'+#13#10);
  Write('##########SharkParser############'+#13#10);
  Write('#################################'+#13#10#13#10);

  //Kurze Pause
  Sleep(2000);

  //Laden der Datei
  Write('Uebergebe ' + ParamStr(1) + ' an den Parser...'+#13#10);

  Shark.OnStatus := StatusWrite; //Hier erhalte ich den Zugriffs fehler!

  Shark.ParseFile(ParamStr(1)); //Parsen lassen

  Write('Parsing abgeschlossen.'+#13#10);
  Sleep(2000);
end.

Gollum 20. Dez 2007 12:39

Re: Fehler bei Funktionszuweisung
 
Hallo,

wo wird das Objekt erzeugt, bzw. wird es überhaupt erzeugt?

Luckie 20. Dez 2007 12:40

Re: Fehler bei Funktionszuweisung
 
Wo wird das Objekt Shark erstellt?

Desmulator 20. Dez 2007 13:17

Re: Fehler bei Funktionszuweisung
 
ah, okay danke...

hm... aber warum funktion der funktionsaufruf , jedoch die eiegnschaft nicht?

naja mit nem Creat gehts...

Desmulator 20. Dez 2007 16:38

Re: Fehler bei Funktionszuweisung
 
Okay wir sind jetzt ganz wo anders, aber ich wollte keine neue Topic aufmachen, weil das mit dem gleichn zutun hat...

Delphi-Quellcode:
program Neon;

uses
  Forms,
  IdBaseComponent,
  IdComponent,
  IdTCPConnection,
  IdTCPClient,
  IdTCPServer,
  Classes,
  Controls;

{$R *.res}

var
  TcpClient: TIdTcpClient;
  TcpServer: TIdTcpServer;
  Buffer: String;

procedure ServerExec(AThread: TIdPeerThread);
begin
  //Der Server wurde aufgerufen


end;

begin
  //StartUp, anschalten der Tcp's
  TcpClient := TIdTcpClient.Create(Application.Owner); //Client erstellen
  TcpClient.Port := 18754; //Port festlegen
  TcpServer := TIdTcpServer.Create(Application.Owner); //Server erstellen
  TcpServer.DefaultPort := 18754; //Port festlegen
  TcpServer.Active := true; //Server starten

  //Events setzen
  TcpServer.OnExecute := ServerExec; //Hier ist der Fehler

  //Anlaufen der DauerSchleife
  while not Application.Terminated do begin


  end;
end.
Ich erhalte eine Fehlermeldung:

[Fehler] Neon.dpr(36): Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'

was ist da falsch?

Muetze1 20. Dez 2007 16:39

Re: Fehler bei Funktionszuweisung
 
... das ServerExec() eine Procedure ist und keine Methode?

Desmulator 20. Dez 2007 16:41

Re: Fehler bei Funktionszuweisung
 
Ja... das ist mir auch klar, aber wie bekomme ich das jetzt hin, muss ich ein Object machen, das die Funktion ServerExec enthält?
Geht es auch nicht so umständlich?

Muetze1 20. Dez 2007 16:45

Re: Fehler bei Funktionszuweisung
 
Zitat:

Zitat von Desmulator
Ja... das ist mir auch klar, aber wie bekomme ich das jetzt hin, muss ich ein Object machen, das die Funktion ServerExec enthält?

Du musst dir eine Klasse bauen welche die ServerExec als Methode implementiert, ja. Und wenn du unbedingt keine Klasse instanziieren willst, etc, dann bau dir diese als statische Methode. Delphi gibt bei diesen (im Gegensatz zu z.B. C++) die Klassen-Type-Informationen als versteckten ersten Parameter mit und damit passt das ganze wieder und ist zuweisungskompatibel.

Desmulator 20. Dez 2007 16:51

Re: Fehler bei Funktionszuweisung
 
okay ich bin ein noob, wie mache ich eine statische mehtode ohne eine instanz?

Ghostwalker 20. Dez 2007 17:13

Re: Fehler bei Funktionszuweisung
 
Gaaaanz einfach. :)


Delphi-Quellcode:

    Type
     THelper = class
     public
       class procedure ServerExec((AThread: TIdPeerThread);
     end;



     :
     :

     TcpServer.OnExecute := THelper.ServerExec; //Hier WAR der Fehler

Hoffe es hilft :)

Desmulator 20. Dez 2007 17:17

Re: Fehler bei Funktionszuweisung
 
leider nein...

so schauts aus:
Delphi-Quellcode:
program Neon;

uses
  Forms, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdTCPServer,
  Classes, Controls;

{$R *.res}

procedure ServerExec(AThread: TIdPeerThread);
var
  Command: String;
begin
  //Der Server wurde aufgerufen
  while AThread.Connection.Connected do begin
    //Command einlesen
    Command := AThread.Connection.CurrentReadBuffer;

  end;
end;

Type
     THelper = class
     public
       class procedure ServerExec(AThread: TIdPeerThread);
     end;


var
  TcpClient: TIdTcpClient;
  TcpServer: TIdTcpServer;
  Buffer: String;

begin

  //StartUp, anschalten der Tcp's
  TcpClient := TIdTcpClient.Create(Application.Owner); //Client erstellen
  TcpClient.Port := 18754; //Port festlegen
  TcpServer := TIdTcpServer.Create(Application.Owner); //Server erstellen
  TcpServer.DefaultPort := 18754; //Port festlegen
  TcpServer.Active := true; //Server starten

  //Events setzen
  TcpServer.OnExecute := THelper.ServerExec;

  //Anlaufen der DauerSchleife
  while not Application.Terminated do begin


  end;
end.
Ich weiß jetzz net ob das wichtig ist, aber ich arbeite nur mit dem program und ohne unit...

Ghostwalker 20. Dez 2007 17:20

Re: Fehler bei Funktionszuweisung
 
Du mußt natürlich schon die ServerExec vom THelper ausprogrammieren, mit dem was sie tun soll :)

Desmulator 20. Dez 2007 17:25

Re: Fehler bei Funktionszuweisung
 
aha und wie das= den function quelltext unter die deklaration quetschen? :wiejetzt:

Delphi-Quellcode:
Type
     THelper = class
     public
       class procedure ServerExec(AThread: TIdPeerThread);
       var
         Command: String;
       begin
         //Der Server wurde aufgerufen
         while AThread.Connection.Connected do begin
           //Command einlesen
           Command := AThread.Connection.CurrentReadBuffer;

         end;
       end;
     end;

DeddyH 20. Dez 2007 17:27

Re: Fehler bei Funktionszuweisung
 
Ungetestet:
Delphi-Quellcode:
program Neon;

uses
  Forms, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdTCPServer,
  Classes, Controls;

{$R *.res}

Type
     THelper = class
     public
       class procedure ServerExec(AThread: TIdPeerThread);
     end;

procedure THelper.ServerExec(AThread: TIdPeerThread);
var
  Command: String;
begin
  //Der Server wurde aufgerufen
  while AThread.Connection.Connected do begin
    //Command einlesen
    Command := AThread.Connection.CurrentReadBuffer;

  end;
end;

var
  TcpClient: TIdTcpClient;
  TcpServer: TIdTcpServer;
  Buffer: String;

begin

  //StartUp, anschalten der Tcp's
  TcpClient := TIdTcpClient.Create(Application.Owner); //Client erstellen
  TcpClient.Port := 18754; //Port festlegen
  TcpServer := TIdTcpServer.Create(Application.Owner); //Server erstellen
  TcpServer.DefaultPort := 18754; //Port festlegen
  TcpServer.Active := true; //Server starten

  //Events setzen
  TcpServer.OnExecute := THelper.ServerExec;

  //Anlaufen der DauerSchleife
  while not Application.Terminated do begin


  end;
end.

Desmulator 20. Dez 2007 17:32

Re: Fehler bei Funktionszuweisung
 
er meldet dass sich die delkaration von der vorherigen unterscheidet

Ghostwalker 20. Dez 2007 17:34

Re: Fehler bei Funktionszuweisung
 
Delphi-Quellcode:
program Neon;

uses
  Forms, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdTCPServer,
  Classes, Controls;

{$R *.res}

Type
     THelper = class
     public
       class procedure ServerExec(AThread: TIdPeerThread);
     end;

class procedure THelper.ServerExec(AThread: TIdPeerThread);
var
  Command: String;
begin
  //Der Server wurde aufgerufen
  while AThread.Connection.Connected do begin
    //Command einlesen
    Command := AThread.Connection.CurrentReadBuffer;

  end;
end;

var
  TcpClient: TIdTcpClient;
  TcpServer: TIdTcpServer;
  Buffer: String;

begin

  //StartUp, anschalten der Tcp's
  TcpClient := TIdTcpClient.Create(Application.Owner); //Client erstellen
  TcpClient.Port := 18754; //Port festlegen
  TcpServer := TIdTcpServer.Create(Application.Owner); //Server erstellen
  TcpServer.DefaultPort := 18754; //Port festlegen
  TcpServer.Active := true; //Server starten

  //Events setzen
  TcpServer.OnExecute := THelper.ServerExec;

  //Anlaufen der DauerSchleife
  while not Application.Terminated do begin


  end;
end.
Man beachte das CLASS vor der Procedure :)

mkinzler 20. Dez 2007 17:38

Re: Fehler bei Funktionszuweisung
 
Welcher Fehler?

Ghostwalker 20. Dez 2007 17:53

Re: Fehler bei Funktionszuweisung
 
Den, den ich da oben bereits ausgemerzt habe. :) Den Satz hab ich nur nochmal drunter geschrieben, da man das CLASS sehr leicht im Quelltext überließt :)


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