![]() |
Rechtsklick abschießen
Ich habe in meiner anwendung eine listview mit multiselect und einem poupmenü.
wenn ich jetzt rechts klicke, wird die aktuelle auswahl aufgehoben und das wo ich klicke markiert. das will cih aber nicht. meine aktuelle lösung: ich speichere im onmousemove die selection in einem array of bool. beim onpopup wird das array zurück in die listview geschrieben. da das aber 1. suboptimal und 2. nicht oop ist, habe ich mir überlegt, dass ich einfach den rechtsklick ausschalte. das habe ich bis jetzt zustande gebracht(LV ist die listview):
Delphi-Quellcode:
Und jetzt brauche ich eben etwas, das die Message annulliert.
procedure WndProc(Msg:TMessage);
var p:TPoint; inLV:boolean; begin inherited; p:=screentoclient(mouse.cursorpos); inLV:= ( (p.X >= LV.left) and (p.X <= LV.left+LV.width) and (p.Y >= LV.top) and (p.Y <= LV.top + LV.Height) ); if ( msg.msg = WM_RBUTTONDOWN ) and inLV then begin msg := nil; //geht nicht end; end; gibt es da was? |
Re: Rechtsklick abschießen
*push*
hallo? niemand da der mir sowas einfaches sagen kann? |
Re: Rechtsklick abschießen
Ich meine es gibt WM_NULL (oder war's WM_NONE? Ich glaube eher WM_NULL...)
|
Re: Rechtsklick abschießen
EDIT:
bin ich jetzt ganz blöd??????
Delphi-Quellcode:
{...}
About1: TMenuItem; N2: TMenuItem; Umformungen1: TMenuItem; procedure LVListMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure PMListPopup(Sender: TObject); procedure FormCreate(Sender: TObject); procedure About1Click(Sender: TObject); procedure EUnknownToKeyPress(Sender: TObject; var Key: Char); private { Private-Deklarationen } public procedure WndProc(Msg:TMessage);override; //hier deklaration procedure WMDropFiles(var AMsg:TWMDROPFILES); Message WM_DROPFILES; end;
Delphi-Quellcode:
das muss doch gehen??????
procedure TForm1.WndProc(Msg:TMessage); //hier implenmentation
var p:TPoint; inLV:boolean; begin inherited; p:=screentoclient(mouse.cursorpos); inLV:= ( (p.X >= LVList.left) and (p.X <= LVList.left+LVList.width) and (p.Y >= LVList.top) and (p.Y <= LVList.top + LVList.Height) ); if ( msg.msg = WM_RBUTTONDOWN ) and inLV then begin msg.Result:=1; end; end; er sagt mir aber Zitat:
|
Re: Rechtsklick abschießen
Hallo Lukas,
du bist auf dem Holzweg. Den Code, der die aktuelle Selektion in deiner Listview aufhebt, musst du selbst geschrieben haben. Der Rechts-Klick verschiebt lediglich den Fokus und lässt die Selektion unangetastet. Grüße vom marabu |
Re: Rechtsklick abschießen
Hallo,
was sagt denn die Delphi-Hilfe :) Zitat:
Delphi-Quellcode:
procedure TForm1.ListView1Changing(Sender: TObject; Item: TListItem;
Change: TItemChange; var AllowChange: Boolean); begin If (GetKeyState(VK_RButton) And $80 <> 0) Then AllowChange := False else AllowChange := True; end; |
Re: Rechtsklick abschießen
@DGL-luke, ansonsten bezüglich der Fehlermeldung
Zitat:
type TWndMethod = procedure(var Message: TMessage) of object; |
Re: Rechtsklick abschießen
Also ich habe das gerade bei mir ausprobiert
wenn ich eine Listbox erstelle ein paar items einfüge und ein Popupmenü zuweise das ganze dann starte und ausprobiere funktioniert das mit dem Multiselect einwandfrei. nur wenn ich auf ein frei bleibenden Teil der Listview mit rechtsklicke geht die Auswahl verloren. hast du was anderes mit der Listview gemacht oder habe ich was falsch verstanden |
Re: Rechtsklick abschießen
@DGL-luke,
dein Plan mit dem Verschwindenlassen der WM_RButtonDown-Message funktioniert. Allerdings solltes du das inherited in deinem Code erst nach dem Nullen der Message ausführen. Hab's mal schnell gecheckt, da's mich auch interessierte ...und der Einfachheit gleich die WndProc des ListView-Controls selbst überschrieben:
Delphi-Quellcode:
...
private oldLVWindowProc : TWndMethod; procedure LVWndProc(var Msg:TMessage); //hier implenmentation ...
Delphi-Quellcode:
procedure TForm1.LVWndProc(var Msg:TMessage); //hier implenmentation
begin if ( msg.msg = WM_RBUTTONDOWN ) then begin msg.msg := wm_null; end; oldLVWindowProc(Msg); end; procedure TForm1.FormCreate(Sender: TObject); begin oldLVWindowProc := ListView1.WindowProc; ListView1.WindowProc := LVWndProc; end; |
Re: Rechtsklick abschießen
ach das hat auch eins?
cool, das macht die sache SEHR viel eleganter. aber wieso speichert man eigentlich immer die alte wndproc? wenn man sie eh nimmer braucht? nimmt doch nur speicherplatz weg :mrgreen: werde das morgen ausprobieren, aber heute check ich nur noch schnell alles ab, morgen chemie schulaufgabe... ps: das war ja jetzt einer der eher nicht gewünschten posts. aber ich bin mir sicher, dass da morgen schon einer was gesagt haben wird, und damit is es dann auch kein doppelpost :mrgreen: pps: das mit der listbox: ja klar, ne listbox hatte ich auch ursprünglich, aber ich brauch halt drei spalten. und komponentenentwickeln werd ich jetzt nicht anfangen für das fuzzelprojekt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:26 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