Forum: PC-Programmierung Gambas: OPEN Befehl?


von Bernd W. (berndwiebus) Benutzerseite


Lesenswert?

Hallo

Ich habe ein Problem mit dem Open Befehl aus Gambas. Es handelt sich um 
Gambas 2.7 unter Debian "Lenny"

Folgender Gambas-Code, der irgendeinmal nach weiterem Ausbau zeilenweise 
etwas aus einem Textfile einlesen soll, liefert mir als Fehlermeldung 
beim Ausführungsversuch, das in der Zeile  "OPEN = stFileNameOpen FOR 
READ AS hFileIn" hFileIn nicht definiert ist (unknown identifier 
hFileIn):

PUBLIC SUB ChooseFile_Click()
 DIM hFileIn AS File
 DIM stFileNameOpen AS String

 Dialog.Title = "Open File"
 Dialog.OpenFile
 stFileNameOpen = Dialog.Path
 Label1.Text = "Path: " & stFileNameOpen
 OPEN stFileNameOpen FOR READ AS hFileIn
END

Dieser Code Schnipsel ist nach dem Vorbild in "Beginners Guide to 
Gambas" erstellt.
Ich habe auch versuchsweise andere Namen für hFileIN gewaehlt, um nicht 
mit irgendwelchen reservierten Worten zusammenzustossen.
Ausserdem habe ich hFileIn versuchsweise auch mal als PUBLIC definiert, 
aber der Fehler blieb gleich.

An einer Stelle im Netz habe ich als Beispiel für "OPEN stFileNameOpen 
FOR READ AS hFileIn" gefunden, "#hFileIN" zu schreiben. Abgesehen davon, 
das ich dann nicht mehr genau weiss, was ich mache (Ich bin Anfaenger), 
bekomme ich dann die Fehlermeldung: "No startup method".

Auf gambas.org habe ich folgendes Beispiel gefunden: " hFileIn = OPEN 
stFileNameOpen FOR READ".  Ich erhalte aber ebenfals als Fehlermeldung: 
"No startup method".

Ansonsten scheint dieser Abschnitt einigermassen zu funktionieren, wenn 
ich die betreffende Zeile entferne. Ich erhalte eine Dialogbox zur 
Auswahl von Pfad und File, und das wird auch anschliessend im Label 
angezeigt.

Und jetzt weiss ich erstmal nicht mehr weiter.
Kennt sich einer mit dem Open Befehl in Gambas aus?



Mit freundlichem Gruß: Bernd Wiebus alias dl1eic

http://www.dl0dg.de

von hp-freund (Gast)


Lesenswert?

Bernd Wiebus schrieb:
> AS hFileIn

Das bedeutet das ein Typ hFileIn existieren muss.
hFileIn ist aber eine Variable vom Typ File (FileHandler).

http://www.gambasdoc.org/help/lang/open

gibt eine gute Übersicht mit passendem Beispiel...

von Bernd W. (berndwiebus) Benutzerseite


Lesenswert?

Hallo hp-freund.

>> AS hFileIn
> Das bedeutet das ein Typ hFileIn existieren muss.
> hFileIn ist aber eine Variable vom Typ File (FileHandler).

Die Variable ist aber 7 Zeilen weiter oben als File definiert worden: 
"DIM hFileIn AS File". Eine Zeile darunter "DIM stFileNameOpen AS 
String" und das hat ja funktioniert. Ich sollte den Gültigkeitsbereich 
also noch nicht verlassen haben.


> http://www.gambasdoc.org/help/lang/open
> gibt eine gute Übersicht mit passendem Beispiel...

Mmmmmh.....
Von der Seite hatte ich das im Vorposting angegebene Beispiel mit:
" hFileIn = OPEN stFileNameOpen FOR READ".  Ich erhalte aber ebenfals 
als Fehlermeldung: "No startup method".
Meinst Du, es ist keine gute Idee, da einen Pfad über eine String 
Variable hineinzuschreiben???

Vermutlich übersehe ich irgendwas mit dem file-handler.

Mit freundlichem Gruß: Bernd Wiebus alias dl1eic

http://www.dl0dg.de

von hp-freund (Gast)


Lesenswert?

Bernd Wiebus schrieb:
> Die Variable ist aber 7 Zeilen weiter oben als File definiert worden:
> "DIM hFileIn AS File".

Genau. Aber:

Dim Variable AS Typ

Hinter AS muss der Typ der Variable und nicht eine Variable stehen.

Existiert die zu öffnende Datei auch? Leserechte sind auch vorhanden?

von hp-freund (Gast)


Angehängte Dateien:

Lesenswert?

