QBasic Befehl Locate in Perl

QBasic Befehl Locate in Perl

am 22.07.2007 17:51:23 von Mario Vogl

Hallo,

ich bin Neuling was Perl Programmierung betrifft und habe nun ein kleines
Problem. Es gibt doch in QBasic den Befehl Locate, mit dem man den Cursor
zum Ein-/Ausgeben auf der Konsole an eine bestimmte Stelle setzen kann,
gibt es so eine Möglichkeit auch unter Perl?
Ich habe schon bei Google gesucht, aber wohl nur die falschen Suchbegriffe
verwendet (wie ich hoffe), aber konnte nichts finden.

gruß
Mario

Re: QBasic Befehl Locate in Perl

am 22.07.2007 19:09:50 von Christian Kirsch

Mario Vogl schrieb:
> Hallo,
>
> ich bin Neuling was Perl Programmierung betrifft und habe nun ein kleines
> Problem. Es gibt doch in QBasic den Befehl Locate, mit dem man den Cursor
> zum Ein-/Ausgeben auf der Konsole an eine bestimmte Stelle setzen kann,
> gibt es so eine Möglichkeit auch unter Perl?
> Ich habe schon bei Google gesucht, aber wohl nur die falschen Suchbegriffe
> verwendet (wie ich hoffe), aber konnte nichts finden.


In Perl direkt gibt es so einen Befehl nicht. Es sollte aber Module auf
CPAN (www.cpan.org) geben, die ähnliches bewerkstelligen können, bspw.
durch Einbinden von (n)curses.

Re: QBasic Befehl Locate in Perl

am 22.07.2007 19:36:26 von Mirco Wahab

Mario Vogl wrote:
> ich bin Neuling was Perl Programmierung betrifft und habe nun ein kleines
> Problem. Es gibt doch in QBasic den Befehl Locate, mit dem man den Cursor
> zum Ein-/Ausgeben auf der Konsole an eine bestimmte Stelle setzen kann,
> gibt es so eine Möglichkeit auch unter Perl?
> Ich habe schon bei Google gesucht, aber wohl nur die falschen Suchbegriffe
> verwendet (wie ich hoffe), aber konnte nichts finden.

