GFA-Basic

GFA-Basic Editor Extensions

english Version

 Startseite

 Mailingliste

 Editor Extensions

 Linkliste

 Impressum
  Die Editor-Extensions von GFA-Basic 32 sind ein mächtiges Werkzeug um den schon sehr guten Editor um weitere nützliche Funktionen zu erweitern. Allerdings ist die Weitergabe einer kompletten Editor Extension in meinen Augen nur bedingt praktikabel. Zum einen, weil man oft schon eigene Erweiterungen hat, die man nicht verlieren will, zum anderen, weil es viel Vertrauen erfordert die Extension eines anderen Programmierers zu verwenden. Ich will hier einen anderen Weg gehen und einzelne Routinen anbieten. Dabei beschreibe ich hier kurz die Funktion und gebe den kompletten Quellcode einer einzelnen Extension an. Damit kann jeder entscheiden, was für ihn selbst interessant ist und die entsprechenden Routinen in die eigene Extension einbauen. Durch den offengelegten Quellcode (als eine Art PD) ist zu dem sichergestellt, das keine versteckten Schadroutinen enthalten sind.

Wer auch eigene Editor Extensions zur Verfügung stellen will, sendet mir diese am besten per E-Mail an zu. Ich werde sie dann hier auf der Seite veröffentlichen.


Speichert bei jedem Programmstart den aktuellen Programmstand in einem temporären Verzeichnis
Ich habe die Funktion entwickelt um immer Backups meiner Projekte zu haben. Bei jedem Start wird der aktuelle Programmstand
in einer Datei, deren Dateiname aus dem aktuellen Dateinamen besteht (oder aus Test.g32) und einem Zeitstempel,
in einem speziellen Verzeichnis gespeichert.
'In Standard onRun-Sub einbauen Sub GFA_onrun Dim Dateiname As String, Dateiname_Pos As Long Dateiname = Gfa_FileName 'Falls noch nicht gespeichert, Standard-Namen setzen If Dateiname = "" Then Dateiname = "Test.g32" End If Dateiname_Pos = RInStr(Dateiname, "\") 'Pfadnamen entfernen If Dateiname_Pos <> 0 Then Dateiname = Mid$(Dateiname, Succ(Dateiname_Pos)) End If 'Dateiname um Datumsstempel ergänzen If Dateiname <> "" Then Dateiname = Left$(Dateiname, Len(Dateiname) - 4) & " " & Format$(Now, "yyyymmdd hhnnss") & ".g32" 'und in temporärem Verzeichnis speichern Gfa_SaveFile "H:\Temp_G32\" & Dateiname End If End Sub


Zeigt den aktuellen Prozedurnamen in der Statuszeile an
Gerade in langen Prozeduren oder beim Suchen kann es interessant sein den aktuellen Prozedurnamen zu ermitteln,
ohne die aktuelle Zeile zu verlassen. Diese Funktion schreibt diesen Namen in die Statuszeile.
'beliebige Gfa_Ex-Prozedur Sub Gfa_Ex_1() 'aktuelle Procedure Gfa_StatusText = Gfa_Text(Pred(Gfa_ProcLine)) End Sub


Springt zur Definitionsstelle der Variable/Prozedur
Eine sehr nützliche Funktion in VB ist der Ansprung einer Sub/Funktion auf der sich der Cursor befindet.
Dies ist mit dem folgenden Funktionspaket nun auch in GFA-Basic möglich.
Sie müssen dazu die Routine "GFA_Bezeichner_Init" in der Initialisierungsroutine GFA_Init aufrufen.
Die Aufrufe sind dann:
GFA_Bezeichner_Suchen True   zeigt die Zeile mit der Definition in der Statuszeile an
GFA_Bezeichner_Suchen False   springt zur Position der Prozedur oder zur Definition der Variablen.
Die Rücksprungadresse wird gespeichert.
GFA_Bezeichner_Ruecksprung   Springt zur gespiecherten Cursor-Position zurück

Die Routinen sind nicht unbedingt effektiv programmiert, aber sie funktionieren ;-).
Selbst in großen Listings werden die Ergebnisse zügig geliefert.
Procedure GFA_Bezeichner_Init 'Initialisiere Bezeichner-Variablen Global GFA_Bezeichner(255) As Boolean, GFA_Nummer As Long, GFA_PrgZeile As String Global GFA_Ruecksprung(1, 10) As Long, GFA_Ruecksprung_Pos As Long 'Initialisiere Buchstaben und Ziechen für Variablennamen For GFA_Nummer = 0 To 255 If InStr(1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_abcdefghijklmnopqrstuvwxyz", Chr$(GFA_Nummer)) = 0 Then GFA_Bezeichner(GFA_Nummer) = False Else GFA_Bezeichner(GFA_Nummer) = True End If Next GFA_Nummer End Proc Procedure GFA_Bezeichner_Suchen(GFA_Bezeichner_nur_Ausgabe As Boolean) 'Bezeichner unter Cursor erkennen und hinspringen Dim GFA_Bezeichnung As String, GFA_Zeile_Nr As Long, GFA_Pos As Long, GFA_Klammer As Long GFA_Bezeichnung = GFA_Bezeichner_hole_name() GFA_Zeile_Nr = Gfa_ProcLine '1. Durchlauf für lokale Definitionen Repeat GFA_Nummer = 0 GFA_PrgZeile = Gfa_Text(GFA_Zeile_Nr) 'Prüfe auf die diversen Schlüsselwörter GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "DECLARE ", 8, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "SUB ", 4, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "SUBA ", 5, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "FUNCTION ", 9, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "FUNCTIONA ", 10, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "PROCEDURE ", 10, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "GLOBAL ", 7, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "PUBLIC ", 7, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "DIM ", 4, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "PRIVATE ", 8, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "LOCAL ", 6, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "STATIC ", 7, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "CONST ", 6, GFA_Nummer) If GFA_Nummer > 0 Then 'Definitions-Kommando gefunden, Suche nach Bezeichner GFA_Nummer = InStr(1, GFA_PrgZeile, GFA_Bezeichnung) End If If GFA_Nummer = 0 Then 'Keine Fundstelle, gehe zur nächsten Zeile Inc GFA_Zeile_Nr End If Until GFA_Nummer <> 0 Or GFA_Zeile_Nr >= Gfa_ProcLine + Gfa_ProcLineCnt 'Wenn GFA_Nummer <> 0, dann wurde der Bezeichner gefunden If GFA_Nummer = 0 Then '2. Durchlauf für globale Definitionen GFA_Zeile_Nr = 0 Repeat GFA_Nummer = 0 GFA_PrgZeile = Gfa_Text(GFA_Zeile_Nr) 'Prüfe auf die diversen Schlüsselwörter GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "DECLARE ", 8, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "SUB ", 4, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "SUBA ", 5, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "FUNCTION ", 9, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "FUNCTIONA ", 10, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "PROCEDURE ", 10, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "GLOBAL ", 7, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "PUBLIC ", 7, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "DIM ", 4, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "PRIVATE ", 8, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "LOCAL ", 6, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "STATIC ", 7, GFA_Nummer) GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "CONST ", 6, GFA_Nummer) If GFA_Nummer > 0 Then 'Definitions-Kommando gefunden, Suche nach Bezeichner GFA_Nummer = InStr(1, GFA_PrgZeile, GFA_Bezeichnung) End If If GFA_Nummer = 0 Then 'Keine Fundstelle, gehe zur nächsten Zeile Inc GFA_Zeile_Nr End If Until GFA_Nummer <> 0 Or GFA_Zeile_Nr >= Gfa_LineCnt End If If GFA_Nummer = 0 Then 'Bezeichner nicht gefunden Gfa_StatusText = "Bezeichner '" & GFA_Bezeichnung & "' nicht erkannt !" Else If GFA_Bezeichner_nur_Ausgabe Then 'Ausgabe des Textes in der Statuszeile GFA_PrgZeile = Gfa_Text(GFA_Zeile_Nr) GFA_Nummer = InStr(1, GFA_PrgZeile, GFA_Bezeichnung) GFA_Pos = GFA_Nummer + Pred(Len(GFA_Bezeichnung)) GFA_Klammer = 0 Repeat Inc GFA_Pos Select Mid$(GFA_PrgZeile, GFA_Pos, 1) Case "(" Inc GFA_Klammer Case ")" If GFA_Klammer > 0 Then Dec GFA_Klammer Inc GFA_Pos End If End Select Until GFA_Klammer = 0 And (Mid$(GFA_PrgZeile, GFA_Pos, 1) = "," Or Mid$(GFA_PrgZeile, GFA_Pos, 1) = ")" Or GFA_Pos > Len(GFA_PrgZeile)) Gfa_StatusText = Mid$(GFA_PrgZeile, GFA_Nummer, GFA_Pos - GFA_Nummer) Else 'Ruecksprung_Adresse merken GFA_Ruecksprung(0, GFA_Ruecksprung_Pos) = Gfa_Line GFA_Ruecksprung(1, GFA_Ruecksprung_Pos) = Gfa_Col GFA_Ruecksprung_Pos = Mod(Succ(GFA_Ruecksprung_Pos), 11) Gfa_Line = Succ(GFA_Zeile_Nr) GFA_Nummer = InStr(1, Gfa_Text, GFA_Bezeichnung) 'Position anspringen If GFA_Nummer > 0 Then Dec GFA_Nummer Gfa_Col = GFA_Nummer Gfa_SelCol = Gfa_Col + Len(GFA_Bezeichnung) End If End If End If End Proc Procedure GFA_Bezeichner_Ruecksprung ' Nach Procedur-Sprung zurück zur gemerkten Position 'Die Rücksprung-Positionen werden in einem Array gespeichert 'beim letzten Element, wird auf das erste gesprungen, es werden maximal 11 Positionen gespeichert If GFA_Ruecksprung_Pos = 0 Then GFA_Ruecksprung_Pos = 10 Else Dec GFA_Ruecksprung_Pos End If 'Prüfen auf gespeicherte Rücksprungadresse If GFA_Ruecksprung(0, GFA_Ruecksprung_Pos) = 0 Then 'nichts gefunden, zurück zur alten Position GFA_Ruecksprung_Pos = Mod(Succ(GFA_Ruecksprung_Pos), 11) Else 'Cursor-Position setzen Gfa_SelCol = Gfa_Col Gfa_Line = GFA_Ruecksprung(0, GFA_Ruecksprung_Pos) Gfa_Col = GFA_Ruecksprung(1, GFA_Ruecksprung_Pos) GFA_Ruecksprung(GFA_Ruecksprung_Pos) = 0 EndIf End Proc Function GFA_Bezeichner_hole_name() As String Dim GFA_Position As Long, GFA_Zeile As String, GFA_Anfang As Long, GFA_Ende As Long 'Cursor-Position und Text holen GFA_Anfang = Gfa_Col GFA_Ende = Gfa_Col GFA_Zeile = Gfa_Text 'Von Cursor-Position aus den Anfang suchen, Auftreten des 1. Zeichens, das kein Variablenname ist While GFA_Anfang > 1 And GFA_Bezeichner(Asc(Mid$(GFA_Zeile, GFA_Anfang, 1))) Dec GFA_Anfang Wend 'Von Cursor-Position aus das Ende suchen, Auftreten des 1. Zeichens, das kein Variablenname ist While GFA_Ende < Len(GFA_Zeile) And GFA_Bezeichner(Asc(Mid$(GFA_Zeile, GFA_Ende, 1))) Inc GFA_Ende Wend 'Anfangs und End-Position korrigieren If Not GFA_Bezeichner(Asc(Mid$(GFA_Zeile, GFA_Anfang, 1))) Then Inc GFA_Anfang End If If Not GFA_Bezeichner(Asc(Mid$(GFA_Zeile, GFA_Ende, 1))) Then Dec GFA_Ende End If 'Bezeichner zurück geben GFA_Bezeichner_hole_name = Mid$(GFA_Zeile, GFA_Anfang, GFA_Ende - GFA_Anfang + 1) End Func Function GFA_Bezeichner_Check(ByRef GFA_Check_PrgZeile As String, GFA_Check_Name As String, GFA_Check_Laenge As Long, GFA_Check_Nummer As Long) As Long 'Prüfen auf Kommando If UCase$(Left$(Trim$(GFA_Check_PrgZeile), GFA_Check_Laenge)) = GFA_Check_Name Then GFA_Check_PrgZeile = Mid$(Trim$(GFA_Check_PrgZeile), Succ(GFA_Check_Laenge)) GFA_Bezeichner_Check = 1 Else GFA_Bezeichner_Check = GFA_Check_Nummer End If End Func


Veröffentlicht am 21.10.2005
Letzte Änderung am 21.10.2005
  RunAProg-Counter V1.0

Besucher seit 21.10.2005