Toon posts:

[Delphi] Reageren op een WM_PASTE bij een TEdit

Pagina: 1
Acties:
  • 118 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een x aantal normale TEdit componenten op mijn form. Nu kan de gebruiker daar text pasten. Nu zijn er bij sommige edit controls bepaalde regels over de invoer. Dus bepaalde tekens mogen niet.

Nu weet ik dat ik daar TMaskEdit's voor kan gebruiken maar om een bepaalde rede wil ik die niet gebruik, dus dat is even uitgesloten.

Wat ik dus nodig heb is een trigger wanneer een WM_PASTE naar de TEdit gestuurd wordt, zodat ik kan kijken wat er op het klembord bevind en of dat toegestaan is volgens de regels voor die desbetreffende TEdit.

Nu is het gewoon heel simpel om een afstammeling van TEdit te maken en daarbij bij een binnenkomende WM_PASTE een event afvuren en vervolgens controleren.

Maar is het op 1 of andere manier ook mogelijk om gewoon van bestaande TEdits gebruik te maken en via het Form de WM_PASTE onderscheppen die naar de TEdit gestuurd wordt.

Op kom je er niet onderuit om toch een nieuwe TEdit te maken?

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Staat dat niet in de help van Delphi of op Google, hoe je zelf events maakt met Delphi. Ik prog ook wel eens in Delphi, maar zover ben ik nou ook weer niet, dus weet niet precies hoe het gaat. Kan het trouwens ook niet op ongeveer dezelfde manier als de eerste manier die je schrijft, dus met afstammeling van Tedit maken. Post anders ff de code als je het op die manier zou doen, mischien kan ik je dan wel helpen.

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Voor mijn gevoel kun je de controle die je wil hebben op twee momenten uitvoeren: op de onchange (wat traag wordt bij veel ingeven op een enkele edit) of wanneer er op de OK/Opslaan/Save/Doorboeken/Whatever knop klikt. Waarom zou je de gegevens direct willen afvangen wanneer het gepaste wordt?

Overigens kun je in de OnKeyUp de ShiftState en de key afvangen, en dan heb je in ieder geval de CTRL + V combi en de paste-knopjes van bijvoorbeeld een Microsoft Office Keyboard. Enige wat je dan niet hebt is de menukeuze 'paste' die je in een edit kunt kiezen.

Waarschijnlijk zul je, als je ook die wil hebben, een eigen control moeten gaan maken of inderdaad de message afvangen.

[ Voor 42% gewijzigd door OZ-Gump op 23-01-2004 10:30 ]

My personal website


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je kan WM_PASTE gewoon afvangen:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
interface

type
  TMyEdit = class(TEdit)
  private
    procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
  end;

implementation

procedure TMyEdit.WMPaste(var Message: TWMPaste);
begin
  ShowMessage('Gevangen!');
  inherited; // niet aanroepen als je de message zelf afhandeld.  
end;


Of als je geen eigen afgeleide wilt maken zou je de wndproc kunnen omleiden en daar hetzelfde in doen.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
De OnChange heb ik helaas niks aan, omdat je pas een seintje krijgt nadat de text veranderd is en je niet kan aangeven of het veranderd mag worden.

LordLarry: Dat eerste verhaal weet ik, dat gaf ik ook aan in mijn post, maar ik ga eens kijken naar het 2e stukje. Dat is wat ik wilde hebben.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je kan van elke TControl het adres van de wndproc functie getten en setten via de TControl.WindowProc property. Zorg dat je de originele opvraagt en onthoud en dan m op jouw functie zet. Voortaan wordt jouw functie aangeroepen en daarin kan je o.a. de WM_PASTE afvangen. Als je aan het einde van de functie ook de originele wndproc aanroept draait alles verder alsof er niets gebeurt is. Als je de re-route weer wil verwijderen zet je de TControl.WindowProc weer op het orignele adres.

Persoonlijk vind ik een eigen afgeleide component netter, maar in sommige gevallen wil je liever het bovenstaande doen.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
LordLarry:

Ik wilde eerst dat met die wndproc gaan doen, echter dat kost toch veel meer werk dan ik gedacht had.

Ik heb toch maar gekozen voor een afgeleide, aangezien dit bij vele forms in de applicatie moet gebeuren. Het werkt inmiddels ook perfect.

Bedankt voor het meedenken.

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 26-05 11:18

alienfruit

the alien you never expected

Als je het alleen voor in een vensters nodig hebt, kun je het zo doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
type
  TEdit = class(StdCtrls.TEdit)
  private
    procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
  end;

implementation

procedure TEdit.WMPaste(var Message: TWMPaste);
begin
  ShowMessage('Gevangen!');
  inherited; // niet aanroepen als je de message zelf afhandeld.  
end;
Pagina: 1