Thread Auf lokale Variablen global zugreifen (3 answers)
Opened by Kean at 2007-08-18 16:22

Kean
 2007-08-18 16:22
#98364 #98364
User since
2004-08-18
463 Artikel
BenutzerIn

user image
Ich bin gerade dabei alles so umzustellen, dass ich use strict endlich aktivieren kann ;)

Jetzt bin ich auf ein Problem gestossen:

Ich habe eine Subroutine die ein neues Fenster(Toplevel) erzeugt. In diesem Fenster befinden sich Textfelder(Labels) welche mit Daten gefüllt werden.

Früher hatte ich eine zweite Subroutine welche die Daten aktualisiert hat. Diesen aktualisierungsvorgang hatte ich in einer eigenen Sub da ich ihn immer wieder brauchte und kein copy and paste wollte.

Jetzt wo ich die Variablen welchen ich die Labels zugeordnet habe aber mit my deklariert habe, kann ich nicht mehr aus dem zweiten Sub auf diese Variablen zugreifen.

Gibt es also eine Möglichkeit von Außen auf die Variabeln zuzugreifen?

Um das ganze zu verdeutlichen habe ich mal die beiden Subroutinen angehängt.

Code (perl): (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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
sub exportieren
{
my $auswahl_chkb1 = 0;
my $auswahl_chkb2 = 0;
my $auswahl_chkb3 = 0;
my $auswahl_chkb4 = 0;

my $export_tw = $mw->Toplevel();

my      $windowHeight       = "300";
my      $windowWidth        = "540";
my      $screenHeight       = $export_tw->screenheight;
my      $screenWidth        = $export_tw->screenwidth;
$export_tw->geometry($windowWidth."x".$windowHeight);
$export_tw->geometry("+".int($screenWidth/2 - $windowWidth/2)."+".int($screenHeight/2 - $windowHeight/2));

my $f1_tw = $export_tw->LabFrame(-label => "Ziel wählen",-labelside => 'acrosstop')->place(-x => 20,
                                                                                  -y    => 30,
                                                                                  -height => 65, -width => 500
                                                                                  );

my $Label1_tw = $export_tw->Label(-text => "Export von Schülerdaten:",-anchor => 'w')->place( -x => 21, -y => 10, -height => 21, -width => 493);

my $Label2_tw = $f1_tw->Label(-text => "Ziel-Datei:")->place( -x => 5, -y => 5, -height => 23, -width => 74);


my $Entry1_tw = $f1_tw->Entry(-width => 50, -relief => "sunken")->place( -x => 79, -y => 5, -height => 24, -width => 224);
$Entry1_tw->delete(0, 'end');
$Entry1_tw->insert('end', 'C:\');
#$pfad = $Entry1_tw->get();
&Speicher_aktualisieren; 

my $Button1_tw = $f1_tw->Button(-text    => 'Durchsuchen',
                           -relief => "raised",
                           -command =>
                             sub { if (my $TargetFolder = BrowseForFolder("Bitte wählen Sie den Ziel-Ordner", CSIDL_DESKTOP))
                                                                                {
                                                                                $Entry1_tw->delete(0, 'end');
                                                                                $Entry1_tw->insert('end', $TargetFolder);
                                                                                &Speicher_aktualisieren; 
                                                                                }
                             },
                        )->place( -x => 308, -y => 5, -height => 24, -width => 152);

my $f2_tw = $export_tw->LabFrame(-label => "Auswahl",-labelside => 'acrosstop')
                                                                                        ->place(-x => 20, -y => 100, -height => 125, -width => 245);                                            
                                                
$f2_tw->Checkbutton( -text => "Schüler Datenbank",
                                        -anchor => "w",
                                        -command => \&Speicher_aktualisieren,
                                     -variable => \$auswahl_chkb1
                                     )->place( -x => 0, -y => 0, -height => 22, -width => 100);
                                                                         
$f2_tw->Checkbutton( -text => "Buchungsdaten",
                                        -anchor => "w",
                                        -command => \&Speicher_aktualisieren,
                                     -variable => \$auswahl_chkb2
                                     )->place( -x => 0, -y => 24, -height => 22, -width => 100);
                                                                         
$f2_tw->Checkbutton( -text => "Bilddateien",
                                        -anchor => "w",
                                        -command => \&Speicher_aktualisieren,
                                     -variable => \$auswahl_chkb3
                                     )->place( -x => 0, -y => 48, -height => 22, -width => 100);                                                                         
                                                                         
$f2_tw->Checkbutton( -text => "Alles",
                                        -anchor => "w",
                                        -command => \&Speicher_aktualisieren,
                                     -variable => \$auswahl_chkb4
                                     )->place( -x => 0, -y => 72, -height => 22, -width => 100);                                                                         
                                                                         
my $f3_tw = $export_tw->LabFrame(-label => "Speicher",-labelside => 'acrosstop')
                                                                                        ->place(-x => 270, -y => 100, -height => 125, -width => 245);                                                                                                                    
                                                
$f3_tw->Label( -text => "Speicherbedarf:",
                                  -anchor => 'w'
                                )->place( -x => 0, -y => 0, -height => 20, -width => 100);
                                                
$f3_tw->Label( -textvariable => \$speicherbedarf,
                                  -anchor => 'e',
                                  -foreground => 'blue'
                                )->place( -x => 110, -y => 0, -height => 20, -width => 100);

$f3_tw->Label( -text => "Freier Speicher:",
                                  -anchor => 'w'
                                )->place( -x => 0, -y => 25, -height => 20, -width => 100);                             
                                
$f3_tw->Label( -textvariable => \$freierspeicher,
                                  -anchor => 'e',
                                  -foreground => 'blue'
                                )->place( -x => 110, -y => 25, -height => 20, -width => 100);
                                
                                                
$Label3_tw = $export_tw->Label( -textvariable => \$var_status_tw,
                                  -anchor => 'w',
                                  -foreground => 'red'
                                )->place( -x => 74, -y => 230, -height => 20, -width => 300);
$var_status_tw = "";

my $Button2_tw = $export_tw->Button(
                           -text => "Sichern",
                           -relief => "raised",
                           -command => sub {
                                                                my $pfad = $Entry1_tw->get();
                                                                if ( $pfad eq "" ) { $var_status_tw = "Fehler: Bitte geben Sie einen gültigen Pfad an!"; $Label3_tw->configure(-foreground => 'red'); return; }
                                                                my @target = ();
                                                                my @folder = ();
                                                                print "1:$auswahl_chkb1 ";
                                                                print "2:$auswahl_chkb2 ";
                                                                print "3:$auswahl_chkb3 ";
                                                                print "4:$auswahl_chkb4\n";
                                                                if ( $auswahl_chkb4 == 1 )
                                                                        {
                                                                        @folder2 = Foldercont(".");
                                                                        shift @folder2;
                                                                        
                                                                        foreach(@folder2)
                                                                                {
                                                                                my $pfad2 = $_;
                                                                                $pfad2 = reverse($pfad2);
                                                                                chop $pfad2;
                                                                                chop $pfad2;
                                                                                $pfad2 = reverse($pfad2);
                                                                                push @folder, "\.\\$pfad2";
                                                                                push @target, "$pfad$pfad2\n";
                                                                                }
                                                                        }
                                                                else
                                                                        {
                                                                        if ( $auswahl_chkb1 == 1 )
                                                                                {
                                                                                push @folder, ".\\schueler.csv";
                                                                                push @target, $pfad."schueler.csv";
                                                                                }
                                                                        if ( $auswahl_chkb2 == 1 )
                                                                                {
                                                                                my @folder2 = Foldercont(".\\daten");
                                                                                shift @folder2;
                                                                                foreach(@folder2)
                                                                                        {
                                                                                        my $pfad2 = $_;
                                                                                        $pfad2 = reverse($pfad2);
                                                                                        chop $pfad2;
                                                                                        chop $pfad2;
                                                                                        $pfad2 = reverse($pfad2);
                                                                                        push @folder, "\.\\$pfad2";
                                                                                        push @target, "$pfad$pfad2\n";
                                                                                        }
                                                                                }
                                                                        if ( $auswahl_chkb3 == 1 )
                                                                                {
                                                                                my @folder2 = Foldercont(".\\bilder");
                                                                                shift @folder2;
                                                                                foreach(@folder2)
                                                                                        {
                                                                                        my $pfad2 = $_;
                                                                                        $pfad2 = reverse($pfad2);
                                                                                        chop $pfad2;
                                                                                        chop $pfad2;
                                                                                        $pfad2 = reverse($pfad2);
                                                                                        push @folder, "\.\\$pfad2";
                                                                                        push @target, "$pfad$pfad2\n";
                                                                                        }
                                                                                }
                                                                        }
                                                                #if (CopyEx (\@folder => \@target, FOF_NOCONFIRMMKDIR))
                                                                #               {
                                                                #               $mw->messageBox(-icon => 'info', -message => "Das Backup wurde erfolgreich erstellt!       ", -title => 'Herzlichen Glückwunsch', -type => 'Ok', -default => 'Ok');
                                                                #               }
                                                                #       else
                                                                #               {
                                                                #               $mw->messageBox(-icon => 'info', -message => "Fehler beim kopieren aufgetreten!       ", -title => 'Fehler!', -type => 'Ok', -default => 'Ok');
                                                                #               }
                                                                my $cnt = 0;
                                                                foreach (@target)
                                                                        {
                                                                        print "$cnt:$folder[$cnt] - $target[$cnt]\n";
                                                                        $cnt++;
                                                                        }
                                                                        print "\nAnzahl: $cnt\n-------------------------------\n";
                                                        }
                           )->place( -x => 43, -y => 265, -height => 23, -width => 136);

my $Button3_tw = $export_tw->Button(
                           -text => "Abbrechen",
                           -relief => "raised",
                           -command => sub { $export_tw->destroy() }
                           )->place( -x => 361, -y => 265, -height => 23, -width => 136);

my $Label4_tw = $export_tw->Label(-text => "Status:",-anchor => 'w')->place( -x => 24, -y => 230, -height => 20, -width => 50);

$export_tw->bind ('<Escape>', sub{ $export_tw->destroy() });
$Button1_tw->focus();
}

sub Speicher_aktualisieren
        {
        my $summe = 0;
        my @zwischensumme;
        if ( $auswahl_chkb1 == 1 ) 
                {
                $summe = $summe + -s 'schueler.csv';
                }
        if ( $auswahl_chkb2 == 1 ) 
                {
                @zwischensumme = Foldercont(".\\daten");
                $summe = $summe + $zwischensumme[0];
                }
        if ( $auswahl_chkb3 == 1 ) 
                {
                @zwischensumme = Foldercont(".\\bilder");
                $summe = $summe + $zwischensumme[0];
                }
        if ( $auswahl_chkb4 == 1 ) 
                {
                @zwischensumme = Foldercont(".");
                $summe = $zwischensumme[0];
                $auswahl_chkb1 = 1;
                $auswahl_chkb2 = 1;
                $auswahl_chkb3 = 1;
                }
        $speicherbedarf = sprintf("%.2f", $summe/1048576)." MB";
        my $pfad = $Entry1_tw->get();
        if (GetDiskFreeSpace $pfad)
                {
                $freierspeicher = GetDiskFreeSpace $pfad;
                $freierspeicher = sprintf("%.2f", $freierspeicher/1048576)." MB";
                }
        }

View full thread Auf lokale Variablen global zugreifen