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
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]