Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#1

TObjectList sehr anfällig?

  Alt 26. Aug 2012, 09:06
Versuche die TObjectList anstelle von Collection(VB) zu verwedenden.

Beim start der Anwendung wird ein Button erstellt der aber nicht in die TObjectList aufgenommen wird.
Das ergebis ist dann ListIndex überschreitet das Maximum(1)

Lasse ich den ersten Button weg und fange bei 0 an kommt die Meldung ListIndex überschreitet das Maximum(0)
Langsam bekomme ich einen Anfall und frage mich ob es nicht besser wäre einfach ein normales Array zu verwenden.
Ich dachte das es sinnvoll wäre da die Button während der Laufzeit auch wieder entfernt
bzw.. ReOrganisiert werden müssen.

FColButtons: TObjectList;

Delphi-Quellcode:
function TClsProgBar.Button(Btn: Integer): TClsButtonInfo;
var
  FSelButton: TObject;
begin
  FSelButton := nil;
  try
    try
      // auch ein FColButtons.Items[Btn- 1]) führt zu einem EListError
      FSelButton := (FColButtons.Items[Btn]) as TClsButtonInfo;
    except
      //
    end;
  finally
     Result := TClsButtonInfo(FSelButton);
  end;

end;
Delphi-Quellcode:
function TClsProgBar.ReOrgDisplay(Ctrl: TClsControls; oInit: Bool): Bool;
var
  Width: Integer;
  Height: Integer;
  Btn: Integer;
  oButton: TClsButtonInfo;

begin

  NewNumButtons := ButtonWidth * ButtonHeight;
  oButton := nil;

  // Lösche nicht benötigte Controls
  if NewNumButtons < FNumButtons then
  begin
     // lösche nichtverwendete Tasten, ausgenommen die erste
     for Btn := NewNumButtons + 1 to FNumButtons do
       Ctrl.RemoveButton(Btn);
  end;

  // lösche nichtverwendete einträge in der TObjectList
  if NewNumButtons < FColButtons.Count then
    // Lösche nicht benötigte Tasten, ausgenommen die erste
    for Btn := NewNumButtons + 1 to FNumButtons do
      RemoveButton(Btn);

  // erstelle neue Tasten wenn vorhanden
  Btn := 0;
  for Height := 1 to ButtonHeight do
  begin
    for Width := 1 to ButtonWidth do
    begin
      inc(Btn);
      if Btn > FNumButtons then
        Ctrl.AddButton(frmButtonHandle, Btn);

      Ctrl.PositionButton(Btn, Width, Height);

      if Btn > FColButtons.Count then
      begin
        try
          oButton := TClsButtonInfo.Create(nil);
          oButton.Num := Btn;
          AddButton(oButton);
        finally
          oButton := nil;
        end;
      end;
    end; // Width
  end; // Height

  // ButtonForm adjustieren
  Ctrl.Adjust(ButtonWidth, ButtonHeight);

  if oInit then
  begin
    // lösche die 1. Taste
    oButton := Button(1);
    if Assigned(oButton) then
    begin
      try
        oButton.BmpFile := '';
        oButton.ButtonKey := '';
        oButton.ToolTip := '';
        oButton.ButtonCmd := '';
      finally
        oButton := nil;
      end;
    end;
    // ProgBar-Properties zurücksetzen
    ClassNamen := '';
    ProgPath := '';
    ArbVerz := '';
    ProgTitle := '';
    ProgToolTips := '';
    ProgTrayMenu := '';
    Name := '';

    FNumButtons := 1;
  end else
  FNumButtons := NewNumButtons;

  if Assigned(SelButton) then
    SelButton.Free;

  result := True;
end;
Bedingt durch den Fehler fehlen mir immer irgendwelche Button
hier zum beispiel 2 .. sollten 8 sichtbar sein.

gruss

Geändert von EWeiss (11. Jul 2019 um 16:41 Uhr)
  Mit Zitat antworten Zitat