Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - In TEdit Markieren verhinden


Daniel L. - Do 17.07.14 17:49
Titel: In TEdit Markieren verhinden
Hallo zusammen,

wie kann in verhindern, dass der Benutzer in einem TEdit den Text bzw. Textausschnitte markieren kann?

sänks - Daniel


Delete - Do 17.07.14 18:22

Zuerst einmal mußt du auf Tastatureingaben und Mausklicks reagieren, denn nur damit kann der Anwender markieren. Von dort aus verweist du auf deine private Methode, um jegliche Markierung rückgängig zu machen: SelLength := 0;


zuma - Fr 18.07.14 08:00

im OnEnter-Ereignis des TEdit einfach den Focus auf ein
anderes Objekt setzen dürfte die einfachste Methode sein ;)


baumina - Fr 18.07.14 08:11

user profile iconzuma hat folgendes geschrieben Zum zitierten Posting springen:
im OnEnter-Ereignis des TEdit einfach den Focus auf ein
anderes Objekt setzen dürfte die einfachste Methode sein ;)


Nur dann kann der arme Benutzer niemals einen Text dort eingeben *kicher

Wie wärs denn damit :

http://www.swissdelphicenter.ch/de/showcode.php?id=1403


jasocul - Fr 18.07.14 08:17

user profile iconDaniel L. hat folgendes geschrieben Zum zitierten Posting springen:
wie kann in verhindern, dass der Benutzer in einem TEdit den Text bzw. Textausschnitte markieren kann?

Welchen Sinn soll das denn haben?
Wenn der Anwender diesen Text verändern können soll, dann schränke ich die Bearbeitungs-Möglichkeiten doch nicht unnötig ein.
Darf es sowieso nicht bearbeitet werden, dann funktioniert der Tipp von user profile iconzuma sehr gut. Alternativ kann man natürlich auch ein TLabel statt eines TEdit verwenden.


zuma - Fr 18.07.14 08:26

hab das auch so verstanden, das das TEdit nur zur Anzeige genutzt wird.


Daniel L. - Fr 18.07.14 11:51

Also der Nutzer soll schon noch ins Edit schreiben können.

Der Verweis auf swissdelphicenter ins hilfreich, danke.

Gruss: Daniel


Delete - Fr 18.07.14 13:25

user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Darf es sowieso nicht bearbeitet werden, dann funktioniert der Tipp von user profile iconzuma sehr gut. Alternativ kann man natürlich auch ein TLabel statt eines TEdit verwenden.

Und wozu gibt es dann das Property ReadOnly?

user profile iconDaniel L. hat folgendes geschrieben Zum zitierten Posting springen:
Also der Nutzer soll schon noch ins Edit schreiben können. Der Verweis auf swissdelphicenter ins hilfreich, danke.

