Przekazywanie komponentów do biblioteki DLL w Delphi

0

witam napisałem sobie prostą bibliotekę dll która służy do zapisywania danych ze StringGrida do pliku tekstowego.

library dll;


uses
  SysUtils,
  Classes;

{$R *.res}
procedure zapis(nazwa_pliku:string);stdcall;           //zapis
 Var F: TextFile;
     x, y: Integer;
 begin
  assignfile (f, nazwa_pliku );
  rewrite(f);
  writeln (f, stringgrid1.colcount);
  writeln (f, stringgrid1.rowcount);
  For x:=0 to stringgrid1.colcount-1 do
     For y:=0 to stringgrid1.rowcount-1 do
       writeln (f, stringgrid1.cells[x, y]);
  Closefile (f);
 end;

exports
   wczytaj name 'zapis';

begin
end. 

niestey czepia sie do pierwszego StringGrida i kazdego nastepnego. Stąd moje pytanie jak przekazać StringGrida do mojej procedury w bibliotece DLL?

Pisze w Borland Delphi7

0
  writeln (f, stringgrid1.colcount);
  writeln (f, stringgrid1.rowcount);
  For x:=0 to stringgrid1.colcount-1 do
     For y:=0 to stringgrid1.rowcount-1 do
       writeln (f, stringgrid1.cells[x, y]);

Musisz pomyśleć, jak komputer.
Skąd ma on wiedzieć, co to jest stringgrid1?
Dane możesz przekazać np.przez tablicę.
Poza tym nie wolno przekazywać stringów przez bibliotekę (tzn.można, lecz czasami może to spowodować niemiłe efekty; lepiej jest użyć PChar).

0

próbowałem na kilka sposobów "poinformować" go o tym StringGridzie. Pomysły brałem z funkcji przekazujących rekordy znalezionych w necie np.

 type
PStringGrid=^TStringGrid;
end;
...
procedure zapis(nazwa_pliku:string; var stringgrid1:PStringGrid);stdcall;
...

 with StringGrid1^ do

albo tak

 procedure zapis(nazwa_pliku:string; var stringgrid1:Pointer);stdcall;
...
TStringGrid(StringGrid1^)..colcount

ale bezskutecznie...
Jak powinienem postąpić z tym przekazaniem?

0

Wrzuć wszystkie wpisy ze stringgrida do tablicy i przekaż tablicę do biblioteki (rzecz jasna - mówimy tutaj o dynamicznych tablicach).

0

ok zrobiłem tak jak mówisz wpisałem całego stringGrida w programie do tablicy wygląda i ją przekazałem do DLL i zapisuje do pliku. A teraz jakbym chciał wczytać z pliku to robie sobie w dll moją tablice jako zmienną i wczytuje do niej całą zawartość pliku a jak ją następnie wyeksportować z dll do programu?

0

A w czym problem? Musisz koniecznie poczytać o podstawach, bo pytasz o banały i wiem, że to dział Newbie, ale szukaj zawsze najpierw informacji samodzielnie. Ok, to przeanalizuj sobie kod dołączony do mojego posta. A i najlepiej - według mnie - do odczytywania i zapisywania tekstu lub innych danych z plików zamiast konstrukcji typowo Pascalowych jak AssignFile, BlockRead / BlockWrite czy CloseFile - używac funkcji WinAPI jak CreateFile, ReadFile/ WriteFile , CloseHandle. Informacje na temat tych funkcji znajdziesz w google, rownież z przykładami użycia w Delphi. Chociaż w twoim przypadku chcesz dodawać zawartośc do StringGrida, to jednak ja polecam wczytać plik do dynamicznej tablicy stringów i później dopiero używac jej w programie tak jak pokazałem w odnieśieniu na przykład do StringGrida. I dodam, że tutaj do skompilowania dllki użyłem tylko modułu Windows i specjalnych modułów pozwalających tylko pod Delphi 7 uzyskać jeszcze mniejszy plik wynikowy - są one dostepne na: http://kolmck.net/sys/SysDcu7.zip i polecam takie rozwiązane. O ile program jeśli bardziej złożony ja osobiście dopuszczam robienie go w VCL, jednak według mnie dllka powinna być jak najbardziej przejrzysta, mała i zgrabna w kodzie, bez zbędnych konstrukcji powiększających jej rozmiar oraz w miarę oczywiście uniwersalna, bo jeśli nie to po co koniecznie ją stosować w kodzie.

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