[gelöst]StringList, TStrings und Objekte über Assign weiterkopieren

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

[gelöst]StringList, TStrings und Objekte über Assign weiterkopieren

Beitrag von af0815 »

Ich habe folgendes Problem, ich hole mir über eine Funktion eine Stringlist, die auch immer zum String zugehörige Objekte beinhaltet. In der StartUp werden die eingelesn und sind auch vorhanden, wie man in der Variable n sehen kann.

Code: Alles auswählen

procedure TFormSearchEdit.StartUp;
var
  SL: TStringList;
  idx : integer;
  obj : TObject;
  n: string;
  mycat : TPayeeItem;
begin
  SL:= GetDMMMEX.GetAllPayeeItems;
  idx :=0;
  obj:= SL.Objects[idx];
  n:= SL.Strings[idx];
  try
    if SL.Count > 0 then begin
      ComboBox1.Items.Assign(SL);
    end;
  finally
    SL.Free;
  end;
end;
Wen ich jetzt einen Eintrag in einer Combobox auswähle und dann einen Butten drücke, dann ist im folgenden Code zwar der String vorhanden, allerdings ist das Objekt verlorengegangen und ungültig.

Irgendwie kommt es mir vor, das Assign zwar die String Elemente kopiert, aber die Objekte nicht. Schau ich mir es in der LCL an, so finde ich keinen Grund für das Verhalten.

Code: Alles auswählen

procedure TFormSearchEdit.btUseClick(Sender: TObject);
var
  idx : integer;
  obj : TObject;
  n: string;
  mycat : TPayeeItem;
begin
  idx := ComboBox1.ItemIndex;
  if (idx >= 0) then begin
    obj:= ComboBox1.Items.Objects[idx];
    n:= ComboBox1.Items.Strings[idx];
    if obj is TPayeeItem then begin
      mycat := obj as TPayeeItem;
      Payee:= mycat.Payee;
      Category:= mycat.Category;
      SubCategory:= mycat.SubCategory;
    end;
  end
  else begin
    ShowMessage('Auswahl ungültig <'+idx.ToString+'>');
  end;
end;
Habe ich da was übersehen, oder bin ich auf ein Feature gestossen ?!


Lazarus 2.3.0 (rev main-2_3-607-gae60967b81) FPC 3.3.1 i386-win32-win32/win64
Zuletzt geändert von af0815 am Do 11. Aug 2022, 13:20, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: StringList, TStrings und Objekte über Assign weiterkopieren

Beitrag von theo »

Hi
Dein Code enthält Teile, die ich nicht verstehe.
Habe das beschriebene Problem mal eingedampft, so wie ich es verstanden habe und sehe so kein Problem.

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var SL: TStringList;
begin
  SL:=TStringList.Create;
  Sl.AddObject('eins',TEdit.Create(self));
  Sl.AddObject('zwei',TButton.Create(self));
  Combobox1.Items.Assign(SL);
  Sl.Free;
end;       

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  Caption:=Combobox1.Items.Objects[ComboBox1.ItemIndex].ClassName;
end;
EDIT: Hast du vllt. irgendwo

Code: Alles auswählen

  SL.OwnsObjects:=true;
drin? Dann gehen die mit SL.Free nat. flöten.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: StringList, TStrings und Objekte über Assign weiterkopieren

Beitrag von wp_xyz »

af0815 hat geschrieben:
So 7. Aug 2022, 14:16
Wenn ich jetzt einen Eintrag in einer Combobox auswähle und dann einen Butten drücke, dann ist im folgenden Code zwar der String vorhanden, allerdings ist das Objekt verlorengegangen und ungültig.

Irgendwie kommt es mir vor, das Assign zwar die String Elemente kopiert, aber die Objekte nicht. Schau ich mir es in der LCL an, so finde ich keinen Grund für das Verhalten.
Irgendwo habe ich das schon mal gesehen, kann mich aber nicht mehr an Details erinnern. Jedenfalls hier, wenn ich das Problem vereinfache, tritt der Fehler nicht auf (siehe Anhang). Daher meine ich, dass du wahrscheinlich irgendwo in deinem Programm die Objekte zerstörst - Objekte in die Items von TStrings-Instanzen zu hängen ist immer mit einem gewissen Risiko verbunden, gerade, wenn die Programm unübersichtlich wird. Versuche das Programm zu vereinfachen und so den Fehler einzukreisen.

[EDIT]
Sorry theo, lese gerade deinen Beitrag genauer, in dem du ja dasselbe gemacht hast...
Dateianhänge
combobox_objects.zip
(2.04 KiB) 23-mal heruntergeladen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: StringList, TStrings und Objekte über Assign weiterkopieren

Beitrag von af0815 »

Danke Theo und Wp, das mit dem OwnsObjects war das missing Link.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten