AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Problem mit WM_NOTIFY beim Listview und Return
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit WM_NOTIFY beim Listview und Return

Ein Thema von Luckie · begonnen am 21. Feb 2003 · letzter Beitrag vom 23. Feb 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Problem mit WM_NOTIFY beim Listview und Return

  Alt 21. Feb 2003, 12:16
Delphi-Quellcode:
    WM_NOTIFY:
    begin
      { Benachrichtigungs-Codes vom Listview behandeln }
      if PNMHdr(lParam).idFrom = IDC_LV then
      case PNMHdr(lParam)^.code of
        { Doppelklick auf Listview-Eintrag -> Kontakt-Dialog öffnen }
        NM_DBLCLK, NM_RETURN:
        begin
          { Sender = Listview }
          Sender := SNDR_LV;
          Caption := GetCaption(hDlg, IDC_LV);
          { keinen Eintrag dierekt angeklickt, GetCaption ist gescheitert }
          if Caption = 'then exit;
          { ansonsten Kontakt anzeigen }
          DialogBox(hInstance, MAKEINTRESOURCE(200), hDlg, @dlgContact);
        end;
Der obiger Code sollte eigentlich auch ausgeführt werden, wenn der Listview den Focus hat und man Return drückt. Tut es aber nicht. Der Doppelklick funktioniert aber.

Der Code stammt aus meiner AdressDB, die man sich auch mit Source von meiner Seite runterladen kann.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2
  Alt 21. Feb 2003, 14:47
keine Ahnung. Wenn Du gar nicht weiterkommst hilft vielleicht ein Umweg.
OnKeyDown nutzen, auf Enter prüfen und Code in einer ausgelagerten Methode aufrufen (die dann auch für nm_Dblclk nutzen).

Gruß oki

P.S. Mein Notmotto ist: Viele Wege führen nach Rom. Schick ist nicht alles.
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#3
  Alt 21. Feb 2003, 14:52
Wird nicht funktionieren, da das Programm und der Source nonVCL ist.
@Luckie: vielleicht trotzdem in WM_COMMAND schreiben!?

Chris
  Mit Zitat antworten Zitat
janjan

Registriert seit: 16. Jan 2003
Ort: Bonn ("links über Königswinter ")
240 Beiträge
 
Delphi 4 Standard
 
#4
  Alt 21. Feb 2003, 15:04
Geb doch einfach mal PNMHdr(lParam)^.code aus und kuck was da drin ist wenn du Enter drückst...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5
  Alt 21. Feb 2003, 15:18
Zitat von janjan:
Geb doch einfach mal PNMHdr(lParam)^.code aus und kuck was da drin ist wenn du Enter drückst...
Auf die Idee bein ich auch schon gekommen. Nur bekommt die Anwendung alle Nase lang WM_NOTIFY.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#6
  Alt 21. Feb 2003, 15:38
Zitat von Luckie:
Nur bekommt die Anwendung alle Nase lang WM_NOTIFY.
Dann leg eine Log-Datei an in die jede WM_NOTIFY-Message eingetragen wird.. du kannst ja zwischendurch noch andere Einträge machn, damit dich dann besser orientieren kannst und die betreffende Message besser lokalisieren kannst..
Manuel Pöter
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7
  Alt 21. Feb 2003, 16:16
Das wäre eine Idee. Aber das amche ich erst, wenn Mathias Simmack auch nichts mehr einfällt.

Ich werde irre. In dem Demo aus meinen Tutorials geht es.

Jetzt wird es verrückt:
Delphi-Quellcode:
LVN_KEYDOWN:
          if(PLVKeyDown(lParam)^.wVKey = VK_F2) then
          begin
            { Sender = Listview }
          Sender := SNDR_LV;
          Caption := GetCaption(hDlg, IDC_LV);
          { keinen Eintrag dierekt angeklickt, GetCaption ist gescheitert }
          if Caption = 'then exit;
          { ansonsten Kontakt anzeigen }
          DialogBox(hInstance, MAKEINTRESOURCE(200), hDlg, @dlgContact);
          end;
Mit F2 geht es aber nicht mit VK_RETURN.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8
  Alt 21. Feb 2003, 17:09
