Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Listbox mit verschiedenfarbigen Spalten (https://www.delphipraxis.net/177730-listbox-mit-verschiedenfarbigen-spalten.html)

iphi 24. Nov 2013 14:43

Delphi-Version: 7

Listbox mit verschiedenfarbigen Spalten
 
Hallo,

ist es möglich, in einer Listbox verschiedene Spalten unterschiedlich einzufärben?
Bisher kann ich nur komplette Zeilen einfärben.

himitsu 24. Nov 2013 15:02

AW: Listbox mit verschiedenfarbigen Spalten
 
Eine TListBox mit mehreren Spalten?
Sicher daß du nicht den TListView meinst?

Und ich bin mir recht sicher, daß Letzteres mehrere Zeichenevents besitzt und Einige auch für einzelne Felder/Spalten gelten.
(vorallem bei den "OnCustom..."-Events, auch schon bei älteren Delphis)

iphi 24. Nov 2013 15:23

AW: Listbox mit verschiedenfarbigen Spalten
 
Zitat:

Sicher daß du nicht den TListView meinst?
Das geht mit einer TListBox wohl auch:

http://delphi.about.com/cs/adptips20...ltip1200_3.htm

Ich will lediglich in einer Box tabellenorientierte Meldungen ausgeben, wobei einige Wörter farbig hervorgehoben werden sollen. Was wäre denn da die einfachste Lösung?

himitsu 24. Nov 2013 15:40

AW: Listbox mit verschiedenfarbigen Spalten
 
OK, dann ist jede Zeile dennoch nur ein Feld.

Jenachdem, wie du nun die Farben änderst....

Wenn du nur die Hintergrundfarbe änderst, aber der VCL das weitere Zeichnen übernehmen läßt, dann geht natürlich nur eine Farbe.
Wenn du den Hintergrund komplett selber zeichnest, dann mußt du halt den Zeichenbereich aufteilen (TabWidth) und jeweils die Teile einzeln ausmalen.



Oder du verwendest eben den ListView, welcher von Haus aus schon mehrere Spalten kann.



[edit]
Zitat:

Zitat von iphi (Beitrag 1237224)

Wer hier weiß was diese ^X-EscapeCodes eigentlich machen?
Ich würde es dann doch eher so empfehlen:
Delphi-Quellcode:
ListBox1.Items.Add('First'#9'Second'#9'Third');

Popov 25. Nov 2013 01:14

AW: Listbox mit verschiedenfarbigen Spalten
 
@iphi

Hat jetzt nicht direkt mit deiner Frage zu tun, aber ich hab mal ein Beispiel geschrieben wie man mehrere Spalten in einer ListBox darstellen kann. Mein Ansatz war anders als bei deinem Beispiel, aber etwas angewandelt kann man damit auch dein Problem lösen . Guck dir mal den Block unter
Delphi-Quellcode:
for k := 0 to...
http://www.entwickler-ecke.de/topic_...len_22048.html

Luckie 25. Nov 2013 01:30

AW: Listbox mit verschiedenfarbigen Spalten
 
Das sind keine mehreren Spalten im Sinne eines Listviews. Die "spalten" entshene, weil der Text in einer Zeile mit Tabstops getrennt wurde.

ASM 25. Nov 2013 15:14

AW: Listbox mit verschiedenfarbigen Spalten
 
Liste der Anhänge anzeigen (Anzahl: 2)
Relativ einfach wäre es, in der Listbox die besondere "Spalte" durch farblich veränderten Text hervorzuheben, anstatt den Hintergrund einzelner "Spalten" verändern zu wollen (was "spaltenweise" nicht so ohne weiteres geht).

Für eine Multispalten-Listbox bietet sich übrigens dazu besonders die Komponente MultiColListbox von Mike Heydon an
(war 2002 unter dem Titel "Multi Column ListBox with Column Sorting and Resizing" im Quellcode veröffentlicht auf delphi3000.com/articles/article_3360.asp; leider ist delphi3000 inzwischen aus dem Netz verschwunden. Bei Interesse/Bedarf kann ich diese Komponente aber gerne zur Verfügung stellen).

Die Komponente lässt sich mühelos mittels ergänzender Properties und entsprechender Set-Funktionen so erweitern, dass ausschließlich in den gewünschte(n) "Spalte(n)" der Text farblich hervorgehoben wird: siehe Anhangsbild und beigefügtes Beispiel (kompiliert; beachte die Möglichkeit zur Sortierung der Spalten nach Klick auf den jeweiligen "Spaltenkopf").

iphi 26. Nov 2013 15:39

AW: Listbox mit verschiedenfarbigen Spalten
 
@Popov,

danke für den Link. Mit Deinem Code kann ich mein Problem in der Tat lösen.

@ASM,

die MultiColListbox von Mike Heydon klingt sehr interessant, danke. Kann ich die bitte bekommen?
Geht das über die Mailfunktion im Forum?

haentschman 26. Nov 2013 15:47

AW: Listbox mit verschiedenfarbigen Spalten
 
Moin...

wenn du mit dieser Listbox spekulierst kannst du auch gleich die Standard Listview verwenden. Da bekommst du noch Extras wie z.B. Icons in den Spalten. :thumb: Desweiteren lassen sich an jedes Item beliebige Objekte dranhängen (z.B. Referenzen auf ein TOtto in einer TOttoList)

ASM 26. Nov 2013 23:13

AW: Listbox mit verschiedenfarbigen Spalten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von iphi (Beitrag 1237494)
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;

iphi 27. Nov 2013 15:08

AW: Listbox mit verschiedenfarbigen Spalten
 
Vielen Dank für den Code!
Funktioniert prima :-)

iphi 29. Nov 2013 15:59

AW: Listbox mit verschiedenfarbigen Spalten
 
Die MultiColListBox verhält sich merkwürdig beim Verändern von Width oder Height.
Veränderung der einen Property verändert die andere und umgekehrt. Warum?

Auch Align verhält sich nicht richtig. Die beiden Subkomponenten bleiben nicht übereinander.
Wie programmiert man Align bei so einer zusammengesetzten Komponente denn richtig?

ASM 29. Nov 2013 22:59

AW: Listbox mit verschiedenfarbigen Spalten
 
Die von Dir bemängelte Wechselwirkung zwischen Weite und Höhe der MultiListbox kann ich hier nicht reproduzieren. Bei mir gibt es keine solche.

Was das von Dir beschriebene Fehlverhalten beim Align Deiner Multilistbox angeht, so kann ich das Problem aus Deiner kurzen Anmerkung heraus leider nicht verstehen. Was soll heißen [Zitat]"Die beiden Subkomponenten bleiben nicht übereinander." ? Welche Subkomponenten meinst Du ? Ich habe bei mir bisher nie ein Problem beim Alignment der Multilistbox gehabt.

Ich denke, hier hilft als Voraussetzung zu einer Analyse der Ursachen Deiner Probleme nur ein konkreter Code dessen weiter, was Du machst bzw. machen willst.

iphi 30. Nov 2013 14:06

AW: Listbox mit verschiedenfarbigen Spalten
 
Zitat:

Die von Dir bemängelte Wechselwirkung zwischen Weite und Höhe der MultiListbox kann ich hier nicht reproduzieren.
Wollte gerade einen knappen Beispielcode präparieren. Ich bekomme das jetzt auch nicht mehr hin. Da ist irgendetwas seltsames passiert.

Zitat:

"Die beiden Subkomponenten bleiben nicht übereinander."
Das bezieht sich auf das Verhalten während Design-Time, wenn ich das Align im Object-Inspector ändere. Das Resultat auf der Form sieht dann merkwürdig aus.
Zur Runtime ist aber alles in Ordnung. Die Form sieht dann so aus wie sie soll. Woran kann das liegen?

ASM 1. Dez 2013 15:12

AW: Listbox mit verschiedenfarbigen Spalten
 
[QUOTE=iphi;1237984]
Zitat:

Zur Runtime ist aber alles in Ordnung. Die Form sieht dann so aus wie sie soll. Woran kann das liegen?
Der Autor der Multilistbox verweist explizit darauf, dass es wichtig ist, im Event FormResize die Parameter für das Layout der Multilistbox, also insbesondere die Weite der einzelnen Sections, an die jeweils aktuelle, neue Situation der Form anzupassen. Das ist auch in meinem oben geposteten Codebeispiel so gezeigt. FormResize wird übrigens bereits erstmals unmittelbar nach FormShow aufgerufen, so dass der in Formsize enthaltene Code immer sofort auch nach dem Start des Programms bzw. der Öffnung des betroffenen Fensters wirksam wird.

Während der Designzeit greift dieser Mechanismus beim Verändern der Formvorlage natürlich nicht. Da muss man ggf. Weite (und evt. Höhe) der einzelnen Sections im Objectinspector manuell anpassen, wenn man die Formgröße verändert. Davon unberührt bleibt natürlich zur Runtime das durch den Code im FormResize-Event determinierte Layout.

Zudem empfiehlt sich, eine solche visuelle Komponenten in der Formvorlage auf ein geignet positioniertes Panel als Owner zu plazieren und ihr 'Align' auf 'alClient' zu setzen, wobei letzteres sich eindeutig dann ja auf das Panel (eben als Owner der Multilistbox) bezieht.

iphi 3. Dez 2013 06:42

AW: Listbox mit verschiedenfarbigen Spalten
 
Ok, danke.

Noch eine Frage:
Wie könnte ich der MultiColListBox einen horizontalen Scrollbar verpassen, wenn die Zeilen zu lang werden, da z.B. Spalten außerhalb der Box?

Luckie 3. Dez 2013 18:33

AW: Listbox mit verschiedenfarbigen Spalten
 
Mal eine blöde Frage. warum nimmst du keinen Listview oder ein Stringgrid? Damit könntest du dir wahrscheinlich über die Hälfte der Arbeit sparen.

DeddyH 3. Dez 2013 20:29

AW: Listbox mit verschiedenfarbigen Spalten
 
Ich dachte schon, ich bin der Einzige, der das denkt :thumb:

himitsu 3. Dez 2013 21:34

AW: Listbox mit verschiedenfarbigen Spalten
 
Zitat:

Zitat von DeddyH (Beitrag 1238412)
Ich dachte schon, ich bin der Einzige, der das denkt :thumb:

Neee, bist'e nicht.

Aber wenigstens will er nicht auch eine 16-Bit-DLL in einem Win32- oder Win64-Programm laden,
anstatt den vorhandenen Quellcode mal schnell neu zu kompilieren. (ich warte nur noch darauf, bis das in Linux und MacOS versucht wird)

haentschman 4. Dez 2013 10:21

AW: Listbox mit verschiedenfarbigen Spalten
 
Zitat:

Zitat von DeddyH (Beitrag 1238412)
Ich dachte schon, ich bin der Einzige, der das denkt :thumb:

Diesmal war ich im Denken schneller als du... 8-) Siehe #9 Aber es ist wie überall... man ignoriert mich :stupid:

DeddyH 4. Dez 2013 10:22

AW: Listbox mit verschiedenfarbigen Spalten
 
Hat da gerade jemand was gepostet? :mrgreen: :duck:

haentschman 4. Dez 2013 10:26

AW: Listbox mit verschiedenfarbigen Spalten
 
:cheer: Ich, ich, ich...

Zum Thema: Ich denke auch, das die Arbeit mit einer Listview und deren Möglichkeiten deutlich weniger wäre. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:53 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