Funktioniert es jetzt?
Anbei ein kleines Beispiel für gambas 2.21

von Bernd W. (berndwiebus) Benutzerseite


Lesenswert?

Hallo hp-freund.

>> Die Variable ist aber 7 Zeilen weiter oben als File definiert worden:
>> "DIM hFileIn AS File".
> Genau. Aber:
> Dim Variable AS Typ
> Hinter AS muss der Typ der Variable und nicht eine Variable stehen.

Umpf.....eventuell das #?

Ich habe das jetzt so hingekriegt:

PUBLIC hFileIn AS File
PUBLIC stFileNameOpen AS String

PUBLIC SUB _new()

END

PUBLIC SUB Form_Open()

END

PUBLIC SUB ChooseFile_Click()
 DIM sLine AS String
 Dialog.Title = "Open File"
 Dialog.OpenFile
 stFileNameOpen = Dialog.Path
 Label1.Text = "Path: " & stFileNameOpen
 OPEN stFileNameOpen FOR READ AS #hFileIn
 LINE INPUT #hFileIn, sLine
 Label2.Text = sLine
 LINE INPUT #hFileIn, sLine
 Label3.Text = sLine
 LINE INPUT #hFileIn, sLine
 Label4.Text = sLine
 LINE INPUT #hFileIn, sLine
 Label5.Text = sLine
END

Wirf mir jetzt nicht das fehlende CLOSE vor, das kommt noch. Irgendwann 
:-)

