[Win32] Drop-down box van date/time picker tonen

Pagina: 1
Acties:

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 06-05 19:34

Tomatoman

Fulltime prutser

Topicstarter
Het gaat om dit ding:

Afbeeldingslocatie: http://www.fmsinc.com/products/components/components2000/graphics/DateAndTime.PNG

Als de drop-down box van een date/time picker niet zichtbaar is, hoe kun je via een Windows API call dat ding dan toch zichtbaar maken? Als gebruiker kun je als je in de date/time picker staat gewoon op F4 drukken, maar ik kan geen manier vinden om het via code te doen. De volgende probeersels lijken geen resultaat te hebben.

Picker.Handle is de window handle van een date/time picker.
Delphi:
1
2
3
  // twee probeersels:
SendMessage(Picker.Handle, CB_SHOWDROPDOWN, 1, 0);
SendMessage(DateTime_GetMonthCal(Picker.Handle), CB_SHOWDROPDOWN, 1, 0);
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const
  NMHdrDefaults: TNMHdr =
    (hwndFrom: 0;
     idFrom: 0;
     code: DTN_DROPDOWN);
var
  NMHdr: TNMHdr;
begin
  NMHdr := NMHdrDefaults;
  NMHdr.hwndFrom := Picker.Handle;

  // nog twee probeersels:
  SendMessage(Picker.Handle, WM_NOTIFY, 0, Integer(@NMHdr));
  SendMessage(DateTime_GetMonthCal(Picker.Handle), WM_NOTIFY, 0,
    Integer(@NMHdr));
end;


[edit]
DateTime_GetMonthCal(Picker.Handle) retourneert 0 (een ongeldige handle) als de drop-down box onzichtbaar is. Regel 14 in het tweede voorbeeld en regel 3 in het eerste voorbeeld zullen daardoor niet werken.

[ Voor 13% gewijzigd door Tomatoman op 06-06-2005 16:24 . Reden: aanvullende info ]

Een goede grap mag vrienden kosten.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 05-05 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Probeer eens een CB_SHOWDROPDOWN message te sturen, die wordt voor een combobox gebruikt om de contents te laten zien [.edit: dat had je dus al geprobeerd 8)7 ]. In het ergste geval zou je altijd nog WM_CHAR's kunnen sturen met de f4 knop als de toets die is ingedrukt.

[ Voor 12% gewijzigd door .oisyn op 06-06-2005 16:26 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 10:04
Misschien met een PostMessage? Of bestaat die niet in Delphi?

[ Voor 35% gewijzigd door farlane op 06-06-2005 16:43 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 05-05 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

farlane: als een sendmessage niet werkt zal een postmessage dat al helemaal niet doen.
Ik heb even in de gelekte win2k source gekeken, de window wordt alleen getoond in reactie op een WM_KEYDOWN met VK_F4 als wParam, of een WM_SYSKEYDOWN met en VK_DOWN als wParam.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 06-05 19:34

Tomatoman

Fulltime prutser

Topicstarter
.oisyn schreef op maandag 06 juni 2005 @ 16:45:
Ik heb even in de gelekte win2k source gekeken, de window wordt alleen getoond in reactie op een WM_KEYDOWN met VK_F4 als wParam, of een WM_SYSKEYDOWN met en VK_DOWN als wParam.
WM_KEYDOWN werkt inderdaad. Fraai is het niet, maar blijkbaar geldt dat ook voor de win2k source ;)
Delphi:
1
SendMessage(Picker.Handle, WM_KEYDOWN, VK_F4, 0);
of
Delphi:
1
Picker.Perform(WM_KEYDOWN, VK_F4, 0);

[ Voor 16% gewijzigd door Tomatoman op 06-06-2005 17:36 ]

Een goede grap mag vrienden kosten.


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

.oisyn schreef op maandag 06 juni 2005 @ 16:45:
farlane: als een sendmessage niet werkt zal een postmessage dat al helemaal niet doen.
Ik heb even in de gelekte win2k source gekeken, de window wordt alleen getoond in reactie op een WM_KEYDOWN met VK_F4 als wParam, of een WM_SYSKEYDOWN met en VK_DOWN als wParam.
is dit dan positief "hacken" ;)

ASSUME makes an ASS out of U and ME


  • BoomSmurf
  • Registratie: Maart 2003
  • Laatst online: 13-06-2025

BoomSmurf

Am-Ende!

Je wilt dus dat ding tonen, maar niet de dropdownbox zelf? Waarom gebruik je dan niet gewoon de monthcalender? Naast de dropdown op de palette, ziet er hetzelfde uit.

NB: Hoogstwaarschijnlijk niet van toepassing, edoch wellicht nuttige informatie; zowel de dropdown als de normale versie werken alleen met de systeem date/time format en niet via de date/time format variabelen die je in Delphi in kan stellen (kun je via messages oplossen).

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 06-05 19:34

Tomatoman

Fulltime prutser

Topicstarter
BoomSmurf schreef op maandag 06 juni 2005 @ 20:05:
Je wilt dus dat ding tonen, maar niet de dropdownbox zelf? Waarom gebruik je dan niet gewoon de monthcalender? Naast de dropdown op de palette, ziet er hetzelfde uit.
Ik gebruik de standaard TDateTimePicker - met dropdown box - om de gebruiker een einddatum te laten selecteren. In een andere TDateTimePicker staat een begindatum. Als een einddatum vóór de begindatum wordt geselecteerd, laat de applicatie een foutmelding zien en stuurt de gebruiker terug naar de TDateTimePicker. Om duidelijk te laten zien dat hij weer in de TDateTimePicker is teruggekeerd, wordt de dropdown box opengeklapt - kwestie van gebruikersvriendelijkheid en wat visuele feedback.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TMijnForm.ExpiryDateExit(Sender: TObject);
begin
  if not ADOConnection1.Connected then
    Exit;
  { Check if the expiry date is valid (being later than the issue date). If not,
    show a dialog and ask the user what to do.
      mrRetry: go back to the ExpiryDate control
      mrIgnore: set the default expiry date
      mrAbort: set the license to never expire (RadioDontExpire.Checked = True)}
  if (ExpiryDate.Date <= IssueDate.Date) and RadioDoExpire.Checked then
    case MijnDialoogVenster.ModalResult of
      mrRetry:
        begin
          ExpiryDate.SetFocus;
          ExpiryDate.Perform(WM_KEYDOWN, VK_F4, 0);
        end;
      mrIgnore: ExpiryDate.DateTime := MijnDefaultExpiryDate;
    else // mrAbort
      RadioDontExpire.OnClick(nil);
    end;
end;


Afbeeldingslocatie: http://img292.echo.cx/img292/4828/expiry0ir.gif

Een goede grap mag vrienden kosten.

Pagina: 1