Delphi-PRAXiS
Seite 1 von 2  1 2      

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 :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:48 Uhr.
Seite 1 von 2  1 2      

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