DLL i formularz pliku głównego exe

0

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?

0
  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;

Deklarujesz sobie ni stąd ni zowąd zmienną ListProszek, której nawet nie inicjujesz i od razu zaczynasz ją modyfikować.
Nawet, jeżeli kompilator jakoś auto magicznie by ją zainicjował, to i tak wtedy ListProszek.Items.Count będzie równe -1 bądź 0.
Skąd niby biblioteka ma wiedzieć o jaki komponent na jakiej formie chodzi?
Poza tym przenoszenie takiego kodu do DLL nie ma sensu, a jeżeli nawet chciałbyś zrobić tak, jak chcesz teraz (tzn, że biblioteka DLL będzie modyfikować coś na formie), to byłoby z tym sporo roboty i po prostu nie opłaca się.

0

Chcę, czy nie, muszę to zrobić. Wymogi uczelni. Jeżeli dużo roboty jest ze zmianami na formularzu, to może da się w jakiś prosty sposób zrobić to modyfikując i pracując na plikach typowanych. Na nich zrobiona jest lista, którą badam tą funkcją. Tylko tego nie wiem za bardzo jak zrobić w ogóle. Wczoraj założyłem temat w tej kwestii i mi odpowiedziałeś, ale nie bardzo zrozumiałem o co chodziło, a potem z rekordów przeszedłem na komponent:
Odczytywanie rekordow z pliku typowanego

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