Weil das # habe ich in einem Beispiel gefunden, und so gehts.
Heist das jetzt, daß das # aus der Variablen einen "Typ der Variablen" 
macht? Ich müsste das mal mit "PUBLIC hFileIn AS #File" testen.....
dann waere ja hFileIn als Typ definiert. Oder sehe ich das zu naiv?
Das mit der "Hungarian notation" und h als Kennzeichnung für einen 
Filehandler war mir vollständig neu. :-(

> Existiert die zu öffnende Datei auch? Leserechte sind auch vorhanden?

Ja. Hab ich extra streng Zeilenorientiert für den Zweck gut erreichbar 
deponiert. Aber zum Auswerten der Zeilen muss ich die erst einlesen.....
Das in Label zu schreiben ist auch nur um zu prüfen, ob es grundsätzlich 
funktioniert wie angedacht.

> Funktioniert es jetzt?
> Anbei ein kleines Beispiel für gambas 2.21

Vielen Dank.
Ich werde mir das Programm gleich mal ansehen.

Mit freundlichem Gruß: Bernd Wiebus alias dl1eic

http://www.dl0dg.de

von hp-freund (Gast)


Lesenswert?

Hallo Bernd,
das # gibt den numerischen Wert des handles an der für die Ein- u. 
Ausgabe benötigt wird...

...
hp-freund

von Bernd W. (berndwiebus) Benutzerseite


Lesenswert?

Hallo hp-freund.

> das # gibt den numerischen Wert des handles an der für die Ein- u.
> Ausgabe benötigt wird...

Ah. Ok. Danke! Analog zur haeufigen Verwendung von "#" als Kennzeichnung 
eines nummerischen Wertes.
Ich müsste mal tiefer im "Beginners Guide to
Gambas" graben, um explizit darüber was zu finden.

Mein letzter Haenger war, daß ein Modul mehrere Funktionen enthalten 
könnte, und darum auf eine Funktion im Modul weder mit Modulname noch 
Funktionsname sondern mit Modulname.Funktionsname zugegriffen werden 
muss.
Heisst das jetzt im Umkehrschluss, ich koennte in einem anderen Modul 
eine andere Funktion mit gleichem Funktionsnamen erstellen, und beim 
Aufrufen dann ueber den Modulnamen die beiden Funktionen 
auseinanderhalten?

Die Notation hat was, ist aber seeeehr ungewohnt. Vor allem, wenn das 
letzte Programmieren 15 Jahre zurueck liegt.....

Ist es sinnvoll, paralell in VisualBasic (oder irgendeine andere moderne 
Programmiersprache) Unterlagen zu schielen, um Ideen zu finden? 
Letztlich handelt es sich auch darum, sich an die 
grammatikalischen/linguistischen Konstrukte moderner Programmiersprachen 
zu gewoehnen.

Mit freundlichem Gruß: Bernd Wiebus alias dl1eic

http://www.dl0dg.de

von hp-freund (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Bernd,

ich glaube das es genug Beispiele für gambas gibt. Ich persönlich würde 
nicht zu VB gucken. Kleine Unterschiede gibt es schon.
Laufen eigentlich meine Quelltexte Version 2.21 in deinem gambas?
Wenn ja, hier noch was. Es ist möglich in jedem Modul eine Funktion mit 
gleichem Namen zu definieren.

von Bernd W. (berndwiebus) Benutzerseite


Lesenswert?

Hallo hp-freund.

> ich glaube das es genug Beispiele für gambas gibt. Ich persönlich würde
> nicht zu VB gucken. Kleine Unterschiede gibt es schon.

Danke! Gut zu wissen.


> Laufen eigentlich meine Quelltexte Version 2.21 in deinem gambas?

Problemlos. Allerdings habe ich das selber nicht in eine Textbox 
eingelesen, weil ich vorhabe, das File zeilenmaeßig zu analysieren......

Auf lange Sicht gesehen müsste ich das File für die Laufzeit des 
Programmes irgendwie zergliedert oder sonstwie geordnet ablegen. Ich 
dachte dabei aus alter Tradition an ein Array. Allerdings ist die 
Fillänge (Zeilenzahl) selber vorher unbekannt. D.h. ich muesste 
Speicherplatz für ein Array variabel reservieren können, oder noch 
besser, zur Laufzeit umaendern können. Das war frueher immer eine 
kitzelige Sache und viele Programmiersprachen liessen das auch gar nicht 
erst zu.
Ob und im welchem Umfange das Gambas zulaesst, werde ich mir heute abend 
noch durchlesen. Vieleicht ist ja eine verkettete Liste doch besser.

> Wenn ja, hier noch was.

Danke. Ich sehe es mir gleich mal an.

> Es ist möglich in jedem Modul eine Funktion mit
> gleichem Namen zu definieren.

Ich habe damit schon rumgespielt....und ich habe das auch festgestellt 
und auch weiter festgestellt, das ich auf die Tour eine Moeglichkeit 
habe, komplette Module per Namensaenderung auszutauschen.
Die Art der Notation faengt an, mir zu gefallen.

Mit freundlichem Gruß: Bernd Wiebus alias dl1eic

http://www.dl0dg.de

von hp-freund (Gast)


Lesenswert?

Bernd Wiebus schrieb:
> Allerdings habe ich das selber nicht in eine Textbox
> eingelesen, weil ich vorhabe, das File zeilenmaeßig zu analysieren......

Das in meinem Beispiel ist keine Textbox sondern eine Listbox.
Somit stehen schon Listenfunktionen wie hinzufügen, entfernen, Index 
u.a. zur Verfügung.
Hab mal testweise 1000000 Strings der Länge 50 + Zeilennummern in die 
Liste geschrieben - ohne Probleme.
Schnelle Rechner mit viel Speicher sind doch was Schönes :)

von Bernd W. (berndwiebus) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo hp-freund.

> Wenn ja, hier noch was. Es ist möglich in jedem Modul eine Funktion mit
> gleichem Namen zu definieren.

Ich habe es mir angesehen. Nette Demonstration dieses Prinzieps.

>> Allerdings habe ich das selber nicht in eine Textbox
>> eingelesen, weil ich vorhabe, das File zeilenmaeßig zu analysieren......
> Das in meinem Beispiel ist keine Textbox sondern eine Listbox.
> Somit stehen schon Listenfunktionen wie hinzufügen, entfernen, Index
> u.a. zur Verfügung.

Habe ich mir mal angesehen, aber vorlaeufig noch nichts mit gemacht.
Ich habe erst mal mit ein paar anderen Sachen rumgespielt, z.B. den 
ersten Ansaetzen eines Gerberviewers. Joerg Wunsch duerfte sich darueber 
allerdings kringelig lachen.
Siehe die beigelegte Datei Test.tar
Im Ordner Testfiles sind drei Files, mit denen Du das Teil testen 
kannst.
Draw klappt aber nur für das ~~247D.gbr File, weil ich mir noch was 
einfallen lassen muss, um die Formatierung sicher zu erkennen.
Genauso die Skalierung. Desweiteren habe ich alles nur mit LineWith 2 
gezeichnet.
Auch die Fileerkennung muss noch gehoerig verbessert werden, damit sie 
nicht mehr so leicht zu veraeppeln ist. :-)
Grundsaetzlich sollte ich mich nach diesen Vorstudien mal auf den 
Hintern setzten und sehen, wie ich das ganze struckturiere. Dazu muesste 
ich mir jetzt z.B. mal Ansehen, wie ich Daten von einer Klasse in eine 
andere schaufel.
Einfach per public Namen geht ja nicht, dazu ist zu gut gekapselt.

Der Code ist mittlerweile auch schon etwas verworren, und vermutlich 
existieren von meinen Versuchen Unmengen von deklarierten aber nirgendwo 
verwendeten Variablen, die ich vergessen habe, zu loeschen.

