Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 146
Erhaltene Danke: 5



BeitragVerfasst: Fr 15.06.18 22:41 
Hallo zusammen,
Unter der Frage "ImageList - schnelle Anzeige" habe ich zum Abschluss ein lauffähiges Beispiel beigefügt. Dort wird eine StrinGrid-Liste mit Dateinamen angezeigt und in einer Listview die zugehörigen Icons. Die beiden Listen sind in ihrer Reihenfolge synchron.
Mein Wunsch ist diese beiden Ansichten optisch zu synchronisieren. D.h. wird in StringGrid eine Zeile angeklickt (sie färbt sich ein), so soll das Icon in der Listview markiert werden und in den sichtbaren Bereich verschoben werden. Genau so auch umgekehrt: Item anklicken bewirkt StringListzeile markieren.
Hinweis: Row in StringGrid entspricht ItemIndex in der Listview. Hat jemand eine Idee?
Danke und Gruß hRb
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3884
Erhaltene Danke: 789

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Sa 16.06.18 17:13 
Ich hatte gerade unter ListView Item EnsureVisible funktioniert nicht eine ähnliche Frage beantwortet (wenn auch für C#). Aber mit den Stichworten "EnsureVisible", "TopItem" und evtl. "ScrollTo(View)" müßtest du auch bei den VCL-Controls weiterkommen.
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 146
Erhaltene Danke: 5



BeitragVerfasst: Mi 07.11.18 22:22 
Hallo Th69 und alle im Forum,
mit Ensurevisible und ScrollTo bin entweder ich gescheitert oder mein Delphi Berlin 10.1 wollte meinen Code nicht compilieren. Aber mit
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
// StringGrid in Bildmitte scrollen
  with StrinGrid1 do begin 
   vScroll:= Arow - ((VisibleRowCount-5div 2);
   visible:=false;  // zur Beschleunigung
     Perform(WM_VSCROLL, SB_TOP, 0); 
     for i:=2 to vScroll{ARow} do
     Perform(WM_VSCROLL, SB_LINEDOWN, 0); 
   visible:=true;
  end;

funktionierte es. Damit war aber nur ein Teil meines Problems gelöst. Lange habe ich benötigt, um auch optisch die Objekte gleichzuschalten.
Mir wurde bei vielen Fragen in diesem Forum geholfen. Oft war es ein Rat, manchmal fertige Befehlsfolgen. Als Autodidakt war ich immer für lauffähigen Code dankbar. Deshalb stelle ich für andere nun mein über viele Monate entwickeltes Programm zur Verfügung (siehe Anhang). Es eignet sich zum Sortieren und Umbenennen von Bildern. Im Code finden sich zahlreiche Lösungen für unterschiedliche Fragen die ich in letzter Zeit hier gestellt habe. Vielleicht ist nicht immer alles elegant gelöst, aber funktionsfähig. Im zip-Ordner sind alle Dateien enthalten (übersetz mit Berlin 10.1, ebenso eine lauffähige exe).
Anmerkung: ich habe zwar mit Delphi7 begonnen, inzwischen sind jedoch Objekte enthalten, die mit D7 nicht mehr compilierbar sind. PS: einige Wünsche bleiben dennoch.
Mein besonderer Dank gehen an Frühlingsrolle und jaenicke.
hRb
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Frühlingsrolle, Mathematiker
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2088
Erhaltene Danke: 381

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 08.11.18 19:34 
Gern geschehen. :beer:
Ein Problem beim Neuladen eines Ordners habe ich feststellen müssen:
Sobald ein Ordner, indem sich Bilder befinden, ausgewählt wurde, unter Dateianzeige-Selektion die Auswahl auf Filter frei wählen (*.) gesetzt wurde und der MainMenu Punkt OrdnerNeuLaden geklickt wurde, meldete das Programm, dass der Ordner leer sei, was er nicht ist.

Nachtrag

Wie Th69 bereits erwähnte, gibt es in Delphi ähnliche Befehle zum Scrollen der ListView an eine bestimmte Stelle:

ausblenden Delphi-Quelltext
1:
2:
ListView.Items[SomeIndex].Selected := true;
ListView.Items[SomeIndex].MakeVisible(false);

Die Methode EnsureVisible() gibt es auf direktem Wege nicht, jedoch könnte man dafür die Nachricht LVM_ENSUREVISIBLE abschicken:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
const
  LVM_ENSUREVISIBLE = $1013;
begin
  SendMessage(ListView.Handle, LVM_ENSUREVISIBLE, SomeIndex, 0);
  // bzw. 
  ListView.Perform(LVM_ENSUREVISIBLE, SomeIndex, 0);
end;

Oder man ruft das ListView_EnsureVisible() Makro auf, welches intern die Nachricht versendet:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
uses
  CommCtrl;

begin
  ListView_EnsureVisible(ListView.Handle, SomeIndex, false);
end;

Die Eigenschaft TopItem kennt die TListView unter Delphi zwar, kann aber nur gelesen werden!

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 146
Erhaltene Danke: 5



BeitragVerfasst: So 11.11.18 20:45 
Hallo Frühlingsrolle,
Zitat:
Ein Problem beim Neuladen eines Ordners habe ich feststellen müssen:

Nun, im Grunde macht das Programm das was es soll: in der FileListBox stehen alle Dateien des eingelesenen Ordners, während über die FilterComboBoxErw (Parameter Filter) lediglich die Auswahl selektiert wird. Solange ins angewählte Verzeichnis nicht durch andere Programme (z.B. Explorer) keine neuen Dateien hinzukommen oder gelöscht werden, besteht also überhaupt kein Anlass die Funktion "OrdnerNeuLaden" anzustoßen (dafür war sie gedacht = Kurzanwahl).
In FilterComboBoxErw.Filter stehen feste, vorgegebene Dateiendungen zur Auswahl. Als Erkennungsmerkmal für das Freie-Filter habe ich '*.' gewählt. Nach Aktivierung nutzt das Programm als Erweiterung die Werte aus Edit1.Text (standardmäßig würde es '*.' nutzen, also keine Dateianzeige). Genau dies geschieht jedoch beim OrdnerNeuLaden.

Dennoch, ich gebe ich, '*.' ist unglücklich gewählt. Das "Problem gegen Fehlbedienung" ist jedoch leicht zu beheben:
1. Ersetze in der FilterComboBoxErw.Filter den Teiltext 'Filter frei wählen (*.)|*.' gegen 'Filter frei wählen (*.**)|*.**', also zweimal ** im Suffix. Damit sollte das Problem weg sein.
2. Wichtiger erscheint mir den Meldetext zu verbessern, nämlich in:
'Dieses Verzeichnis ist entweder leer oder enthält keine Dateien mit der gewählten Dateiendung. ' + FileListBox1.Mask + ' Eventuelle Unter-Verzeichnisse werden hier nicht angezeigt.'

Danke für die weiteren Tipps. Verstehe nicht, warum man diese Art der Positionierung in der Hilfe nicht findet. Genannte Befehle funktionieren, sind vielleicht auch ein wenig schneller, allerdings scrollt meine Befehlsfolge das markierte Objekt in Bild-Mitte, während die vorgestellten Löungen u.U. am unteren oder oberen Rand "kleben".
hRb
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2088
Erhaltene Danke: 381

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 13.11.18 23:40 
Du könntest schaun, ob der aktuelle Index den Wert 0 hat, dann könntest du die ListView ganz nach oben/links scrollen:

ausblenden Delphi-Quelltext
1:
ListView.Perform(WM_VSCROLL, SB_TOP, 0);					

Ebenso nach unten/rechts, wenn der aktuelle Index gleich .Items.Count - 1 entspricht:

ausblenden Delphi-Quelltext
1:
ListView.Perform(WM_VSCROLL, SB_BOTTOM, 0);					

Ansonsten, wie bereits erwähnt.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)