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;