Teraz mam następny problem z funkcją edytuj...
A mianowicie wczytauje dane z listview do form 2 i po edycji oraz kliknieciu zapisz tworzy mi nowy rekord, ktory potem chce podmienic w liscie funkcja w dll.
//EDIT
jakims dziwnym sposobem zmienna id zmienia swoja wartosc na 1632660... Jakieś pomysły??
library dll;
uses windows, System.SysUtils, Vcl.ComCtrls, Vcl.StdCtrls; //<-- wystarczy tylko ten moduł
type
wskaznik=^TOsoba;
TOsoba = packed record
imie,nazwisko,telefon:shortstring;
nastepny: wskaznik;
end;
TOsobafile = file of TOsoba;
var
pierwszy, ostatni:wskaznik;
procedure Dodaj_osobe(rekord:wskaznik);
begin
if Pierwszy=nil then
begin
Pierwszy:=rekord;
Ostatni:=Pierwszy;
end
else
begin
Ostatni^.nastepny:=rekord;
Ostatni:=rekord;
end;
end;
procedure wczytaj_liste(nazwa:pchar);
var
Ofile : TOsobafile;
NewOsoba : wskaznik;
begin
pierwszy:=nil;
ostatni:=nil;
AssignFile(Ofile, nazwa);
Reset(Ofile);
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);
//MessageBox(0, pwidechar(string(pierwszy.imie)+string(pierwszy.telefon)),'Hello world!',MB_OK);
end;
end;
procedure Zapisz_zmiany(nazwa:pchar);
var
Ofile : TOsobafile;
aktualny : wskaznik;
nazwa_pliku:string;
begin
try
nazwa_pliku:=string(nazwa);
AssignFile(Ofile, nazwa);
Rewrite(Ofile);
aktualny:=pierwszy;
while aktualny <> nil do
begin
write(Ofile, aktualny^);
aktualny:=aktualny^.nastepny;
end;
finally
Closefile(Ofile);
end;
end;
procedure Wyswietl_liste(listview1:Tlistview);
var
aktualny : wskaznik;
i : integer;
begin;
listview1.Clear;
aktualny:=pierwszy;
i:=0;
while aktualny <> nil do
begin
listview1.Items.add;
listview1.Items.Item[i].caption:=inttostr(i);
listview1.items.Item[i].SubItems.add(aktualny^.imie);
listview1.items.Item[i].SubItems.add(aktualny^.nazwisko);
listview1.items.Item[i].SubItems.add(aktualny^.telefon);
aktualny:=aktualny^.nastepny;
inc(i);
end;
end;
function getfirst:wskaznik;
begin
result:=pierwszy;
end;
procedure usun_osobe(id:integer);
var
aktualny, poprzedni:wskaznik;
i:integer;
begin
aktualny:=pierwszy;
if id=0 then
begin
pierwszy:=pierwszy.nastepny;
dispose(aktualny);
end
else
begin
for i := 0 to id-1 do
begin
poprzedni:=aktualny;
aktualny:=aktualny.nastepny;
end;
if aktualny.nastepny <>nil then
begin
poprzedni.nastepny:=aktualny.nastepny;
end
else
begin
poprzedni.nastepny:=nil;
ostatni:=poprzedni;
end;
end;
end;
procedure Skasuj_liste;
var
del:wskaznik;
begin
while pierwszy<> nil do
begin
del:=pierwszy;
pierwszy:=pierwszy^.nastepny;
dispose(del);
end;
end;
procedure edytuj(rekord:wskaznik; id:integer);
var
aktualny, poprzedni:wskaznik;
i:integer;
begin
aktualny:=getfirst;
if id=0 then
begin
rekord^.nastepny:=pierwszy^.nastepny;
pierwszy:=rekord;
end
else
begin
for i := 0 to id-1 do
begin
poprzedni:=aktualny;
aktualny:=aktualny^.nastepny;
end;
poprzedni^.nastepny:=rekord;
rekord^.nastepny:=aktualny^.nastepny;
end;
end;
exports // eksportuj procedurę
Dodaj_osobe name 'Dodaj_osobe',
wczytaj_liste name 'Wczytaj_liste',
zapisz_zmiany name 'Zapisz_zmiany',
wyswietl_liste name 'Wyswietl_liste',
usun_osobe name 'usun_osobe',
getfirst,
skasuj_liste,
edytuj;
begin
end.
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
wskaznik=^TOsoba;
TOsoba = packed record
imie,nazwisko,telefon:shortstring;
nastepny: wskaznik;
end;
TForm2 = class(TForm)
StaticText1: TStaticText;
StaticText2: TStaticText;
StaticText3: TStaticText;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
zapisz: TButton;
anuluj: TButton;
Label1: TLabel;
procedure FormShow(Sender: TObject);
procedure zapiszClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses
unit1;
procedure edytuj(rekord:wskaznik; id:integer); stdcall; external 'project2.dll' name 'edytuj';
{$R *.dfm}
procedure TForm2.FormShow(Sender: TObject);
begin
edit1.Text:=form1.ListView1.Selected.SubItems[0];
edit2.Text:=form1.ListView1.Selected.SubItems[1];
edit3.Text:=form1.ListView1.Selected.SubItems[2];
label1.caption:=form1.ListView1.Selected.Caption
end;
procedure TForm2.zapiszClick(Sender: TObject);
var
rekord:wskaznik;
id:integer;
begin
new(rekord);
rekord^.imie:=edit1.Text;
rekord^.nazwisko:=edit2.Text;
rekord^.telefon:=edit3.Text;
rekord^.nastepny:=nil;
id:=strtoint(form1.ListView1.Selected.Caption);
edytuj(rekord, id);
form2.close;
end;
end.