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:
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
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:
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:
- Du gehst alle MenuItems in einer Schleife durch und überprüfst ob sie gecheckt sind.
- 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!