AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Liste basierend auf TScrollBox - will nicht so recht...
Thema durchsuchen
Ansicht
Themen-Optionen

Liste basierend auf TScrollBox - will nicht so recht...

Ein Thema von Andreas L. · begonnen am 2. Feb 2009
Antwort Antwort
Andreas L.
(Gast)

n/a Beiträge
 
#1

Liste basierend auf TScrollBox - will nicht so recht...

  Alt 2. Feb 2009, 15:51
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?
Miniaturansicht angehängter Grafiken
bl_2_560.png   bl_1_151.png  
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:09 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