AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TListView und Spalte

Ein Thema von Schwedenbitter · begonnen am 29. Okt 2009 · letzter Beitrag vom 4. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

TListView und Spalte

  Alt 29. Okt 2009, 15:59
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
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
Alex Winzer
  Mit Zitat antworten Zitat
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#2

Re: TListView und Spalte

  Alt 29. Okt 2009, 16:09
sei mir nicht böse aber WAS GENAU benutzt du jetzt?
Checkboxen? Comboboxen? Listboxen? listviews?

Ich hab grad keine ahnung

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
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#3

Re: TListView und Spalte

  Alt 29. Okt 2009, 16:23
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?
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: TListView und Spalte

  Alt 29. Okt 2009, 16:43
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
Miniaturansicht angehängter Grafiken
bild_175.png  
Alex Winzer
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: TListView und Spalte

  Alt 29. Okt 2009, 22:56
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.

Wieso klappt das nicht?
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

Re: TListView und Spalte

  Alt 29. Okt 2009, 23:06
Ich habe die Logik jetzt nicht bis ins Letzte nachvollzogen, aber müsstest Du nicht X prüfen statt Y?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: TListView und Spalte

  Alt 29. Okt 2009, 23:43
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
Angehängte Dateien
Dateityp: zip tlistview_p_172.zip (3,7 KB, 6x aufgerufen)
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#8

Re: TListView und Spalte

  Alt 30. Okt 2009, 00:00
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

Re: TListView und Spalte

  Alt 30. Okt 2009, 03:50
Du könntest statt der ListView auch einen VirtualTreeView nehmen
> ich weiß "Tree", aber sie läßt sich auch als "List" verwenden

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.
$2B or not $2B
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: TListView und Spalte

  Alt 30. Okt 2009, 08:10
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
Alex Winzer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 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