Przypisanie wyniku funkcji TStringlist

0

Witam, mam sobie funkcję, która ma zwracać klasę TStringList. Chciałbym do tej klasy przypisać wartość text. Wszystko się kompiluje, tylko przy uruchomieniu programu i dotarciu do tej linijki kodu wysypuje mi błąd, że wartość jaką chcę przypisać nie jest nazwą komponentu.

funkcja.Text:=copy(ciag,x,y);     

Po czym przenosi mnie do pliku control.inc do procedury:

procedure TControl.SetName(const Value: TComponentName);
var
  ChangeText: Boolean;
begin
  if Name=Value then exit;
  ChangeText :=
    (csSetCaption in ControlStyle) and not (csLoading in ComponentState) and
    (Name = Text) and
    ((Owner = nil) or not (Owner is TControl) or not (csLoading in TControl(Owner).ComponentState));
  inherited SetName(Value);
  if ChangeText then Text := Value;
end;      

Dodam, że jeśli wpiszę:

form1.memo1.text:=copy(ciag,x,y); 

To nie ma żadnego problemu i wszystko działa tak jakbym chciał, jednak zamiast komponentu memo preferowałbym wcisnąć tę wartość do TStringListy.

0
Brunatny Szewc napisał(a):

[…] jednak zamiast komponentu memo preferowałbym wcisnąć tę wartość do TStringListy.

Dobrze, bo do przechowywania danych są kontenery, a z komponentów korzysta się wyłącznie do budowania interfejsu.

mam sobie funkcję, która ma zwracać klasę TStringList.

Unikaj funkcji tworzących i zwracających referencje, bo Delphi/FP nie posiada GC, więc bardzo łatwo w takim przypadku o wycieki pamięci.

Chciałbym do tej klasy przypisać wartość text. Wszystko się kompiluje, tylko przy uruchomieniu programu i dotarciu do tej linijki kodu wysypuje mi błąd, że wartość jaką chcę przypisać nie jest nazwą komponentu.

funkcja.Text:=copy(ciag,x,y);     

Jeśli funkcja to ta funkcja, która zwraca referencję listy, to w tym miejscu będziesz miał wyciek pamięci, nawet jeśli doprowadzisz kod do kompilowalnego stanu. Jeśli już koniecznie chcesz używać takich funkcji, to najpierw zwróć referencję i wrzuć ją do zmiennej, a dopiero później na tej zmiennej operuj (a na koniec zwolnij pamięć za pomocą Free).

Popatrz dobrze, bo na pewno coś robisz źle. To dziwne, bo jeśli Twój kod działa tak jak opisujesz, to powinien się bez problemu kompilować. Przykład:

{$MODE OBJFPC}{$LONGSTRINGS ON}

uses
  Classes;

  function CreateList(): TStringList;
  begin
    Result := TStringList.Create();
  end;

var
  MyString: String = 'furious programming';
begin
  CreateList().Text := Copy(MyString, 1, 7);
end.

Sam zobacz – https://ideone.com/cWTj3X

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