Wskaźnik do funkcji/procedury (prawdopodobnie)

0

Mam taki problem:
Piszę teraz program, którego fragmenty kodu będą wykorzystywane do innych programów. Ten "współdzielony" kod znajduje się w jednym module. I teraz w tym samym module mam funkcję, która do działania potrzebuje wartości z programu, ale żeby zwiększyć wydajność tej funkcji, wartości będą obliczne tylko wtedy, kiedy się ją wywoła. Więc jak zrobić tak, że ta funkcja w module "współdzielonym" odwoła się do funkcji w innym module nie znając jego nazwy? Myślałem, żeby przekazać tej funkcji wskaźnik do drugiej funkcji. Ale jak to wykonac?

0

imho, dobry pomysl z tym przekazywaniem wskaznika.

Type
  FuncPtr = function(A1: Integer; A2: String): Integer;
//...
//tutaj ta funkcyjka w twoim module
function Blabla(argumenty, Func: FuncPtr): costam;
begin
//...
  XD := FuncPtr(B1, C8);
//...
end;
//i gdzies w innym module...
function Cosik(Foo: Integer; Bar: String): Integer;
begin
//...
end;
//...
  Blabla(8, 9, "foobar", Cosik); //albo @Cosik? nie jestem pewien, ale chyba oba dzialaja

O to pytałeś? Być może źle zrozumiałem. :]

0

Zrozumiałeś dobrze, ale to niestety nie działa. Dam mały przykład o co mi chodzi:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function Cos(s: string): byte;
  end;

  TFunc = function (s: string): byte;

var
  Form1: TForm1;
  Func: TFunc;

implementation

{$R *.dfm}

{ TForm1 }

function TForm1.Cos(s: string): byte;
begin
  Result := StrToInt(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(intToStr(Func('111')));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Func := cos; //ta linia powoduje błąd (z użyciem @ też)
end;

end.

Ten błąd to:
[Error] Unit1.pas(45): Incompatible types: 'regular procedure and method pointer'
Jakieś pomysły?

0

No tak, bo twoje "Cos" nie jest zwykłą procedurą/funkcją, tylko metodą klasy TForm1. Jeśli chcesz tak robić, to do deklaracji typu tej zmiennej będącej wskaźnikiem na funkcje musisz dodać modyfikator of object.
Czyli albo:

public
end;
//...
function Cos(...); //bez TForm1.
//...

Albo:

TFunc = function (s: string): byte of object;
0

Aha! Takie buty. Dzieki za pomoc [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1