AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Strg-Taste per Button einrasten!

Ein Thema von valon · begonnen am 7. Okt 2004 · letzter Beitrag vom 7. Okt 2004
Antwort Antwort
valon

Registriert seit: 27. Sep 2004
86 Beiträge
 
#1

Strg-Taste per Button einrasten!

  Alt 7. Okt 2004, 08:08
Hallo Leute!
Brauche eure Hilfe!

Wenn ich in einer ListBox das Property MultiSelect auf true setze, dann hab ich die Möglichkeit mehrere Einträge zu selektieren.
Dabei muss ich aber die "Strg" Taste gedrückt halten.
Wie kann ich einfach per Button die Strg-Taste einrasten um dann zu selektieren.und wenn ich nicht mehr selectieren will die Strg-taste wieder per Button lösen.

Ich sollte nähmlich auf ein Touchscreen die Möglichkeit haben zu selektieren.und da hab ich ja keine Strg-Taste.
Danke
  Mit Zitat antworten Zitat
Benutzerbild von Steve
Steve

Registriert seit: 2. Mär 2004
Ort: Würzburg
730 Beiträge
 
Delphi 2006 Personal
 
#2

Re: Strg-Taste per Button einrasten!

  Alt 7. Okt 2004, 08:53
Ein Beispiel für das "Einrasten" via CheckBox, Button etc läuft analog.
Beim Einrasten wird ein Befehl gesendet, dass Ctrl gedrückt wird, beim "Ausrasten" wird ein Befehl gesendet, dass die Taste losgelassen wird.

Delphi-Quellcode:
IF cbCtrl.Checked THEN
  Keybd_Event(VK_CONTROL,0,0,0)
ELSE
  Keybd_Event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
Das funzt natürlich nur, solange zwischendrin keiner an der "echten" Ctrl-Taste rumfummelt
Schau Dir halt am besten mal das Kapitel [oh]"Keyboard Input"[/oh] an

Gruß
Stephan
Stephan B.
Wer andern eine Grube gräbt ist Bauarbeiter!
Wer im Glashaus sitzt, sollte sich lieber im Dunkeln ausziehen!
Außerdem dieser Satz kein Verb...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#3

Re: Strg-Taste per Button einrasten!

  Alt 7. Okt 2004, 09:03
Ich hätte zwar erst gedacht dass, wenn man die Strg-Taste mitten innerhalb von onMouseDown drücken läßt, es dann zu spät wäre, weil ja das Mausereignis schon begonnen und eigentlich TShiftState (also auch Strg) schon ausgelesen wurde, aber es geht

Delphi-Quellcode:
Procedure TForm1.ListBox1MouseDown ...
  Begin
    If cbCtrl.Checked Then Keybd_Event(VK_CONTROL, 0, 0, 0);
  End;

Procedure TForm1.ListBox1MouseUp ...
  Begin
    If cbCtrl.Checked Then Keybd_Event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
  End;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Steve
Steve

Registriert seit: 2. Mär 2004
Ort: Würzburg
730 Beiträge
 
Delphi 2006 Personal
 
#4

Re: Strg-Taste per Button einrasten!

  Alt 7. Okt 2004, 09:06
Ja, das erst während MouseUp/Down zu setzen ist die bessere Lösung.. Sonst bleibt Strg eingerastet, wenn man vergisst, das Häkchen wieder zu entfernen Das kann böse Folgen haben

Gruß
Stephan
Stephan B.
Wer andern eine Grube gräbt ist Bauarbeiter!
Wer im Glashaus sitzt, sollte sich lieber im Dunkeln ausziehen!
Außerdem dieser Satz kein Verb...
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

Re: Strg-Taste per Button einrasten!

  Alt 7. Okt 2004, 09:19
Zitat von himitsu:
Ich hätte zwar erst gedacht dass, wenn man die Strg-Taste mitten innerhalb von onMouseDown drücken läßt, es dann zu spät wäre, weil ja das Mausereignis schon begonnen und eigentlich TShiftState (also auch Strg) schon ausgelesen wurde, aber es geht
Wie bitte??? Das funktioniert doch überhaupt nicht! Zumindest bei mir (Delphi 6 Pro).
Kann auch überhaupt nicht, weil die Prozedur TCustomListBox.WMLButtonDown vor OnButtonDown ausgelöst wird, und dort der ShiftState überprüft wird!
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#6

Re: Strg-Taste per Button einrasten!

  Alt 7. Okt 2004, 09:49
hatte ich ja auch gedacht, aber komisch ... vorhin ging es noch, als ich es so hatte:
Delphi-Quellcode:
Procedure TForm1.ListBox1MouseDown ...
  Begin
    Keybd_Event(VK_CONTROL, 0, 0, 0);
  End;

Procedure TForm1.ListBox1MouseUp ...
  Begin
    Keybd_Event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
  End;
Hab's jetzt noch 4, 5-mal versucht und jetzt wills nichtmehr gehn

Na ja, man könnte es ja auch mal vorm Klickereignis machen und dann über'nen Timer wieder abschalten, da es ja kein onMouseLeave bei der Listbox gibt:
Delphi-Quellcode:
  Procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    Begin
      If CheckBox1.Checked Then Begin
        Keybd_Event(VK_CONTROL, 0, 0, 0);
        ListBox1.Tag := 1;
      End;
    End;

  Procedure TForm1.Timer1Timer(Sender: TObject);
    {ein Interval von 10 bis 10 ms reicht voll aus}
    Var P: TPoint;

    Begin
      P := ListBox1.ScreenToClient(Mouse.CursorPos);
      If CheckBox1.Checked and (ListBox1.Tag <> 0) and
        ((P.X < 0) or (P.Y < 0) or (P.X >= ListBox1.Width) or (P.Y >= ListBox1.Height)) Then Begin
        Keybd_Event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
        ListBox1.Tag := 0;
      End;
    End;
mehrfach getestet ^^
Klar, wenn man die Maus nicht bewegt und zwischendurch mal auf 'ne Taste drückt, dann wird gibt es auf diese Weise Probleme -.-''

Die ander Möglichkeit mit 'nem Timer wäre dann
Delphi-Quellcode:
  Procedure TForm1.Timer1Timer(Sender: TObject);
    {ein Interval von 10 bis 10 ms reicht voll aus}
    Var P: TPoint;

    Begin
      If CheckBox1.Checked Then Begin
        P := ListBox1.ScreenToClient(Mouse.CursorPos);
        If (P.X >= 0) and (P.Y >= 0) and (P.X < ListBox1.Width) and (P.Y < ListBox1.Height) Then
          Keybd_Event(VK_CONTROL, 0, 0, 0)
        Else
          Keybd_Event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
      End;
    End;

  Procedure TForm1.CheckBox1Click(Sender: TObject);
    Begin
      If not CheckBox1.Checked Then Keybd_Event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
    End;
Dort ist dann das Problem mit dem Drücken einer Taste nicht mehr so groß.

Oder über 'nen Maus-Hook, da sollte es auch möglich sein.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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:15 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