Ich hatte ein paar Probleme mit der Drawing Area. Urspruenglich war sie 
mit Bestandteil von SUB ChooseFile. Abgesehen, das sie auch bei 
ungeigneten Files loslief, zeichnete sie nur im linken oberen Quadranten 
und schnitt alles ab, was darueber hinaus ragte. Es war keine 
"Skalierungsangelegenheit". Ich habe sie aus anderen Gruenden 
ausgelagert,
und ploetztlich funktioniert sie.....?

Ich werde jetzt erstmal Doku und Brainstorming machen, waerend ich mich 
wieder etwas mehr der Hardware zuneige.



> Hab mal testweise 1000000 Strings der Länge 50 + Zeilennummern in die
> Liste geschrieben - ohne Probleme.

Duerfte fuer die meisten Faelle langen....:-)

> Schnelle Rechner mit viel Speicher sind doch was Schönes :)

Ja. Aber bei mir laeuft das auf einem Sony Vaio Schleppi von 2002 oder 
so.  :-)

Mit freundlichem Gruß: Bernd Wiebus alias dl1eic

http://www.dl0dg.de

von hp-freund (Gast)


Lesenswert?

Hallo Bernd,
ich habe dein Prog mal getestet. Es wird schon mal was gezeichnet :)
Zu mindest bei 247d das andere gibt einen string/integer Fehler.

Eigentlich ist ein CAD Programm im weitesten Sinne ein klarer Fall für 
OOP.
Hab mal einige Versuche dies bezüglich angestellt, aber in der gambas 2 
Version fehlen noch einige wichtige Sachen wie typedef, struct und 
objektlisten.

Lediglich Textlisten existieren, so wie ich das sehe. collection listbox 
usw.
Ich lasse mich aber gern korrigieren.

Meine Vorstellung war ein Grafikobjekt (Grafik) und davon abgeleitet ein 
GrafikLinie ein GrafikPunkt, GrafikBogen usw.
Das scheint auch alles so weit in Ordnung, nur leider fehlt mir eben die 
Object-Liste um diese Objekte abzuspeichern.
So müsste man also alle Objekte in TextZeilen wandeln und diese in der 
List speichern. z.B.:

Objekttyp,Farbe,Ebene,Linienart,Linienbreite,Radius,x1,y1,x2,y2,x3,y3... 
..

"Punkt",1,0,1,0.25,0,100,100 //Farbe 1,Ebene 0,LinArt,Breite 
0.25,Position
"Bogen",1,0,1,0.5,20,10,10,100,100 //Radius 20 Start 10,10 Ende 100,100
"Linie",1,0,2,0.2,0,50,50,80,90 //Linie von 50,50 nach 80,90
usw.

Diese Textzeilen werden dann mit FOR EACH ausgewertet und entsprechend 
des Objekttypes behandelt. Durch die Kommatrennung ist ein zerlegen der 
Textzeile auch recht einfach.


...
hp-freund

von Bernd W. (berndwiebus) Benutzerseite


Lesenswert?

Hallo hp-freund.


> Hallo Bernd,
> ich habe dein Prog mal getestet. Es wird schon mal was gezeichnet :)
> Zu mindest bei 247d das andere gibt einen string/integer Fehler.

Richtig. Weil das Format, in dem die Daten abgelegt wurden, leicht 
anders ist, und dann klappt diese primitievst Stringverwurstung nicht 
mehr.
Nach der Stringzerlegung bleiben Buchstaben zurück, und bei der 
Integerumwandlung weiss er nicht mehr, was er tun soll......

So ein Strichmuster würde in vielen Fällen langen, wenn man ein 
kleiberes File manipulieren möchte. Es würde zur Orientierung langen, 
und man koennte in einem passend aufgebauten Programm die Draws 
erkennen, von denen man einen Endpunkt leicht verrücken möchte, oder die 
Blinks, für die man gerne eine andere Blende haette.

> Eigentlich ist ein CAD Programm im weitesten Sinne ein klarer Fall für
> OOP.

Richtig. Aber Gerberfiles sind schon etwas eigen. Ich habe das zuerst 
auch unterschätzt, nach dem Motto, so ein altes Lochstreifenformat 
dürfte sich schnell erschlagen lassen.
Dummerweise ist aber vieles nicht fix definiert bzw. Kontextabhängig von 
einem Kontext, den man im Zweifel nicht immer kennt.

