AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Methodenzeiger Deklarieren, wenn keine Form vorhanden ist?
Thema durchsuchen
Ansicht
Themen-Optionen

Methodenzeiger Deklarieren, wenn keine Form vorhanden ist?

Ein Thema von magicshadow · begonnen am 7. Jun 2003 · letzter Beitrag vom 9. Jun 2003
Antwort Antwort
Seite 1 von 2  1 2      
magicshadow

Registriert seit: 28. Apr 2003
85 Beiträge
 
#1

Methodenzeiger Deklarieren, wenn keine Form vorhanden ist?

  Alt 7. Jun 2003, 15:13
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
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#2
  Alt 7. Jun 2003, 15: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...
Manuel Pöter
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3
  Alt 7. Jun 2003, 16:44
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.
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#4
  Alt 7. Jun 2003, 18:11
Stimmt, das muss man halt bedenken... also als ersten Parameter einen Pointer (oder eben eine Objekt-Referenz) und erst dann die restlichen Parameter.
Manuel Pöter
  Mit Zitat antworten Zitat
magicshadow

Registriert seit: 28. Apr 2003
85 Beiträge
 
#5
  Alt 7. Jun 2003, 18:41
Keine Angst, ich deklarier immer nach Vorschrift
THX für den Tip mit dem @ funst super!
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#6
  Alt 7. Jun 2003, 19:25
Zitat von magicshadow:
Keine Angst, ich deklarier immer nach Vorschrift
Sicher? Zeig mal die Deklaration deiner Prozedur und den Aufbau des Events...
Manuel Pöter
  Mit Zitat antworten Zitat
magicshadow

Registriert seit: 28. Apr 2003
85 Beiträge
 
#7
  Alt 9. Jun 2003, 12: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]
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#8
  Alt 9. Jun 2003, 13: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);
Manuel Pöter
  Mit Zitat antworten Zitat
magicshadow

Registriert seit: 28. Apr 2003
85 Beiträge
 
#9
  Alt 9. Jun 2003, 15: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.
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#10
  Alt 9. Jun 2003, 17: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...
Manuel Pöter
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 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