www.mikrocontroller.net

Forum: PC-Programmierung Gambas: OPEN Befehl?


Autor: Bernd Wiebus (berndwiebus) Benutzerseite
Datum:

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
Autor: hp-freund (Gast)
Datum:

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...
Autor: Bernd Wiebus (berndwiebus) Benutzerseite
Datum:

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
Autor: hp-freund (Gast)
Datum:

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?
Autor: hp-freund (Gast)
Datum:
Angehängte Dateien:

Funktioniert es jetzt?
Anbei ein kleines Beispiel für gambas 2.21
Autor: Bernd Wiebus (berndwiebus) Benutzerseite
Datum:

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
Autor: hp-freund (Gast)
Datum:

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

...
hp-freund
Autor: Bernd Wiebus (berndwiebus) Benutzerseite
Datum:

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
Autor: hp-freund (Gast)
Datum:
Angehängte Dateien:

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.
Autor: Bernd Wiebus (berndwiebus) Benutzerseite
Datum:

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
Autor: hp-freund (Gast)
Datum:

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 :)
Autor: Bernd Wiebus (berndwiebus) Benutzerseite
Datum:
Angehängte Dateien:

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
Autor: hp-freund (Gast)
Datum:

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
Autor: Bernd Wiebus (berndwiebus) Benutzerseite
Datum:

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
Autor: hp-freund (Gast)
Datum:

Autor: Bernd Wiebus (berndwiebus) Benutzerseite
Datum:
Angehängte Dateien:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net