AGB  ·  Datenschutz  ·  Impressum  







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

Ein paar Fragen zu TListView

Ein Thema von Opa Knack · begonnen am 11. Apr 2005 · letzter Beitrag vom 11. Apr 2005
Antwort Antwort
Opa Knack

Registriert seit: 28. Dez 2004
Ort: Köln
166 Beiträge
 
#1

Ein paar Fragen zu TListView

  Alt 11. Apr 2005, 09:19
Hallo,

ich habe zwar ein paar Lösungen gefunden, wie dies mit anderen Komponenten umgesetzt werden kann, aber rein zum ListView bislang nichts:

1.) Ich möchte gerne die einzelnen Einträge im ListView miteinander austauschbar machen (Drap/Drop). Dabei sollen die "Verschiebe"-Aktionen mit einem Event gekoppelt sein, da dieses ListView quasi nur die "vorzeigbare" Version eines StringGrids darstellt. In diesem StringGrid habe ich pro Zeile x Daten, und jede Zeile im StringGrid wird als Item im ListView dargestellt. Es soll also nun folgendes funktionieren:

- Item in Zeile 4 des ListViews wird in Zeile 2 verschoben
- Dabei wird "im Hintergrund" im StringGrid die Zeile 4 in die Zeile 2 verschoben

Egal, welche Möglichkeit ich ausprobiere, ich komme dabei einfach nicht weiter.

2.) Ich möchte im ListView nur eine Spalte darstellen. Den Eintrag mache ich mit

Delphi-Quellcode:
 
ItemNeu := Gliederung.Items.Add;
ItemNeu.Caption := Inhalt;
ItemNeu.ImageIndex := Grafik;
wobei "Inhalt" dem Text entspricht, der ausgewiesen werden soll, Grafik dem ImageIndex einer ImageList und Gliederung dem ListView. Wenn ich nun mittels Gliederung.Columns[0]; (direkt vor dem o.a. Quelltext) die Spalte auf die erste setze, bringt mich das überhaupt nicht weiter (ist wahrscheinlich mal wieder ein popeliger Denkfehler).

Hat jemand eine Idee, wo der Fehler liegt?

Danke
Opa
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#2

Re: Ein paar Fragen zu TListView

  Alt 11. Apr 2005, 12:23
bei erstens kann ich dir leider nicht helfen und bei zweitens hab ich kein Wort verstanden. Zur Designzeit kannst du Doppelklick auf eine Listview machen, dann kannst du die Spalten bearbeiten. Um die Listview im Spaltenmodus anzuzeigen muss der ListViewstyle (weiß jetzt nicht welche Eigenschaft, glaube aber ViewStyle) auf Report gesetzt werden.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: Ein paar Fragen zu TListView

  Alt 11. Apr 2005, 14:54
Zitat von Opa Knack:
Hallo,

ich habe zwar ein paar Lösungen gefunden, wie dies mit anderen Komponenten umgesetzt werden kann, aber rein zum ListView bislang nichts:
die suche zu Hier im Forum suchenlistview drag soll wirklich nichts finden ?

Zitat:
1.) Ich möchte gerne die einzelnen Einträge im ListView miteinander austauschbar machen (Drap/Drop).
Listview-dragmode auf dmautomatik und auf die Schnelle (behandelt nur ein selektiertes item, nicht alle):
Delphi-Quellcode:

procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  accept:=source is TListView;
end;

procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var Src_LV,Dest_LV:TListview;
    item,dest_item:TListItem;
    index:integer;
begin
  if source is Tlistview then
    begin
      src_lv:=TListView(Source);
      dest_lv:=TListView(sender);

      if Src_LV.Selected<>nil then
        begin
          //ganz einfach, nur das selektierte iterm behandeln
          //einzzufügende Position bestimmen
          item:=Dest_LV.GetItemAt(x,y);
          if item<>Nil then
            begin
              index:=item.Index;
              //wenn source=Sender, also das gleich listview, noch die Position anpassen,
              if (source=Sender) and (item.index>Src_LV.Selected.index) then
                index:=item.Index+1;
              dest_item:=Dest_LV.items.Insert(index)
            end
           else
            dest_item:=Dest_LV.items.add;
          //inhalt kopieren
          dest_item.Assign(Src_LV.Selected);
          //und item löschen
          Src_LV.DeleteSelected;
        end;
    end;
end;
Zitat:
Dabei sollen die "Verschiebe"-Aktionen mit einem Event gekoppelt sein, da dieses ListView quasi nur die "vorzeigbare" Version eines StringGrids darstellt. In diesem StringGrid habe ich pro Zeile x Daten, und jede Zeile im StringGrid wird als Item im ListView dargestellt. Es soll also nun folgendes funktionieren:

- Item in Zeile 4 des ListViews wird in Zeile 2 verschoben
- Dabei wird "im Hintergrund" im StringGrid die Zeile 4 in die Zeile 2 verschoben
Wie du in einem grid zeilen austauschst: rows sind Tstrings und die kennen move, von und nach hast du ja anhand der item.index. Obwohl das eher nach einem design-problem aussieht, warum nicht auch ein grid zum auzeigen?

Mfg Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#4

