Anzeigen von Elementen mit Bildern und OnClick auf Bild

Rund um die LCL und andere Komponenten
Antworten
musicones
Beiträge: 35
Registriert: Di 8. Sep 2009, 09:13
OS, Lazarus, FPC: Win 10 (L 1.6.2 FPC 3.0.0)
CPU-Target: 64Bit

Anzeigen von Elementen mit Bildern und OnClick auf Bild

Beitrag von musicones »

Hallo,

ich bin mir gerade nicht sicher, welche Komponente ich für folgende Anforderungen nutzen kann.

1. Die Komponente sollte sich im Grunde visuell wie eine Listbox anfühlen und aussehen, ohne Kopfspalten etc.
2. Sie sollte mind. zwei Spalten halten können, später evtl. mehr.
3. In der ersten Spalte soll ein Icon (Bild 16x16) rein.
4. In der zweiten Spalte die eigentliche Information.
5. Beim Klick auf das Bildicon wird ein Ereignis ausgelöst auf das ich reagieren kann.
6. Ich möchte das Icon nicht während der Ausführung aus dem Dateisystem laden, es sollte also schon vorher da (Designzeit, Ressource) sein.
7. Nice to Have: Würde gerne auf Drittanbieter Komponenten verzichten.
Info: Wird benötigt zum Anzeigen von angemeldeten Clients. Beim Klick auf das Icon wird der Client vom Server abgemeldet.

Im Grund wäre TListbox mit Columns irgendwie schön, habe irgendwo gelesen, dass die Property zwar vorhanden ist,
aber derzeit keine Funktionalität dahinter steckt.

Kann das StringGrid evtl. mit Bildern umgehen? Vielleicht wäre ein TDBGrid über MemData möglich. Müsste nur wissen, wie ich das Bild in eine Zelle bekäme und ob ich das Aussehen eines Grid soweit minimalisieren kann, dass es wie eine Listbox aussieht (Spaltenlinien müssen nicht sichtbar sein)
Es gibt ja auch noch TCheckListbox, evtl. mit OwnerDraw?

Bin für alle Anregungen und Meinungen offen.

Danke und Gruß
Antonio

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Anzeigen von Elementen mit Bildern und OnClick auf Bild

Beitrag von Euklid »

Stringgrid erfüllt die meisten Anforderungen. Ich bin mir nicht sicher, inwiefern das mit den Icons funktioniert, kannst Du ja mal ausprobieren.

- Euklid

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Anzeigen von Elementen mit Bildern und OnClick auf Bild

Beitrag von Scotty »

TListBox, TListView und TStringGrid haben OwnerDraw-Fähigkeiten. Du kannst im Stringgrid im OnDrawCell-Ereignis zeichnen, was du willst (vgl. auch TDrawGrid). TListView hat verschiedene Methoden für die einzelnen Schritte.

"Beim Klick auf das ... wird ein Ereignis ausgelöst" ist IMHO ein falscher Ansatz. Besser ist es, den Klick auf die Zeile, sprich: auch die andere Spalte, zu verwenden. Ansonsten würde der Anwender vielleicht eine andere Reaktion bei Klick auf die Informationsspalte erwarten.

Ansonsten klingt deine Idee nach einem (Popup)Menü. Vielleicht willst du auch darüber nachdenken.

musicones
Beiträge: 35
Registriert: Di 8. Sep 2009, 09:13
OS, Lazarus, FPC: Win 10 (L 1.6.2 FPC 3.0.0)
CPU-Target: 64Bit

Re: Anzeigen von Elementen mit Bildern und OnClick auf Bild

Beitrag von musicones »

Vielen Dank für Eure Rückmeldungen.

Ich habe jetzt gute Tests mit dem TListView machen können.
[*]Property "Columns" habe ich auf zwei gesetzt
[*]Property "ColumnClick" auf true.
[*]Imagelist habe ich gesetzt.
[*]ViewStyle habe ich auf vsReport gesetzt.

Code: Alles auswählen

...
var
  NewItem: TListItem;
begin
    ...
    NewItem := MyView.Items.Add; // Neuer Eintrag im View
    NewItem.StateIndex := 1; // Index des Bildes in der Imagelist - 1. Spalte
    NewItem.SubItems.Add('Mein Text'); // Text in der 2. Spalte
    ...
end;
Ungetestet ist noch das OnClick und ja, es wird das OnClick der Spalte und nicht des Bildes genutzt.
Die Beschreibung war nur zum veranschaulichen gedacht. Ich denke das geht jetzt unproblematisch weiter.

musicones
Beiträge: 35
Registriert: Di 8. Sep 2009, 09:13
OS, Lazarus, FPC: Win 10 (L 1.6.2 FPC 3.0.0)
CPU-Target: 64Bit

Re: Anzeigen von Elementen mit Bildern und OnClick auf Bild

Beitrag von musicones »

musicones hat geschrieben: Ungetestet ist noch das OnClick und ja, es wird das OnClick der Spalte und nicht des Bildes genutzt.
Die Beschreibung war nur zum veranschaulichen gedacht. Ich denke das geht jetzt unproblematisch weiter.
Da habe ich mich wohl geirrt. Ich bekomme das OnColumnClick nicht zum Ausführen. Hat jemand ne Idee, ob man noch was setzen muss, ausser der property "ColumnClick"?

EDIT: Ok, da habe ich mich vollends geeirt. ColumnClick fängt einen Klick auf den Spaltenkopf ab. Was ich benötige wäre eine Art onCellClick oder OnItemClick mit Spaltenangabe oder ähnliches. Etwas das mir genau zurückliefert worauf ich geklickt habe.

Danke und Gruß
Antonio

musicones
Beiträge: 35
Registriert: Di 8. Sep 2009, 09:13
OS, Lazarus, FPC: Win 10 (L 1.6.2 FPC 3.0.0)
CPU-Target: 64Bit

[gelöst] Anzeigen von Elementen mit Bildern und OnClick auf

Beitrag von musicones »

So, letztendlich habe ich mich für ein TStringGrid entschieden und mittlerweile alle Probleme ausgeräumt.

So habe ich es gemacht:

StringGrid wie folgt eingestellt:
[*] Property: Columns - zwei eingetragen
[*] Property: FixedCols - 0
[*] Property: FixedRows- 0
[*] Property: Options|RowSelect - true
[*] Property: Options|RowSelect - true
[*] Property: Options|VertLine - false
[*] Property: Options|HorzLine - false

Damit sieht es in etwa aus wie eine Listbox.

Code: Alles auswählen

...
  { Auotsize LastColumn }
  Grid.Columns[1].Width := Grid.Parent.Width - Grid.Columns[0].Width - 20;
...
Die erste Spalte soll eine fixe Breite haben, da dort das Icon reinkommt.
Die Breite der zweiten Spalte berechne ich entsprechend so breit das Parent Control ist - der ersten Spalte und da ich noch die verticale Scrollbar
anhabe - 20, dann ist das in etwa so wie mir das vorschwebt.

Code: Alles auswählen

procedure TForm1.GridDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
var TopPos, LeftPos: integer;
begin
  { Draw Image from Imagelist into first Column }
  if (aCol = 0) then
  begin
    TopPos := aRect.Top;
    LeftPos := (aRect.Right div 2) - 8;
    ImageList1.Draw(Grid.Canvas,LeftPos,TopPos,0);
  end;
end;
Hier zeichne ich in die erste Spalte jeder Zeile das Bild Index = 0 aus der Imagelist ein.
LeftPos berechne ich um das Bild zu zentrieren. Ich nutze ein Icon 16x16, deshalb - 8.

Code: Alles auswählen

procedure TForm1.GridClick(Sender: TObject);
begin
  if (Grid.Col = 0) then
  showMessage(
    'Grid OnClick' + LineEnding +
    'Zeile:  ' + IntToStr(Grid.Row) + LineEnding +
    'Spalte: ' + IntToStr(Grid.Col) );
Bei jedem Click auf das Grid prüfe ich, ob ich auf die erste Spalte geklickt habe und gebe zum Test hier einfach ein ShowMessage mit aktueller Spalte und Zeile aus. Damit kann ich auf das OnClick einer Spalte reagieren und weiß auch um welche Zeile es sich handelt.

Damit sind alle meine Anforderungen erfüllt.

Gruß
Antonio

Antworten