Autor |
Beitrag |
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: So 12.08.07 23:16
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
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: Mo 13.08.07 00:15
Dann zeig doch mal wie Du das machst. Die berühmte Glaskugel ist noch immer in Reparatur. 
_________________ Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
|
|
elundril 
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
      
Beiträge: 47
WinXP
Delphi 5 Enterprise, Delphi 2006 Enterprise
|
Verfasst: 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 
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
      
Beiträge: 47
WinXP
Delphi 5 Enterprise, Delphi 2006 Enterprise
|
Verfasst: 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
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: Mo 13.08.07 17:44
Worum handelt es sich denn bei item1 bis item6?
_________________ Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: 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
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
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 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
dummzeuch
      
Beiträge: 593
Erhaltene Danke: 5
Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
|
Verfasst: 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
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mo 13.08.07 22:29
dummzeuch hat folgendes geschrieben: | Jv fuer Jedi Visual (Component Library) |
hab ich verdreht im Kopf, grad... 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
matze
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: 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';
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
elundril 
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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??
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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: 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.
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
dummzeuch
      
Beiträge: 593
Erhaltene Danke: 5
Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
|
Verfasst: 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 
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
      
Beiträge: 593
Erhaltene Danke: 5
Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
|
Verfasst: 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 
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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 
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
|
|