Funkcja zwracająca TStringList

0

Otóż mam funkcję postaci:

function funkcja(a: string, b: String): TStringList;
begin
 //tu nieistotne rzeczy
 result.Add(copy(jakis_string, zmienna_integer, druga_zmienna_integer);
 //blabla
end;

i na result.Add program się wysypuje - Access Violation.
Co zrobić, żeby było dobrze? Żeby dodawał?

I czy mogę zrobić takie przyrównanie?:

var
 sl: TStringList;
begin
 sl := TStringList.Create;
 sl:=funkcja(a, b);
//...
end;
0
procedure procedura(a,b:string;var res: TStringList);
begin
 res.Add(copy(jakis_string, zmienna_integer, druga_zmienna_integer);
end;

var
 sl: TStringList;
begin
 sl := TStringList.Create;
 procedura(a, b,sl);
end;

Przez result nie przekażesz do wnętrza funkcji parametru.

0

Oczywiscie flabra ma racje . W Twoim przykladzie Juhas zmienna result nie ejs zainicjowana wiec kazde odwolanie do jakiekolwiek jej pola (funkcja wlasciwosc) spowoduje blad "Access Violation" Musisz to zrobic tak jak napsial flabra.

0

Można równie dobrze:

function funkcja(a: string, b: string): TStringList;
begin
result:=TStringList.Create;
result.Add(copy(jakis_string, zmienna_integer, druga_zmienna_integer);
end;


var
 sl: TStringList;
begin
 sl:=funkcja(a, b);
end;

A, i ja się nie pytam o sl.free (bo to jest gdzie wsadzić) tylko o result.free .

Hmmm... Ale przecież tworzony jest tylko jeden obiekt. Potem jego wskaźnik jest przypisywany do innej zmiennej. Potem zwalniana jest zawartość tego wskaźnika, czyli to, co było stworzone... Czy źle myślę?

0

Można równie dobrze:

function funkcja(a: string, b: string): TStringList;
begin
result:=TStringList.Create;
result.Add(copy(jakis_string, zmienna_integer, druga_zmienna_integer);
end;


var
 sl: TStringList;
begin
 sl:=funkcja(a, b);
end;

A gdzie wsadzić:
Resutl.free ;

// do postu poniżej

Ej , Juhasowi chodzilo chyba o fnkcje ktora dopisuje do Tstringlista dwa stringi a nie tworzy nowy obiekt.
Mirekpil, no w przykladzie thenklesa to o co pytasz to sl.free : )

Po czym wnioskujesz że dwa mi się wydaje że 5 (7,12 albo 1) :-D .
I skąd Ci przyszło do głowy tworzenie nowego objektu.
A, i ja się nie pytam o sl.free (bo to jest gdzie wsadzić) tylko o result.free .

0

Ej , Juhasowi chodzilo chyba o fnkcje ktora dopisuje do Tstringlista dwa stringi a nie tworzy nowy obiekt.
Mirekpil, no w przykladzie thenklesa to o co pytasz to sl.free : )

0

Ej , Juhasowi chodzilo chyba o fnkcje ktora dopisuje do

Jeśli tak, to trzeba przekazać listę jako parametr.

0
function funkcja(a: string, b: string): TStringList;
begin
  Result := TStringList.Create;
  Result.Add(a);
  Result.Add(b);
end;

Tu sie odwolujesz np funkcja('bleble', 'bleble').Count , tylko, ze w tym przypadku masz memory leak, zeby tego uniknac uzyj:

procedure procedura(a, b: string; var Buffer: TStringList);
begin
  Buffer.Add(a);
  Buffer.Add(b);
end;

Costam := TStringList.Create;
procedura('ble', 'ble', CosTam);
CosTam.Count

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.