Entwickler-Ecke

Sonstiges (Delphi) - Tmenu item hinzufügen


hibbert - Mi 16.04.03 21:09
Titel: Tmenu item hinzufügen
hallo,
ich habe auf einer form eine listbox und ein tmenu.
wenn die form aufgerufen wird, soll eine datei in die listbox geladen werden

Quelltext
1:
listbox1.items.loadfromfile('C:\text.txt');                    

nun sollen im tmenu die gleichen einträge erscheinen, wie in der listbox.
einen ''button'' im tmenu zu ändern ist ja recht einfach:

Quelltext
1:
mainmenu1.items[2].items[3].items[2].items[1].caption:='text';                    

so, kann man nun beides kombinieren, sodass alle listboxeinträge dem mainmenu1.items[4] hinzugefügt.

mfg hibbert


Luncustaf - Do 17.04.03 08:57


Quelltext
1:
2:
3:
4:
5:
listbox1.items.loadfromfile('C:\test.txt');
for i := 0 to listbox1.items.count -1 do //die Variable i noch lokal deklarieren
begin
   MainMenu1.Items[4].add(listbox1.items[i]);
end;//for


hibbert - Do 17.04.03 09:39

Danke, aber ich erhalte diesen error
Zitat:
[Error] Unit2.pas(161): There is no overloaded version of 'Add' that can be called with these arguments

und dfas wird mir dann angestrichen:

Quelltext
1:
MainMenu1.Items[4].add(listbox1.items[i]);                    

obwohl ich folgendes gemacht habe:

Quelltext
1:
var i:integer;                    


was nun?

mfg hibbert


Luncustaf - Do 17.04.03 10:54

hi sorry

so sollte es gehen


Quelltext
1:
Mainmenu1.Items.items[4].add(Listbox.Items[i]);                    



gr€€tz


hibbert - Do 17.04.03 11:22

hi,
sorry, ist wieder der gleiche fehler, ich hab jetzt

Quelltext
1:
Mainmenu1.Items.items[4].add(Listbox1.Items[i]);                    

mal selber eingegeben, und bei D6 mach D6 ja immer vorschlage für den code und so soll das dann irgendwie aussehen:
Zitat:
mainmenu1.Items.Items[4].Add(const AItes:arry of TMenuItem);

also, der fehler ich leider geblieben.
Zitat:
[Error] Unit2.pas(161): There is no overloaded version of 'Add' that can be called with these arguments


ich hab leider nicht die große ahnung von
Add(const AItes:arry of TMenuItem); :oops:
aber vielleicht hilft das jemandem weiter :wink:

mfg hibbert


Luncustaf - Do 17.04.03 11:47

hi

bei mir gibt es zwei add's einmal das was du beschrieben hast und einmal dieses hier


Quelltext
1:
add(Item : TMenuItem);                    



meiner meinung nach sollte das funktionieren *denk*

gr€€tz


hibbert - Do 17.04.03 12:07

so,
jetzt soll ich alos

Quelltext
1:
add(Item : TMenuItem);                    

soll ich dann da auch wieder

Quelltext
1:
add(Listbox1.Items[i])                    

daraus machen, wenn ja, dann ist das doch das selbe bzw. das gleiche.:wink:

oder was kommt dann diesmal darein?

mfg
hibbert


Luncustaf - Do 17.04.03 12:45

eigentlich ja also soll das selbe rein weis aber auch net wieso das nicht funktioniert :/


gr€€tz


wulfskin - Do 17.04.03 13:57

Hallo ihr 2!

Dann mach ich mal eurem Kämpfen um die Lösung ein Ende ;). Wie oben beschrieben gibt es keine Methode Add, die ein String hinzufügt. Hingegen wird ein Menüitem verlangt.
Ein Beispiel:

Quelltext
1:
2:
3:
4:
5:
6:
var
  MenuItem: TMenuItem;
begin
  MenuItem := TMenuItem.Create(MainMenu);
  MenuItem.caption := ListBox.Items[I];
  MainMenu.Items[4].Add(MenuItem);
Gruß wulfskin!


Luncustaf - Do 17.04.03 16:00

:autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch: :autsch:

ich doof innem anderen thread hab ich das noch einem genauso erklärt :autsch:

man man heute bin ich doof sorry hibbert

http://www.delphi-forum.de/viewtopic.php?t=9643


gr€€tz


hibbert - Do 17.04.03 16:34

macht ja nichts, war doch auf ein netter zeitvertreib :wink:
DANKE !!

so ich hab jetzt folgendes draus gemacht:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
mainmenu1.Items[4].Clear;
if listbox1.Count=0 then exit;
listbox1.items.loadfromfile('user/user.ini');
for i := 0 to listbox1.items.count -1 do 
  begin
  MenuItem := TMenuItem.Create(MainMenu1);
  MenuItem.caption := ListBox1.Items[I];
  MainMenu1.Items[4].Add(MenuItem);
  mainmenu1.Items[4].Items[i].RadioItem:=true;
  mainmenu1.Items[4].Items[i].Checked:=true;
  end;

so diese aktion wird bei einem buttonklick ausgeführt. funktioniert ja auch ganz gut (danke nochmal), aber jetzt ist ja nur ein item des menüs "gechecked", soll ja auch so sein, aber wenn ich jetzt ein anderes item anklicken will,kann ich es zwar anklicken, aber der punkt setzt sich nicht davor. :? könnt ihr mir da auch nochmal weiterhelfen :?:

