OnClick Ereignis nur für rechte Maustaste ?


#1
Hallo.
Hab in der Suche leider nichts gefunden, aber vielleicht weiß ja jemand bescheid.
Möchte ein OnClick Ereignis (für ein TEdit Feld) haben, aber eben nur, wenn die rechte Maustaste gedrückt wird (und nicht die linke).
Denn wenn man mit der linken Maustaste darauf drückt, soll ja die Eingabe möglich sein.
(bei der rechten soll dann ein Fenster mit einer Hilfe-Message aufgehen o. ä. )

Vielen Dank für jeden Tipp schon mal!
Jupp :)
 
#2
Das kommst du mit dem reinen "OnClick()" leider nicht ganz weiter, denn dieses Ereignis ist fest definiert als "Benutzer hat den Mauszeiger auf das Editfeld positioniert, die linke Maustaste runtergedrückt und wieder losgelassen."
Ist aber halb so wüst, denn diese einzelnen Schritte lassen sich ebenfalls abfragen mittels:
- OnMouseMove
- OnMouseDown
- OnMouseUp

Die interessanten Ereignisse sind für dich OnMouseDown oder OnMouseUp. Denn diese geben beide in ihrem Header auch den gedrückten Button mit:
Code:
void __fastcall Form1::FormMouseDown(TObject *Sender, TMouseButton Button,
  TShiftState Shift, int X, int Y)
{
  if(Button == mbRight) //daneben gibt es noch mbLeft und mbMiddle
  {
    //Zeige Popummenü oder mach sonst was
  }
}
D.h. du musst nur noch entscheiden: Soll die Aktion sofort geschehen, sobald der Mauszeiger gedrückt wurde (z.B. klassisches Popup-Menü) oder erst, nachdem die Maustaste wieder losgelassen wurde.
 
#3
Hey, cool, das funktioniert gut für das, was ich will. Danke für den Tipp (so einfach - aber so hilfreich!)

Jetzt hab ich das Problem, dass der Benutzer eine Zahl XXX,X eingeben können soll. Habe ein TMaskEdit genommen und die Maske so gesetzte: 999.9 . Bei der Eingabe ist das auch in Ordnung.
Aber wie kann ich diese eingegebene Zahl übernehmen?
Er will das ja als AnsiString übernehmen, welches ich dann per StrToInt zu einer Dezimalzahl machen wollte.
Da gibt´s aber ne Fehlermeldung, dass das kein gültiger AnsiString ist (um ihn konvertieren zu können). Vermutlich wegen dem Punkt, der das Komma repräsentiert!

Was kann man da machen?
 

CSANecromancer

Erfahrenes Mitglied
#4
Die einfache Methode wäre wohl ähnlich dem, was ich in der Hilfe zum CBuilder (Suchbegriff "AnsiString", Unterthema "AnsiString::pos()") gefunden habe:

Code:
String  Value = Edit1->Text;
int Result;
while ((Result = Value.Pos(',')) > 0 )
  Value[Result] = '.';

Result = StrToInt(Value);
 
#5
Hm, versteh ich nicht so wirklich, was da passieren soll.

Mir ist aber noch eingefallen, dass meine Kommazahl doch wohl eher als float definiert werden sollte, oder?

Hab versucht unter Value... was in der Hilfe zu finden, aber nix.
Was ist denn Value.Pos ?
Ist Value ne Klasse oder wie?

Wär nett, wenn du noch ein paar Worte hättest für eine Anfängerin! Danke!
 

CSANecromancer

Erfahrenes Mitglied
#6
Na klar, das kriegen wir schon.
Zunächst einmal hast du vollkommen Recht, dass das ein float sein muss, wenn du mit Nachkommastellen arbeitest. Ich ging nur von einer Lokalisierung aus, wie z.B. wenn 1 Million auf Englisch ("1,000,000") nach Deutsch konvertiert werden muss ("1.000.000"). :)

Ok, dann nochmal die Zeilen im einzelnen:

Code:
String Value = Edit1->Text;
Damit wird ein AnsiString namens Value angelegt und gleich mit dem eingegebenen text aus dem Editfeld gefüllt.

Code:
float Result;
In Result steht dann hinterher der Zahlenwert drin.

Neu dazu genommen werden sollte
Code:
int i;
Weswegen der vorherige Code evtl. etwas unverständlicher war, weil dort Result zweckentfremdet wurde.

Code:
while ((i = Value.Pos(',')) > 0 )
Hier wird der Value geprüft. Du erinnerst dich? Value enthält den eigegebenen Zahlenwert. Die AnsiString-Funktion Pos() teilt dir nun mit, an welcher Position im String (auf 1 basierend) ein "," vorkommt. Die Bedingung ist also erfüllt, solange ein "," in deinem String gefunden wird. Praktischerweise erlaubt C++ auch sofort die entsprechende Zuweisung. In jedem Fall enthält i die Position des gefundenen "," in deinem String, oder eben 0, wenn kein "," gefunden wurde, wodurch dann die Schleife abbricht.

Code:
Value[i] = '.';
Diese Anweisung wird nur durchgeführt, wenn in deinem String auch wirklich ein "," vorkam. Dieses wird jetzt (referenziert durch Value[i]) durch einen "." ersetzt.

Code:
Result = StrToFloat(Value);
Zum Zeitpunkt dieser Zeile sollten alle "," aus Value in "." ersetzt worden sein. Es wird versucht, aus dem String Value einen Float-Wert nach Result zu bilden. Sollte allerdings in Value kein gültiger Float-Wert stehen, führt dieser Aufruf von StrToFloat zu einer Exception. Aber auch dafür gibt es dann Mittel und Wege.

Etwas verständlicher geworden?
 
#7
Oh, das ist eine echt interessante Sache! Habe ich mir gestern auch grad überlegt, was man denn macht, wenn man die "deutsche Version" des C++Builders hat, der demnach mit 999,9 rechnet, aber eigentlich ein 999.9 haben will (internationaler)...
Wie schön, dass du schon heute morgen eine Antwort für mich hast! :)

Kann man einer Float Zahl auch irgendwie mitteilen, dass sie bitte nur eine Nachkommastelle haben soll?
Wenn der Benutzer einen zu hohen Wert eingibt, wird er auf den höchstmöglichen Wert zurückgesetzt, was bei mir 359,9 ist. Wenn ich 359,9 nehme, steht aber in dem Editfeld nachher 359,89999 oder so was.
Hatte mir überlegt, dass man das bestimmt irgendwie mit einer selbstgebauten Klasse hinbekommen kann, aber so weit bin ich denn mit meinen Porgrammierkenntnissen in zwei Monaten doch noch nicht gekommen... (schade auch)
(also ich habe schon ein paar Klassen zum üben gebaut, aber wie es in diesem speziellen Fall ginge, wüsste ich nicht)
 

CSANecromancer

Erfahrenes Mitglied
#8
Also der Floatzahl selbst kannst du nicht mitteilen, dass sie nur eine bestimmte Anzahl an Nachkommastellen haben soll. Der Float wird vom Computer grundsätzlich mit maximal möglicher Genaugikeit verarbeitet.

Aber du willst ja diesen Float anzeigen und zwar als eingetragenen Wert in deinem Editfeld. Und da gibt es eine entsprechende Umwandlungsroutine, die passenderweise FloatToStr heisst. :) Ok, nicht ganz. FloatToStr wandelt einfach den Float um und du hast keinen weiteren Einfluss darauf. Aber es gibt noch FlotToStrF und da hast du definitiv Einflussmöglichkeiten. In deinem speziellen Falle wäre es wohl:

Code:
float fValue = 359.997434;
String strValue = FloatToStrF(fValue, fFixed, 5, 2);
Edit1.Text = strValue;
(was die Parameter bedeuten, steht in der Hilfe).
 
#9
Das hab ich auch schon aus probiert. Problem ist, dass er die Zahl nicht abschneidet, sondern rundet.
Also 359,9 eingegeben und gewandelt merkt er sich als 359,899..... und das mit FloatToStrF(ffFixed, 15,1) ergibt aber wieder 359,8 - das ist echt ätzend!
Hab aber noch ne Idee, und zwar an den String ein "+0000" hinten ran hängen. Und dann erst konvertieren. Dann kommt am Ende 359,9 raus.
Jetzt nur noch dein Tipp von oben mit der Punkt nach Komma - Umwandlung...dann ist hoffentlich mein Problem gelöst!
:)
 

CSANecromancer

Erfahrenes Mitglied
#10
Kannst du mal bitte in vollständigen (und damit vielleicht mir verständlichen) Sätzen sagen, was du wirklich haben willst?
Problem ist, dass er die Zahl nicht abschneidet,
Soll der Float-Wert abgeschnitten werden?

Also 359,9 eingegeben und gewandelt merkt er sich als 359,899
Hast du ein Problem mit der speicherinternen Darstellung eines Floats?

das mit FloatToStrF(ffFixed, 15,1)
Dir ist klar, dass ein Float einen begrenzten Wertebereich hat und ich bin mir so aus dem Stegreif nicht sicher, dass der wirklich 15-stellig ist.

String ein "+0000" hinten ran hängen. Und dann erst konvertieren.
Also hast du jetzt doch eine Lösung gefunden? Oder was oder wie?

Jetzt nur noch dein Tipp von oben mit der Punkt nach Komma - Umwandlung...
Was soll damit sein?


Im Ernst: Schreibe hier bitte vernünftige und vollständige Sätze. Ich hatte schon immer Probleme, wenn ein "chatter" mir gegenüber jedes 2. Wort und jeden Nebengedankengang beim Schreiben ausgelassen hat, aber deren Kenntnisse schlicht und ergreifend stillschweigend vorausgesetzt hat.
Ich kann dir leider erst antworten, wenn du in einer (wenigstens mir) verständlichen Weise beschrieben hast, was du GENAU(!) in WELCHEM ZUSAMMENHANG(!) und WOMIT(!) machen willst.
 

Neue Beiträge