AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

AccessViolation bei CallBack

Ein Thema von blackdrake · begonnen am 27. Aug 2008 · letzter Beitrag vom 27. Aug 2008
Antwort Antwort
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

AccessViolation bei CallBack

  Alt 27. Aug 2008, 22:26
Hallo.

Ich versuche gerade etwas mit Callbacks zu machen, erhalte aber eine AV...

Delphi-Quellcode:
type
  TDownloadCallBackStatus = procedure(FilesDownloaded: Integer) of object;
  PDownloadCallBackStatus = ^TDownloadCallBackStatus;

  Txxx = class(T...)
  private
    {...}
  public
    {...}
    procedure DownloadOrSynchronize(SearchString: string; OnlySync: boolean;
      CallBackStatus: PDownloadCallBackStatus);
  end;

procedure Txxx.DownloadOrSynchronize(SearchString: string;
  OnlySync: boolean; CallBackStatus: PDownloadCallBackStatus);
var
begin
  {...}

  if Assigned(CallBackStatus) then
  begin
     CallBackStatus^(j); // <-- EACCESSVIOLATION
  end;

  {...}

end;

procedure CallBack(FilesDownloaded: Integer);
begin
  MainForm.label_x.Caption := inttostr(FilesDownloaded);
end;

procedure TMainForm.btn_download_click(Sender: TObject);
begin
  {...}
  AOBJ.DownloadOrSynchronize(edt_tags.Text, chk_nodownload.Checked, @CallBack);
  {...}
end;
(Hintergrund: DownloadOrSynchronize ist eine Funktion, die in einer gemeinsam genutzten PAS-Datei steht. Die einzelnen Projekte, die auf diese Funktion zurückgreifen, haben jeweils ihre eigene Art, dem Benutzer den aktuellen Status in Labels zu vermitteln. Daher Callback)

Ich habe jetzt schon relativ viele Varianten zu Callbacks gesehen, aber nicht alle Funktionieren bei mir. Dieser Code ist nun der erste, den ich Kompilieren konnte.

Hat jemand eine Idee, wie das geht?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: AccessViolation bei CallBack

  Alt 27. Aug 2008, 22:39
Las mal den Zeiger weg, dann klappt das auch.

Delphi-Quellcode:
type
  TDownloadCallBackStatus = procedure(FilesDownloaded: Integer) of object;

  Txxx = class(T...)
  private
    {...}
    FDownloadCallBackStatus:TDownloadCallBackStatus;
  public
    {...}
    property OnDownloadCallBackStatus:TDownloadCallBackStatus
      read FDownloadCallBackStatus write FDownloadCallBackStatus;
    procedure DownloadOrSynchronize(SearchString: string; OnlySync: boolean);
  end;

procedure Txxx.DownloadOrSynchronize(SearchString: string; OnlySync: boolean);
var
begin
  {...}

  if Assigned(FDownloadCallBackStatus) then
    FDownloadCallBackStatus(j);

  {...}
end;

procedure CallBack(FilesDownloaded: Integer);
begin
  MainForm.label_x.Caption := inttostr(FilesDownloaded);
end;

procedure TMainForm.btn_download_click(Sender: TObject);
begin
  {...}
  AOBJ.OnDownloadCallBackStatus:=CallBack;
  AOBJ.DownloadOrSynchronize(edt_tags.Text, chk_nodownload.Checked);
  {...}
end;
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: AccessViolation bei CallBack

  Alt 27. Aug 2008, 22:42
Erstens muss du dich entscheiden, ob dein Callback-Parameter freie Routinen oder Methoden annehmen soll. Mit der Klausel "of object" sagst du, dass es eine Methode sein muss, aber du willst dann eine freie Routine übergeben.
Zweitens: Wozu ein Zeiger auf einen Zeiger? Das ist hier absolut unnötig. @Callback gibt den Funktionszeiger zurück, aber nicht die zusätzliche Indirektion, die du eingebaut hast. Daher kommt auch die Zugriffsverletzung.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: AccessViolation bei CallBack

  Alt 27. Aug 2008, 23:41
