Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TListView und Spalte (https://www.delphipraxis.net/142510-tlistview-und-spalte.html)

Schwedenbitter 29. Okt 2009 15:59


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

stho 29. Okt 2009 16:09

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

Andreas L. 29. Okt 2009 16:23

Re: TListView und Spalte
 
Zitat:

Zitat von stho
Ich persönlich habs noch net geschafft in einem Listview objekte zu hinterlegen. in einer listbox geht das einfacher ^^

Objekte kannst du ganz einfach der Data-Eigenschaft eines Items zuweisen.
Delphi-Quellcode:
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...
Oder meinst du visuelle Objekte die in der ListView angezeigt werden sollen?

Schwedenbitter 29. Okt 2009 16:43

Re: TListView und Spalte
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von stho
sei mir nicht böse aber WAS GENAU benutzt du jetzt?

Bin ich nicht! -> TListView

Also ich kann den einzelnen Zellen Bilder zuweisen und die auch ändern (lassen)
Delphi-Quellcode:
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;
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.

Gruß, Alex

Schwedenbitter 29. Okt 2009 22:56

Re: TListView und Spalte
 
Ich habe es jetzt so probiert
Delphi-Quellcode:
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;
Ich bekomme aber immer eine '0' ausgegeben. :wall:

Wieso klappt das nicht?

DeddyH 29. Okt 2009 23:06

Re: TListView und Spalte
 
Ich habe die Logik jetzt nicht bis ins Letzte nachvollzogen, aber müsstest Du nicht X prüfen statt Y?

Schwedenbitter 29. Okt 2009 23:43

Re: TListView und Spalte
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von DeddyH
... aber müsstest Du nicht X prüfen statt Y?

Genau das! Jetzt klappt es ... fast.

Ich habe jetzt aber immer noch 2 Probleme:
  • Zum einen läuft die Schleife von 0 bis Anzahl der Spalten - 1. In meinem Fall sind es 7 Spalten, so dass die Schleife bis 6 laufen müsste. Bis zu 6. Spalte stimmt die Ausgabe (=5). In der 7. Spalte kommt aber 7, was falsch ist.
  • Wenn ich die Größe der Spalten zur Laufzeit ändere, passen die Werte nur noch bis zur letzten geänderten Spalte. Da aber auch bis zum Ende. Ich verstehe das nicht
Ich habe deshalb mal den Quellcode beigefügt.

Alex

DeddyH 30. Okt 2009 00:00

Re: TListView und Spalte
 
Probier es mal so:
Delphi-Quellcode:
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;
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.

himitsu 30. Okt 2009 03:50

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.

Schwedenbitter 30. Okt 2009 08:10

Re: TListView und Spalte
 
Zitat:

Zitat von DeddyH
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.

Auch hier hast Du mal wieder ins Schwarze getroffen. Der Code funktioniert jetzt. CurCol ist nicht erforderlich. Ich habe das über eine Abfrage gelöst. Denn CurCol wäre sonst auch am Ende evtl. 0 und ich könnte nicht prüfen, ob außerhalb der Spalten geklickt wurde. Habe es jetzt so gemacht:
Delphi-Quellcode:
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;
@himitsu
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz