AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Implement ListView

Ein Thema von EWeiss · begonnen am 10. Jan 2017 · letzter Beitrag vom 10. Jan 2017
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Implement ListView

  Alt 10. Jan 2017, 05:11
Hier findest du entsprechenden Code mit Erläuterungen:
https://de.m.wikibooks.org/wiki/Prog...elphi:_Pointer
Es fehlt vor der Verwendung lediglich die Reservierung des Speichers mit New und nach dem SendMessage die Freigabe mit Dispose.
Supi.. Sebastian hast mir sehr geholfen.

Delphi-Quellcode:
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;
Jetzt kann ich mich mit den anderen Kram Ownerdraw usw. .beschäftigen.
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

Geändert von EWeiss (10. Jan 2017 um 05:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.923 Beiträge
 
Delphi 12 Athens
 
#2

AW: Implement ListView

  Alt 10. Jan 2017, 05:17
Wann ist das grundsätzlich gegeben den Speicher mit NEW zu Reservieren?
Immer wenn du einen Pointer hast, der auf nichts Bekanntes zeigt. Sprich einen Pointer auf eine lokale Variable musst du nicht initialisieren, einen Pointer, den du ohne weitere Zusammenhänge lokal als Variable deklariert hast, schon.

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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Implement ListView

  Alt 10. Jan 2017, 05:35
Zitat:
Immer wenn du einen Pointer hast, der auf nichts Bekanntes zeigt. Sprich einen Pointer auf eine lokale Variable musst du nicht initialisieren, einen Pointer, den du ohne weitere Zusammenhänge lokal als Variable deklariert hast, schon.
Das ist mal Aussagekräftig Danke.

Zitat:
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.
Jo wie ich es hier schon gemacht habe.

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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#4

AW: Implement ListView

  Alt 10. Jan 2017, 09:23
Natürlich kann man auch direkt den Datentypen verwenden und spart sich dann die manuelle Speicherreservierung und den von dir vergessenen Ressourcenschutzblock (Try-Finally).
Delphi-Quellcode:
var
  MessageStructure: TNMHdr;

SendMessage(..., LPARAM(@MessageStructure));

PS: Eigentlich müsste man beim Zugriff auf Pointer noch den Zeiger dereferenzieren MessageStructure^.hwndFrom ,
aber Delphi macht das netterweise implizit, von sich aus, wenn man .irgendwas auf den Zeiger anwendet.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Jan 2017 um 09:50 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Implement ListView

  Alt 10. Jan 2017, 09:39
Zitat:
Eigentlich müsste mal beim Zugriff auf Pointer noch den Zeiger dereferenzieren MessageStructure^.hwndFrom
Das geht nicht nur wenn MessageStructure als PNMHdr definiert ist. (ZeigerTyp erforderlich)

Dein anderer Vorschlag geht auch ohne Speicher Reservierung.

Delphi-Quellcode:
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;
Ich lasse es mal mit NEW
Aber gut zu wissen das es auch anders geht.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.923 Beiträge
 
Delphi 12 Athens
 
#6

AW: Implement ListView

  Alt 10. Jan 2017, 09:56
Jo wie ich es hier schon gemacht habe.

SendMessageW(GetParent(WinHandle), WM_COMMAND, MAKELONG(DlgItemID, LBN_DBLCLK), lp);
Ich meinte so etwas wie:
Delphi-Quellcode:
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);
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.
WM_COMMAND gibt es ja im Standard auch schon. Du bist aber nicht auf diese Standard-Messages beschränkt.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Implement ListView

  Alt 10. Jan 2017, 10:03
Zitat:
Du bist aber nicht auf diese Standard-Messages beschränkt.
Jo das ist klar nur müsste ich diese dann der Anwendung bekannt machen.
Deshalb nutze ich vorgegebene. in der DLL soweit es geht.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#8

AW: Implement ListView

  Alt 10. Jan 2017, 10:08
WM_USER+x
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Implement ListView

  Alt 10. Jan 2017, 10:53
Noch einmal
Zitat:
nur müsste ich diese dann der Anwendung bekannt machen.
gruss
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Implement ListView

  Alt 10. Jan 2017, 11:35
Delphi-Quellcode:
const
  mymsg1:=WM_USER+1;
  mymsg2:=WM_user+2;
Ist ja nicht deeer Aufwand.
Oder geht's Dir um die Proceduren die die Messages verarbeiten sollen?


Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:10 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