Was willst du wirklich erreichen? Daß man kein Zeichen in deinem Edit markieren kann oder daß man keines kopieren kann?
Für den ersten Fall hab ich dir bereits eine einfache Lösung gezeigt.
Für den zweiten Fall läßt du einfach die beiden Tastenkombinationen Strg-C und Strg-X nicht zu:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TFormMain.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  If (Key = #3)  Or   // Strg-C gedrückt
     (Key = #24Then // Strg-X gedrückt
  Key := #0;
end;


Die entsprechenden Tastencodes kannst du ganz leicht mit dem kleinen Tool von Leuselator [http://www.delphipraxis.net/14587-miniprog-um-tastaturereignisse-zu-veranschaulichen.html] ermitteln.

Nun bleibt nur noch, das Context-PopUp-Menü zu verhindern. Entweder du weist deinem Edit ein eigenes PopUp-Menü zu oder du schreibst in die Ereignisbehandlung für das Erscheinen des Context-PopUps einfach Folgendes:


Delphi-Quelltext
1:
2:
3:
4:
procedure TFormMain.Edit1ContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
begin
  Handled := True;
end;

Damit findet das Ereignis-Handle in deinem Edit ein frühes Grab :lol:


WasWeißDennIch - Fr 18.07.14 14:04

Und dann drückt jemand STRG + EINF bzw. SHIFT + EINF :twisted:. Statt der Tastenkombinationen/des Kontextmenüs sollte man daher besser die entsprechenden Messages deaktivieren, wie es der Code der Schweizer wohl nach kurzem Überfliegen tut.


jaenicke - Fr 18.07.14 14:09

Kopieren funktioniert von außen ja trotzdem noch jederzeit mit jedem Tool, das das Editfeld direkt ausliest, zudem kann man den Text ja abschreiben. Einen Sinn sehe ich darin gerade nicht. :gruebel:
WM_GETTEXT müsste man z.B. noch zusätzlich abfangen. Dazu die Accessibility-Funktionen usw.

Jedenfalls macht es dann eher Sinn ein eigenes Control zu implementieren. Da funktionieren die Standardwege nicht und man muss diese nicht erst alle abfangen.

Ein Programm mit Controls, die den Zugriff auf ihre Texte blocken, kann (bzw. darf in einigen Einrichtungen) allerdings dann nicht überall verwendet werden, wenn dann auch die Screenreader für Sehbehinderte nicht funktionieren...


jasocul - Fr 18.07.14 14:22

user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Darf es sowieso nicht bearbeitet werden, dann funktioniert der Tipp von user profile iconzuma sehr gut. Alternativ kann man natürlich auch ein TLabel statt eines TEdit verwenden.

Und wozu gibt es dann das Property ReadOnly?

ReadOnly verhindert nicht, dass man die Daten markieren und kopieren kann. :wink:
Dann müsste man schon Enabled auf False setzen. Der graue Text sieht dann aber auch nicht besonders hübsch aus. Kann man natürlich auch wieder anpassen, aber dann wird wieder suggeriert, dass man auf das TEdit zugreifen kann. Also alles irgendwie nicht besonders angenehm und schon gar nicht an irgendwelche Standards ausgerichtet.


Delete - Fr 18.07.14 14:30

user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
ReadOnly verhindert nicht, dass man die Daten markieren und kopieren kann. :wink:
Dann müsste man schon Enabled auf False setzen. Der graue Text sieht dann aber auch nicht besonders hübsch aus. Kann man natürlich auch wieder anpassen, aber dann wird wieder suggeriert, dass man auf das TEdit zugreifen kann. Also alles irgendwie nicht besonders angenehm und schon gar nicht an irgendwelche Standards ausgerichtet.

Ja glaubst du etwa , das weiß ich nicht? Ich habe doch nirgendwo was Gegenteiliges behauptet! Wie kommst du dazu, mich derart unqualifiziert belehren zu wollen?

Letztlich habe ich auf jene Aussage geantwortet, die behauptet, daß man, wenn man die Bearbeitung eines Edits verhindern will, diesem Edit bei OnEnter den Focus entreißen sollte. Dieses Vorgehen ist garantiert kein Standard! Dafür gibt es das Property ReadOnly. Also bitte nichts durcheinanderbringen und Beiträge etwas aufmerksamer lesen! Du hast z.B. auch überlesen, daß der TE nicht möchte, daß das TEdit für die Bearbeitung gesperrt ist. Um genauer in Erfahrung zu bringen, was der TE eigentlich beabsichtigt, habe ich ihm genau diese Frage gestellt. Die Antwort darauf muß man wissen, wenn man sein Problem lösen will.

Im Übrigen habe ich oben ausführlich beschrieben, wie man sauber verhindert, daß der Eintrag eines TEdit kopiert werden kann (getestet). Was soll deiner Meinung daran nicht funktionieren?


Daniel L. - Fr 18.07.14 16:44

Also keinen Streit meinetwegen :wink:

Kurz angedeutet: Es geht um ein Wörter - Ratespiel.
Der User soll u.a. in einem Editfeld ein Wort editieren können, in dem er einzelne Buchstaben hinzufügen oder entfernen kann, aber er soll weder markieren noch paste % copy können.

Entsprechend werde ich eure Vorschläge probieren.

Danke nochmal: Daniel L.


jaenicke - Sa 19.07.14 08:18

Das hört sich erst recht so an als sei ein TEdit nicht sinnvoll. ;-)
Für ein Spiel würde ich das Ganze auf einer Paintbox selber zeichnen.


Delete - Sa 19.07.14 08:49

Vermutlich geht's um's "Galgemännle", wie man bei uns im Badischen sagt :?