![]() |
Implement ListView
Habe kleine Probleme beim implementieren einer ListView.
Meine DLL schickt folgende Message beim WM_LBUTTONDBLCLK.
Delphi-Quellcode:
var
MessageStructure: PNMHdr;
Delphi-Quellcode:
in der Anwendung wird die Message so verarbeitet.
function TSkinListView.ListViewProc(WinHandle: hWnd; Msg: UINT; wP: WParam; lP: LParam): LRESULT;
begin case Msg of WM_LBUTTONDBLCLK: begin MessageStructure := PNMHdr(lP); MessageStructure.hwndFrom := WinHandle; MessageStructure.idFrom := DlgItemID; MessageStructure.code := NM_DBLCLK; SendMessageW(ListViewParent, WM_NOTIFY, DlgItemID, integer(MessageStructure)); Result := 0; exit; end; end; Result := CallWindowProc(Pointer(FPrevClientProc), WinHandle, Msg, wP, lP); end;
Delphi-Quellcode:
Das Problem ist ich kann die MessageStructure nicht füllen.
WM_NOTIFY:
begin if(PNMHdr(lp)^.hwndFrom = PLList.Handle) then begin case PNMHdr(lp)^.code of NM_DBLCLK: begin nItem := PLList.GetCursel(lP); if nItem > 0 then begin LastPlayListTitle := nItem; HiddenPLList.ListSelectPlus(HiddenPLList.Handle, nItem); getAudioFile := HiddenPLList.ListGetText(HiddenPLList.Handle, nItem); SKAERO_UpdateWindow(lP, False); HiddenPLList.ListSetTopIndex(HiddenPLList.Handle, nItem); // PLList.ListSetTopIndex(PLList.Handle, nItem); BassChannelPlay; end; end; end; end; end; Error: Zitat:
gruss |
AW: Implement ListView
Zitat:
![]() Zitat:
Intel und Co. haben beschlossen, dass der Integer beim Sprung von 32 auf 64 nicht mehr mit wächst und haben ihn eingefrohren. (früher war der mal 16 Bit, in 16 Bit Systemen) Besser Typen verwenden, die für solche Casts vorgesehn sind, wie z.B. UIntPtr und IntPtr, oder die "neuen" Integer-Typen verwenden, welche man nun erfunden hat und die ab jetzt wachsen sollen. In Delphi sind das NativeInt und NativeUInt. Bzw. für Casts bei Messages gibt es extra die Typen LPARAM, WPARAM und LRESULT, damit immer alles richtig läuft, auch wenn man irgendwann auf 64 Bit umstellen würde. |
AW: Implement ListView
Zitat:
WM_NOTIFY in meiner ListViewProc funktioniert nicht
Delphi-Quellcode:
if(PNMHdr(lp)^.hwndFrom = PLList.Handle) then
tritt niemals ein. Logisch weil WM_NOTIFY an das MainWindow gesendet wird. Zitat:
Aber dazu muss ich erst mal erfolgreich die Message senden können.
Delphi-Quellcode:
SendMessageW(ListViewParent, WM_NOTIFY, DlgItemID, LParam(MessageStructure));
Ich könnte es jetzt auf diese weise machen
Delphi-Quellcode:
SendMessageW(GetParent(WinHandle), WM_COMMAND, MAKELONG(DlgItemID, LBN_DBLCLK), lp);
Aber das ist nicht das typische ListView verhalten beim Doubleclick. Wenn dann jemand anderes damit arbeitet kommt er nicht mehr zurecht. gruss |
AW: Implement ListView
Zitat:
Im Moment schreibst du, da der Parameter, den du einfach auf einen Pointer auf den Record castest, ja nicht einmal ein Pointer ist, an eine quasi zufällige Stelle im Speicher und hoffst, dass das gut geht... Auffallen tut das bei dir, weil du eben nicht einfach überall in den Speicher schreiben darfst. Deshalb die Zugriffsverletzung. Deiner Meldung zufolge hast du übrigens an Position 378/144 geklickt. // edit Mal ein Beispiel was du da machst:
Delphi-Quellcode:
Die Fehlermeldung sollte deiner aktuellen sehr ähnlich sein.
var
a: Integer; MessageStructure: PNMHdr; begin a := $017a0090; MessageStructure := PNMHdr(a); MessageStructure.hwndFrom := WinHandle; ... end; |
AW: Implement ListView
Zitat:
Mein Problem ist das ich nicht weis welche Message ich anstelle von WM_LBUTTONDBLCLK verwenden soll. Damit im MainWindow WM_NOTIFY NM_DBLCLK: auch ausgelöst wird. Das macht ärger MessageStructure (nicht immer).. Zitat:
Eigentlich sollte sich dann der Record-Zeiger über lP zugewiesen werden. Scheint aber nicht immer der Fall zu sein. gruss |
AW: Implement ListView
Hier findest du entsprechenden Code mit Erläuterungen:
![]() Es fehlt vor der Verwendung lediglich die Reservierung des Speichers mit New und nach dem SendMessage die Freigabe mit Dispose. |
AW: Implement ListView
Zitat:
Delphi-Quellcode:
Jetzt kann ich mich mit den anderen Kram Ownerdraw usw. .beschäftigen.
function TSkinListView.ListViewProc(WinHandle: hWnd; Msg: UINT; wP: WParam; lP: LParam): LRESULT;
begin case Msg of WM_LBUTTONDBLCLK: begin OldSelected := GetCurSel(WinHandle); new(MessageStructure); MessageStructure.hwndFrom := WinHandle; MessageStructure.idFrom := DlgItemID; MessageStructure.code := NM_DBLCLK; SendMessageW(GetParent(WinHandle), WM_NOTIFY, DlgItemID, LParam(MessageStructure)); Dispose(MessageStructure); Result := 0; exit; end; end; Result := CallWindowProc(Pointer(FPrevClientProc), WinHandle, Msg, wP, lP); end; Hab ich so groß noch nicht verwendet NEW.. man lernt immer was dazu. Wann ist das grundsätzlich gegeben den Speicher mit NEW zu Reservieren? gruss |
AW: Implement ListView
Zitat:
Nebenbei: Du musst auch nicht WM_NOTIFY benutzen. Du kannst ruhig eine eigene Windows Message und einem eigenen Recordtyp verwenden, wenn du vielleicht noch andere Informationen weitergeben möchtest. |
AW: Implement ListView
Zitat:
Zitat:
Delphi-Quellcode:
SendMessageW(GetParent(WinHandle), WM_COMMAND, MAKELONG(DlgItemID, LBN_DBLCLK), lp);
Das Problem dabei ist nur das LBN_DBLCLK (Listbox DoubleClick) eigentlich nichts mit dem ListView gemein hat. Wenn man über WM_NOTIFY geht weis jeder was mit NM_DBLCLK: in Verbindung mit dem ListView gemeint ist. gruss |
AW: Implement ListView
Natürlich kann man auch direkt den Datentypen verwenden und spart sich dann die manuelle Speicherreservierung und den von dir vergessenen Ressourcenschutzblock (Try-Finally). :zwinker:
Delphi-Quellcode:
var
MessageStructure: TNMHdr; SendMessage(..., LPARAM(@MessageStructure)); PS: Eigentlich müsste man beim Zugriff auf Pointer noch den Zeiger dereferenzieren
Delphi-Quellcode:
,
MessageStructure^.hwndFrom
aber Delphi macht das netterweise implizit, von sich aus, wenn man
Delphi-Quellcode:
auf den Zeiger anwendet.
.irgendwas
|
AW: Implement ListView
Zitat:
Dein anderer Vorschlag geht auch ohne Speicher Reservierung.
Delphi-Quellcode:
Ich lasse es mal mit NEW ;)
function TSkinListView.ListViewProc(WinHandle: hWnd; Msg: UINT; wP: WParam; lP: LParam): LRESULT;
begin case Msg of WM_LBUTTONDBLCLK: begin OldSelected := GetCurSel(WinHandle); MessageStructure.hwndFrom := WinHandle; MessageStructure.idFrom := DlgItemID; MessageStructure.code := NM_DBLCLK; SendMessageW(GetParent(WinHandle), WM_NOTIFY, DlgItemID, LParam(@MessageStructure)); Result := 0; exit; end; end; Result := CallWindowProc(Pointer(FPrevClientProc), WinHandle, Msg, wP, lP); end; Aber gut zu wissen das es auch anders geht. gruss |
AW: Implement ListView
Zitat:
Delphi-Quellcode:
Kompiliert so wohl nicht, aber was ich damit zeigen möchte ist, dass du auch eine ganz eigene Message und einen ganz eigenen Recordtyp deklarieren kannst und damit arbeiten kannst.
const
WM_MySuperSpecialOperation = WM_USER + 777; // ab WM_USER oder WM_APP kannst du eigene Botschaften definieren var MyValue: TMyVeryOwnRecord; begin SendMessageW(GetParent(WinHandle), WM_MySuperSpecialOperation, 0, @MyValue); WM_COMMAND gibt es ja im Standard auch schon. Du bist aber nicht auf diese Standard-Messages beschränkt. |
AW: Implement ListView
Zitat:
Deshalb nutze ich vorgegebene. ;) in der DLL soweit es geht. gruss |
AW: Implement ListView
WM_USER+x
|
AW: Implement ListView
Zitat:
Zitat:
|
AW: Implement ListView
Delphi-Quellcode:
Ist ja nicht deeer Aufwand.
const
mymsg1:=WM_USER+1; mymsg2:=WM_user+2; Oder geht's Dir um die Proceduren die die Messages verarbeiten sollen? Gruß K-H |
AW: Implement ListView
Zitat:
Wenn ich jetzt Messagen in meiner DLL definiere bsp..
Delphi-Quellcode:
BS_LABEL_LEFT = BS_USERBUTTON + BS_LEFT;
BS_LABEL_RIGHT = BS_USERBUTTON + BS_RIGHT; BS_LABEL_CENTER = BS_USERBUTTON + BS_CENTER; BS_LABEL_MULTILINE = BS_USERBUTTON + BS_LEFT + BS_MULTILINE; und diese in meiner Anwendung unter bsp.. WM_NOTIFY verwenden will dann muss ich diese öffentlich machen. Das muss ich aber nicht wenn ich als bsp. NM_DBLCLK verwende da diese Message dem ListView bekannt ist. Ka warum jeder jetzt auf WM_USER rumreitet das ist mir doch bekannt ;) Schaut doch in mein VPiano Sample da sind Hunderte von WM_USER+\WM_APP+ Messagen definiert. Wie viel braucht ihr?
Delphi-Quellcode:
gruss
ID_LABEL_INTRO = WM_APP + 100; // Informations Label
ID_FLIPNOTES = WM_APP + 102; // Noten Umdrehen ID_DRUM = WM_APP + 103; // Drum Checkbox ID_INSTRUMENT = WM_APP + 104; // Instrumenten Checkbox ID_VL = WM_APP + 105; // VL Checkbox ID_EFFECTS = WM_APP + 106; // Effects Checkbox ID_LABEL_GENRE = WM_APP + 107; // Informations Label ID_GLASS_OPACITY_LABEL = WM_APP + 108; // Informations Label ID_TRACK_OPACITY = WM_APP + 109; // Trackbar Transparent ID_LINEVERT = WM_APP + 112; // Einfache Linie ID_VSCROLL = WM_APP + 114; ID_VERSION = WM_APP + 115; // Versions Info ID_BTN_ABOUT = WM_APP + 116; // About Button ID_BTN_ABOUT2 = WM_APP + 117; // About Button KeyTasten Window ID_KNOB_SPEED = WM_APP + 118; // Knob MidiTracker Geschwindigkeit ID_VOLUME_LABEL = WM_APP + 119; // Informations Label ID_SUSTAIN = WM_APP + 120; // Sustain Checkbox ID_SMALLESTNOTELLABEL = WM_APP + 121; // Informations Label ID_KNOB_CHANNEL = WM_APP + 122; // Channel Knob ID_CHANNEL_LABEL = WM_APP + 123; // Informations Label ID_KNOB_CHORD = WM_APP + 124; // Chord Knob ID_CHORD_LABEL = WM_APP + 125; // Informations Label ID_OPEN = WM_APP + 126; // Midi Tracker File laden ID_SAVE = WM_APP + 127; // Midi Tracker File speichern ID_PLAY = WM_APP + 128; // MidiTracker abspielen ID_EXPORT = WM_APP + 129; // Midi Tracker File zu Midi Exportieren ID_PRESETSONG = WM_APP + 130; // Presetsong abspielen ID_BTN_BACKL = WM_APP + 131; // Nächtes Hintergrundbild ID_BTN_BACKR = WM_APP + 132; // Vorheriges Hintergrundbild ID_BACKGROUND_LABEL = WM_APP + 133; // Informations Label ID_BACKGROUND = WM_APP + 134; // Hintergrund Image ID_SWITCH = WM_APP + 135; // Midi aktivieren/deaktivieren ID_MODULATION_LABEL = WM_APP + 136; // Informations Label ID_KNOB_MODULATION = WM_APP + 137; // Modulations Knob ID_DLG_INFOLABEL = WM_APP + 140; // Informations Label ID_BTN_IMPORTANT = WM_APP + 141; // Warnungs Bitmap ID_SPEEDLABEL = WM_APP + 142; // Informations Label ID_SPEEDVALLABEL = WM_APP + 143; // MidiTracker Geschwindigkeit ID_CHANNELLABEL = WM_APP + 144; // Informations Label ID_CHANNELVALLABEL = WM_APP + 145; // Channel Value ID_CHORDLABEL = WM_APP + 146; // Informations Label ID_CHORDVALLABEL = WM_APP + 147; // Chord Value ID_BEATSLABEL = WM_APP + 148; // Informations Label ID_BTN_INTRO = WM_APP + 149; // Beat Intro Button ID_BTN_FILL = WM_APP + 150; // Beat Fill Button ID_BTN_PAUSE = WM_APP + 151; // Beat Pause Button ID_BTN_ENDING = WM_APP + 152; // Beat Ending Button ID_BTN_STOP = WM_APP + 153; // Beat Stop Button ID_BTN_BEATR = WM_APP + 154; // Nächster Beat Button ID_BTN_BEATL = WM_APP + 155; // Vorheriger Beat Button ID_TRACK_BEAT = WM_APP + 156; // Aktuell ausgewälter Beat ID_BTN_INSTR = WM_APP + 157; // Nächstes Instrument Button ID_BTN_INSTL = WM_APP + 158; // Vorheriges Instrument Button ID_BANK1 = WM_APP + 159; // Instrumenten Bank1 ID_BANK8 = WM_APP + 166; // Instrumenten Bank8 ID_INSTRUMENTLABEL = WM_APP + 167; // Informations Label ID_MIDITRACKER = WM_APP + 168; // MidiTracker anzeigen oder verstecken ID_USEKEY = WM_APP + 169; // Focus für Tasten Eingaben ID_KEYBOARDMAP = WM_APP + 170; // Keyboard Map anzeigen ID_KEYBOARDSETTING = WM_APP + 171; // Keyboard Settings Window anzeigen ID_KEY_LABEL = WM_APP + 172; // Informations Label ID_BLINKLABEL = WM_APP + 173; // Informations Label ID_SHOWLYRICS = WM_APP + 174; // Lyrics anzeigen ID_FPS_LABEL = WM_APP + 175; // FPS label ID_TRACK_FPS = WM_APP + 176; // Trackbar Frames pro Sekunden ID_LIMITFRAMES = WM_APP + 177; // Frames limitieren ID_MIDIBOX = WM_APP + 178; // Midi Tracker Anzeigen ID_EDITTRACKLABEL = WM_APP + 179; // Informations Label ID_EDITTRACK1 = WM_APP + 180; // Midi Tracker Editier Button Track1 ID_EDITTRACK16 = WM_APP + 195; // Midi Tracker Editier Button Track16 ID_TRACK_MASTERVOL = WM_APP + 196; // Channel MasterVolume ID_MASTERVOLLABEL = WM_APP + 197; // MasterVolume Informations Label ID_TRANSPOSE_LABEL = WM_APP + 198; // Informations Label ID_BTN_TRANSPUP = WM_APP + 199; // Song nach oben Transponieren ID_HIDETRACKLABEL = WM_APP + 300; // Informations Label ID_HIDETRACK1 = WM_APP + 301; // Midi Tracker Hidden Button HiddenTrack1 ID_HIDETRACK16 = WM_APP + 316; // Midi Tracker Hidden Button HiddenTrack16 ID_DRAWBUTTON = WM_APP + 317; // Funktions Edit Button ID_INSERTBUTTON = WM_APP + 318; // Funktions Einfügen Button ID_SELECTBUTTON = WM_APP + 319; // Funktions Auswahl Button ID_COPYBUTTON = WM_APP + 320; // Kopier Button ID_CUTBUTTON = WM_APP + 321; // Ausschneiden Button ID_PASTEOVERBUTTON = WM_APP + 322; // Einfügen Überschreibt die Noten ID_PASTEINSERTBUTTON = WM_APP + 323; // Fügt Sie ein ohne zu Überschreiben ID_SPACEBUTTON = WM_APP + 324; // Platz zwischen Noten schaffen ID_BTN_TRANSPDOWN = WM_APP + 325; // Song nach unten Transponieren ID_BTN_SMALLNDR = WM_APP + 326; // Nächster Kleinster Notenwert im Grid ID_BTN_SMALLNDL = WM_APP + 327; // Vorheriger Kleinster Notenwert im Grid ID_OVERLAYLABEL = WM_APP + 328; // StartSpur ab der Gespielt werden soll ID_BTN_SYS = WM_APP + 329; // Anwendungs Icon ID_NEWBUTTON = WM_APP + 330; // MidiTracker Grid löschen Variablen neu Initialisieren ID_REVERSENOTES = WM_APP + 331; // Entgegengesetzte Noten Button ID_REWIND = WM_APP + 332; // StartSpur auf Ausgangsstellung zurück setzen ID_SBARFRAME = WM_APP + 333; // Container für Sidebar Labels ID_TBARFRAME = WM_APP + 334; // Container für Topbar Labels ID_LOADEDFILE = WM_APP + 335; // Informations Label ID_LOADEDFILEVAL = WM_APP + 336; // Zeigt das File an das geladen wurde ID_IMPORT = WM_APP + 337; // Importieren von MidiFile ID_SMALLESTNOTELABELVAL = WM_APP + 338; // Kleinste Note Value ID_BEATSPERMEASURE = WM_APP + 339; // Takt Informations Label ID_VOLUME1 = WM_APP + 340; // Volumen Track1 ID_VOLUME16 = WM_APP + 355; // Volumen Track16 ID_BEATSPERMEASUREVAL = WM_APP + 356; // Takt Value Label ID_BTN_BEATSPERMEASURER = WM_APP + 357; // Nächste Taktrate ID_BTN_BEATSPERMEASUREL = WM_APP + 358; // Vorherige Taktrate ID_SOUNDTIME = WM_APP + 359; // Komplette Laufzeit Song ID_MEDIATIMER = WM_APP + 360; // Aktuelle Laufzeit Media Timer ID_CLOCK = WM_APP + 361; // Uhr ID_PIANOBACK = WM_APP + 362; // Piano KeyBoard Hintergrund ID_KEYPIANOBACK = WM_APP + 363; // Piano KeyTasten Hintergrund ID_FRAMEOPTION = WM_APP + 364; // Frame Option ID_FRAMEEDITTRACK = WM_APP + 365; // Frame Edit Track ID_FRAMEEDITTRACKB = WM_APP + 366; // Frame Edit TrackB ID_FRAMEHIDETRACK = WM_APP + 367; // Frame HideTrack ID_BACKGROUNDFRAME = WM_APP + 368; // Background Frame ID_FRAMEPIANOBACK = WM_APP + 369; // Piano Background Frame ID_FRAMELISTE = WM_APP + 370; // Frame Liste ID_FRAMELEFTSIDE = WM_APP + 371; // Frame auf der Linken Seite ID_FRAMEINSTRUMENT = WM_APP + 372; ID_FRAMEVL = WM_APP + 373; ID_FRAMEEFFECTS = WM_APP + 374; ID_FRAMEDRUMS = WM_APP + 375; ID_FRAMEUSEKEY = WM_APP + 376; ID_FRAMEUSEKEY2 = WM_APP + 377; ID_BACKGROUNDFRAME2 = WM_APP + 378; ID_FRAMEPIANOBACK2 = WM_APP + 379; ID_TBACK2 = WM_APP + 380; ID_BACKGROUNDFRAME3 = WM_APP + 381; ID_INFOLABEL = WM_APP + 382; ID_INFOLABEL2 = WM_APP + 383; ID_BTN_ICON = WM_APP + 384; ID_LOADMIDIFILES = WM_APP + 385; ID_PLAY2 = WM_APP + 386; ID_BTN_DESIGN = WM_APP + 387; ID_INSTRUMENTLIST = WM_APP + 388; // InstrumentenListe ID_DRUMLIST = WM_APP + 389; // DrumListe ID_EFFECTLIST = WM_APP + 390; // EffektListe ID_VLLIST = WM_APP + 391; // VLListe ID_LYRICSFRAME = WM_APP + 392; // Lyrics Frame |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz