Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Was ist an dieser Funktion falsch?


benedikt124 - Mo 24.11.08 18:08
Titel: Was ist an dieser Funktion falsch?
Hallo,

ich habe eine Funktion mit einer Indy-Komponente:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
function console(const befehl, pw, port, ip: String; out antwort: String): Boolean; 

    var pb_senden, strTemp, Daten, strTemp2, pb_str: String; 
        IdUDPClient3: TIdUDPClient; 
        e_stop_re_pb: Boolean; 

begin 
    pb_senden := 'pw '+pw+' '+befehl+''+#$00; 
    IdUDPClient3.Host := ip; 
    IdUDPClient3.Port := strtoint(port); 
    IdUDPClient3.Active := true; 
  try 
    IdUDPClient3.Send(pb_senden); 
    strTemp := IdUDPClient3.ReceiveString(160); 
    pb_str := StringReplace(strTemp,'ÿÿÿÿprint','Antwort des Servers:',[rfReplaceAll, rfIgnoreCase]); 
    Daten := StringReplace(pb_str,'^1439','' + #13#10 + '',[rfReplaceAll, rfIgnoreCase]); 
    antwort := Daten; 
    IdUDPClient3.Active := false; 
    Result := True; 
  except 
    on E: EIdException do begin 
     e_stop_re_pb := True; 
     IdUDPClient3.Active := false; 
     Result := False; 
    end; 

  end; 

end;


Beim Ausführen kommt aber immer:


Quelltext
1:
Zugriffsverletzung bei Adresse 00404038                    


Aber warum?

mfg

Bene


bummi - Mo 24.11.08 18:12

Du hast IdUDPClient3 nirgendwo erzeugt....


benedikt124 - Mo 24.11.08 18:34

Hallo

Delphi-Quelltext
1:
var IdUDPClient3: TIdUDPClient;                    


oder was meinst du jetzt?


bummi - Mo 24.11.08 18:40

IdUDPClient3:=TIdUDPClient.Create(self);
....
....
....
IdUDPClient3.Free;

oder eine Statische Komponente auf Deinem Form/Datenmodul


benedikt124 - Mo 24.11.08 18:50

Ahso okey,

auf dem Form habe ich die Komponente drin, es kommt der Fehler immer noch.

Wenn ich es mit
IdUDPClient3:=TIdUDPClient.Create(self);

bekomme ich jedoch den Fehler

Undefinierter Bezichner: self ...

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt


bummi - Mo 24.11.08 19:02

ok, sorry ich hatte nicht gesehen daß Du eine "Nichtklassenmethode" verwendest.

Du könntest
IdUDPClient3:=TIdUDPClient.Create(nil);
verwenden
oder IdUDPClient3 als Parameter Deiner Funktion mitgeben
oder function Form1.console(const befehl, pw, port,....
aus Deiner Funtion machen.

Das Problem ist daß Du in Deinem Beispiel auf eine Variable zugreift hinter der nicht steht.

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt


benedikt124 - Mo 24.11.08 19:54

Hmm ich habe jetzt

Frame9.console(const befehl, pw, port,....

ausprobiert, geht aber immer noch nicht :oops: :oops:


Delete - Mo 24.11.08 21:00

Dann mach doch aus der Funktion eine Methode und lass die Variablendeklaration des UDPClients weg.


benedikt124 - Di 25.11.08 17:52

Aber Moment,

wenn ich aus der Funktion eine Methode mache, dann bekomme ich doch kein Ergebnis zurück also zum Beispiel die
Antwort des Servers in einem String....

Oder bin ich da jetzt komplett falsch? :lol: :lol:


Delete - Di 25.11.08 17:54

Der Unterschied zwischen regulärer Funktion und Methode ist Dir geläufig?


benedikt124 - Di 25.11.08 18:52

Nicht wirklich ,
ich glaube ich missverstehe da gerade was ganz arg..


Delete - Di 25.11.08 20:16

Reguläre Funktion:

Delphi-Quelltext
1:
function TuWas: integer;                    

Methode von FrmMain:

Delphi-Quelltext
1:
function TFrmMain.TuWas: integer;                    

Ich hoffe, das ist nun klarer ;)


benedikt124 - Mi 26.11.08 08:16

Achsooo,

also in meinem Fall geht das auch so oder:

Delphi-Quelltext
1:
function TFrame9.console(...                    


hier kommt aber auch der Fehler... :oops: :oops:


Mordilion - Mi 26.11.08 08:57

Versuch mal so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
function console(const befehl, pw, port, ip: String; out antwort: String): Boolean; 
var 
  pb_senden, strTemp, Daten, strTemp2, pb_str: String; 
  IdUDPClient3: TIdUDPClient; 
  e_stop_re_pb: Boolean; 
begin 
  pb_senden := 'pw '+pw+' '+befehl+''+#$00; 

  IdUDPClient3 := TIdUDPClient.Create(nil);
  try
    IdUDPClient3.Host := ip; 
    IdUDPClient3.Port := strtoint(port); 
    IdUDPClient3.Active := true; 
    try 
      IdUDPClient3.Send(pb_senden); 
      strTemp := IdUDPClient3.ReceiveString(160); 
      pb_str := StringReplace(strTemp,'ÿÿÿÿprint','Antwort des Servers:',[rfReplaceAll, rfIgnoreCase]); 
      Daten := StringReplace(pb_str,'^1439','' + #13#10 + '',[rfReplaceAll, rfIgnoreCase]); 
      antwort := Daten; 
      IdUDPClient3.Active := false; 
      Result := True; 
    except 
      on E: EIdException do 
      begin 
        e_stop_re_pb := True; 
        IdUDPClient3.Active := false; 
        Result := False; 
      end; 
    end; 
  finally
    IdUDPClient3.Free;
  end;
end;


Die Funktionist nicht von mir getestet worden!
Schau einfach mal ob der Fehler weiterhin auftritt.

Wenn es mit dieser Änderung klappen sollte, dann schau dir bitte noch ein paar Tutorials bezüglich Delphi an.



Gruß
Mordi


benedikt124 - Mi 26.11.08 14:54

Cool es geht... :D :D :D :D

Danke @all

Zitat:

Wenn es mit dieser Änderung klappen sollte, dann schau dir bitte noch ein paar Tutorials bezüglich Delphi an.


Das werde ich machen, nochmal Danke :)