Perl/Tk Klasse
Alex
- perl
Hallo,
package FormManager;
use strict;
use Tk;
sub new
{
my $obj = @_;
my $ref = {
MainForm => MainWindow->new(),
Menue => {}
};
bless($ref, $obj);
return($ref);
}
sub CreateMenue
{
my ($self) = @_;
$self->{Menue} = $self->{MainForm}->Menu(-type => 'menubar');
$self->{MainForm}->configure(-menu => $self->{Menue});
$self->{Menue}->cascade(-label => 'Datei', -underline => 0, );
}
=====================
#!/usr/bin/perl
use Tk;
use PM::FormManager;
my $frm = new FormManager;
$frm->CreateMenue();
=====================
die Methode CreateMenue funktioert nicht (Can't locate object method "CreateMenue" via package "1" at test.pl line 7)
Ist mir noch zu helfen?
Danke im Voraus
Alex
Na, darauf muss man erst ein mal kommen o_O
Der mag ja wohl den letzten Simikolon in der Sub nicht. Wieso sagt mir das denn Keiner...
Der mag ja wohl den letzten Simikolon in der Sub nicht.
Wie meinen? Dein vorgestellter Code funktioniert so nicht, egal ob mit oder ohne Semikolon.
Siechfred
kann mir jemand auf den Code mal schauen. Warum Funktioniert das nicht?
Weil du ein paar Basics nicht beachtet hast.
sub new
{
my $obj = @_;
Was soll das werden? In @_ stehen alle Parameter, die der Konstruktorfunktion übergeben wurden. Im OO-Kontext ist der erste Parameter immer der Klassenname (beim Konstruktor) bzw. die Objektreferenz (bei Aufruf von Objektmethoden). Jetzt überlege mal, was du hier welcher Variablen zuweist. Tipp: '@_' ist ein Array.
Jetzt, da du überlegt hast, wirst du sicher wissen, dass ein Array im Listenkontext die Anzahl der enthaltenen Elemente zurückgibt. Und genau darauf weist dich Perl hin:
die Methode CreateMenue funktioert nicht (Can't locate object method "CreateMenue" via package "1" at test.pl line 7)
Dein Package heißt nämlich nicht 'FormManager' sondern '1'. Damit verlierst du den Zugriff auf die Klasse Formmanager, eine Klasse '1' existiert nicht (dieser Name wäre m.W. auch unzulässig).
Ist mir noch zu helfen?
Ja, durch Lesen:
http://perldoc.perl.org/perltoot.html#Planning-for-the-Future%3A-Better-Constructors
Siechfred
Ist mir noch zu helfen?
Ja, durch Lesen:
http://perldoc.perl.org/perltoot.html#Planning-for-the-Future%3A-Better-Constructors
Danke für den Link ;)
Da ich Langeweile hatte und auf die Antworten gewartet habe, habe ich im Archiv gestöbert und zufälligt diese Seite gefunden. Echt cool muß ich sagen =)
Du hast noch auf den zweiten Post von mir geantworten. Ich schreibe jetzt ein mal hier für deine beiden Antworten.
Meinst de es funktioniert nicht? Also bei mir geht es, eben ohne Semikolon am ende der Sub. Was habe ich falsch gemacht? Dabei habe ich mich an die Seite gehalten: http://cologne.pm.org/talks/jps-ooperl/index.html
Ist das hier falsch? Dann habe ich den Stoff falsch verstanden und muss jetzt wieder umdenken :(
Danke und Gruß
Alex
Meinst de es funktioniert nicht?
Nein, die von dir gepostete Fehlermeldung deutet genau auf den Fehler hin, den ich beschrieben habe. Änderst du das, funktioniert es wie gewünscht. Hier mein reduzierter Testcode:
#!/usr/bin/perl -w
use strict;
use diagnostics;
my $frm = FormManager->new;
$frm->CreateMenue();
package FormManager;
use Tk;
sub new {
my $obj = shift;
my $ref = { MainForm => MainWindow->new(),
Menue => {}
};
bless $ref, $obj;
return $ref;
}
sub CreateMenue {
my $self = shift;
$self->{Menue} = $self->{MainForm}->Menu(-type => 'menubar');
$self->{MainForm}->configure(-menu => $self->{Menue});
$self->{Menue}->cascade(-label => 'Datei', -underline => 0 );
$self->{MainForm}->MainLoop;
}
Das tut zunächst das, was man in diesem Stadium erwarten kann: Es zeigt ein Fensterchen mit 'Datei' an.
Also bei mir geht es, eben ohne Semikolon am ende der Sub.
Sehr seltsam.
Siechfred
Das tut zunächst das, was man in diesem Stadium erwarten kann: Es zeigt ein Fensterchen mit 'Datei' an.
Besten Dank für die Hilfe. Das bringt mich weiter. Und ich werde wohl noch ein bissl Studieren und üben :)
Gruß, Alex
Meinst de es funktioniert nicht? Also bei mir geht es, eben ohne Semikolon am ende der Sub. Was habe ich falsch gemacht? Dabei habe ich mich an die Seite gehalten: http://cologne.pm.org/talks/jps-ooperl/index.html
Ist das hier falsch? Dann habe ich den Stoff falsch verstanden und muss jetzt wieder umdenken :(
Nein, hier ist ein kleiner aber in Perl wichtiger Unterschied zwischen deiner Konstruktorfunktion und der auf der Seite.
deine:
sub new
{
my $obj = @_;
...
Die auf der Seite:
sub new {
my ($inPkg, $inKontostand, $inDispo) = @_;
...
Du kannst in dem Fall nicht die Klammer weglassen.
Struppi.