Announcement

Collapse
No announcement yet.

Picklist wird nicht freigegeben?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Picklist wird nicht freigegeben?

    Hallo,

    ich fülle einzelne Picklists meiner Spalten eines DBGrid abh. von deren FieldName zur Laufzeit mit einer TStringList. Soweit so gut. Jetzt stelle ich aber fest, das mir FastMM nach Beendigung des Programms mitteilt, dass die jeweilige erzeugte Anzahl TStringLists nicht freigegeben wurde.
    Ich habe schon mehrere Versuche gemacht, diese Listen per Free freizugeben, laufe dabei jedoch immer auf Fehler. Selbst das zus. Verwalten der zugewiesenen Listen in einer Objektliste inkl. anschließendem Durchlauf + Free hilft nichts.

    Was übersehe ich und warum gibt das DBGrid die Listen nicht selber frei

    Hier noch ein wenig Code:

    Code:
    procedure TBB_DataProvider.BuildLookupColumns(var cDBGrid : TJvDBGrid);
    var x : integer;
        cList : TList;
    begin
      for x := 0 to cDBGrid.Columns.Count - 1 do begin
        if (cDBGrid.Columns[x].FieldName  = 'Artikel') OR
           (cDBGrid.Columns[x].Title.Caption = 'Artikel')
        then
          cDBGrid.columns[x].PickList := GetItemPickList()
        [...]
    end;
    
    function TBB_DataProvider.GetItemPickList : TStringList;
    var cItemDataSet : TDataSet;
    begin
      cItemDataSet := cDBProvider.GetSQLDataset('SELECT Artikel FROM tbl_Artikel', TRUE);
      try
        Result := cDBProvider.GetStringListOfFieldValues(cItemDataSet, 0);
      finally
        cItemDataSet.Free;
      end;
    end;
    
    function TBB_DBProvider.GetStringListOfFieldValues(var cDataSet : TDataSet; iFieldNo : integer) : TStringList;
    begin
      Result := GetStringListOfFieldValues(cDataSet, iFieldNo, 0, '');
    end;
    
    function TBB_DBProvider.GetStringListOfFieldValues(var cDataSet : TDataSet; iFieldNo, iAddFieldNo : integer; sSeparator : string) : TStringList; 
    var cNewStringList : TStringList;
    begin
      cNewStringList := TStringList.Create;
      if cDataSet.RecordCount > 0 then begin
        cDataSet.First;
        while not cDataSet.Eof do begin
          if iAddFieldNo = 0 then
            cNewStringList.Add(cDataSet.Fields[iFieldNo].asString)
          else
            cNewStringList.Add(cDataSet.Fields[iFieldNo].asString + sSeparator + cDataSet.Fields[iAddFieldNo].asString );
          cDataSet.Next;
        end;
      end else
        cNewStringList.Add('');
    
      Result := cNewStringList;
    end;

  • #2
    Hi,

    ich kenne die JvDBGrid zwar nicht. Aber eine TStringlist zu erzeugen und als Funktionsergebnis zurückzugeben ist nicht nur tötlich, sondern auch unnötig.

    Übergebe die PickList und fülle diese!
    Code:
    procedure TBB_DataProvider.BuildLookupColumns(var cDBGrid : TJvDBGrid);
    var x : integer;
        cList : TList;
    begin
      for x := 0 to cDBGrid.Columns.Count - 1 do begin
        if (cDBGrid.Columns[x].FieldName  = 'Artikel') OR
           (cDBGrid.Columns[x].Title.Caption = 'Artikel')
        then
          FillPickList(cDBGrid.columns[x].PickList);
          // cDBGrid.columns[x].PickList := GetItemPickList()
          [...]
    end;
    function TBB_DataProvider.FillPickList(APickList: TStringList);
    var
      cItemDataSet : TDataSet;
    begin
      cItemDataSet := cDBProvider.GetSQLDataset('SELECT Artikel FROM tbl_Artikel', TRUE);
      try
        Result := cDBProvider.FillPickListFromFieldNo(cItemDataSet, APickList, 0);
      finally
        cItemDataSet.Free;
      end;
    end;
    function TBB_DBProvider.FillPickListFromFieldNo(cDataSet : TDataSet; APickList: TStringList; iFieldNo : integer) : TStringList;
    begin
      Result := FillPickListFromFieldNo(cDataSet, APickList, iFieldNo, 0, '');
    end;
    function TBB_DBProvider.FillPickListFromFieldNo(cDataSet : TDataSet; APickList: TStringList; iFieldNo, iAddFieldNo : integer; sSeparator : string) : TStringList;
    begin
      APickList.Clear;
      if not cDataSet.IsEmpty then
      begin
        cDataSet.First;
        while not cDataSet.Eof do
        begin
          if iAddFieldNo = 0 then
            APickList.Add(cDataSet.Fields[iFieldNo].asString)
          else
            APickList.Add(cDataSet.Fields[iFieldNo].asString + sSeparator + cDataSet.Fields[iAddFieldNo].asString );
          cDataSet.Next;
        end;
      end
      else
        cNewStringList.Add('');
    end;
    Ist ungetestet, aber verdutlicht, was ich meine.

    Cu, Frank
    Zuletzt editiert von Frank Reim; 15.09.2007, 15:13.

    Comment


    • #3
      Noch zu Erklärung:

      Du fragst, warum die Liste nicht freigegeben wird.
      PickList ist ein Property vom Typ TStringList.

      Die Zuweisung erfolgt in der Regel über einen Setter (SetPickList).
      Und in dieser Methode steht dann nur:
      Code:
      FPickList.Assign(Value).
      Es werden nur die Items aus deiner selbst erzeugten StringListe in PickList kopiert.
      Dein mühsam erzeugtes Objekt hängt weiter in der Luft. Es wird also gar nicht die Stringliste übergeben.

      Cu, Frank

      Comment

      Working...
      X