Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - [popupmenu] Caption ändern
elundril - So 12.08.07 23:16
Titel: [popupmenu] Caption ändern
ich habe ein problem mit dem Popupmenu.
ich verändere während der laufzeit die caption und den hint von popmenüeinträgen. doch wenn ich das popupmenu dann aufrufen will dann kommt n error weil der listenindex das maximum (-1) übersteigt.
kann mir wer dabei helfen?
lg el
cuejo - Mo 13.08.07 00:15
Dann zeig doch mal wie Du das machst. Die berühmte Glaskugel ist noch immer in Reparatur. :?
elundril - Mo 13.08.07 15:55
ok. ich nehm ja rücksicht auf die progger ohne funktionierende Glaskugel und zeig ein bissal was von meinem Quelltext her:
nur mal der relevante teil (aus dem gedächnis heraus). Wenn ich den weglass funzt wie geschmiert.
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 TOptions.LoadLang(AFilename: string); var XML: TJvSimpleXML; begin XML:=TJvSimpleXML.create(nil); try XMl.Loadfromfile(AFilename); with XML.Root.items.itemnamed['Menu'] do begin item1.caption:=items.itemnamed['item1'].items.itemnamed['caption'].Value; item2.caption:=items.itemnamed['item1'].items.itemnamed['caption'].Value; item3.caption:=items.itemnamed['item1'].items.itemnamed['caption'].Value; item4.caption:=items.itemnamed['item1'].items.itemnamed['caption'].Value; item5.caption:=items.itemnamed['item1'].items.itemnamed['caption'].Value; item6.caption:=items.itemnamed['item1'].items.itemnamed['caption'].Value; item1.Hint:=items.itemnamed['item1'].items.itemnamed['Hint'].Value; item2.Hint:=items.itemnamed['item1'].items.itemnamed['Hint'].Value; item3.Hint:=items.itemnamed['item1'].items.itemnamed['Hint'].Value; item4.Hint:=items.itemnamed['item1'].items.itemnamed['Hint'].Value; item5.Hint:=items.itemnamed['item1'].items.itemnamed['Hint'].Value; item6.Hint:=items.itemnamed['item1'].items.itemnamed['Hint'].Value; end; finally XML.Free; end; end; |
little-wolf - Mo 13.08.07 16:03
hallo elundril
em, bin jetzt nicht ganz sicher, aber könnte es daran liegen, weil du "xml" in der funktion als variable deklarierst und danach etwas darauf zuweist. danach gibst du in finally "xml" wieder frei und probierst nachher (hier nicht ersichtlich) auf "xml" zu zu greifen? hoffe habe das jetzt so richtig interpretiert. wenn ja, ist meine frage gleich deine antwort...
gruss
little-wolf
elundril - Mo 13.08.07 17:12
nene sonst würd die XML komponente schreien und nicht das popupmenü.
der fehler tritt ja nur auf wenn das programm schon läuft und man während der laufzeit das popupmenü aufmacht. (erst nach dem code)
lg elundril
little-wolf - Mo 13.08.07 17:19
sorry, aber für mich siet der gepostete code so aus, dass items der variable "xml" abgefüllt werden
Delphi-Quelltext
1:
| with XML.Root.items.itemnamed['Menu'] do begin ... |
lass doch mal probehalber das xml.free weg...
ich kenne allerdings diese komponente (TJvSimpleXML) nicht. evtl. kapier ich einfach wirklich nicht, was genau du hier machst...
cuejo - Mo 13.08.07 17:44
Worum handelt es sich denn bei item1 bis item6?
JayEff - Mo 13.08.07 17:51
Schätze, das Java Simple XML Teil funktioniert wie eine Ini-Datei. Damit würde das Weglassen der Freigabe ein böses Speicherleck verursachen und das wollen wir doch vermeiden ;)
Ich schätze, item1-6 sollen die Popup-Menü-Items sein :gruebel:
Von welchem Listenindex da die Rede ist hab ich aber keine Ahnung - sicher, dass itemnamed in eckigen Klammern einen String erwartet? Sind das keine Runden? Hab sowas noch nie gesehen :shock:
Vielleicht versuchst du mal, die JvSimpleXML anstelle bei jedem Aufruf der Prozedur einmalig im FormCreate zu initialisieren (Global deklarieren!) und im onClose frei zu geben, das würde auch etwas Zeit sparen.
Ausser dem Erwähnten find ich nix, was ich seltsam finde :nixweiss:
dummzeuch - Mo 13.08.07 21:44
Hi,
JayEff hat folgendes geschrieben: |
Schätze, das Java Simple XML Teil |
Hm, ich tippe eher dass Jv fuer Jedi Visual (Component Library) steht.
twm
JayEff - Mo 13.08.07 22:29
dummzeuch hat folgendes geschrieben: |
Jv fuer Jedi Visual (Component Library) |
hab ich verdreht im Kopf, grad... :autsch:
matze - Di 14.08.07 12:32
also das mit der SimpleXML Kompo schaut ja schon mal korrekt aus. Und da meckert er doch auch nicht, oder ?
Füll in der Procedure doch die MenuItems mal mit statischen Strings statt mit den Sachen aus dem XML File.
Also item1.caption := 'hallo1';
elundril - Di 14.08.07 14:42
hallo,
als ich alles noch mal durchgegangen bin hab ich entdeckt das ich eine zeile doppelt geschrieben habe und beim debuggen es nicht gemerkt habe. deswegen wusst ich nicht wo der fehler herkommt. ich bin draufgekommen wo der fehler steckt aber noch nicht wie ich ihn beseitigen kann. Ich muss vielleicht noch dazu sagen das der menüpunkt bei dem die exception geworfen wird ein untermenü hat. warum die exception geworfen wird weis ich auch nicht. Fällt euch was dazu ein??
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: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure TfrmGeneralSettings.LoadLanguage(AFilename: String); var XML: TJvSimpleXML; begin XML:=TJvSimpleXML.Create(nil); try XML.LoadFromFile(AFilename); with XML.Root.Items.ItemNamed['frmGeneralSettings'].Items.ItemNamed['Menu'] do begin NewNote1.Caption:=items.ItemNamed['NewNote'].Items.ItemNamed['Caption'].Value; NewNote1.Hint:=items.ItemNamed['NewNote'].Items.ItemNamed['Hint'].Value; Contacts1.Caption:=items.ItemNamed['Contacts'].Items.ItemNamed['Caption'].Value; Contacts1.Hint:=items.ItemNamed['Contacts'].Items.ItemNamed['Hint'].Value; GeneralSettings1.Caption:=items.ItemNamed['GeneralSettings'].Items.ItemNamed['Caption'].Value; GeneralSettings1.Hint:=items.ItemNamed['GeneralSettings'].Items.ItemNamed['Hint'].Value; Help1.Caption:=items.ItemNamed['Help'].Items.ItemNamed['Caption'].Value; Help1.Hint:=items.ItemNamed['Help'].Items.ItemNamed['Hint'].Value; AboutSpeedNotes1.Caption:=items.ItemNamed['About'].Items.ItemNamed['Caption'].Value; AboutSpeedNotes1.Hint:=items.ItemNamed['About'].Items.ItemNamed['Hint'].Value; Close1.Caption:=items.ItemNamed['Close'].Items.ItemNamed['Caption'].Value; Close1.Hint:=items.ItemNamed['Close'].Items.ItemNamed['Hint'].Value; AllNotes1.Caption:=items.ItemNamed['AllNotes'].Items.ItemNamed['Caption'].Value; AllNotes1.Hint:=items.ItemNamed['AllNotes'].Items.ItemNamed['Hint'].Value; ShowNotes1.Caption:=items.ItemNamed['ShowNotes'].Items.ItemNamed['Caption'].Value; ShowNotes1.Hint:=items.ItemNamed['ShowNotes'].Items.ItemNamed['Hint'].Value; end; Application.ProcessMessages; finally XML.Free; end; end; |
lg elundril
jaenicke - Di 14.08.07 14:56
Also raten würde ich jetzt, dass ItemNamed den Eintrag nicht findet. Dann dürfte der Index -1 sein, des gesuchten Eintrags...
matze - Di 14.08.07 15:04
jaenicke hat folgendes geschrieben: |
Also raten würde ich jetzt, dass ItemNamed den Eintrag nicht findet. Dann dürfte der Index -1 sein, des gesuchten Eintrags... |
Nee, also ich kenn das bei der JvSimpleXML so, dass wenn das ItemNamed keinen passenden Eintrag findet, es
nullzurückgibt, weswegen an dieser Stelle dann eine Access Violation kommen müsste.
dummzeuch - Di 14.08.07 15:26
Hi,
elundril hat folgendes geschrieben: |
als ich alles noch mal durchgegangen bin hab ich entdeckt das ich eine zeile doppelt geschrieben habe und beim debuggen es nicht gemerkt habe. deswegen wusst ich nicht wo der fehler herkommt. ich bin draufgekommen wo der fehler steckt aber noch nicht wie ich ihn beseitigen kann. Ich muss vielleicht noch dazu sagen das der menüpunkt bei dem die exception geworfen wird ein untermenü hat. warum die exception geworfen wird weis ich auch nicht. Fällt euch was dazu ein??
Delphi-Quelltext 1: 2:
| ShowNotes1.Caption:=items.ItemNamed['ShowNotes'].Items.ItemNamed['Caption'].Value; ShowNotes1.Hint:=items.ItemNamed['ShowNotes'].Items.ItemNamed['Hint'].Value; |
Hier muss es sein. Ich hab alle zeilen eingeklammert und dann einer nach der anderen wieder ausgeklammert. In dem gehighlighteten Text steckt der hund drin. |
Kann es evtl. sein, dass als Caption ein Leerstring zugewiesen wird? Nicht, dass ich wuesste, was dann genau passiert...
twm
elundril - Di 14.08.07 16:18
nö hab die XML datei selbst geschrieben. glaub nicht das ich das ausgelassen habe. und ich glaub kaum das dann ne ListIndex outofbounds kommen würde.
lg elundril
(noch ein nachtrag: ich benutze JvPopupmenu)
dummzeuch - Di 14.08.07 16:45
elundril hat folgendes geschrieben: |
nö hab die XML datei selbst geschrieben. glaub nicht das ich das ausgelassen habe. und ich glaub kaum das dann ne ListIndex outofbounds kommen würde.
|
Wenn das reproduzierbar ist und auch im Debugger passiert, sollte es doch moeglich sein, herauszufinden, auf welche Liste sich der Fehler bezieht.
elundril - Di 14.08.07 18:16
omg! ich glaub ich hab nen debst schwachsinnigen fehler gemacht. Ich überprüf das mal und sag euch bescheid.
lg elundril
elundril - Mi 15.08.07 15:15
so ich hab den fehler jetzt gefunden.
wenn ihr ab hier weiterlest seit ihr damit einverstanden mich nicht aus dem forum zu kicken oder mich zu steinigen.
Mein Fehler war folgender:
ich add ins untermenü von jenem Menüpunkt wo er die Exception wirft div. menüeintrage. Ich hab das früher, weil ich nicht gewusst hab wie sonst (ich hab den index vom menüitem nicht gewusst), so gemacht:
Delphi-Quelltext
1:
| popupmenu.items[popupmenu.items.indexof(popupmenu.items.find('Show Notes')].add(NewItem); |
wie ich dann rausbekommen habe welches menuitem das ist hab ichs natürlich überall umgestell. dacht ich jedenfalls. aber ich hab doch einen Teil übersehen. Jetzt hab ichs überall auf diesen Coder geändert:
Delphi-Quelltext
1:
| popupmenu.items[2].add(NewItem); |
natürlich wirft er dann ne exception wenn ich das menü aufrufe und der den menüpunkt zum eintragen nicht mehr findet.
damit erklärt sich auch warum eure zeit vergeudet ist. Es tut mir leid. Ich geh jetzt und schreib 100x: ich muss genauer meinen Quelltext lesen bevor ich ins Delphiforum "heulen" gehe.
schönen tag noch
lg elundril
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!