Autor Beitrag
Jochen W.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 56



BeitragVerfasst: Di 08.11.05 08:34 
Guten Morgen!

Ich habe eine kleine Anwendung ohne die VCL geschrieben. Das hat auch alles so weit funktioniert doch bei einer Sache komme ich nicht weiter. Hab auch schon in dem WinAPI Toturial (von Lucky) geschaut aber nicht wirklich etwas gefunden was mir hilft etwas zu implementieren das dann auch funktionert. ;-) Bin halt noch nicht so fit was nonvcl angeht. ;-)

Jetzt zu Frage: Ich habe ein Fenster erstellt und auf dem Fenster eine Listbox. Meine Frage ist nun wie ich auf ein Doppelklick und das drücken der Taste Enter in der Listbox reagieren kann?

Hier mal meine WndMain Procedure:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
  Function WndProc (hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: LParam) : lresult; stdcall;
  Var
    Result : lresult;
    Buffer : PChar;
    Loop : Integer;
  begin
    Result := 0;

    case uMsg of
      WM_CREATE:
        begin
          IgnoreBool := MoveWindow (
            hWnd, 10, 10, 100, 100,
            True
          );

          hwndListBox := CreateWindowEx (
            WS_EX_CLIENTEDGE,
            'LISTBOX', nil,
            WS_CHILD Or WS_VISIBLE Or LBS_NOTIFY Or WS_VSCROLL Or WS_BORDER Or WS_TABSTOP,
            10, 10, 80, 80,
            hWnd, IDC_LISTBOX, hInstance, nil
          );

      WM_COMMAND:
        Case hiword (wParam) Of
            LBN_SELCHANGE:
              Case LoWord (wParam) Of
                IDC_LISTBOX:
                  Begin
                  End;
              End;
          End;
    End;

    Result := DefWindowProc(hWnd, uMsg, wParam, lParam);

    WndProc := Result;
  End;

Auf eine Änderung der Listbox kann ich schon reagieren aber nicht auf einen Doppelklick und einen Tastendruck. Wäre schön wenn mir jemand ein paar Hinweise geben könnte.

Vielen lieben dank!

Bye Jochen
Jochen W. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 56



BeitragVerfasst: Di 08.11.05 09:11 
So, nach dem ich noch etwas in der messages.pas Datei rumgesucht habe habe ich auch die Konstate LBN_DBLCLK entdeckt. ;-) Und das scheint auch zu funktionieren.

Allerdings hab ich dann noch das Problem mit der Taste Enter. Ich hab auch schon probiert den OK Button das Flag BS_DEFPUSHBUTTON zu geben in der Hoffnung, dass dann ein Enter in der Listbox automatisch zu einen Klick auf dem Ok-Button führt (halt so wie man das aus der VCL kennt). Aber leider klappt das nicht. Der Ok-Button hat zwar mit diesem Flag einen dickeren Rand (was üblich für einen Default-Button ist) aber wenn ich Enter drücke (in der Listbox) wird der Ok-Button nicht angeklickt. :-(

Hat jemand eine Tipp? Danke!!

Bye Jochen
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.11.05 13:02 
Guck dir mal Suche im MSDN WM_VKEYTOITEM an:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
    WM_VKEYTOITEM:
      begin
{$WARNINGS OFF}
        if lParam = GetDlgItem(hTabDlgs[3], ID_LST_USER_GRPS) then
{$WARNINGS ON}
        begin
          case loword(wParam) of
            VK_DELETE:
              begin
                SendMessage(GetDlgItem(hTabDlgs[3], ID_LST_USER_GRPS), LB_DELETESTRING, hiword(wParam), 0);
                MyEnableMenuItem(hMenu, ID_MNU_SAVE, True);
                bModified := True;
              end;
          end;
        end
{$WARNINGS OFF}
        else if lParam = GetDlgItem(hTabDlgs[3], ID_LST_AVAILABLE_GRPS) then
{$WARNINGS ON}
        begin
          case loword(wParam) of
            VK_INSERT:
              begin
                SendMessage(GetDlgItem(hTabDlgs[3], ID_LST_AVAILABLE_GRPS), LB_GETTEXT, hiword(wParam),
                  Integer(@buffer));
                if SendMessage(GetDlgItem(hTabDlgs[3], ID_LST_USER_GRPS), LB_FINDSTRING, -1, Integer(@buffer)) = LB_ERR
                  then
                begin
                  SendMessage(GetDlgItem(hTabDlgs[3], ID_LST_USER_GRPS), LB_ADDSTRING, 0, Integer(@buffer));
                  MyEnableMenuItem(hMenu, ID_MNU_SAVE, True);
                  bModified := True;
                end;
              end;
          end;
        end;
        EnableMenuItem(hmenu, ID_MNU_SAVE, MF_BYCOMMAND or MF_ENABLED);
      end;

So kan man auf Entferen und Einfügen reagieren. Enter ist dann entsprechend VK_RETURN.
Jochen W. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 56



BeitragVerfasst: Di 08.11.05 14:07 
Danke Luckie für die Hilfe!

Ich hab es auch zum laufen bekommen. Allerdings erst als ich gemerkt habe, dass ich IsDialogMessage nicht benutzen darf da diese Funktion wohl die Message WM_VKEYTOITEM selbst verwarbeitet.

Gibt es da eine Lösung das ich beides benutzen kann. Jetzt funktioniert die Enter-Taste aber die Tab-Taste nicht mehr. ;-)

Vielen dank!

bye Jochen
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Di 13.03.07 10:51 
Hallo Jochen!

Ich habe das gleiche Problem. Auf meinem Fenster befinden sich drei Elemente: Eine Listbox und zwei Buttons (s. Anhang).

Wähle ich einen Eintrag in der Listbox aus und drücke dann ENTER oder ESC funktioniert es leider nicht wie ich es erwartet hätte. Der OK Button hat unter anderem das Style BS_DEFPUSHBUTTON. Aber auch das reicht wohl nicht.

Hast du zufällig eine Lösung gefunden bzw. hat jemand anders eine Lösung?

Gruß
Tino
Einloggen, um Attachments anzusehen!