guten Morgen,
Ich selber kenne TCL gar nicht (ausser vom hoeren natuerlich). Interessieren wuerde mich vor allem ein "Sourceshot", also ein kleines Beispielprogramm, an dem jemand, der schon ein paar Sprachen kann, schnell sieht, welche Art von Sprache das ist, ob sie umstaendlich oder straight-forward aussieht usw., also einen ersten Eindruck bekommt. Aber gerade faellt mir ein, wo man sowas schnell findet: http://internet.ls-la.net/mirrors/99bottles/beer_s_z.html.
ähm ... ja. Das TCL-Beispiel, das da mit drin steht, sagt dir nur wenig. Ich hänge dir mal nen funktionierenden Code an, der bissel mehr zeigt. Das war mal vor etwa zwei Jahren mein "Ausgangsmodell", um mir mit TCL/Tk ein eigenes "Gegenmodell" zum WINDOWS-Explorer zu basteln - ist übrigens geglückt, ich brauche den Windows-Explorer nicht mehr und bin sogar nahe dran, mir meinen eigenen Browser fürs WWW fertigzustellen. Deine Frage, ob TCL "umstaendlich oder straight-forward aussieht usw." läßt sich damit etwas besser beantworten als mit dem Beispiel in der von dir angegebenen Adresse. Eine grafische Darstellung kriegst du allerdings nur, wenn du irgendwo den zuständigen Interpreter installiert hast, aber der Code ist plain-text, läßt sich also problemlos mit jedem Editor lesen.
Du siehst, daß es die üblichen "Grundbestandteile" gibt, also Variablen, Schleifen, Bedingungen (if), reguläre Ausdrücke, Kommentare usw. Es gibt nur eins, was dieser für mich alte Entwurf noch nicht leistet: er kann keine URL finden bzw. kein HTML-Dokument "browsermäßig" darstellen. Das läßt sich zwar machen, aber damit würde der Beispielcode doch zu sehr aufgebläht.
Das Schöne an TCL/Tk ist, daß sich Scripts nahezu unverändert auch auf anderen Plattformen ausführen lassen; es müssen dann lediglich die Pfadangaben plattformgemäß formuliert werden, der Rest ist sowohl mit Windows wie mit LINUX/BSD oder mit dem Mac ausführbar/darstellbar, vorausgesetzt natürlich, daß der Interpreter vorhanden ist - aber auch den kann man notfalls mitliefern, er ist schön klein. Für Windows-Systeme kann man Script plus Interpreter in eine EXE zusammenpacken, eine LINUX-Version desselben Programms würde dann aus Script, Interpreter und shell-Script (oder PERL-Script) zum Ausführen bestehen, und ein ziemlich vollwertiger Editor könnte damit in einer Größe unter 1 MB gebaut werden.
Beispielhaft umgesetzt worden ist das (aus meiner Sicht) mit Tkdesk, allerdings nur für UNIX/LINUX, zu finden unter http://www.tkdesk.org/
Achtung: Das Beispiel, das ich anhänge, ist für ein Forums-posting ziemlich viel Code, daher verabschiede ich mich schonmal vorher mit den üblichen
Grüßen aus Berlin
Christoph S.
#----------------------------------------------------------
Datei tcl-editor.tcl
ein Editorprogramm
#----------
1. Titel, Fenstergröße und -position
wm title . "TCL-EDITOR"
wm geometry . 600x430
wm geometry . +15+15
#----------
2. Hauptfenster
frame .fr
pack .fr
#----------
2.1 Kopfzeile mit Menübefehlen erstellen
frame .menubar -relief raised -bd 1
pack .menubar -in .fr -fill x
menubutton .menubar.datei -text Datei -menu .menubar.datei.menu
menubutton .menubar.url -text URL -menu .menubar.url.menu
pack .menubar.datei .menubar.url -side left
menubutton .menubar.help -text Anmerkungen -menu .menubar.help.menu
pack .menubar.help -side right
menu .menubar.datei.menu -tearoff 0
.menubar.datei.menu add command -label Öffnen -command {oeffnen}
.menubar.datei.menu add command -label Speichern -command {speich}
.menubar.datei.menu add command -label "Speichern als ..." -command {speichals}
.menubar.datei.menu add sep
.menubar.datei.menu add command -label "Programm beenden" -command exit
menu .menubar.url.menu -tearoff 0
.menubar.url.menu add command -label "URL öffnen" -command {urlopen http://forum.de.selfhtml.org}
menu .menubar.help.menu -tearoff 0
.menubar.help.menu add command -label Hinweise -command {hinw}
.menubar.help.menu add sep
.menubar.help.menu add command -label Entwicklung -command {hist}
#----------
2.2 Text-Widget mit Scrollfunktion festlegen
frame .edf
text .ed -bg #EEEEEE -padx 10 -pady 10 -yscrollcommand ".ys set" \
-width 120 -height 30
scrollbar .ys -command ".ed yview"
pack .ed .ys -in .edf -side left -fill both
pack .edf -in .fr -after .menubar -fill both
#----------
2.3 externe Scripts übernehmen
source filesel.tcl
source message.tcl
source popup.tcl
#----------
3. Prozesse starten
#----------
3.1.0 Menübefehl "Datei Neu"
proc neu {} {
}
#----------
3.1.1 Menübefehl "Datei öffnen"
proc oeffnen {} {
set types {
{"Alle Dateien" *}
{"Tcl Scripts" {.tcl} TEXT}
{"Text" {.txt} }
{"HTML-Dateien" {.htm .html} HTML}
}
set openf [tk_getOpenFile -filetypes $types -initialdir C:/]
.ed delete 1.0 end
set fid [open $openf r+]
while {![eof $fid]} {
.ed insert end [read $fid 1000]
}
close $fid
.ed mark set insert 1.0
}
#----------
3.1.2 Menübefehl "Datei Speichern"
proc speich {} {
set sts [catch {set f [open [tk_getOpenFile -filetypes $types -initialdir C:/] w]} errormessage]
if {$sts == 0} {
puts $f [.ed get 1.0 end]
} else {
set ok [puts stdout "kein Dateiname angegeben"]
}
}
#----------
3.1.3 Menübefehl "Datei Speichern als ..."
proc speichals {} {
if {[tk_getOpenFile -filetypes $types -initialdir C:/]) == "" } {
set ok [showMessage "kein Dateiname angegeben"]
return }
if {[string compare [tk_getOpenFile -filetypes $types -initialdir C:/] $altname] == 0 } {
set ok [showMessage "Datei wird überschrieben"]
tkwait window .messpop
if {$ok == 0} {
speich
}
} else {
set openf [tk_getOpenFile -filetypes $types -initialdir C:/]
set f [open $openf w]
puts $f [.ed get 1.0 end]
}
}
#----------
3.2.0 URL öffnen
proc urlopen {url} {
global http
if {![regexp -nocase {^(http://)?([^:/]+)(:([0-9])+)?(/.*)} \
$url x protocol server y port path]} {
error "falsche URL: $url"
}
if {[string length $port] == 0} {
set port 80
}
set sock [socket 127.0.0.1 80]
puts $sock "GET $path HTTP/1.1"
puts $sock "Host: $server"
puts $sock "User-Agent: Tcl/Tk urlopen"
puts $sock ""
flush $sock
return $sock
}
#----------
3.3.0 Hinweise
proc hinw {} {
set openf [tk_getOpenFile -initialfile hinweis.txt]
.ed delete 1.0 end
set fid [open $openf r]
if {![eof $fid]} {
.ed insert end [read -nonewline $fid]
}
close $fid
.ed mark set insert 1.0
}
#----------
3.3.1 Entwicklung
proc hist {} {
}