Zitat:
Aber das amche ich erst, wenn Mathias Simmack auch nichts mehr einfällt.
Es geht auch mit ENTER; ich habe mal eben meinen HED (Hosts Editor) entsprechend angepasst:
Code:
    WM_NOTIFY:
      case PNMHdr(lp)^.code of
        LVN_KEYDOWN:
          case PLVKeyDown(lp)^.wvKey of
            VK_RETURN:
              SendMessage(wnd,WM_COMMAND,MAKEWPARAM(IDC_EDITENTRY,BN_CLICKED),0);
          end;
      end;
Keine Probleme. Ich drücke ENTER und der Bearbeiten-Dialog erscheint.
So, what?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9
  Alt 21. Feb 2003, 22:40
Ich habe es ausprobiert. Es geht definitiv nicht bei mir. Auch NM_RETURN geht nicht. Farg mich bitte nicht, warum nicht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#10
  Alt 22. Feb 2003, 10:13
Meine Vermutung ist, dass sich -durch deine ganzen Erweiterungen/Änderungen/usw.- Stellen im Programmcode befinden, die zwar keine Fehler verursachen, sich aber gegenseitig behindern. Eine andere Möglichkeit gibt es eigentlich nicht, denn wenn ich an meine Programme denke: HED, UIS und EFlagsEd verfügen auch über Listview, Toolbar und Statuszeile. Prinzipiell also die selben Elemente wie in deiner Datenbank, nur dass ich eben auch mit ENTER die Listview-Items aufrufen kann (bzw. den Dialog, der dann erscheinen soll).
Ich habe mir mal den Quellcode des Programms angesehen, und meine ehrliche Meinung ist: wenn du mal Zeit und Muße hast, dann solltest du es von Grund auf neu schreiben!

Dinge, die mir besonders aufgefallen sind:
  • Du hast einen Dialog als Hauptfenster. In dem Dialog steckt aber nur die Listview, alles andere wird im Programm erzeugt. Ich hätte diesen Schritt übersprungen und Fenster und Listview auch gleich im Programm erstellt; also ohne Dialogressource.
  • Der Quellcode ist für meinen Geschmack zu unübersichtlich. Du hast zwar räumliche Trennungen (durch mehrzeilige Kommentare), aber manchmal stecken Prozeduren in "Sparten", in denen sie, IMHO, eigentlich nichts zu suchen haben.
  • Was mir ebenfalls nicht sonderlich gefällt (persönliche Meinung!), ist das Deklarieren von Variablen an zentraler Stelle. Das mache ich nur bei Texten (Konstanten), die man z.B. übersetzen können soll. Variablen deklariere ich erst dann, wenn sie gebraucht werden; die ganzen Fenster-Handles z.B. erst vor der "WndProc", usw.
    Benötige ich so ein Handle dann doch vor seiner Deklaration, dann übergebe ich es der Prozedur (die es braucht) als Parameter. Erst wenn ich das Handle in verschiedenen Prozeduren benötige, ziehe ich es weiter nach vorn.
  • Schau dir mal bitte den Teil mit dem Dropdown-Menü für den "Drucken"-Button an. Solltest du mal einen Button davor einfügen, oder solltest du evtl. die Toolbar-Anpassung ausprobieren, bei der der Anwender entscheiden kann, welche Buttons er wo sehen will, dann erscheint das Menü unter Garantie unter dem falschen Button.
  • Es gibt einige Optimierungsmöglichkeiten im Code. Als Beispiel sei das Umschalten der Listview-Ansicht (Icon, Report, Liste) genannt. Das ist immer das selbe. Eine Prozedur, aufgerufen mit dem gewünschten Stilattribut (wie im Tutorial), würde den Code verkürzen und die Exe auch wieder ein Stückchen kleiner machen.
  • Die Konstante "DATFILE" konnte ich übrigens auskommentieren, ohne dass das Auswirkungen gehabt hätte.
  • Na gut, die Namen von bestimmten Parametern würde ich nicht als Fehler ansehen. Ich persönlich (!) bevorzuge nur eben das "richtige" Casten und vermeide daher Variablennamen, die mit irgendwelchen Typen identisch sind (HWND, WPARAM, LPARAM, HBITMAP, ...) - obwohl letztlich auch bloß LONGINTS usw. hinter solchen Typen stecken.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz