Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]5144[/thread]

Table->Label->Popup-Menu: in einer Schleife



<< >> 6 Einträge, 1 Seite
pktm
 2005-12-20 20:03
#45125 #45125
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Ich würde gerne eine 9x9 Felder große Tabelle mit Labels füllen, wobei jedes dieser Labels ein Kontextmenu haben soll.
Also dachte ich mir, ich könnte in einer Schleife einfach je ein Label in die Tabelle packen und daran dann den Rechtslick binden um das Menu zu realisieren.

Aber immer, wenn ich das alles in der Schleife machen erhalte ich anschließend eine Fehlermeldung wenn ich das Menu öffnen will:
Quote
Tk::Error: Can't call method "Popup" on an undefined value at C:\Perl\Scripten\Sudoku\main1.pl line 49.
<Button-3>
(command bound to event)


Hier ist der
Code: (dl )
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
my @felder = ();
my @menus = ();
# z = zeile; s = spalte
for( my $z = 0; $z <= 8; $z++ ){
for( my $s = 0; $s <= 8; $s++ ){

# Was soll gerae angezeigt werden?
my $inhalt = "$z.$s";
#my $inhalt = int( rand(8) + 1 );

# Es wird in einem Label angezeigt
$felder[$z][$s] = $mw->Label(-text => $inhalt,);

# Dingens in Tabelle einfügen
$t->put($z, $s, $felder[$z][$s]);
# Menu für Feld erzeugen
$menus[$z][$s] = $felder[$z][$s]->Menu(
-menuitems => [
[Separator => ""],
],
);
#die Dumper($menus[$z][$s]);
$felder[$z][$s]->bind(
"<Button-3>" => sub {
$menus[$z][$s]->Popup(
-popover => "cursor",
-popanchor => 'nw'
);
}
);
}
}


Die Fehlermeldung kommt, nachdem die GUI gestartet ist und ich versuche mittels einem Rechtsklick auf ein solches Menu zuzugreifen.

Kurioserweise funktioniert die Sache aber, wenn ich außerhalb der Schleife durch Zugriff auf @felder ein Kontextmenu hinzufüge:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
# Menu für Feld erzeugen
$menus[0][0] = $felder[0][0]->Menu(-menuitems => [[Separator => ''],]);
#die Dumper($menus[0][0]);
$felder[0][0]->bind(
"<Button-3>" => sub {
$menus[0][0]->Popup(
-popover => "cursor",
-popanchor => 'nw'
);
}
);


Und nun? Einfach eine zweite Schleife benutzen und die Kirche umfahren (im Sinne von darum herum fahren)?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
esskar
 2005-12-20 21:30
#45126 #45126
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
:)

Code: (dl )
1
2
3
4
5
6
sub {
$menus[$z][$s]->Popup(
-popover => "cursor",
-popanchor => 'nw'
);
}


$z und $s existieren aber zum zeitpunkt des aufrufs nicht mehr! :)
Ishka
 2005-12-20 22:42
#45127 #45127
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
selbst wenn $s und $z noch existieren würden, hätten sie bereits andere Werte. Abhilfe schafft beispielsweise, wenn du unmittelbar vor der anonymen sub

my ($local_z,$local_s)=($z,$s);

machst und in der sub $z durch $local_z bzw. $s durch $local_s ersetzt.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
pktm
 2005-12-20 22:54
#45128 #45128
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
AAAAAAHHHHHHHHHHHHHHHH!
Ok, ich habe mittlerweile zwar festgestellt, dass die Variablen, die ich in sub{} zum Aufruf benutze zwar während der Deklaration existieren, aber zum Aufrufzeitpunkt nicht, aber irgendwie kam ich nicht drauf.

Nur jetzt die blöde Frage: Wieso?
my ($local_z,$local_s)=($z,$s); erzeugt eine Kopie der Laufvariablen der For-Schleife?
Der Skopus ist doch der selbe? Was ist denn der Kniff dahinter?
Werden die Laufvariablen nach Durchlauf der Schleife aus dem Gedächtnis von Perl eleminiert (wie nennt man denn nochmal dieses Gedächtnis - Register?)?

Grüße, pktm\n\n

<!--EDIT|pktm|1135112098-->
http://www.intergastro-service.de (mein erstes CMS :) )
Ishka
 2005-12-20 23:13
#45129 #45129
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Laufvariablen werden danach entfernt. Aber selbst wenn sie das nicht würden, beim nächsten Schritt würde ihr Wert geändert und damit hast du in der sub nicht den Wert, den die Variable hatte, als die sub erzeugt wurde stehen, sondern den, den sie jetzt hat.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
esskar
 2005-12-21 04:18
#45130 #45130
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
du meinst scope
<< >> 6 Einträge, 1 Seite



View all threads created 2005-12-20 20:03.