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,

user profile iconJayEff 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

user profile icondummzeuch 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;    
      
  
      {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.}
    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

user profile iconjaenicke 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,

user profile iconelundril 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

user profile iconelundril 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