Untzer Unix nimmt man, wie schon gesagt, "Curses" oder "Ncurses".
Das gibts auch für Perl, bei mir (Activeperl 5.8.8 unter XP)
installiere ich das mit dem Activestate-PPM-tool; und zwar vom
"Bribes de Perl" (http://www.bribes.org/perl/ppm/package.lst)
Repository.

Damit funktioniert dann folgendes:

...
use Curses;

my $screen = new Curses; # Modul initialisieren
my($y, $x) = (2, 20); # Ausgangsposition
my($ymax, $xmax); # Bildschirmgroesse

$screen->getmaxyx($ymax, $xmax);
$screen->addstr($y, $x, "Ueberschrift (Screen: $ymax x $xmax)");
$screen->addstr($y+2, $x, "Text eingeben: ");
$screen->refresh(); # komplett anzeigen

Curses::echo(); # Tastatureingabe anzeigen

$screen->getstr(my $str); # Eingabe machen
$screen->addstr($ymax-2, 20, "Die Eingabe war: $str");

Curses::noecho(); # Tastatureingabe ausblenden
$screen->refresh(); # komplett anzeigen
...

Viele Grüße

M.

Re: QBasic Befehl Locate in Perl

am 22.07.2007 21:47:43 von Slaven Rezic

Mirco Wahab writes:

> Mario Vogl wrote:
> > ich bin Neuling was Perl Programmierung betrifft und habe nun ein kleines
> > Problem. Es gibt doch in QBasic den Befehl Locate, mit dem man den Cursor
> > zum Ein-/Ausgeben auf der Konsole an eine bestimmte Stelle setzen kann,
> > gibt es so eine Möglichkeit auch unter Perl?
> > Ich habe schon bei Google gesucht, aber wohl nur die falschen Suchbegriffe
> > verwendet (wie ich hoffe), aber konnte nichts finden.
>
> Untzer Unix nimmt man, wie schon gesagt, "Curses" oder "Ncurses".
> Das gibts auch für Perl, bei mir (Activeperl 5.8.8 unter XP)
> installiere ich das mit dem Activestate-PPM-tool; und zwar vom
> "Bribes de Perl" (http://www.bribes.org/perl/ppm/package.lst)
> Repository.

Curses braucht man nicht unbedingt, es geht auch mit dem Coremodule
Term::Cap:


use Term::Cap;
$terminal = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed };
$| = 1;
for (1..24) {
$terminal->Tgoto('cm', $_*3, $_, \*STDOUT);
print "Hallo";
select undef,undef,undef,0.2;
}

Allerdings vermute ich, dass Term::Cap sehr Unix-spezifisch ist und
unter Windows möglicherweise gar nicht funktioniert.

Gruß,
Slaven

--
Slaven Rezic - slaven rezic de

Berlin Perl Mongers - http://berlin.pm.org

Re: QBasic Befehl Locate in Perl

am 22.07.2007 23:45:01 von Mario Vogl

Mirco Wahab wrote:
> Untzer Unix nimmt man, wie schon gesagt, "Curses" oder "Ncurses".
> Damit funktioniert dann folgendes:
> ...

Erst einmal vielen Dank für die schnellen Antworten, ich hab das jetzt ein
wenig ausprobiert und folgende Funktionen erstellt, damit ich nicht
jedesmal im Programm die ganzen Curses-Befehle neu eingeben muss, da das
ganze sehr oft mit vielen verschiedenen Variablen vorkommen wird.

....
use Curses;
$screen = new Curses;

sub locout {
$screen->addstr($_[0], $_[1], $_[2]);
}

sub locin {
my $input;
$screen->addstr($_[0], $_[1], $_[2]);
$screen->getstr($input);
return $input
}

# Zum Testen
print "1**********************************\n";
print "2**********************************\n";
print "3**********************************\n";
print "4**********************************\n";
print "5**********************************\n";
print "6**********************************\n";
print "7**********************************\n";
print "8**********************************\n";
print "9**********************************\n";
print "0**********************************\n";
print "1**********************************\n";


# Funtionstest
locout(2, 5, "Hallo");
$input = locin(4, 5, "Eingabe:");
locout(6, 5, $input);
$input = locin(8, 5, "Eingabe:");
locout(10, 5, $input);
....

Das funktioniert soweit ganz gut, nur gibt es da einen Haken. Ich bräuchte
die Ausgabe so das der Hintergrund den ich mit Print und den * erzeugt habe
noch sichtbar bleibt und nur an der Stelle wo der neue Text mit den
Funktionen erscheint die Sternchen überschieben werden.
Das ganze soll eigentlich so aussehen:

1**********************************
2****Hallo*************************
3**********************************
4****Eingabe:**********************
5**********************************
6****(String)**********************
7**********************************
8****Eingabe:**********************
9**********************************
0****(String)**********************
1**********************************

Momentan ist es ja leider so das die Sternchen nicht mehr angezeigt werden
sobald die Funktion aufgerufen wird. Hat jemand einen Tip für mich wie ich
die Anzeige mit den Sternchen (als überschriebener Hintergrund so zusagen)
erzeugen kann?

gruß
Mario

Re: QBasic Befehl Locate in Perl

am 22.07.2007 23:50:24 von Mirco Wahab

Mario Vogl wrote:
> 1**********************************
> 2****Hallo*************************
> 3**********************************
> 4****Eingabe:**********************
> 5**********************************
> 6****(String)**********************
> 7**********************************
> 8****Eingabe:**********************
> 9**********************************
> 0****(String)**********************
> 1**********************************
>
> Momentan ist es ja leider so das die Sternchen nicht mehr angezeigt werden
> sobald die Funktion aufgerufen wird. Hat jemand einen Tip für mich wie ich
> die Anzeige mit den Sternchen (als überschriebener Hintergrund so zusagen)
> erzeugen kann?

Du musst jegliche Ausgabe mit den Curses-Funktionen machen,
also z.B. so:

....
my $screen = new Curses;

sub locout { $screen->addstr(@_) }

sub locin {
$screen->addstr(@_);
Curses::echo();
$screen->getstr(my $input);
Curses::noecho();
return $input
}

sub hintergrund {
$screen->addstr(0, 0,'
1**********************************
2**********************************
3**********************************
4**********************************
5**********************************
6**********************************
7**********************************
8**********************************
9**********************************
0**********************************
1**********************************
');
}

hintergrund();
locout(2, 5, 'Hallo');
my $input = locin(4, 5, "Eingabe:");
locout(6, 5, $input);
$input = locin(8, 5, "Eingabe:");
locout(10, 5, $input);
...


Viele Grüße

M.

Re: QBasic Befehl Locate in Perl

am 23.07.2007 10:57:48 von Mario Vogl

Mirco Wahab wrote:


> Du musst jegliche Ausgabe mit den Curses-Funktionen machen,
> also z.B. so:
>
....
> sub locin {
> $screen->addstr(@_);
> Curses::echo();
> $screen->getstr(my $input);
> Curses::noecho();
> return $input
> }

Danke für die Hilfe das ist genau das was ich gebraucht habe, aber ich habe
da noch eine Verständnisfrage dazu, was bewirkt Curses::echo(); und
noecho() oder besser wozu braucht man das? Ich hab es einfach mal
weggelassen und es funktioniert immer noch auch ohne diese Zeilen.

Und dann wären da noch zwei Kleinigkeiten, erstens jedesmal wenn ich das
Programm beende und ich mit den Funktionen Zeichen Ausgegeben habe, ist
mein Cursor auf der Konsole verschwunden und ich kann die Eingaben nicht
mehr sehen, wie kriegt man den wieder sichtbar?
Zweitens, jedesmal wenn ich mit locin() etwas eingebe bleibt die eingabe
nach drücken von Enter stehen, gibt es eine Möglichkeit das automatisch der
eingegebene Text wieder gelöscht wird? Da ich eine Reihe von Abfragen habe,
die alle an der selben Position nacheinander vorkommen und es etwas
verwirrend ist wenn bei der neuen Abfrage noch alter Text hinter dem Cursor
steht.

Hoffe ich nerve nicht zu sehr mit den ganzen Fragen...

gruß
Mario

PS: Gibt es eine einfache Möglichkeit diese schönen Rahmen-Zeichen (179-210)
aus den ASCII-Zeichen zu verwenden? Oder sonst eine Möglichkeit den
Hintergrund mit einigen Linien (vertikal und Horizontal) zu unterteilen?

Re: QBasic Befehl Locate in Perl

am 23.07.2007 15:38:51 von Ferry Bolhar

Mario Vogl:

> Danke für die Hilfe das ist genau das was ich gebraucht habe, aber ich
habe
> da noch eine Verständnisfrage dazu, was bewirkt Curses::echo(); und
> noecho() oder besser wozu braucht man das? Ich hab es einfach mal
> weggelassen und es funktioniert immer noch auch ohne diese Zeilen.

Möglicherweise das Echoing von Eingaben ein- und auszuschalten, dh.,
mit noecho() siehst du nicht mehr, was du eintippst (wie bei Passworten
häufig der Fall). Mit echo() schaltet man das Echoing wieder ein. Beim
Erzeugen von Ausgaben hat dieses Setting keine Wirkung.

> Und dann wären da noch zwei Kleinigkeiten, erstens jedesmal wenn ich das
> Programm beende und ich mit den Funktionen Zeichen Ausgegeben habe, ist
> mein Cursor auf der Konsole verschwunden und ich kann die Eingaben nicht
> mehr sehen, wie kriegt man den wieder sichtbar?

Mit echo()?

> PS: Gibt es eine einfache Möglichkeit diese schönen Rahmen-Zeichen
(179-210)
> aus den ASCII-Zeichen zu verwenden? Oder sonst eine Möglichkeit den
> Hintergrund mit einigen Linien (vertikal und Horizontal) zu unterteilen?

Ich weiß nicht, aber irgendwie kommt mir die Art deiner Programmierung
nicht mehr ganz zeitgemäß vor. Was machst du außerdem, wenn dein Programm
seine Ausgabe auf Geräte schickt, die die erwähnten Rahmenzeichen nicht
unterstützen?

Warum verwendest du nicht ein Grafik-Paket wie z.B. Tk?

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: QBasic Befehl Locate in Perl

am 23.07.2007 23:39:13 von Slaven Rezic

"Ferry Bolhar" writes:

> Mario Vogl:
[...]
> > PS: Gibt es eine einfache Möglichkeit diese schönen Rahmen-Zeichen
> (179-210)
> > aus den ASCII-Zeichen zu verwenden? Oder sonst eine Möglichkeit den
> > Hintergrund mit einigen Linien (vertikal und Horizontal) zu unterteilen?
>
> Ich weiß nicht, aber irgendwie kommt mir die Art deiner Programmierung
> nicht mehr ganz zeitgemäß vor. Was machst du außerdem, wenn dein Programm
> seine Ausgabe auf Geräte schickt, die die erwähnten Rahmenzeichen nicht
> unterstützen?

Typischerweise nimmt man einen Fallback aus normalen ASCII-Zeichen (|,
-, +). Mein terminfo(5)-Manual erwähnt das unter der Überschrift "Line
Graphics".

>
> Warum verwendest du nicht ein Grafik-Paket wie z.B. Tk?
>

Auch heute gibt es noch genug Bedarf für einfache Konsoleprogramme.

Gruß,
Slaven

--
Slaven Rezic - slaven rezic de

Lost in your Tk widget tree? Try
http://user.cs.tu-berlin.de/~eserte/src/perl/Tk-WidgetDump/

Re: QBasic Befehl Locate in Perl

am 24.07.2007 09:56:28 von Ferry Bolhar

Slaven Rezic:

>> Warum verwendest du nicht ein Grafik-Paket wie z.B. Tk?
>
> Auch heute gibt es noch genug Bedarf für einfache Konsoleprogramme.

Stimmt, ich kenne natürlich die Anforderungen des OP nicht. Ich
habe mich nur etwas gewundert - wir haben unsere letzten DEC
VT420 Schirme (das waren welche mit "Line Graphics") vor zehn
Jahren entsorgt. Mit Escape-Sequenzen zum Ansprechen des
Cursors und zum Ein- und Ausschalten von Bold- und Underline-
Modus habe ich mich so Ende der Achziger das letzte mal
rumgeschlagen...

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: QBasic Befehl Locate in Perl

am 24.07.2007 12:52:36 von Robert Berghaus

Ferry Bolhar schrieb:
> Slaven Rezic:
>=20
>>> Warum verwendest du nicht ein Grafik-Paket wie z.B. Tk?
>> Auch heute gibt es noch genug Bedarf für einfache Konsoleprogramme.
>=20
> Stimmt, ich kenne natürlich die Anforderungen des OP nicht. Ich
> habe mich nur etwas gewundert - wir haben unsere letzten DEC
> VT420 Schirme (das waren welche mit "Line Graphics") vor zehn
> Jahren entsorgt. Mit Escape-Sequenzen zum Ansprechen des
> Cursors und zum Ein- und Ausschalten von Bold- und Underline-
> Modus habe ich mich so Ende der Achziger das letzte mal
> rumgeschlagen...

Man kann diese Dinge wunderbar benutzen um per Telnet (SSH müßte=20
auch gehen) Menü geführt irgendwelche Einstellungen zu verändern.=20
Dazu werden dann auch die ESC Sequenzen wieder benötigt.
Mein letztes Programm für diesen Bereich stammt von 2002 (ist aber=20
nicht für Maus-Schubser geeignet ;-) ).


--=20
Schönen Gruß aus dem Bergischen Land
Robert

Re: QBasic Befehl Locate in Perl

am 24.07.2007 14:25:30 von hjp-usenet2

On 2007-07-24 07:56, Ferry Bolhar wrote:
> Slaven Rezic:
>>> Warum verwendest du nicht ein Grafik-Paket wie z.B. Tk?
>>
>> Auch heute gibt es noch genug Bedarf für einfache Konsoleprogramme.
>
> Stimmt, ich kenne natürlich die Anforderungen des OP nicht. Ich
> habe mich nur etwas gewundert - wir haben unsere letzten DEC
> VT420 Schirme (das waren welche mit "Line Graphics") vor zehn
> Jahren entsorgt.

Es gibt auch sowas wie "xterm", "putty", "konsole", ...
Man braucht nicht unbedingt ein physisches Terminal, um
character-cell-basierte Programme zu verwenden. Gerade wenn man remote
arbeitet, sind die auf Grund der geringeren Anforderungen an Bandbreite
und Latency angenehmer zu bedienen als GUI-Programme. Ich sitze z.B.
gerade in Tirol und bin über SSH auf meinem Rechner in Wien eingeloggt,
wo ich mittels slrn News lese und diese Zeilen mit dem vim schreibe ...

hp


--
_ | Peter J. Holzer | I know I'd be respectful of a pirate
|_|_) | Sysadmin WSR | with an emu on his shoulder.
| | | hjp@hjp.at |
__/ | http://www.hjp.at/ | -- Sam in "Freefall"