Hallo omata und Apollonius.

@omata: Vielen Dank für die Korrektur! Funktioniert prima. Ich musste lediglich das "of object" noch wegnehmen.

Zitat von Apollonius:
Erstens muss du dich entscheiden, ob dein Callback-Parameter freie Routinen oder Methoden annehmen soll. Mit der Klausel "of object" sagst du, dass es eine Methode sein muss, aber du willst dann eine freie Routine übergeben.
Leider habe ich von der Materie sehr wenig Ahnung. Was ist denn der Unterschied zwischen einer (freien) Routine und einer Methode? Ich dachte immer Routinen und Methoden seien das Selbe.

Zitat von Apollonius:
Zweitens: Wozu ein Zeiger auf einen Zeiger? Das ist hier absolut unnötig. @Callback gibt den Funktionszeiger zurück, aber nicht die zusätzliche Indirektion, die du eingebaut hast. Daher kommt auch die Zugriffsverletzung.
Leider verstehe ich da nur Bahnhof. Ich habe so lange mit Referenzierung (@) und De-Referenzierung (^) herumgespielt, bis ich kompilieren konnte. Im Internet gab es auch unzählige Varianten von CallBacks, teilweise mit stdcall, teilweise mit und ohne Pointern.

Ich finde die Ausführung von omata mit den properties elegant gelöst, da ich ja sowieso in einer Klasse arbeite. Deswegen werde ich diesen Code auch so behalten.

Aber wie würde mein Code in funktionierender Fassung aussehen, wenn ich eine Methode/Routine Prozedur/Funktion direkt an eine Funktion weitergeben möchte, ohne diese vorher als Property oder Variable zu setzen? Ist Interessehalber, ich möchte ja irgendwie auch was dabei gelernt haben...

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: AccessViolation bei CallBack

  Alt 27. Aug 2008, 23:45
Zitat:
Leider habe ich von der Materie sehr wenig Ahnung. Was ist denn der Unterschied zwischen einer (freien) Routine und einer Methode? Ich dachte immer Routinen und Methoden seien das Selbe.
Du scheinst wohl auch zu der neuen Gattung von Programmierern zu gehören, die ohne Grundlagenwissen lustig drauflosprogrammieren.
Eine Methode gehört zu einer Klasse und eine freie Prozedur nicht (deshalb ist sie auch frei)
Markus Kinzler
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: AccessViolation bei CallBack

  Alt 27. Aug 2008, 23:52
Zitat von blackdrake:
Vielen Dank für die Korrektur! Funktioniert prima. Ich musste lediglich das "of object" noch wegnehmen.
Ok, das habe ich übersehen. Wenn deine Callbackroutine zur Klasse gehören soll oder es eine Methode in einem Formular ist, dann solltest bzw. musst du aber das "of object" beibehalten.

Delphi-Quellcode:
type
  TDownloadCallBackStatus = procedure(FilesDownloaded: Integer) of object;

  Txxx = class(T...)
  private
    {...}
    FDownloadCallBackStatus:TDownloadCallBackStatus;
  public
    {...}
    property OnDownloadCallBackStatus:TDownloadCallBackStatus
      read FDownloadCallBackStatus write FDownloadCallBackStatus;
    procedure DownloadOrSynchronize(SearchString: string; OnlySync: boolean);
  end;

  TMainForm = class(TForm)
  private
    procedure CallBack(FilesDownloaded: Integer);
  public
  end;

procedure Txxx.DownloadOrSynchronize(SearchString: string; OnlySync: boolean);
var
begin
  {...}

  if Assigned(FDownloadCallBackStatus) then
    FDownloadCallBackStatus(j);

  {...}
end;

procedure TMainForm.btn_download_click(Sender: TObject);
begin
  {...}
  AOBJ.OnDownloadCallBackStatus:=CallBack;
  AOBJ.DownloadOrSynchronize(edt_tags.Text, chk_nodownload.Checked);
  {...}
end;

procedure TMainForm.CallBack(FilesDownloaded: Integer);
begin
  Label_x.Caption := inttostr(FilesDownloaded);
end;
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:33 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