Re: Ein paar Fragen zu TListView

  Alt 11. Apr 2005, 15:02
Wieso brauchste eine Vorzeigkomponente? Wenn du schon mit einem StringGrid arbeitest, dann bleib doch auch dabei. Du kannst ein StringGrid doch auch wie eine ListView aussehen lassen.
  Mit Zitat antworten Zitat
Opa Knack

Registriert seit: 28. Dez 2004
Ort: Köln
166 Beiträge
 
#5

Re: Ein paar Fragen zu TListView

  Alt 11. Apr 2005, 15:29
Hallo,

erst einmal Danke für die Antworten.

Ich nutze ein ListView, weil ich das StringGrid nur als temporäre Ablage für die Eigenschaften der vorhandenen Einträge nutze. Beispiel:

Jedes Element, welches eingegeben wird, verfügt über 15 Eigenschaften. In meinem StringGrid habe ich 16 Spalten: Eine für die Bezeichnung des Elements, und 15 für die Eigenschaften.

In der ListView wird nur das Element selbst angezeigt, die Eigenschaften brauche ich hier nicht. Theoretisch in etwa wie ein Adressbuch, wo ich in einer Übersicht nur den Namen sehen kann, die eigentlichen Daten dahinter aber in einer versteckten Tabelle untergebracht sind.

Nun sollen die Namen aber in Relation zueinander gebracht werden können, so dass ich mir eigene "Gruppen" anlegen kann ("der Schmitz kommt in der Liste direkt nach dem Meier, weil die zusammensitzen, ..."). Werden diese verschoben, muss sich ja auch die entsprechende Zeile im StringGrid verschieben, damit diese Sortierung nach einem Speichern weiterhin Bestand hat.

So, jetzt aber zum Problem:

Die Lösungen, die ich im Forum finden konnte, erfüllen meine Anforderungen nur zum Teil.

Die Lösung, die Keldorn gepostet hat, funktioniert zwar ansatzweise, jedoch habe ich dann im ListView das Problem, dass das Verschieben nicht hundertprozentig funktioniert (wenn ich z. B. bei 3 Einträgen den ersten zwischen den zweiten und dritten schieben will, funktioniert's nicht) und dass Leerzeilen entstehen, die natürlich auch nicht viel Sinn machen.

Die Leerzeilen kann ich zwar wahrscheinlich irgendwie "herausfiltern", aber wie kann ich das Drag/Drop so umsetzen, dass die Items auch zwischeneinander platziert werden können?

Oder:

Hat jemand eine andere Idee, wie ich das oben geschilderte Vorhaben umsetzen könnte? Ich habe ListView gewählt, weil ich da noch vor jedem Item eine Grafik einbinden kann, was ich auf jeden Fall brauche. Außerdem sollen die Eigenschaften der einzelnen Elemente nicht sichtbar sein.

Danke
Opa
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Ein paar Fragen zu TListView

  Alt 11. Apr 2005, 17:56
Hai Opa Knack,

schaue Dir doch mal die Eigenschaft .Data an. Damit kannst Du z.B. ein Objekt an ein Item koppeln.
Hier mal ein kleines Beispiel:
Delphi-Quellcode:
type
  TEigenschaften = class (TObject)
    public
    Eigenschaft1 : String;
    Eigenschaft2 : Integer;
    Eigenschaft3 : String;
  end;

// Neuen Eintrag in die ListView
// Edit1 = Titel
// Edit2 = Eigenschaft 1
// Edit3 = Eigenschaft 2
// Edit4 = Eigenschaft 3
procedure TForm1.Button1Click(Sender: TObject);
var
  eigenschaften : TEigenschaften;
  eintrag : TListItem;
begin
  eintrag := ListView1.Items.Add;
  eintrag.Caption := Edit1.Text;
  eigenschaften := TEigenschaften.Create;
  with eigenschaften do
  begin
    Eigenschaft1 := Edit2.Text;
    Eigenschaft2 := StrToInt (Edit3.Text);
    Eigenschaft3 := Edit4.Text;
  end;
  eintrag.Data := eigenschaften;
end;

// Die Eigenschaften wieder auslesen
procedure TForm1.ListView1Click(Sender: TObject);
var
  eigenschaften : TEigenschaften;
begin
  eigenschaften := ListView1.Items[ListView1.ItemIndex].Data;
  Edit2.Text := eigenschaften.Eigenschaft1;
  Edit3.Text := IntToStr (eigenschaften.Eigenschaft2);
  Edit4.Text := eigenschaften.Eigenschaft3;
end;

// Wenn Eintrag gelöscht wird denn Speicher für die
// Eigenschaften freigeben
procedure TForm1.ListView1Deletion(Sender: TObject; Item: TListItem);
var
  eigenschaften : TEigenschaften;
begin
  eigenschaften := Item.Data;
  eigenschaften.Free;
end;

// Und den Speicher wieder aufräumen
procedure TForm1.FormDestroy(Sender: TObject);
var
  ndx : Integer;
  eigenschaften : TEigenschaften;
begin
  for ndx := 0 to Pred (ListView1.Items.Count) do
  begin
    eigenschaften := ListView1.Items[ndx].Data;
    eigenschaften.Free;
  end;
end;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:31 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