Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Problem mit Combobox.Items.AddObject() .AddItem() (https://www.delphipraxis.net/192934-problem-mit-combobox-items-addobject-additem.html)

hugorantanplan 2. Jun 2017 16:13

Problem mit Combobox.Items.AddObject() .AddItem()
 
Hallo Zusammen,

ich habe ein merkwürdiges Verhalten der Objekte meiner Combobox.Items.

Code:
procedure FillCmb;
var
  myCmb: TComboBox;
begin
  myCmb := TComboBox.Create(nil);

  myCmb.AddItem('Anfrage',     (TObject('AF'))); // string(myCmb.Items.Objects[0]) = 'AF'
  myCmb.AddItem('Angebot',     (TObject('AB'))); // string(myCmb.Items.Objects[0]) = 'AF'
                                                   // string(myCmb.Items.Objects[1]) = 'AB'
  myCmb.AddItem('Auftrag',     (TObject('AG'))); // string(myCmb.Items.Objects[0]) = 'AG'
                                                   // string(myCmb.Items.Objects[1]) = 'AF'
                                                   // string(myCmb.Items.Objects[2]) = 'AG'
  myCmb.AddItem('Lieferschein', (TObject('LS'))); // string(myCmb.Items.Objects[0]) = 'LS'
                                                   // string(myCmb.Items.Objects[1]) = 'AF'
                                                   // string(myCmb.Items.Objects[2]) = 'AF'
                                                   // string(myCmb.Items.Objects[3]) = 'AF'
  myCmb.AddItem('Rechnung',    (TObject('RS'))); // string(myCmb.Items.Objects[0]) = 'RS'
                                                   // string(myCmb.Items.Objects[1]) = 'LS'
                                                   // string(myCmb.Items.Objects[2]) = 'RS'
                                                   // string(myCmb.Items.Objects[3]) = 'LS'
                                                   // string(myCmb.Items.Objects[4]) = 'RS'



end;
Ich kann mir das Verhalten von "string(myCmb.Items.Objects[n]" nicht erklären.

Natürlich ist das erstmal nur ein Beispiel. Der richtige Code sieht in etwa so aus:
Code:
procedure TBelegerfassungF.FillCmbBelegart;
var
  qBelegart: TMSQuery;
begin
  try
    qBelegart := TMSQuery.Create(Self);
    qBelegart.Connection := DM1.MSConnection1;

    qBelegart.SQL.Add('SELECT Kennzeichen, Bezeichnung');
    qBelegart.SQL.Add('FROM ' + DM1.cBelegarten);
    qBelegart.SQL.Add('WHERE BelegArt = 1000 AND IstInitialbeleg = -1');
    qBelegart.SQL.Add('ORDER BY AnzeigeIndex');
    qBelegart.Open;

    cmbBelegart.Items.Clear;
    while not qBelegart.Eof do
    begin
      cmbBelegart.Items.AddObject(qBelegart.FieldByName('Bezeichnung').AsString, TObject((qBelegart.FieldByName('Kennzeichen').AsString)));
      qBelegart.Next
    end;
  finally
    FreeAndNil(qBelegart);
  end;
end;

himitsu 2. Jun 2017 16:26

AW: Problem mit Combobox.Items.AddObject() .AddItem()
 
Strings sind referenzgezählt und eine nach Objekt gecasteter Schrott ist das nicht.

Also fliegen die Strings kurze Zeit späte wieder aus dem Speicher, aber deine "Zeiger" zeigen immernoch auf die nicht mehr vorhandenen Strings. :roll:

* Strings "ordentlich" kopieren und nicht die Referenzzählung schrotten
* oder mit PChars arbeiten (StrNew StrDispose)
* oder richtige Daten-Objekte benutzen


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf