Mam taki problem.
Mam dwie procedury, w jednej z nich tworzę dynamicznie tablicę wskaźników do rekordu,
i przekazuję jako parametr do drugiej procedury, która w pętli (rekurencja) wypełnia ją zawartością.
Problem w tym , że niby wszystko działa, ale po wyjściu z procedury wartości znikają :(
Podejrzewam że można to zrobić prościej niż ja, ale potrzebuję podpowiedzi.
Generalnie chodzi o to, że przekazuję do procedury wskaźnik do tablicy oraz string ze zmiennymi, a procedurka ma wydzielić poszczególne składniki i wypełnić tablicę wartościami.
Przykład:
Z czegoś takiego :
'cos1,cos2,cos2';
chcę uzyskać :
T[1]^.nazwaskl='cos1';
T[2]^.nazwaskl='cos2';
T[3]^.nazwaskl='cos3';
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
PrecPodstawka = ^TrecPodstawka;
TrecPodstawka = record
Rok : Integer;
Miesiac : Integer;
NzwSklad : string;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure TablicaArrPodstaw(C:Pointer;Params:string);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Parametry : string;
ArrSkl : array of PrecPodstawka;
i,j : Integer;
begin
// Przykładowe parametry
Parametry := 'cos1,cos2,cos3';
TablicaArrPodstaw(ArrSkl,Parametry); // WYWOŁANIE 2 PROCEDURY
Application.MessageBox(pchar('Ilość parametrów : ' + IntToStr(length(ArrSkl))),'test',MB_ICONINFORMATION); // TU jest 0 a powinno być 3 !!!
end;
procedure TForm1.TablicaArrPodstaw(C: Pointer; Params: string);
var
i,k : Integer;
p : Integer;
S : string;
T : array of PrecPodstawka;
begin
S := trim(Params); // na wszelki wypadek pozbywam się spacji
T := C; // przypisanie do tablicy T wskaźnika podanego jako parametr wywołania
i := length(T); // sprawdzenie ilości elementów tablicy
k := length(S); // sprawdzenie długości stringu Params
p := Pos(',',S); // określenie pozycji separatora (przecinek jest separatorem)
if (k<1) then Exit; //jeżeli ciąg zanków jest pusty to exit
if (p=1) then Exit; //jeżeli na pierwszej pozycji znajduje się przecinek to exit
if (P=0) then begin // jeżeli nie znaleziono separatora więc podano tylko jeden składnik - fragment wywołuje się w ostatnim obrocie pętli
SetLength(T,i+1);
new(T[i]);
T[i]^.NzwSklad := S;
end else begin
SetLength(T,i+1); // zwiększenie ilości elementów tablicy
new(T[i]); // utworzenie nowego wskaźnika
T[i]^.NzwSklad := copy(S,1,p-1); // podpisanie odczytanego wyrazu do wskaźnika "cos1"
S := copy(S,p+1,k-(p)); // odcięcie ze stringu pierwszego wyrazu i przecinka(separatora) aby zostało "cos2,cos3"
// tutaj jest OK, tablica się powiększa
TablicaArrPodstaw(T,S); //<- wywołanie w pętli samej siebie
//ale tu, po wyjściu okazuje się że wartość jest nil, a właściwie wartość z przed wywołania
end;
end;
end.
Czy ktoś podpowie jak to lepiej zrobić lub gdzie robię błąd ?