![]() |
TListView und Spalte
Hallo,
ich habe mit den im Titel genannten Worten unter anderem auch eine Suche hier durchgeführt. Die Themen habe ich mir angesehen, aber nichts gefunden, das mich weiterbringt. Leider kann eine einfache TListView nur eine einzige CheckBox anzeigen. Ich brauche aber mind. 5 pro Zeile und VirtualTreeView ist mir zu aufwendig. Meine Idee ist daher jetzt, dass ich statt CheckBoxen einfach kleine Symbole nehme (sieht sogar chicker aus). Wenn der Benutzer jetzt auf einen Eintrag klickt, wird einfach ein entsprechendes Bild eingeblendet oder eben nicht. Damit habe ich dann meine CheckBoxen :mrgreen: Es hapert aber bei mir an der Umsetzung. Zwar weiß ich, auf welche Zeile der Benutzer geklickt hat. Ich bekomme aber nicht das Item bzw. SubItem. Ich kenne das Ereignis OnMouseDown. Hier bekäme ich die X,Y-Koordinaten. Ich könnte daher anhand dieser Daten das SubItem errechnen. Gibt es eine einfachere Methode, um dort ranzukommen? Gruß, Alex |
Re: TListView und Spalte
sei mir nicht böse aber WAS GENAU benutzt du jetzt?
Checkboxen? Comboboxen? Listboxen? listviews? :?: Ich hab grad keine ahnung :gruebel: aber VST ist eigentlich ganz komfortabel weil man da recht leicht daten hinterlegen kann. Zur not auch in SPaltenform. Ich persönlich habs noch net geschafft in einem Listview objekte zu hinterlegen. in einer listbox geht das einfacher ^^ LG stho |
Re: TListView und Spalte
Zitat:
Delphi-Quellcode:
Oder meinst du visuelle Objekte die in der ListView angezeigt werden sollen?
var
MeinObjekt: TObject; begin with ListView1.Items.Add do begin ... MeinObject := TObject.Create; Data := MeinObjekt; end; end; ... ... TObject(ListView1.Items[0].Data).Name := 'NeuerName'; //etc... |
Re: TListView und Spalte
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Also ich kann den einzelnen Zellen Bilder zuweisen und die auch ändern (lassen)
Delphi-Quellcode:
Mir geht es jetzt nur darum, mit geringstmöglichem Aufwand herauszufinden, auf welches Bild der Benutzer grad geklickt hat. Ich habe mal einen Screenshot angehängt. Vielleicht wird dann das Problem besser verständlich.
procedure TForm1.Button1Click(Sender: TObject);
Var LI : TListItem; begin LI:=ListView1.Items.Add; LI.SubItems.Add(''); LI.SubItems.Add(''); LI.SubItems.Add(''); LI.SubItems.Add('1-5'); LI.SubItemImages[2]:=1; ListView1.Items[Pred(ListView1.Items.Count)].ImageIndex:=2; end; Gruß, Alex |
Re: TListView und Spalte
Ich habe es jetzt so probiert
Delphi-Quellcode:
Ich bekomme aber immer eine '0' ausgegeben. :wall:
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); Var I : Integer; aLeft : Integer; begin aLeft:=0; For I:=0 To Pred(ListView1.Columns.Count) Do Begin If Y In [aLeft..(aLeft + ListView1.Columns.Items[I].Width)] Then Break Else aLeft:=aLeft + ListView1.Columns.Items[I].Width; End; MessageBox(0, PAnsiChar(IntToStr(I)), 'SubItem', mb_OK); end; Wieso klappt das nicht? |
Re: TListView und Spalte
Ich habe die Logik jetzt nicht bis ins Letzte nachvollzogen, aber müsstest Du nicht X prüfen statt Y?
|
Re: TListView und Spalte
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Ich habe jetzt aber immer noch 2 Probleme:
Alex |
Re: TListView und Spalte
Probier es mal so:
Delphi-Quellcode:
In operiert mit Mengen. Mengenelemente dürfen aber maximal den Wert 255 haben, die Summe der Spaltenbreiten ist aber größer, deshalb klappt das nicht.
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); Var I : Integer; aLeft : Integer; CurCol: integer; begin aLeft:=0; CurCol := -1; For I:=0 To Pred(ListView1.Columns.Count) Do Begin If (X >= aLeft) and (X <= (aLeft + ListView1.Columns[I].Width)) Then begin CurCol := i; Break; end Else aLeft:=aLeft + ListView1.Columns[I].Width; End; MessageBox(0, PAnsiChar(IntToStr(CurCol)), 'SubItem', mb_OK); end; |
Re: TListView und Spalte
Du könntest statt der ListView auch einen VirtualTreeView nehmen
> ich weiß "Tree", aber sie läßt sich auch als "List" verwenden :angel: Dort kannst du erstmal die Bilder direct von der Komponente zeichnen lassen und muß ihr nur einen BildIndex und eventuell noch 'ne ImageList (falls da nicht die über das Property Angebundene genommen werden soll) übergeben. Und dann gibt es ein fertiges OnColumnClick, wo du direkt die angeklickte Spalte bekommst und nichts mehr rechnen mußt. |
Re: TListView und Spalte
Zitat:
Delphi-Quellcode:
@himitsu
begin
aLeft:=0; For I:=0 To Pred(ListView1.Columns.Count) Do Begin If (X >= aLeft) and (X <= (aLeft + ListView1.Columns[I].Width)) Then Break Else aLeft:=aLeft + ListView1.Columns.Items[I].Width; End; If I > Pred(ListView1.Columns.Count) Then I:=-1; Label1.Caption:='Zeile: ' + IntToStr(ListView1.ItemIndex) + ' | ' + 'Spalte: ' + IntToStr(I); end; Ich weise auch hier die Bildchen nur per BildIndex zu. Ich brauche VirtualTreeView dazu nicht. Die hatte ich schon einmal am Wickel. Mit kurz mal auf das Form ziehen und loslegen war nicht und die wirklich dicke Anleitung wollte ich mir nicht durchlesen. Jetzt habe ich aber immer noch ein Problem: Um ItemIndex hatte ich mich nicht gekümmert. Ich hatte mich darauf verlassen, dass sich TListView allein darum kümmert. Tut sie aber nicht. Ich sehe bei Zeile jetzt immer -1 und das obwohl ich vorher zig Zeilen angelegt habe. Daran kann es also nicht liegen... Wo liegt denn hier nun wieder mein Denkfehler? Alex |
Re: TListView und Spalte
Hallo,
die aktuell gewählte Zeile des Listview bekommst Du so:
Delphi-Quellcode:
row:=ListView1.Selected.Index;
|
Re: TListView und Spalte
Zitat:
Boxberg = Das Boxberg in Sachsen? Ich habe den Tipp gern aufgenommen. Allerdings bekomme ich jetzt immer eine nicht näher definierte EAccessViolation (Zugriffsverletzung bei Adresse ...). Es kann nur an Selected.Index liegen, denn davor lief die Procedure zumindest durch. Gibt es da noch etwas zu beachten? Gruß, Alex |
Re: TListView und Spalte
Das CurCol hatte schon seine Berechtigung. Nach Ablauf der Schleife ist i nicht definiert, so dass ich mir Treffer in CurCol merke. Außerdem steht dort der Initialwert -1 drin, wenn es keinen Treffer gab.
|
Re: TListView und Spalte
Zitat:
Bzgl. Deiner EAccessViolation bin ich etwas verwundert. Die entsprechende Zeile müsste doch markiert sein (OnMouseDown). Überprüfe einmal mit
Delphi-Quellcode:
ob die entsprechende Zeile überhaupt markiert ist.
if (ListView1.Selected<>nil) then
ShowMessage(IntToStr(ListView1.Selected.Index)); |
Re: TListView und Spalte
Danke, das war es:
Zitat:
Dann habe ich mal eine Frage zum Einbinden von Objekten: Ich habe anhand ![]()
Delphi-Quellcode:
Kann mir bitte da jetzt noch jemand einen Tip geben?
procedure TForm1.Button1Click(Sender: TObject);
Var I : Integer; Bereich : TRect; CB : TCheckBox; begin I:=0; ListView1.Items.Add.Caption:='Test'; Bereich:=Listview1.Items[Pred(ListView1.Items.Count)].DisplayRect(drBounds); Bereich.left:=Bereich.Left + Listview1.columns[I].Width; Bereich.right:=Bereich.Left + Listview1.columns[Succ(I)].Width; CB:=TCheckBox.Create(self); CB.Parent:=Listview1; CB.BoundsRect:=Bereich; CB.Checked:=True; Listview1.items[Pred(ListView1.Items.Count)].Data:=CB; end; Denn dann müsste ich das nicht mehr - wie geplant - mit den Bildchen (ImageIndex) machen, sondern könnte direkt CheckBoxen in jeder Spalte verwenden... Gruß, Alex |
Re: TListView und Spalte
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe es jetzt fertig. Für alle die, die es gebrauchen können, habe ich den Quelltext beigefügt.
Ich würde mich aber immer noch freuen, wenn mir jemand einen Hinweis geben könnte, wie ich es mit TCheckBox in der Liste hinbekommen kann ... Gruß, Alex |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz