W jaki sposób przechowywać listę klas i gdzie?

0

Witam!

Mam dataseta, który pobiera listę kolumn z których utworzona ma zostać tabela i wygląda to mniej więcej tak:

var
  Backlog_Board: TBoard;
  Analiza_Board: TBoard;
  Programowanie_Board: TBoard;
  Testy_Board: TBoard;
  Wdrozenie_Board: TBoard;


procedure JakasTam;
var
  ColumnPanel: TPanel;
  ColumnGroupName: string;
  Column1_Name: string;
  Column1_Limit: integer;
  Column2_Name: string;
  Column2_Limit: integer;
begin

while not FDSKPQuery.EOF do
begin
      // Tworzymy dynamicznie panel na komponencie ScrollBox1
      ColumnPanel := TPanel.Create(ScrollBox1);
      ColumnPanel.Visible := False;
      ColumnPanel.Parent := ScrollBox1;
      ColumnPanel.Width := 236;
      ColumnPanel.Left := ColumnPanel.Width * FDSKPQuery.RecNo;
      ColumnPanel.Align := alLeft;
      ColumnPanel.AlignWithMargins := True;
      ColumnPanel.BevelKind := bkFlat;
      ColumnPanel.BevelOuter := bvNone;
      ColumnPanel.ParentBackground := False;
      ColumnPanel.Name := 'pnlBoardColumn_' + IntToStr(FDSKPQuery.RecNo);
      ColumnPanel.Caption := '';

      ColumnGroupName := FDSKPQuery.FieldByName('Group_Name').AsString;
      Column1_Name := FDSKPQuery.FieldByName('Column1_Name').AsString;
      Column1_Limit := FDSKPQuery.FieldByName('Column1_Limit').AsInteger;
      Column2_Name := FDSKPQuery.FieldByName('Column2_Name').AsString;
      Column2_Limit := FDSKPQuery.FieldByName('Column2_Limit').AsInteger;

     // Problemowa linijka
     Backlog_Board := TBoard.Create(ColumnPanel, gHistoryjka_PokazZglaszajacego, gHistoryjka_PokazTytulZgloszenia, ColumnGroupName, Column1_Name, Column2_Name,       Column1_Limit, Column2_Limit);
      
     FDSKPQuery.Next;
end;

Tutaj pojawia się problem...

Backlog_Board jest to definicja klasy

Backlog_Board: TBoard;

Problem w tym, że chciałbym stworzyć tyle klas, ile utworzonych dynamicznie paneli i przydzielać im nazwy ze właściwości

ColumnPanel.Name

czyli coś takiego:

while not FDSKPQuery.EOF do
begin
      JakasTablicaKlas[FDSKPQuery.RecNo] := TBoard.Create(ColumnPanel, gHistoryjka_PokazZglaszajacego, gHistoryjka_PokazTytulZgloszenia, ColumnGroupName, Column1_Name, Column2_Name, Column1_Limit, Column2_Limit);


      FDSKPQuery.Next;
end;

Mam nadzieję, że coś takiego jest możliwe, bo jak nie to będę w czarnej....

1

TObjectList

0

Robię coś takiego:

var
  arrBoard : array of TBoard;
  Board: TBoard;

...

for i := Low(arrBoard) to High(arrBoard) do
      arrBoard[i].Free;
    SetLength(arrBoard, 0);

    for i := ScrollBox1.ComponentCount -1 downto 0 do
      ScrollBox1.Components[i].Free;

    while not FDSKPQuery.Eof do
    begin
      ColumnPanel := TPanel.Create(ScrollBox1);
      ColumnPanel.Visible := False;
      ColumnPanel.Parent := ScrollBox1;
      ColumnPanel.Width := 236;
      ColumnPanel.Left := ColumnPanel.Width * FDSKPQuery.RecNo;
      ColumnPanel.Align := alLeft;
      ColumnPanel.AlignWithMargins := True;
      ColumnPanel.BevelKind := bkFlat;
      ColumnPanel.BevelOuter := bvNone;
      ColumnPanel.ParentBackground := False;
      ColumnPanel.Name := 'pnlBoardColumn_' + IntToStr(FDSKPQuery.RecNo);
      ColumnPanel.Caption := '';

      ColumnGroupName := FDSKPQuery.FieldByName('Group_Name').AsString;
      Column1_Name := FDSKPQuery.FieldByName('Column1_Name').AsString;
      Column1_Limit := FDSKPQuery.FieldByName('Column1_Limit').AsInteger;
      Column2_Name := FDSKPQuery.FieldByName('Column2_Name').AsString;
      Column2_Limit := FDSKPQuery.FieldByName('Column2_Limit').AsInteger;

      Board := TBoard.Create(ColumnPanel, gHistoryjka_PokazZglaszajacego, gHistoryjka_PokazTytulZgloszenia, ColumnGroupName, Column1_Name, Column2_Name, Column1_Limit, Column2_Limit);
      SetLength(arrBoard, FDSKPQuery.RecNo);
      arrBoard[FDSKPQuery.RecNo -1] := Board;

      FDSKPQuery.Next;
    end;

I wydaje się działać. Pytanie tylko czy jest to odpowiedni sposób?

Później będę się odwoływał do tablicy i wybranego jej indexu, aby dostać się do klasy.

4

Mylisz pojęcia - Ty potrzebujesz przechować listę obiektów, a nie klas; A to:

Backlog_Board: TBoard;

to nie jest żadna definicja klasy, tylko deklaracja zmiennej; Proponuję wrócić do kursu programowania w Delphi, albo skupić się i nazywać rzeczy po imieniu;

Wracając do tematu - jak wskazał poprzednik, lista klasy TObjectList nada się, choć jeśli wszystkie elementy kontenera mają być tego samego typu (konkretniej - klasy TBoard) to skorzystaj z listy generycznej;

Pytanie tylko czy jest to odpowiedni sposób?

Skoro działa i nie zajmuje miliona linii kodu to może być.

0

Dzięki, pisałem na szybko i rzeczywiście pomyliłem pojęcia. W klasach siedzę od nie dawna i wciąż się ich uczę więc muszę też przywyknąć do prawidłowego nazewnictwa.

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