Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Ranking Komponente gesucht, bzw. wie kann man sowas umsetzen? (https://www.delphipraxis.net/176071-ranking-komponente-gesucht-bzw-wie-kann-man-sowas-umsetzen.html)

juergen 10. Aug 2013 12:40


Ranking Komponente gesucht, bzw. wie kann man sowas umsetzen?
 
Hallo zusammen,

momentan nutze ich eine Combobox mit der Auswahl einer entsprechenden Bewertung als reine Textauswahl (1 - 5 Sterne, in 0,5er Schritten).
Benutzerfreundlich ist das nicht, bzw. sieht eine Bewertung über grafische "Sterne" einfach besser aus.
Nun dachte ich es gibt schon etwas fertiges. In meiner TMS Sammlung habe ich auch eine Trackbar gefunden, die sieht aber nicht "schön" aus.

Kennt jemand etwas "fertiges"? Oder sollte ich mir über eine ImageList jeweils 10 gelbe und 10 weiße Sterne-Icons verwalten. Und je nachdem wo der Anwender in z.B. einem Panel dann hin klickt, ermittle ich die Mausposition und setze im Wechsel das passende Icon aus der ImageList...???

Vielen Dank vorab schon mal für Tipps und Vorschläge!

Furtbichler 10. Aug 2013 13:33

AW: Ranking Komponente gesucht, bzw. wie kann man sowas umsetzen?
 
Da das sehr einfach umzusetzen ist, würde ich es mal eben selbst bauen. Du kannst auch einfach einen weißen und einen roten Stern als Bitmap nehmen und die dann hintereinander zeichnen.

Vielleicht verwendest Du einfach eine TPaintbox und überschreibst sowohl die Click- als auch die Paint-Methode. Die OnClick-Methode nimmt Maus-X, relativ zur Paintbox und teilt sie durch 5. das ist die Anzahl der Sterne (+1), die die Paint-Methode dann zeichnen muss.

Eine Form, eine Paintbox und eine Imagelist mit zwei Bitmaps: Weißer und gelber Stern.

Delphi-Quellcode:
Procedure TForm14.PaintBoxClick(Sender: TObject);
Var
  p: TPoint;
  pb: TPaintBox;

Begin
  pb := Sender As TPaintBox;
  p := pb.ScreenToClient(Mouse.CursorPos);
  pb.tag := p.x Div (pb.Width Div 5);
  pb.Invalidate;
End;

Procedure TForm14.PaintBoxPaint(Sender: TObject);
Var
  stars: Integer;
  canvas: TCanvas;
  bounds: TRect;
  I, wd: Integer;

  Procedure _PaintStar(PaintClickedStar: Boolean; x: Integer);
  Var
    imageIndex: Integer;

  Begin
    If PaintClickedStar Then
      imageIndex := 1
    Else imageIndex := 0;

    ImageList.Draw(canvas, x + 2, 2, imageIndex, dsTransparent, itImage);
  End;
Begin

  canvas := (Sender As TPaintBox).Canvas;
  stars := (Sender As TPaintBox).Tag;
  bounds := (Sender As TPaintBox).BoundsRect;
  OffsetRect(bounds, -bounds.left, -bounds.top);
  canvas.Brush.Color := clWhite;
  canvas.Rectangle(bounds);
  wd := bounds.Right Div 5;
  For I := 0 To 4 Do
    _PaintStar(i <= stars, i * wd);
End;

juergen 10. Aug 2013 13:58

AW: Ranking Komponente gesucht, bzw. wie kann man sowas umsetzen?
 
Hallo Furtbichler,

oh, vielen Dank für deine Mühe und es funktioniert auf Anhieb! :thumb:
Dein Ansatz ist etwas anders wie ich es gemacht hätte.
Bis jetzt hatte ich noch nie mit einer Paintbox gearbeitet...
Was ich jetzt auf die Schnelle nicht gefunden habe:
Wie bekomme ich den Rahmen von der Paintbox weg?

Furtbichler 10. Aug 2013 14:01

AW: Ranking Komponente gesucht, bzw. wie kann man sowas umsetzen?
 
Die Paintbox dient nur als 'proof-of-concept' Du kannst Dir eine eigene Komponente von TControl ableiten, glaube ich. Oder Du machst das als TImage lädst eine statische Bitmap mit der entsprechenden Größe (24x120 für 5 24x24 Sterne) und zeichnest in den Canvas der Bitmap.

sx2008 10. Aug 2013 21:27

AW: Ranking Komponente gesucht, bzw. wie kann man sowas umsetzen?
 
Denk auch dran, dass es im Unicode Zeichensatz teilweise recht hübsche Zeichen gibt.
✮✮✮✮⭐⭐⭐
✹✹✹✹
▶▶▶▶▷
◖◗
★★★★☆
☻☻☻☻☻☺
⚫⚫⚫⚫⚪
⬛⬛⬛⬛⬜

Das vergisst man manchmal obwohl man damit einfacher zum Ziel kommt.

Namenloser 11. Aug 2013 06:00

AW: Ranking Komponente gesucht, bzw. wie kann man sowas umsetzen?
 
Da muss man aber aufpassen, dass man auch eine Schrift hat, die die Zeichen enthält. Bei mir werden z.B. bei deinen Beispielen in den ersten und letzten zwei Zeilen nur Kästchen angezeigt...

juergen 11. Aug 2013 11:10

AW: Ranking Komponente gesucht, bzw. wie kann man sowas umsetzen?
 
Hallo zusammen,

danke für eure Hinweise.
Ich hatte gestern den Ansatz von Furtbichler weiter verfolgt.
Damit bin ich flexibel was die Optik der Sterne betrifft und dem Hintergrund.

Aber das Ganze ist dann doch nicht ganz so einfach. Ich benötige auch halbe Sterne, da üblicherweise in "halben Sternen-Schritten" bewertet wird. Weiterhin muss es auch möglich sein die Bewertung wieder komplett zurück zu setzen (keine Sterne).
Ich bin da schon einiges weiter gekommen aber noch nicht ganz fertig.
Meine Grundidee dabei ist, dass der Bereich von einem Stern in 3 "Mausklick-Zonen" aufgeteilt wird. Wenn man im linken 1/3 klickt wird der "leere" Stern gesetzt, im 2/3-Bereich eines Sternes wird der halbe Stern gesetzt und im letzten Drittel der volle Stern.
Weiterhin muss im MouseMove-Event am Mauszeiger der Wert als "Vorschau" angezeigt werden, ohne die Bewertung zu setzen, das erfolgt erst nach einem Klick.
Leider habe ich heute und kommende Woche keine Zeit und muss dann später weiter machen.

Nochmals mein Dank an alle und noch einen schönen Sonntag! :dp:

Union 11. Aug 2013 11:41

AW: Ranking Komponente gesucht, bzw. wie kann man sowas umsetzen?
 
Du könntest ein TcxProgressbar mit Properties.BarStyle = cxBsBitmap einsetzen. Dann die MouseEvents auswerten und das ganze als Trackbar mißbrauchen.
Delphi-Quellcode:
cxProgressBar1.Position := trunc(X*(cxProgressBar1.Properties.Max-cxProgressBar1.Properties.Min)/cxProgressBar1.Width);

Furtbichler 11. Aug 2013 11:58

AW: Ranking Komponente gesucht, bzw. wie kann man sowas umsetzen?
 
Zitat:

Zitat von juergen (Beitrag 1224299)
Aber das Ganze ist dann doch nicht ganz so einfach. Ich benötige auch halbe Sterne, da üblicherweise in "halben Sternen-Schritten" bewertet wird.

Im Beispiel wird die Komponente in 5 Teile geteilt.

Teile sie in 10 Teile. Dann ergibt das einen 'Sternindex von 1..10'. Dann zeichnest Du 'Sternindex/2' ganze Sterne und wenn 'Sternindex' ungerade ist, noch einen halben Stern hinten dran.

Um die Bewertung zurückzusetzen, kannst Du
- einen Button 'Zurücksetzen' dazupacken,
oder
- den Bereich in 11 Teile zeilen (dann ergibt das einen Sternenindex von 1..11'). Du ziehst eins ab, wenn das Ergebnis 0 ist, dann zeichnest Du keinen Stern. Die Komponente ist dann etwas breiter, weil links ein kleines (halbe Sternbreite) Feld leer ist, in das man hineinklickt, um 0 Sterne zu vergeben.
oder
- prüfst einfach, ob Mouse.X < 5 (pixel) ist. Wenn ja, sind es 0 sterne, ansonsten wie gehabt. Man vergibt also 0 Sterne, wenn man auf den ersten Stern links klickt.

juergen 11. Aug 2013 16:34

AW: Ranking Komponente gesucht, bzw. wie kann man sowas umsetzen?
 
@Union,
diese Art der Umsetzung ist ein ganz neuer Ansatz, da ich die "DevExpress-Dinger" auch habe! Die cxBsBitmap-Propertie habe ich noch nie genutzt, bzw. kannte diese auch gar nicht. Werde ich mir anschauen sobald ich wieder etwas Zeit habe. Vielen Dank. :thumb:

@Furtbichler,
dein Ansatz ist ähnlich dem, was ich schon angefangen habe. Nochmals vielen Dank! :thumb:


Cool dass ich 2 völlig verschiedene schöne Lösungsansätze habe. :dp:

Gruss
Jürgen


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:37 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