Autor Beitrag
J.Borchert
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 150

WIN10
XE2 Professional
BeitragVerfasst: Di 08.11.05 18:27 
Habe im Forum gestöbert und meinem PopUp-Menü die Zeilen einer Textdatei als
Menüpunkte zugeordnet. (Item[0]=Die Datei Editieren, Item[1]=Trennlinie)

Habe die Lösung selbst gefunden. Alle roten Texte sind die Verbesserungen !

einige Auszüge:
in Form1:

ausblenden Delphi-Quelltext
1:
2:
3:
  private    { Private-Deklarationen }
   procedure MyPopupHandler(Sender: TObject);
// ...


procedure MyPopupHandler(Sender: TObject); muß public sein !


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.MyPopupHandler(Sender: TObject);
begin 
// soll in der aktuellen Spalte/Zeile des StringGrid die 
// Caption des PopUpMenu-Punktes einfügen
   if(Sender is TMenuItem) then 
    StringGrid1.Cells[17,Row1]:=(Sender as TMenuItem).Caption;
end;

In einer weiteren Unit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure addMenu(m:TPopupMenu;fname:string);
var sl:TStringList; i:integer; t:TMenuItem;
begin if fileexists(fname) then
        begin sl:=TStringList.Create; sl.LoadFromFile(fname);
           try
              // Löschen und Freigeben aller MenuItems ab dem dritten
              for i := 2 to m.Items.Count-1 do
                begin  t := m.Items[2]; // ersten Eintrag im Menü holen
                       m.Items.Delete(2); // Eintrag LÖschen
                       FreeAndNil(t); // und zuletzt freigeben
                end;
              for i:=0 to sl.Count-1 do // Zeile als Menüpunkte verwenden
               if Trim(sl[i])<>'' then // nicht leere Zeile
                begin t := TMenuItem.Create(m); 
                      t.Caption := sl[i];
                      // t.OnClick:=.... keine Ahnung ???  war der Ausgangspunkt
                      // korrektur ist:
                      //********************************
                      t.OnClick := Form1.MyPopupHandler; 
                      m.Items.Add(t);
                end;
           finally sl.free; end;
        end;
end;

Habe also die t.OnClick-Zeile ergänzt.
In Form1 :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var p:TPoint; i:integer; // Col1 und Row1 sind global deklariert
begin stringgrid1.MouseToCell(x, y, Col1, Row1);      GetCursorPos(P);
         if Col1=17 then // PopUp nur 17.Spalte
          begin addMenu(PopupMenu6,pdir+'BemerkungenTB.txt');// Menü aus Dateizeilen
             // pdir ist das Programmverzeichnis+Backslash
             // alte Zeilen wurden gelöscht:
             //   for i:=1 to PopUpMenu6.Items.Count-1 do
             //    PopUpMenu6.Items.OnClick:= MyPopUpHandler; // geht scheinbar nicht
             PopupMenu6.Popup(P.X, P.Y); // Bemerkung aus Liste einfügen            
          end;
end;


Das Ganze arbeitet erstmal recht gut bis auf die Zuweisung des OnClick-Ereignisses.
Korrigiert wie oben beschrieben!

Wie kann ich in der anderen Unit bereits OnClick zuweisen? siehe oben !Ich bekomme dort immer Fehlermeldungen. (siehe Procedure addMenu)

Bei schrittweisen Abarbeiten gelange ich nicht in die Procedure MyPopupHandler,
nehme also an, das die Zuweisung (trotz ohne Fehlermeldung) nicht geklappt hat.

Also jetzt funktioniert alles, danke für die zahlreiche Hilfe ;-)

Gruss Jürgen
J.Borchert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 150

WIN10
XE2 Professional
BeitragVerfasst: Di 08.11.05 19:57 
Da die Caption auch die "&"-Zeichen für die Hotkeys enthält, entweder vorher deaktivieren oder wie ich per:

Form1.StringGrid1.cells[17,i]:=
StringReplace((Sender as TMenuItem).Caption,'&','',[rfReplaceAll]);

einfach durch "nichts" ersetzen.

tschuess sagt Juergen
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mi 09.11.05 00:21 
Hallo,

kennst Du folgende Funktion:
ausblenden Delphi-Quelltext
1:
function NewItem(const ACaption: string; AShortCut: TShortCut; AChecked, AEnabled: Boolean; AOnClick: TNotifyEvent; hCtx: Word; const AName: string): TMenuItem;					

Das ist glaube ich einfacher zu handhaben.
Ein kleines Beispiel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
  private
    procedure MyPopupHandler(Sender: TObject);
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.MyPopupHandler(Sender: TObject);
begin
   if(Sender is TMenuItem) then
     showmessage(TMenuItem(Sender).Caption);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  PopupMenu1.Items.Add(NewItem('Item1',0,False,True,MyPopupHandler,0,''));
  PopupMenu1.Items.Add(NewItem('Item2',0,False,True,MyPopupHandler,0,''));
end;

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
J.Borchert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 150

WIN10
XE2 Professional
BeitragVerfasst: Mi 09.11.05 11:46 
Danke, das ist noch einfacher. mfG Jürgen