Einzelnen Beitrag anzeigen

ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#10

AW: Listbox mit verschiedenfarbigen Spalten

  Alt 26. Nov 2013, 23:13
die MultiColListbox von Mike Heydon klingt sehr interessant, danke. Kann ich die bitte bekommen?

Beigefügt der originale Code der Unit zur Komponente MultiColListbox.
Zur Erweiterung zwecks evt. gewünschter Farbeffekte in der Anzeige einer bestimmten Spalte muss der Code im Minimum nun wie folgt ergänzt werden:

Delphi-Quellcode:
 TMultiColListbox = class(TCustomPanel)
    FExposedColumn: Smallint;
    FExposedColor: TColor;
  private
    {..}
    procedure SetExposedColumn (AColumn: smallint);
    procedure SetExposedColor (AColor:TColor);
  published
    {..}  
    property ExposedColor: TColor write SetExposedColor;
    property ExposedColumn: smallint write SetExposedColumn;
  end;

 constructor TMultiColListBox.Create(AOwner: TComponent);
 begin
  {...}
  FSetExposedColor:=clRed;
  // Voreinstellung: keine "Spalte" selektiert
  FExposedColumn:=-1;
 end;
    
procedure TMultiColListBox.SetExposedColumn (AColumn: smallint);
begin
  FExposedColumn:=AColumn;
end;

procedure TMultiColListBox.SetExposedColor (AColor:TColor);
begin
  FExposedColor:=AColor;
end;

procedure TMultiColListBox.ListBoxDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
Begin
    {...}
    for i := 0 to FHeader.Sections.Count - 1 do
    begin
      with LB.Canvas do
      begin
        Font:=FFont;
        if i = FExposedColumn then
        begin
          Font.color := FExposedColor;
          Font.style := [fsbold];
        end;
      end;
      LB.Canvas.TextOut(Rect.Left + FHeader.Sections.Items[i].Left + 2,
        Rect.Top, XTractField(Line));
    end;
    {...}    
 End;
Noch flexibler wird es, wenn man anstelle der reinen Color-Property 'ExposedColor' gleich eine komplette TFont-Property mit den entsprechenden Set- sowie auch Get-Methoden einsetzt; dann lassen sich in der hervorzuhebenden Spalte zusätzlich spezielle Style-Eigenschaften etc. ansprechen (d.h. sowohl setzen als auch abfragen).

In der Anwendung sieht die Verwendung der Komponente beispielsweise wie folgt aus:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
 // 2.Spalte rot gefärbt
 // alle anderen Spalten wie im Objectinspector unter property Font gesetzt
 with MultiColListbox1 do
 begin
    ExposedColor:=clRed;
    ExposedColumn:=1;
    // hier: 4 Zeilen à 3 sections = "Spalten"
    Items.Add('Richard;Wagner;Komponist');
    Items.Add('Johann;Strauß;Komponist');
    Items.Add('Konrad;Adenauer;Politiker');
    Items.Add('Clint;Eastwood;Schauspieler');
 end;
end;

// sehr wichtig!
procedure TForm1.FormResize(Sender: TObject);
var nSections: integer;
    ownerHeight, ownerWidth: integer;
    i: Integer;
begin
 // hier: auf die Form bezeigen
 // oder ggf. auf ein Panel als Owner der MultiColListbox1 (Align: alClient) anpassen
 ownerWidth:=self.Width;
 ownerHeight:=self.Height;
 with MultiColListbox1 do
 begin
    nSections:=Sections.Count;
    Width:=ownerWidth;
    Height:=ownerHeight;
    for i:=0 to nSections-1 do
    sections[i].Width:=width div nSections;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // jetzt nur 3.Spalte grün färben
  with MultiColListbox1 do
  begin
   ExposedColor:=clGreen;
   ExposedColumn:=2;
   invalidate;
   end;
end;
Angehängte Dateien
Dateityp: zip MultiColListbox_Src.zip (4,7 KB, 18x aufgerufen)
  Mit Zitat antworten Zitat