thx hibbert


wulfskin - Do 17.04.03 16:57

So sollte es gehen (ungetestet):

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:
25:
procedure TForm1.MenuItemClick(Sender: TObject);
begin
  with (Sender as TMenuItem) do
    Checked := not Checked;
end;
[...]
var
  MenuItem: TMenuItem;
  I: Integer;
begin
  MainMenu1.Items[4].Clear;
  if ListBox1.Items.Count = 0 then
    Exit;
  ListBox1.Items.LoadFromFile('user/user.ini');
  for I := 0 to ListBox1.Items.Count - 1 do begin
    MenuItem := TMenuItem.Create(MainMenu1);
    with MenuItem do begin
      Caption := ListBox1.Items[I];
      OnClick := MenuItemClick;
      GroupIndex := 12;
      RadioItem := True;
      Checked := True;  //verschrieben
    end;
    MainMenu1.Items[4].Add(MenuItem);
  end;
Gruß wulfskin!


hibbert - Do 17.04.03 22:58

arrrg, da is a error:

Zitat:
[Error] Unit2.pas(189): Incompatible types: 'method pointer and regular procedure'

bei

Quelltext
1:
menuitem.OnClick := MenuItemClick;                    

da stimmt was net und wenn ich diese zeile lösche, dann gibt noch nen error:
Zitat:
[Error] Unit2.pas(192): Undeclared identifier: 'Checled'

bei

Quelltext
1:
Checled := True;                    


mfg hibbert


wulfskin - Fr 18.04.03 17:42

Hallo hibbert!

Hab den Quelltext oben verbessert. Folgende Korrektur ist wichtig:
Zitat:
procedure TForm1.MenuItemClick(Sender: TObject);
begin
Gruß wulfskin!


hibbert - Sa 19.04.03 14:47

Danke, doch ich hab da noch ne frage:
Ähh, wo muss ich das denn überhaupt genau einfügen?
ich hab mir jetzt den code mal etwas genauer angeguckt und habe diese zeichen entdeckt:
Zitat:
[...]

ich denka mal, dass das entweder für die implementation steht, oder für {$R *.dfm}.
wenn ich jetzt

Quelltext
1:
2:
3:
4:
5:
procedure TForm2.MenuItemClick(Sender: TObject);
    begin
    with (Sender as TMenuItem) do
    Checked := not Checked;
    end;

also über der implementation einfüge, dann hab ich ne errormeldung erhalten:
Zitat:
Expected '=' but '(' found

hää? :?
ich hab dan mal das Mainmenu Symbo angeklickt und hab im object inspector unter events nachgesehen, da gibt es nämlich kein
procedure TForm2.MenuItemClick(Sender: TObject);,also
denke ich, das dieser Teil vor der implementation stehen muss.
das einzige was ich finden kann ist das:

Quelltext
1:
2:
3:
4:
procedure TForm2.N9Click(Sender: TObject);
begin

end;

das ist aber wenn man auf ein betimmtes item des menüs klickt, wleches schon vorhanden sein muss !

was nun? ich blicke da langsam net mehr durch :eyecrazy:

mfg hibbert


wulfskin - Sa 19.04.03 15:06

Hallo Hibbert!

Ich erkläre die jetzt ausführlich wie es funktioniert.
In deiner Unit im Private-Abschnitt schreibst du folgendes:

Quelltext
1:
2:
3:
  private
  { Private-Deklarationen }
  procedure MenuItemClick(Sender: TObject);
Dies bedeutet das dein Formular jetzt eine Prozedure MenuItemClick beinhaltet. Dies ist nur der Prozedurekopf, irgendwo nach implementation folgt dann die eigentliche Prozedur:

Quelltext
1:
2:
3:
4:
5:
procedure TForm1.MenuItemClick(Sender: TObject);
begin
  with (Sender as TMenuItem) do
    Checked := not Checked;
end;
Der Rest (nach [....]) kommt irgendwo hin wo du es haben möchtest, z.B. auf Button-Click.

Gruß wulfskin!

P.S.: Das [...] sollte eigentlich nur als Platzhalter für dein Prozedurkopf gelten :roll:!


hibbert - Sa 19.04.03 23:38

Hi,
danke für deine beschreibung ! jetzt hat es funktioniert und ich habe noch etwas neues dazu gelernt :wink: , danke!!

Da wir aber nun beim thema sind, hab ich noch ne frage:
wie kann ich jetzt per buttonklick abfragen, welches item makiert ist?
Vielen dank!!

mfg hibbert


wulfskin - So 20.04.03 02:18

Hallo Hibbert!

Hier fallen mir spontan 2 Möglichkeiten ein:
  1. Du gehst alle MenuItems in einer Schleife durch und überprüfst ob sie gecheckt sind.
  2. Du speicherst in einer globalen Variablen die Nummer oder irgendwas eindeutiges des MenuItems bei jedem MenuItemClick (würde ich empfehlen).
Gruß wulfskin!


hibbert - So 20.04.03 13:51

hai
ja doch die 2. variante hört sich besser an, also, dass mus ich ja in dieser porcudure einbinden,oder?

Quelltext
1:
procedure TForm2.MenuItemClick(Sender: TObject);                    

aber mir welcher funktion bekomme ich denn den 'itemindex' des menuitems herraus?

ich kann dat einfach net finden :cry:

mfg hibbert