Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ValueListEditor mit rechter Maustaste Zeile selektieren (https://www.delphipraxis.net/79833-valuelisteditor-mit-rechter-maustaste-zeile-selektieren.html)

Klaus01 29. Okt 2006 15:10


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

marabu 29. Okt 2006 15:46

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

Klaus01 29. Okt 2006 17:01

Re: ValueListEditor mit rechter Maustaste Zeile selektieren
 
Zitat:

Zitat von marabu
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

Hallo Achim,

danke für Deine Antwort.

Mein OnMouseDown Ereignis schaut so aus:

Delphi-Quellcode:
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;
Ich stehe allerdings etwas auf dem Schlauch, was Du damit meinst die Selection kurz zu verschieben.

freundliche Grüße
Klaus

marabu 29. Okt 2006 18:23

Re: ValueListEditor mit rechter Maustaste Zeile selektieren
 
Hallo Klaus,

bei mir funktioniert das hier:

Delphi-Quellcode:
// 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;
Probiere mal selbst.

Gute Nacht

Klaus01 29. Okt 2006 18:56

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:

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;
Hab' noch viel zu lernen.

Danke!

Auch eine geruhsame Nacht
Klaus

marabu 29. Okt 2006 19:12

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

EWeiss 29. Okt 2006 19:55

Re: ValueListEditor mit rechter Maustaste Zeile selektieren
 
Zitat:

Das ist nicht windowskonform, da das Kontextmenü an die Komponente gebunden ist und nicht an den Eintrag - aus der Sicht eines Benutzers.
Dem muss ich wiedersprechen!

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ß

Klaus01 29. Okt 2006 20:22

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

marabu 29. Okt 2006 20:55

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

Klaus01 30. Okt 2006 07:47

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 Uhr.
Seite 1 von 2  1 2      

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