Witajcie.
Chciałem przeniść do biblioteki dll funkcję obsługującą formularz(komponent ListView konkretnie) z pliku głównego tj.
function TMainForm.Procentya;
var
i : Integer;
w : Integer;
x : Integer;
y : Double;
begin
w := 0;
for i := 0 to (ListProszek.Items.Count - 1) do
begin
x := StrToInt(ListProszek.Items[i].SubItems[4]);
if x = 1 then w := w + 1;
end;
y := (w * 100)/i;
Result := y;
end;
Wzorując się na kompendium i temacie na tym forum, który odnalazłem:
dll i listview
przerzuciłem funkcję do dll i wyeksportowałem ją. Kod biblioteki wygląda w ten sposób:
library Procenty;
uses
Windows, SysUtils, Classes, Forms,
ComCtrls, MainUnit;
function Procentya : Double;
var
i : Integer;
w : Integer;
x : Integer;
y : Double;
ListProszek : TListView;
begin
w := 0;
for i := 0 to (ListProszek.Items.Count - 1) do
begin
x := StrToInt(ListProszek.Items[i].SubItems[4]);
if x = 1 then w := w + 1;
end;
y := (w * 100)/i;
Result := y;
end;
exports
Procentya;
begin
end.
MainUnit to Unit pliku głównego, w którym znajduje się ów formularz zawierający ListView.
W kodzie głównymi zaimportowałem i zadeklarowałem funkcję w sposób statyczny:
var
MainForm: TMainForm;
p : integer = 1;
function Procentya : Double; stdcall external 'Procenty.dll';
I potem ją wywołałem:
procedure TMainForm.FormCreate(Sender: TObject);
var
f : double;
begin
ReadFile;
SumaWszystkich;
SumaTrudnych;
f := Procentya;
ShowMessage(FloatToStr(f));
end;
Program się jak najbardziej kompiluje, ale podczas uruchamiania wyskakuje mi błąd AccessViolation. Jak temu zaradzić? Ten błąd to przecież przekroczenie rozmiaru pliku, czy komponentu, mam rację? Dlaczego zatem kiedy nie używałem biblioteki wszystko elegancko działało, a po wczytaniu biblioteki wywala mi przekroczenie zakresu dostępu?