[delphi] change event TMyComboBox bij wijziging via keyboard

Pagina: 1
Acties:

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09-2025

BdR

TV is gooder then books

Topicstarter
Ik heb een probleem met een custom combobox TMyComboBox. Het probleem is dat de change-event niet afgaat als je met het keyboard iets intypt en dan met tab-toets naar volgende veld gaat. :? Dus er is:

TComboBox (standaard component) -> TMyComboBox -> instantie cbbConditie op mijn form TdlgRegistreer
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type
  TMyComboBox = class(TComboBox)
  private
    { Private declarations }
    ..
  protected
    { Protected declarations }
    procedure Change; override;
  public
    { Public declarations }
    ..
  published
    { Published declarations }
    ..
  end;

procedure TMyComboBox.Change;
begin
  inherited;
  //reset kleur
  Color := clWindow;
  Font.Color := FDefaultFontColor;
end;


code:
1
2
3
4
5
6
procedure TdlgRegistreer.cbbConditieChange(Sender: TObject);
begin
  inherited;
  { laatste conditie gewijzigd }
  UpdateFields();
end;

Het is vreemd, want het werkt wel goed als je het veld met de muis wijzigd, maar met keyboard dus niet. En ook opvallend is dat het lijkt of de inherited van cbbConditieChange (in voorbeeld op regel 3) niet meegcompileerd wordt. Want er staat geen blauw stipje voor de kantlijn, en ik kan er geen breakpoint op zetten.

Dus, iemand een idee waarom de change-event niet afgaat als veld wordt gewijzigd mbv het keyboard? Of misschien waarom de inherited niet meegecompileerd wordt?

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • Loesje
  • Registratie: Januari 2000
  • Laatst online: 02-07-2025
Als ik je goed begrijp wordt UpdateFields niet uitgevoerd, maar het instellen van die kleuren wel?

Als je 'via het toetsenbord' wijzigt, dan doe je dat niet met behulp van code, he? Want met code trigger je het 'onchange' event niet.

edit:

btw: jouw inherited op 'regel drie' is zinloos, want er is geen ancestor. TCustomCombo.change roept OnChange aan als de 'wijziging' niet door code wordt gemaakt. OnChange is default gewoon leeg. Je bent toch niet vergeten om TdlgRegistreer.cbbConditieChange aan het OnChange-event te hangen, he?

[ Voor 43% gewijzigd door Loesje op 19-11-2004 16:42 ]

Leven is meervoud van lef


Verwijderd

Als ik het even snel zie heb je een protected procedure wat je van buiten het object probeert te benaderen. Dat gaat niet lukken.

[ Voor 3% gewijzigd door Verwijderd op 19-11-2004 18:03 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 10:55

Tomatoman

Fulltime prutser

De unit waar TComboBox in geïmplementeerd is en die je meecompileert, is de *.dcu-versie, de reeds gecompileerde versie. De unit waar je in zit te kijken is de broncode, de *.pas-versie. Aangezien die niet standaard wordt meegecompileerd, zie je ook geen debuginfo zoals het blauwe stipje en werken breakpoints niet. De gemakkelijkste oplossing als je toch een unit zoals Controls of StdCtrls wilt meecompileren is de unit in je project opnemen. De broncode wordt dan netjes opnieuw gecompileerd en je kunt ook binnenin de unit breakpoints zetten.

Nu het antwoord op je eerste vraag. Een combo box is een native windows control, zodat veel gebruikersinput valt te detecteren via notificaties in de vorm van messages. Ik heb hier geen Delphi bij de hand, maar vermoed dat je moet reageren op een CBN_EDITCHANGE message. Dit is bedoeld om te kunnen reageren tijdens het typen in de edit box. Wil je pas wat doen na het typen, dan is het nog veel eenvoudiger. In Delphi reageer je op het verlaten van een control via de OnExit event, die optreedt vlak voor de de control daadwerkelijk verlaat.
Verwijderd schreef op vrijdag 19 november 2004 @ 18:02:
Als ik het even snel zie heb je een protected procedure wat je van buiten het object probeert te benaderen. Dat gaat niet lukken.
Dan moet je toch wat beter kijken. BdR doet een override van een protected method in een descendant (TMyComboBox) van de betreffende class (TComboBox). Dit is precies zoals het hoort en dat gaat wel degelijk lukken.

[ Voor 16% gewijzigd door Tomatoman op 20-11-2004 11:04 ]

Een goede grap mag vrienden kosten.


Verwijderd

Ik keek meer naar de volgende code. Change is niet beschikbaar vanuit TdlgRegistreer maar het onchange event natuurlijk wel :+

code:
1
2
3
4
5
6
procedure TdlgRegistreer.cbbConditieChange(Sender: TObject);
begin
  inherited;
  { laatste conditie gewijzigd }
  UpdateFields();
end;


Maar terug naar het oorspronkelijke probleem:
Ik heb een probleem met een custom combobox TMyComboBox. Het probleem is dat de change-event niet afgaat als je met het keyboard iets intypt en dan met tab-toets naar volgende veld gaat.
Bij mij gaan de change events (zowel de verandering van kleur als de updatefields handler) gewoon beide af als ik iets intik. Wel is het zo dat als je op tab drukt er geen event gegenereerd wordt. Niet vreemd, aangezien TAB geen wijziging in de tekst veroorzaakt. Het zelfde geldt trouwens voor de muis. Als je een tekst intikt en dan met de muis op een knop drukt gaat het onchange event ook niet af. Wil je de tab toets afvangen moet je het onexit event gebruiken ipv het onchange

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09-2025

BdR

TV is gooder then books

Topicstarter
:) problem solved

In de MyCombobox was ook een generieke KeyPress(var Key: Char) event gedefinieerd. Die zoekt de eerst matchende waarde uit het lijstje op ahv wat er ingetypt wordt. Dat was opzich het probleem niet, maar de Key variable werd daarbij op #0 gezet. En daardoor gaat de OnChange event blijkbaar niet af. Dus ik heb nu aan het eind toegevoegd.
code:
1
2
if (Key = #0) then
  Self.Change();

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider

Pagina: 1