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/)
-   -   Delphi Liste basierend auf TScrollBox - will nicht so recht... (https://www.delphipraxis.net/128598-liste-basierend-auf-tscrollbox-will-nicht-so-recht.html)

Andreas L. 2. Feb 2009 14:51


Liste basierend auf TScrollBox - will nicht so recht...
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,
ich habe eine Komponente von TScrollBox abgeleitet und die Refresh Routine wie folgt überschrieben:
Delphi-Quellcode:
procedure TBeeperList.Refresh;
var
  i, x: Integer;
  NewPanel: TPanel;
  NewLabel1, NewLabel2: TLabel;
  NewImage1, NewImage2: TImage;
  NewBevel: TBevel;
  CurrFontColor, CurrColor: TColor;
begin
  inherited Refresh;
  if not (csDesigning in ComponentState) then
  begin

    if ControlCount > FItems.Count then
    begin
      //überflüssige Einträge entfernen falls schon welche vorhanden sind
      for i := ControlCount -1 downto (ControlCount - FItems.Count) do
      begin
        if Controls[i] is TPanel then
          (Controls[i] as TPanel).Free;
      end;
    end
    else if ControlCount < FItems.Count then
    begin
      //evtl. neue Einträge hinzufügen
      for i := 0 to (FItems.Count - ControlCount) -1 do
      begin
        NewPanel := TPanel.Create(Self);
        with NewPanel do
        begin
          Parent := Self;
          Caption := '';
          BevelInner := bvNone;
          BevelOuter := bvNone;
          OnClick := ItemClick;
          ParentBackground := False;
          Align := alTop;
          Height := 50;
          NewLabel1 := TLabel.Create(NewPanel);
          with NewLabel1 do
          begin
            Parent := NewPanel;
            Font.Style := [fsBold];
            Caption := (Items.Items[i] as TBeeperListItem).Title;
            Left := 8;
            Top := 8;
            Transparent := True;
            Hint := '2';        
            OnClick := ItemClick;
          end;
          NewImage2 := TImage.Create(NewPanel);
          with NewImage2 do
          begin
            Parent := NewPanel;
            Visible := (Items.Items[i] as TBeeperListItem).ShowRightIcon;
            Left := NewPanel.Width - 24; //47
            Top := 8;
            Height := 16;
            Width := 16;
            Transparent := True;
            Picture.Assign(FRightIcon);
            Anchors := [akRight, akTop];
            Hint := '2';
            OnClick := ItemClick;
          end;
          NewImage1 := TImage.Create(NewPanel);
          with NewImage1 do
          begin
            Parent := NewPanel;
            Visible := (Items.Items[i] as TBeeperListItem).ShowDescriptionIcon;
            Left := 8;
            Top := 27;
            Height := 16;
            Width := 16;
            Picture.Assign(FDescriptionIcon);
            Transparent := True;
            Hint := '1';
            OnClick := ItemClick;
          end;
          NewLabel2 := TLabel.Create(NewPanel);
          with NewLabel2 do
          begin
            Parent := NewPanel;
            Caption := (Items.Items[i] as TBeeperListItem).Description;
            Left := 30;
            Top := 27;
            Transparent := True;
            Hint := '1';
            OnClick := ItemClick;
          end;
          NewBevel := TBevel.Create(NewPanel);
          with NewBevel do
          begin
            Align := alBottom;
            Parent := NewPanel;
            Height := 2;
            Shape := bsTopLine;
            OnClick := ItemClick;
            Visible := False;
          end;
        end;
      end;
    end;


    //und jetzt Attribute setzen
    for i := 0 to ControlCount -1 do
    begin
      if Controls[i] is TPanel then
      begin
        with Controls[i] as TPanel do
        begin
          CurrFontColor := clBlack;
          CurrColor := clWhite;
          if FItemIndex = i then //wenn Eintrag = selektiert, dann anders darstellen
          begin
            CurrFontColor := clHighlightText;
            CurrColor := clHighlight;
          end;

          Color := CurrColor;
          Font.Color := CurrFontColor;
          Tag := i;
          Top := i * 50;

          for x := 0 to ControlCount -1 do //Unterelemente anpassen
          begin
            if Controls[i] is TLabel then
            begin
              (Controls[i] as TLabel).Font.Color := CurrFontColor;
              (Controls[i] as TLabel).Tag := i;
              if StrToTimeDef((Controls[i] as TLabel).Hint, 1) = 1 then
                (Controls[i] as TLabel).Caption := (FItems.Items[i] as TBeeperListItem).Title
              else
                (Controls[i] as TLabel).Caption := (FItems.Items[i] as TBeeperListItem).Description;
              (Controls[i] as TLabel).Refresh;
            end
            else if Controls[i] is TBevel then
            begin
              (Controls[i] as TBevel).Visible := CurrColor = clHighlight;
              (Controls[i] as TBevel).Tag := i;
            end
            else if Controls[i] is TImage then
            begin
              (Controls[i] as TImage).Tag := i;
              if StrToTimeDef((Controls[i] as TImage).Hint, 1) = 1 then
                (Controls[i] as TImage).Visible := (FItems.Items[i] as TBeeperListItem).ShowDescriptionIcon
              else
                (Controls[i] as TImage).Visible := (FItems.Items[i] as TBeeperListItem).ShowRightIcon;
            end;
          end;
        end;
      end;
    end;

  end;
end;
FItems ist eine Collection. TBeeperListItem ist wie folgt aufgebaut:
Delphi-Quellcode:
  TBeeperListItem = class(TCollectionItem)
  private
    FTitle: String;
    FDescription: String;
    FShowDescriptionIcon: Boolean;
    FShowRightIcon: Boolean;
  published
    property Title: String read FTitle write FTitle;
    property Description: String read FDescription write FDescription;
    property ShowRightIcon: Boolean read FShowRightIcon write FShowRightIcon;
    property ShowDescriptionIcon: Boolean read FShowDescriptionIcon write FShowDescriptionIcon;
  end;
Beim ersten Aufruf von Refresh sieht alles auch ganz toll aus (siehe Anhang1). Beim Klick auf einen Eintrag wird dann der ItemIndex gesetzt. Folgende Setter-Routine habe ich definiert:

Delphi-Quellcode:
procedure TBeeperList.SetItemIndex(Value: Integer);
begin
  if (FItemIndex <> Value) and (Value <= FItems.Count -1) then
  begin
    FItemIndex := Value;
    Refresh;
  end;
end;
Es wird also Refresh aufgerufen um den neuen Eintrag zu markieren. Es wird aber die Farbe des ersten Labels nicht gesetzt (siehe Anhang2). Ich komm' nicht drauf warum das so ist. Jemand eine Idee?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:30 Uhr.

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