![]() |
ValueListEditor mit rechter Maustaste Zeile selektieren
Hallo Gemeinde,
wie der Titel schon sagt, möchte ich im ValueListEditor mit der rechten Maustaste eine Zeile selektieren (farblich markieren) so wie es mit der linken Maustaste schon von alleine funktionert. Hintergrund: Klicke ich mit der rechten Maustaste in eine Zeile des ValueListEditors rufe ich ein popupMenu auf. Hier kann man delete und copy auswählen. Wähle ich z.B. delete aus wird auch die richtige Zeile gelöscht. Ich möchte aber gerne, daß die Zeile vorher z.B. blau markiert wird, damit dem User vor Gesicht geführt wird, welche Zeile bei der Aktion gelöscht wird. Habe da irgendwie ein Brett vor dem Kopf, vielleicht weiß ja jemand wie es gemacht wird. Grüße Klaus |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Hallo Klaus,
das Ereignis OnMouseDown() hat Vorrang vor dem Kontext-Menü. Wenn du dort die Selektion kurz verschiebst, das Popup-Menü selbst anzeigst und anschließend die Selektion wieder zurücksetzt - wäre das keine Lösung für dein Problem? Freundliche Grüße vom marabu |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Zitat:
danke für Deine Antwort. Mein OnMouseDown Ereignis schaut so aus:
Delphi-Quellcode:
Ich stehe allerdings etwas auf dem Schlauch, was Du damit meinst die Selection kurz zu verschieben.
procedure TConfigForm.feed_name_source_listMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var aRow,ACol:LongInt; begin feed_name_source_list.MouseToCell(x,y,aCol,aRow); if (button = mbRight) and (aRow <= feed_name_source_list.RowCount -1) and (aRow > 0)then begin selectedRow:=aRow; // selectedRow ist eine Var. damit ich mit dem delete/copy // aus dem PopUpMenü auch die richtige Zeile verarbeite PopUpMenu1.Popup(Left+x-feed_name_source_list.left,top+y+feed_name_source_list.Top); end else selectedRow:=0; end; freundliche Grüße Klaus |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Hallo Klaus,
bei mir funktioniert das hier:
Delphi-Quellcode:
Probiere mal selbst.
// form private: ContextRow: Integer;
procedure TDemoForm.ValueListEditor1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var iSelected, iRow, iCol: Integer; pt: TPoint; begin with Sender as TValueListEditor do begin iSelected := Row; MouseToCell(x, y, iCol, iRow); if (button = mbRight) and (iRow > 0) and (iRow < RowCount) then begin Row := iRow; ContextRow := iRow; pt := ClientToScreen(Point(x, y)); PopUpMenu.Popup(pt.x, pt.y); Row := iSelected; end else ContextRow := -1; end; end; Gute Nacht |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Hallo Achim,
danke für Deinen Quelltext. Delphi 6 kennt ContectRow anscheinend noch nicht. Ich habe das Problem jetzt etwas anders gelöst. Die Zeile wird mit der linken Maustaste selektiert und mit der rechten wird dann das PopUp aufgerufen. Ist ein wenig umständlich, aber es geht und ist auch einigermaßen Windowskonform.
Delphi-Quellcode:
Hab' noch viel zu lernen.procedure TConfigForm.feed_name_source_listMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var aRow,ACol:Integer; pt : TPoint; begin with sender as TValueListEditor do begin MouseToCell(x,y,aCol,aRow); if (button = mbRight) and (aRow = row) then begin pt:=ClientToScreen(Point(x,y)); PopUpMenu1.Popup(pt.x,pt.y); end; end end; procedure TConfigForm.delete1Click(Sender: TObject); begin feed_name_source_list.DeleteRow(feed_name_source_list.row); end; Danke! Auch eine geruhsame Nacht Klaus |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Hallo Klaus,
auch D7 kennt die Variable ContextRow nicht - die habe ich als form-globale Variable in der private section meiner Form deklariert, so wie du es wahrscheinlich mit selectedRow gemacht hast. Was mir an deiner jetzigen Lösung auffällt ist, dass man nur noch genau auf dem aktuell selektierten Eintrag ein Kontextmenü abrufen kann. Das ist nicht windowskonform, da das Kontextmenü an die Komponente gebunden ist und nicht an den Eintrag - aus der Sicht eines Benutzers. Grüße |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Zitat:
BEISPIEL: Meine Datenbank hat 1 Eintrag Header: Titel , Artist ------------------------ 1. Angel Eyes , Abba Klicke ich nun auf den eintrag Titel in der ersten zeile dann öffnet sich mein Kontexmenü mit dem Eintrag 'Alle Dateien auswählen von diesen Titel' Klicke ich nun auf den eintrag Artist in der ersten zeile dann öffnet sich mein Kontexmenü mit dem Eintrag 'Alle Dateien auswählen von diesen Artist!. Du siehst es macht schon sinn wenn man das Kontexmenu an den Eintrag bindet. Es kommt immer darauf an was im Kontexmenü steht bzw.. zur Laufzeit geändert wird. gruß |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Achim,
habe Deinen Code noch einmal genommen und ein wenig damit herumgespielt. Er verhält sich korrekt, wenn goRowSelect auf false gesetzt ist (vgl. Bild). Ich hatte goRowSelect auf true gesetzt, dann wird die gesammte Zeile blau markiert. Die Markierung wird aber nicht neu gesetzt wenn ich mit der rechten Maustaste in eine Zeile klicke (vgl. Bild, hier würde Zeile 1 gelöscht, Zeile 2 ist aber blau markiert). Und in diesem Zustand würde der User verwirrt werden. Wenn Du noch eine Idee hast? freundliche Grüße Klaus |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
@Emil:
Da ist kein Widerspruch. Natürlich darf und soll das Kontextmenü bei Containern deren Zustand berücksichtigen und auch der Punkt soll berücksichtigt werden, an dem geklickt wurde. Was ich in Frage stelle ist die Anzeige eines Kontextmenüs dann und nur dann, wenn auf das aktuelle Item geklickt wird. Damit wird die Lernkurve deutlich abgeflacht. Ich fände es besser, wenn der Benutzer immer ein Kontextmenü gezeigt bekommt, wenn er auf den Container klickt. @Klaus: Egal ob goRowSelect gesetzt ist oder nicht, die temporäre Verschiebung der Selektion auf das angeklickte Item funktioniert bei mir. Sollte sich D6 da anders verhalten als D7? Grüße |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Achim,
es schaut fast so aus, oder w2k verhält sich anders als z.B. XP wer weiß. Habe mal das Binary angehängt. Ds Programm sucht das IniFile im Programmverzeichnis. Das Programmteil, der mir Problem bereitet, ist unter RSS/add feed zu finden. Zu der Diskussion Windowskonform oder nicht. Wäre es o.k. wenn das PopUp immer angzeigt würde wenn mit der rechten Maustaste in eine Zeile geklickt wird, ist die Zeile aber nicht selektiert (blau hinterlegt) dann sind die PopUp Menüitems disabled. Einen schönen Tag noch. Grüße Klaus |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Klaus,
deine Demo habe ich ausprobiert. Das Kontextmenü wird zwar für den zweiten Feed angezeigt, der erste Feed bleibt aber selektiert. Insofern funktioniert dein Code bei mir unter XP genauso schlecht wie bei dir. Es ist immer noch nicht ausgeschlossen, dass dieser Fehler nicht von dir verursacht wird. Anbei eine Demo von mir, die auf meinem Rechner das von mir beabsichtigte Verhalten zeigt. Grüße |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Hallo Achim,
Dein Programm zeigt bei mir das gleiche Verhalten wie das meine. Die blaue Markierung bleibt in Zeile 1 auch wenn ich mit der rechten Maustaste z.B. in Zeile 2 klicke. Demzufolge würde es eher für ein Problem bei Delphi 6 sprechen. Wenn Du vielleicht noch Lust und Laune hast, könntest Du mir meinen Quelltext (nicht erschrecken) mal compilieren. Danke für Deine Hilfe. Edit: Attachment gelöscht. Grüße Klaus |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Wenn ich die von dir auskommentierten Zeile wieder aktiviere, dann funktioniert bei mir alles wie gewünscht, d.h. die Selektion wird temporär verschoben.
Delphi-Quellcode:
Grüße
// ...
if (button = mbRight) and (iRow > 0) and (iRow < RowCount) then begin // Row := iRow; ContextRow := iRow; pt := ClientToScreen(Point(x, y)); PopUpMenu1.Items.Find('delete').Enabled:= row = irow; PopUpMenu1.Popup(pt.x, pt.y); // Row := iSelected; end // ... |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Ich habe schon verstanden, das diese Zeilen
für die Verschiebung elementar sind aber bei mir macht das keinen Unterschied in der Funktionalität. Es sind keine Auswirkungen spürbar, ob auskommentiert oder nicht. Grüße Klaus |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Dann schlage ich vor, dass du kurz die Nachrichtenschleife abarbeitest:
Delphi-Quellcode:
// ...
if (button = mbRight) and (iRow > 0) and (iRow < RowCount) then begin Row := iRow; Application.ProcessMessages; ContextRow := iRow; pt := ClientToScreen(Point(x, y)); PopUpMenu1.Items.Find('delete').Enabled:= row = irow; PopUpMenu1.Popup(pt.x, pt.y); Row := iSelected; end // ... |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Hallo Achim,
ich habe ja folgende Zeile in meinem Code: PopUpMenu1.Items.Find('delete').Enabled:= row = irow; Damit enable ich den 'delete' Menüeintrag. Wenn goRowSelect auf false ist, ist der Menüeintrag bei jeder Zeile in die ich hineinklicke enabled. Wenn goRowSelect auf true gesetzt ist, ist der Menäeintrag nur bei der Zeile enabled die blau markiert ist. Das Application.ProcessMessages zeigt auch keine Änderung. Grüße Klaus |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Hallo Klaus,
ich fürchte, ich kann dir nicht weiter helfen. Da scheinen Unterschiede zwischen D6 und D7 zu sein und D6 habe ich nicht zur Verfügung. Grüße |
Re: ValueListEditor mit rechter Maustaste Zeile selektieren
Hallo Achim,
trotzdem Danke für Deine Hilfe, da haben wir den Fehler wenigstens etwas einkreisen können. Wenn es die Zeit erlaubt werde ich das mal mit Turbo-Delphi durchspielen. Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz