WM_PASTE Message abfangen

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
Ally
Beiträge: 283
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

WM_PASTE Message abfangen

Beitrag von Ally »

Ich habe in Delphi eine Komponente geschrieben in der die Message WM_PASTE abgefangen und der Clipboard-Inhalt nur dann in das Textfeld geschrieben wird, wenn er den Vorgaben entspricht.
In Lazarus wird der Clipboard-Inhalt allerdings zuerst in das Edit-Feld geschrieben und erst dann wird die WMPaste-Procedure abgearbeitet.
Das ganze macht dann natürlich keinen Sinn mehr, der Text steht ja schon im Textfeld.
Wie kann ich unter Lazarus das gleiche Ergebnis wie unter Delphi erreichen?

Delphi Quelltext:

Code: Alles auswählen

type
  TXedit = class(TCustomEdit)
  private
    { Private-Deklarationen }
    procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
.
.
.
procedure TXedit.WMPaste(var Message: TWMPaste);
begin
  if not Clipboard.HasFormat(CF_TEXT) then Exit;
  if Clipboard.AsText <> Vorgabe then Exit;
  inherited;
end;
Lazarus Quelltext:

Code: Alles auswählen

type
  TXEdit = class(TCustomEdit)
  private
    { Private-Deklarationen }
    procedure LMPasteFromClip(var Message: TLMessage); message LM_PASTE;
.
.
.
procedure TNumedit.LMPasteFromClip(var Message: TLMessage);
begin
begin
  if not Clipboard.HasFormat(CF_TEXT) then Exit;
  if Clipboard.AsText <> Vorgabe then Exit;
  inherited;
end;

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: WM_PASTE Message abfangen

Beitrag von theo »

Keine Ahnung. Muss man das denn können?
Das stell ich mir ziemlich übel vor, wenn ich als User was in ein Textfeld pasten will, und dann passiert nix...

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: WM_PASTE Message abfangen

Beitrag von pluto »

@Ally
Ich glaube das macht das Edit oder sonstige Eingabe Komponenten Automatisch. Das sie nur reinen Text zu lassen und keine Grafiken oder ähnliches. Darauf wolltest du doch hinaus oder ?
Was für vorgaben hast du denn ? Sonst könntest du versuchen das onKeyDown Event abzufangen. Das müsste eigentlich gesendet werden, bevor Strg+V beim Edit landet und dort kannst du dann key auf #0 bzw 0 setzten.

Code: Alles auswählen

if Clipboard.AsText <> Vorgabe then Exit;
Ich denke mal das war als "Beispiel" gedacht oder ? Weil so in dieser Form würde es keinen Sinn ergeben.

EDIT: Habe übersehen das du schon von einem TEdit ableitetest, also könntest du auch einfach die Methode keydown überschreiben.
MFG
Michael Springwald

Benutzeravatar
Ally
Beiträge: 283
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: WM_PASTE Message abfangen

Beitrag von Ally »

Hallo theo hallo Michael,

mein Editfeld darf nur Zahlen akzeptieren. Das wird für die Eingabe über die Tastatur mit KeyPress, Change usw. realisiert. Über WMPaste fange ich Eingaben ab die aus der Zwischenablage, mit z.B. rechte Maustaste-Einfügen oder Strg+V, eingefügt werden sollen.
Über mein spezielles Problem hinaus, stellt sich doch aber die Frage, warum Lazarus die Message zuerst ausführt und dann behandelt?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: WM_PASTE Message abfangen

Beitrag von pluto »

Es gibt doch die SpinEdit Komponenten, die lässt nur zahlen zu. Schau mal wie die das Einfügen gemacht haben(es könnte auch sein, dass diese Komponente von Toolkit übernommen wird)
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: WM_PASTE Message abfangen

Beitrag von theo »

Probier mal sowas, das geht z.B. auf GTK2

Code: Alles auswählen

procedure TForm1.Edit1Change(Sender: TObject);
var och: TNotifyEvent;
n:integer;
begin
  och:=Edit1.OnChange;
  Edit1.OnChange:=Nil;
  if (not (Trim(Edit1.Text) ='')) and (not TryStrToInt(Edit1.text,n)) then
    Edit1.Text:=fEditText else  fEditText:=Edit1.Text;
  Edit1.OnChange:=och;
end;
 
procedure TForm1.Edit1Enter(Sender: TObject);
begin
  fEditText:=Edit1.Text;
end;

Benutzeravatar
Ally
Beiträge: 283
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: WM_PASTE Message abfangen

Beitrag von Ally »

Hallo Pluto,

vielen Dank für deinen Tip, aber bei SpinEdit wird das Einfügen über Strg+V völlig blockiert und über rechte Maustaste-Einfügen wird auch "Blutwurst" eingefügt. :shock:

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: WM_PASTE Message abfangen

Beitrag von Socke »

Ally hat geschrieben:Hallo Pluto,

vielen Dank für deinen Tip, aber bei SpinEdit wird das Einfügen über Strg+V völlig blockiert und über rechte Maustaste-Einfügen wird auch "Blutwurst" eingefügt. :shock:
Vielleicht bist du ja so motivierst und hackst die LCL, auf dass wir bald alle ein OnPaste Event haben :lol:
Aber es fehlt echt an einer brauchbaren Möglichkeit auf so etwas zu reagieren; das mit dem Spin-Edit finde ich auch ... weil man dann immer überprüfen muss, ob das wirklich ein Integer-Wert und keine Blutwurst ist.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
Ally
Beiträge: 283
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: WM_PASTE Message abfangen

Beitrag von Ally »

Hallo theo,

danke für den Code. Einen ähnlichen Ansatz hatte ich auch mal verfolgt. Ich habe dann aber einfach den Cursor nicht in den Griff bekommen. Bei jeder unzulässigen Eingabe oder Einfügung springt der nämlich an den Anfang. Mein Eingabefeld prüft auf Dezimalstellen, Minuswerte und führt eine Wertbegrenzung durch. Dabei ist es mir letztlich nicht gelungen alle Eventualitäten abzuklopfen und den Cursor bei jeder Falscheingabe wieder richtig zu positionieren.
Die Lösung die ich jetztt habe (unter Delphi) funzt perfekt und lässt keine Fehleingabenn zu. Das Ganze funktioniert ja auch unter Lazarus, bis auf die Sache mit dem Einfügen.
Vielleicht liest ja ein Lazarus-Entwickler mit und schaut sich das Message-Problem mal an.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: WM_PASTE Message abfangen

Beitrag von theo »

Ally hat geschrieben: Vielleicht liest ja ein Lazarus-Entwickler mit und schaut sich das Message-Problem mal an.
Du kannst die Chancen dafür erheblich verbessern, wenn du einen Eintrag im Bugtracker machst:
http://bugs.freepascal.org/" onclick="window.open(this.href);return false;

Antworten