Einfaches Beispiel der Maschinen-Stopp Befehl (M02*) der "normalerweise" 
immer am Ende steht, quasi als EOF für die Maschine zum Anhalten, mußte 
bei einigen Maschinen aber am Anfang stehen......damit noch etwaige 
laufende Programme sicher beendet werden. Auf einer normalen Maschine 
eingesetzt, fuehrt das dazu, das die Maschine direkt nach Programmstart 
wieder gestoppt wird.
Die Informationen dazu sind aber nicht im File selber.......
Das heisst, der Benutzer MUSS eine Möglichkeit haben, korriegierend 
einzugreifen.....will ich jetzt das "M02*" am Ende oder am Anfang haben.
Ganz sicher falsch sind am Anfang und am Ende oder ganz weglassen.
Letztlich sind sie wichtig als Trenner, wenn das gleiche Programm zigmal 
hintereinander abläuft.
Für eine Übertragung nach extendet Gerber wäre es aber egal. Das EOF 
langt mir persönlich, Am Anfang brauch ich nicht und bei extendet Gerber 
ist es definiert am Ende. Das heißt, zum Aslesen könnte ich es einfach 
ignorieren
und bei extendet einfach auf jeden Fall am Ende hinschreiben.
Die unterschiedlichen vorkommenden Zahlenformate und die Modalität sind 
da schon problematischer.....


> Lediglich Textlisten existieren, so wie ich das sehe. collection listbox
> usw.
> Ich lasse mich aber gern korrigieren.

Textlisten würden für Gerber dicke langen. :-)


>
> Meine Vorstellung war ein Grafikobjekt (Grafik) und davon abgeleitet ein
> GrafikLinie ein GrafikPunkt, GrafikBogen usw.

Hört sich irgendwie SVG-mäßig an....:-)


> Diese Textzeilen werden dann mit FOR EACH ausgewertet und entsprechend
> des Objekttypes behandelt. Durch die Kommatrennung ist ein zerlegen der
> Textzeile auch recht einfach.


Momentan bin ich an einem Punkt, wo ich nachdenke, wie ich die 
Kommunikation zwischen Unterschiedlichen Programmteilen machen will.
Z.B. den Pfad in einem Form einlesen, aber in mehreren anderen 
verwenden....dazu muss er aber an die anderen übergeben werden.
Das klappt nicht einfach, weil Gambas in der Art keine globalen 
Variablen kennt. Es bestände wohl die Möglichkeit, eine globale Klasse 
einzuführen, und es so über einen Umweg zu erreichen.....aber ich denke 
mir, das muss auch anders gehen. Nur wie.....
Das was ich an Unterlagen habe, schweigt sich dazu aus, oder ich 
Übersehe es.

Vermutlich bietet die Objektorientierung dazu irgendeinen Weg.....die 
Variablen Public in einer Klasse, und die Klasee reicht die an die Form 
weiter....irgendwie so.....du merkst, OO ist für mich eine seehr fremde 
Welt.
Möglicherweise habe ich das Pferd von hinten aufgezäumt. Der Button im 
Form ruft direkt im Form die Dialogbox auf.....Was wäre, wenn eine 
Klasse eine Information vom Form erhaelt, das ein Button gedrückt wurde. 
Dann ruft die  Klasse den Dialog auf, und verteilt anschliessend den 
Pfad dahin, wo er gebraucht wird?

Als ich vor 20Jahren mal von OO gehört habe, hat mich das begeistert. 
Aber seitdem hatte ich nichts mehr damit zu tun, und mir ist der Draht 
dazu irgendwie abhanden gekommen.

Mit freundlichem Gruß: Bernd wiebus alias dl1eic

http://www.dl0dg.de

von hp-freund (Gast)


Lesenswert?


von Bernd W. (berndwiebus) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo hp-freund.


> Kennst Du diese Seiten schon?

Gut das Du mich an das Gambas Wikibook erinnert hast. Ich hatte mir 
davon zwar schon eine Kopie auf den Rechner gezogen, aber die war jetzt 
gut 1 Jahr oder so alt, und seit dem hat sich doch etwas getan. :-)

Die englische Version ist gaaaanz anders, und deckt oft die Luecken der 
deutschen Version ab und vice versa.

Desweiteren kreist ja noch eine Beginners Guide to Gambas als PDF 
Version.
Der ist recht umfassend, aber auch etwas alt.

Die eigene HTML-Hilfe von Gambas ist auch gut. Wenn ich wechselseitig in 
allen dreien lese, hilft mir das oft weiter. ;-)

Wie weit ich bin, siehst Du in obigem Screenshot. Die Sourcen sind in 
der
angehaengten Zip-Datei.

Mit freundlichem Gruß: Bernd Wiebus alias dl1eic

http://www.dl0dg.de

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.