AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Ranking Komponente gesucht, bzw. wie kann man sowas umsetzen?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von juergen · begonnen am 10. Aug 2013 · letzter Beitrag vom 11. Aug 2013
Antwort Antwort
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#1

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

  Alt 10. Aug 2013, 13:40
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!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)

Geändert von juergen (10. Aug 2013 um 14:06 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

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

  Alt 10. Aug 2013, 14:33
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;
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 10. Aug 2013, 14:58
Hallo Furtbichler,

oh, vielen Dank für deine Mühe und es funktioniert auf Anhieb!
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?
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

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

  Alt 10. Aug 2013, 15:01
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.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

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

  Alt 10. Aug 2013, 22:27
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.
fork me on Github
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

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

  Alt 11. Aug 2013, 07:00
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...
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 11. Aug 2013, 12:10
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!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#8

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

  Alt 11. Aug 2013, 12:41
Du könntest ein TcxProgressbar mit Properties.BarStyle = cxBsBitmap einsetzen. Dann die MouseEvents auswerten und das ganze als Trackbar mißbrauchen.
cxProgressBar1.Position := trunc(X*(cxProgressBar1.Properties.Max-cxProgressBar1.Properties.Min)/cxProgressBar1.Width);
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#9

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

  Alt 11. Aug 2013, 12:58
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.
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 11. Aug 2013, 17:34
@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.

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


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

Gruss
Jürgen
Jürgen
  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 06:33 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