Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Methodenzeiger Deklarieren, wenn keine Form vorhanden ist? (https://www.delphipraxis.net/5467-methodenzeiger-deklarieren-wenn-keine-form-vorhanden-ist.html)

magicshadow 7. Jun 2003 14:13


Methodenzeiger Deklarieren, wenn keine Form vorhanden ist?
 
Hallöchen!
Ich möchte einer TWSocket Komponente erklären, dass sie eine bestimmte Prozedur aufrufen soll, wenn daten ankommen.

Mein Problem, ich hab keine Form in der unit. Wo muß ich nun die Prozedur deklarieren, wenn ich diese als Methodenzeiger nutzen will?

Hoffe ihr hab's verstanden!?

THX schonmal :)

Motzi 7. Jun 2003 14:42

Man braucht nicht unbedingt einen Methodenzeiger.. mit einem kleinen Trick geht auch eine normale procedure:

@Ereignis := @Prozedur

Ansonsten kannst du dir ja eine eigene Klasse schreiben, die die entsprechenden Methoden für die Event-Handler hat...

jbg 7. Jun 2003 15:44

Zitat:

Zitat von Motzi
@Ereignis := @Prozedur

Und was denkst du, wie schnell man sich damit eine AV holt, wenn "Prozedur" nicht richtig deklariert ist. Damit meine ich den versteckten Self-Parameter.

Motzi 7. Jun 2003 17:11

Stimmt, das muss man halt bedenken... also als ersten Parameter einen Pointer (oder eben eine Objekt-Referenz) und erst dann die restlichen Parameter.

magicshadow 7. Jun 2003 17:41

Keine Angst, ich deklarier immer nach Vorschrift ;)
THX für den Tip mit dem @ funst super! :spin:

Motzi 7. Jun 2003 18:25

Zitat:

Zitat von magicshadow
Keine Angst, ich deklarier immer nach Vorschrift ;)

Sicher? Zeig mal die Deklaration deiner Prozedur und den Aufbau des Events...

magicshadow 9. Jun 2003 11:58

Zu früh gefreut :(
leider funst das mit dem @ doch nciht richtig, da dann nichts als sender übertragen wird.

meine deklarationen:
Delphi-Quellcode:
interface

uses
  Windows, {Messages,} SysUtils, Classes,
  WSocket;
type
  TMSWSocket = class(TWSocket)
  private
    rcvtext : Ansistring;
  end;
 
  function GetURL(URL:Ansistring):ansistring;
  procedure WSDataAvailable(Sender: TObject; Error: Word);

implementation


procedure WSDataAvailable(Sender: TObject; Error: Word);
var a:AnsiString;
    ws1:TMSWSocket;
begin
ws1:=TMSWSocket(Pointer(sender));
a:=ws1.ReceiveStr;
if a<>'' then ws1.rcvtext:=ws1.rcvtext+a;
end;

function GetURL(URL:Ansistring):ansistring;
var WS:TMSWSocket;
    a:integer;
    ServerAddr:string;
begin
     if lowercase(copy(url,1,7))='http://' then delete(url,1,7);
     if pos('/',url)=0 then exit;
     serveraddr:=copy(URL,1,pos('/',URL)-1);
     delete(url,1,pos('/',url)-1);
     ws:=TMSWSocket.Create(nil);
     ws.port:='80';
     ws.Addr:=serveraddr;
     @ws.OnDataAvailable:=@WSDataAvailable;
     ws.Connect;
     a:=gettickcount;
     while (a+2000>gettickcount) and (ws.State<>wsconnected) do begin
           ws.ProcessMessages;
           sleep(1);
     end;
     ws.ProcessMessages;
     if ws.State=wsconnected then begin
        a:=gettickcount;
        while (a+2000>gettickcount) and (ws.State=wsconnected) do begin
              ws.ProcessMessages;
              sleep(1);
        end;
        result:=ws.rcvtext;
     end;
ws.free;
end;

end.
Das ganze soll später multithreat werden!
Hoffe es kann mir einer ne Hilfe geben.

[edit=Daniel B]Delphi-Tags eingefügt. MfG Daniel B.[/edit]

Motzi 9. Jun 2003 12:57

Tja, das ist genau das was jbg angesprochen hat... eine Methode führt implizit den Self-Pointer mit. Füg bei deinen Funktionen also einfach als ersten Parameter eine Objekt-Referenz dazu, dann stimmt alles:

Delphi-Quellcode:
  function GetURL(Self: TObject; URL:Ansistring):ansistring;
  procedure WSDataAvailable(Self: TObject; Sender: TObject; Error: Word);

magicshadow 9. Jun 2003 14:10

Werd ich später mal probieren. Nur 2 Probleme.
1.) Was soll ich als TObject übergeben wenn ich GetURL aufrufe? (Das ist ne normale Prozedur und zum aufgerufenen zeitpunkt muß nihct einaml ein Object existieren)

2.) Und als erste Variable hab ich ein TObject übergeben (nur heißt das bei mir nicht self, sondern wie stdmäßig sender. Ist das so wichtig, ob ich den Self oder sender nenne?

Mein Problem ist, wenn ich die Deklaration in die Typisierung der Form mit eintrage funktioniert alles, nur wenn ich keine Form habe hab ich das Problem, das ich nicht weiß, wo ich die Deklaration hinsetzen soll (und bei der Methode mit dem @) ist der sender nil.

Motzi 9. Jun 2003 16:31

Sorry, bei GetURL kannst dus weglassen, hab gedacht das is auch irgendein Event-Handler... Die Objekt-Referenz Self die ich eingefügt hab übernimmt den Self-Pointer der bei Methoden immer auf das aufrufende Objekt referenziert. Dieser Pointer wird bei Methoden implizit immer im EAX-Register übergeben und ist somit immer vorhanden. Wenn du also einen Prozedur-Zeiger an einen Methoden-Zeiger übergibst musst du einen zusätzlichen Parameter einfügen um die richtige Parameterreihenfolge zu behalten...


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