Lista jednokierunkowa i DLL

0

Witam,

muszę napisać program, książkę telefoniczną i dopóki miałem wszystkie funkcje i procedury w głownym programie działało ok, ale muszę mieć procedury obsługujące listę i plik dat w bibliotece dll... I tu się zaczął proble, ponieważ nic nie działa... Ma ktoś może przykładowy kod odczytu rekordow z pliku do listy i wyswietlenie ich w listview? Lub może jest ktoś w stanie udzielić mi jakiś wskazówek? (Od razu mówię, że dopiero zaczynam z programowaniem)

Z góry dzięki wszystkim za pomoc!

0

Co to znaczy "nie działa" i gdzie jest kod, goddamnit? :|

0

Kod z dll, wiem straszny, ale już długo nad nim kombinowałem, zeby zadziałał.

 procedure wczytaj_liste(nazwa:pchar);
var
  Ofile : TOsobafile;
  VOsoba : TOsoba;
  NewOsoba : wskaznik;
  nazwa_pliku:string;
begin
pierwszy:=nil;
ostatni:=nil;
  AssignFile(Ofile, nazwa);
  Reset(Ofile);
  nazwa_pliku:=string(nazwa);
  try
     while not eof(Ofile) do
      begin
        New(NewOsoba);
        Read(Ofile, NewOsoba^);
        NewOsoba^.nastepny:=nil;
        if pierwszy=nil then
          begin
            pierwszy:=NewOsoba;
            ostatni:=pierwszy;
            ostatni^.nastepny:=nil;
          end
        else
          begin
          ostatni^.nastepny:=NewOsoba;
          ostatni:=NewOsoba;
          ostatni^.nastepny:=nil;
          end;
      end;
  finally
    CloseFile(Ofile);
 end;
end;

Główny program:

 procedure Tform1.Stworz_liste;
var
nazwa:pchar;
begin
 if Fileexists(Filename) then
   begin
   nazwa:=pchar(Filename);
      wczytaj_liste(nazwa);
   end
 else
    begin
            close;
    end;
end;

A błąd to:
project raised exception class %$C000001D with message 'system exception (code 0x000001d) at 0x0018feb5'.

0

muszę napisać program, książkę telefoniczną i dopóki miałem wszystkie funkcje i procedury w głownym programie działało ok, ale muszę mieć procedury obsługujące listę i plik dat w bibliotece dll...

Mało infrmacji; Pokaż kod tych procedur i ich użycie w programie głównym;

I tu się zaczął proble, ponieważ nic nie działa...

Za taki opis program powinien od razu wylądować w koszu... Że nie działa można powiedzieć pani w piekarni - tutaj potrzebne są konkrety (czyt. kod);

Ma ktoś może przykładowy kod odczytu rekordow z pliku do listy i wyswietlenie ich w listview?

Nie sądzę, żeby ktoś miał, a jeśli ma to niechętnie się podzieli, bo poświęcił czas na jego napisanie i naukę, czego Ty zrobić nie zamierzasz;

Przykładową klasę listy jednokierunkowej z możliwością zapisu i odczytu mam, tutaj jej kod - http://pastebin.com/WnqrWvap ; Stworzona została do jeszcze nieopublikowanego artykułu, który opracowuję z @babubabu - wykorzystaj kod tej klasy i przystosuj go do swoich potrzeb - to nie gotowiec, musisz zrobić coś sam (przystosowanie kodu do Twoich struktur węzłów + wyświetlenie danych w komponencie);

Lub może jest ktoś w stanie udzielić mi jakiś wskazówek?

Musisz sam kombinować, szukać informacji w sieci i uczyć się kodzenia, a nie oczekiwać aż ktoś napisze to za Ciebie;

Od razu mówię, że dopiero zaczynam z programowaniem

To dość trudny temat musisz ogarnąć jak na początek; Przede wszystkim musisz zrozumieć sposób reprezentacji i działania list, zanim zabierzesz się za kombinowanie z bibliotekami DLL;


EDIT (spóźniłem nieco)

A co do Twojego kodu - nie podałeś deklaracji typu TOsoba i na pewno wpisujesz cały rekord do pliku razem z wskaźnikami, dlatego program nie będzie działał poprawnie; Musisz zapisać same dane węzłów bez wskaźnika na następny węzeł - temat wałkowany ostatnio dosyć często; I nie opowiadaj bzdur, bo ten kod nie działa prawidłowo nie tylko w DLL - w normalnym programie także nie ma prawa działać bo jest błędny.

0

Odkryłem, że dll jednak odczytuje rekordy z pliku. coś wysypuje się w głównym programie...
Tutaj cały kod: http://pastebin.com/JNKx2r5w
a tak przy okazji Furious Programming twoj link wygasl, jesli mozesz odswiez go, z gody dzieki :)

0

Pisałem, że program działał poprawnie dopóki nie zacząłem męczyć się z dll. Próbując go zrobić nagrzebałem w unit1 i przez to tak wygląda. Działało wczytywanie do listy, usuwanie, zapis listy do pliku.

0

Ok, znalazłem pierwszy błąd. Wystarczyło dodać NewOsoba:wskaznik;.
A teraz kolejny problem, jak "przesłać" tą listę do programu, aby mógł ją wyświetlić w listview?
Odwołując się do np. pierwszy.imie pokazuje mi błąd access violation.

EDIT
Dobra udało mi się zrobić odczyt, zapis i dodawanie nowych rekordów.
Teraz potrzebowałbym tylko pomocy w wyświetleniu listy stworzonej w dll w listview tform1.

unit1: http://4programmers.net/Pastebin/2830
dll: http://4programmers.net/Pastebin/2831

Może ktoś z tym pomóc?

0

Odwołując się do np. pierwszy.imie pokazuje mi błąd access violation.

Spróbuj Pierwszy^.Imie - powinno pomóc;

A teraz kolejny problem, jak "przesłać" tą listę do programu, aby mógł ją wyświetlić w listview?

Przekaż mu wskaźnik na pierwszy węzeł listy, a resztą się już zajmie sam; Albo w parametrze procedury z DLL przekaż referencję do komponentu i kodem z biblioteki dodaj wszystkie elementy;

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