AGB  ·  Datenschutz  ·  Impressum  







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

StringGrid und Popupmenü

Ein Thema von dioony · begonnen am 8. Aug 2005 · letzter Beitrag vom 9. Aug 2005
Antwort Antwort
dioony

Registriert seit: 18. Apr 2005
Ort: Oldenburg
18 Beiträge
 
Delphi 6 Enterprise
 
#1

StringGrid und Popupmenü

  Alt 8. Aug 2005, 15:15
Mittag!

Irgendwie hab ich nicht eine richtige Lösung hier gefunden, daher hoffe ich, dass ihr mir weiterhelfen könnt:

Ich habe ein StrinGrid und wenn man auf eine Zelle klickt öffnet sich durch das OnSelectCell- Ereignis ein dynamisches Popupmenü. Das funktioniert auch soweit. Das Problem besteht nun, wenn das Popupmenü länger ist als die Zeilen des StringGrids. Wenn ich dann nämlich nach unten gehen werden alle Zellen von dem angeklickten bis zum unteren Ende markiert.
Kann man das Markieren irgendwie unterdrücken?

So sieht das ganze aus:

Delphi-Quellcode:

procedure TForm5.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
var items : array of TMenuItem;
var i: Integer;
begin


   if ARow>0 then
   begin
     if ARow<> StringGrid1.RowCount-1 then
     begin
        PopupMenu1.Items.Clear;
        SetLength(items,1);
        if ACol = 1 then
        begin
            SetLength(items,12);
            for i:=1 to 10 do
            begin
              items[i]:=TMenuItem.Create(self);
              items[i].Caption:=inttostr(i);
              if i = strtoint(StringGrid1.Cells[ACol,ARow]) then
              begin
                 items[i].Checked:=true;
              end;
              PopupMenu1.Items.Add(items[i]);
            end;
            SetLength(items,(High(items)+1));
            items[high(Items)]:=TMenuItem.Create(self);
            items[high(Items)].Caption:='andere Anzahl';
            PopupMenu1.Items.Add(items[high(Items)]);
        end;

        if ACol = 2 then
        begin

           SetLength(items,Form2.ListBox6.Count);
           for i:=0 to Form2.ListBox6.Count-1 do
           begin
             items[i]:=TMenuItem.Create(self);
             items[i].Caption:=Form2.ListBox6.Items[i];
             if Form2.ListBox6.Items[i] = StringGrid1.Cells[ACol,ARow] then
             begin
               items[i].Checked:=true;
             end;
             PopupMenu1.Items.Add(items[i]);
           end;
        end;
        if ACol = 3 then
        begin
           SetLength(items,Form2.ListBox8.Count);
           for i:=0 to Form2.ListBox8.Count-1 do
           begin
             items[i]:=TMenuItem.Create(self);
             items[i].Caption:=Form2.ListBox8.Items[i];
             if Form2.ListBox8.Items[i] = StringGrid1.Cells[ACol,ARow] then
             begin
               items[i].Checked:=true;
             end;
             PopupMenu1.Items.Add(items[i]);
           end;
        end;

        SetLength(items,(High(items)+1));
        items[high(Items)]:=TMenuItem.Create(self);
        items[high(Items)].Caption:='-';
        PopupMenu1.Items.Add(items[high(Items)]);


        SetLength(items,(High(items)+1));
        items[high(Items)]:=TMenuItem.Create(self);
        items[high(Items)].Caption:='Bild Löschen';
        PopupMenu1.Items.Add(items[high(Items)]);


        PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);
     end;
   end;
end;
gruß
Dioony
Iterativ arbeiten ist menschlich, rekursiv dagegen göttlich
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: StringGrid und Popupmenü

  Alt 9. Aug 2005, 18:56
Moin,

ich würde dafür OnMouseDown benutzen...

Delphi-Quellcode:
procedure TForm.StringGridMouseDown(Sender: TObject;
                                    Button: TMouseButton;
                                    Shift: TShiftState;
                                    X, Y: Integer);
var ACol, ARow:integer;
begin
  if Button = mbRight then begin
    with Sender as TStringGrid do
      MouseToCell(X, Y, ACol, ARow);
    if (ACol > 0) and (ARow > 0) then
      PopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
  end;
end;
MfG
Thorsten
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: StringGrid und Popupmenü

  Alt 9. Aug 2005, 19:32
Hallo Dioony,

deine Anwendung spielt Rambo auf dem Desktop, wenn das PopupMenu sich durch bloßes Anwählen einer Grid-Zelle zeigt. Der Vorschlag von Thorsten mit der rechten Maustaste zielt schon eher in eine akzeptable Richtung, aber warum so kompliziert? Das PopupMenu kann sehr gut statisch an das StringGrid gebunden werden. In meinen Programmen wird das Kontextmenü im Ereignis PopupMenu.OnPopup() konfiguriert.

Grüße vom marabu
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: StringGrid und Popupmenü

  Alt 9. Aug 2005, 19:40
Moin,

das war auch erst mein Gedanke, aber wenn man die PopupMenu-Eigenschaft benutzt, wird es auch geöffnet, wenn man mit der Maus über keinem Gridfeld ist (Außenbereiche). Kann man dann auch das komplette Öffnen des Popupmenus im OnPopup verhindern?

Das war mein Problem, sonst hätte ich auch den Weg über die Popup-Eigenschaft vorgeschlagen.

MfG
Thorsten
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: StringGrid und Popupmenü

  Alt 9. Aug 2005, 19:57
Hallo Thorsten,

so könnte das aussehen:

Delphi-Quellcode:
procedure TDemoForm.PopupMenuPopup(Sender: TObject);
var
  p: TPoint;
  iCol, iRow: integer;
begin
  with StringGrid do begin
    p := ScreenToClient(PopupMenu.PopupPoint);
    MouseToCell(p.X, p.Y, iCol, iRow);
    if (iCol < FixedCols) or (iRow < FixedRows) then begin
      ShowMessage('what the heck you think you are doing here?');
      Abort;
    end;
  end;
end;
marabu
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: StringGrid und Popupmenü

  Alt 9. Aug 2005, 20:03
Oh ja, das ist eine Möglichkeit. Die kannte ich so noch nicht.
Muss allerdings sagen, das Abort mich doch sehr an die Bösen Dinge wie Goto, Halt, Exit oder Break errinert und deshalb soetwas für mich nicht in Frage kommt.
Aber es ist auf jeden Fall eine Möglichkeit.

MfG
Thorsten
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: StringGrid und Popupmenü

  Alt 9. Aug 2005, 20:12
Es ist genauso wenig Böses an den von dir aufgezählten Befehlen, wie an einem Brotmesser - ein qualifizierter Benutzer wird es benutzen ohne sich selbst zu verletzen. Abort ist die von den Machern der VCL vorgesehene Methode zum Abbrechen eines Events.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: StringGrid und Popupmenü

  Alt 9. Aug 2005, 20:28
Ja, mit böse meinte ich nur, dass diese Befehle nichts mit strukturierter Programmierung zu tun haben, weil es Sprungbefehle sind. Natürlich, wenn man weiss was man tut ist immer alles ok. Es geht ja auch mehr darum, so zu programmieren, dass andere es auch verstehen. Naja, wie dem auch sei wir werden hier OT und eigentlich haben wir ja schon gute Lösungen für das Problem gegeben.

Und auch wenn Abort von der VCL der vorgeschriebene Weg ist, die VCL hat auch ein paar unschöne Stellen, dass heisst nicht das das der tollste Weg ist...

Also nichts für ungut...
Thorsten
  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 02:10 Uhr.
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