Anzeigen von Elementen mit Bildern und OnClick auf Bild
-
- 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
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
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
-
- 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
Stringgrid erfüllt die meisten Anforderungen. Ich bin mir nicht sicher, inwiefern das mit den Icons funktioniert, kannst Du ja mal ausprobieren.
- Euklid
- Euklid
-
- 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
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.
"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.
-
- 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
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.
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.
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;
Die Beschreibung war nur zum veranschaulichen gedacht. Ich denke das geht jetzt unproblematisch weiter.
-
- 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
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"?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.
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
-
- 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
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.
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.
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.
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
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 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;
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) );
Damit sind alle meine Anforderungen erfüllt.
Gruß
Antonio