vTableCreator (IDE-Tool)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

vTableCreator (IDE-Tool)

Beitrag von MLK »

da ich mich gerade mit interfaces beschäftige und es total unhandlich finde vTables zu erstellen, oder gar im nachhinein zu verändern, habe ich ein kleines IDE-tool geschrieben. es benötigt die parameter %FILE und %TEMPFILE und macht dann aus:

Code: Alles auswählen

Interface iTEST
   Debug1()       ;@Proc1()
   DebugHello()   ;@proc2()
   DebugMySelf()  ;@proc3()
   Dbug(val.l)    ;@proc4()
EndInterface

Interface         iTEST2;interface2
DebugONE();@Proc1()
      DebugHello()     ;@procTwo()
  Debughmmmm();dontknow...
         DebugMySelf() ;@proc3()
   ehm()
;LastOne:
 Dbug(val.l) ;@proc4()
EndInterface

folgendes:

Code: Alles auswählen

;iTEST
*vTable\Method[0]	= @Proc1()
*vTable\Method[1]	= @proc2()
*vTable\Method[2]	= @proc3()
*vTable\Method[3]	= @proc4()

;iTEST2
*vTable\Method[0]	= @Proc1()
*vTable\Method[1]	= @procTwo()
*vTable\Method[3]	= @proc3()
*vTable\Method[5]	= @proc4()

also einfach die interfaces nach obigem beispiel schreiben, das tool ausführen, und das ergebnis ist in der zwischenablage.


hier nun der code:

Code: Alles auswählen

FilePath$ 			= ProgramParameter()
TempFilePath$ 	   = ProgramParameter()	:	If FilePath$ = "" :	FilePath$ = TempFilePath$ : EndIf

If ReadFile(0, FilePath$) = 0 : MessageRequester("Error", "can't read '" + FilePath$ + "'") : End : EndIf

NewList Result.s()

While Eof(0) = #False
   Line$ = LTrim(ReadString())
   If Left(Line$, Len("Interface")) = "Interface"
      If CountString(Line$, ";") : Line$ = Left(Line$, FindString(Line$, ";", 1) - 1) : EndIf
      Line$ = RemoveString(Line$, " ")
      InterfaceName$ = Right(Line$, Len(Line$) - Len("Interface")) 
      ; 
      AddElement(Result()) : Result() + ";" + InterfaceName$ + #CRLF$
      index.l = 0
      Repeat
         Line$ = RemoveString(ReadString(), " ")
         If Left(Line$, Len("EndInterface")) = "EndInterface" Or Eof(0) = #True : Break : EndIf
         SepPos.l = FindString(Line$, ");@", 1)
         If SepPos
            Result() + "*vTable\Method[" + Str(index) + "]" + Chr(9) + "= " + Mid(Line$, SepPos + 2, Len(Line$) - SepPos - 1) + #CRLF$
            index + 1
         ElseIf FindString(Line$, ")", 1)
            If FindString(Line$, ";", 1)
               If FindString(Line$, ")", 1) < FindString(Line$, ";", 1)
                  index + 1
               EndIf 
            Else
               index + 1
            EndIf 
         EndIf
      ForEver
   EndIf
Wend

ForEach Result()
   CurRes.l + 1
   Message$ = "result " + Str(CurRes) + "/" + Str(CountList(Result())) + " in clipboard"
   If CurRes < CountList(Result()) 
      Message$ + #CRLF$ + "push OK to continue"
   EndIf
   SetClipboardText(Result())
   MessageRequester("", Message$) 
Next

wer will kann ihn natürlich gerne erweitern/verändern



edit: hatte noch einen kleinen schönheitsfehler drin. nun geht das ganze auch mit unvollständig ausgefüllten interfaces.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Da muss ich doch glatt meins auch vorstellen:
http://mypage.bluewin.ch/remimeier/webspace/tool.zip

Hat wahrscheinlich Fehler und ist sehr beschränkt, aber nützlich :)

Benötigt %FILE und erstellt dann eine Datei mit einem 'c' vor dem FileName!
Also BASE.pbi wird zu cBASE.pbi

Dazu müssen Regeln eingehalten werden:

Code: Alles auswählen

Structure cFPS
	; Data
	FPSTime.l
	UpdateRate.l
	FPSCount.l
	FPS.f
EndStructure

Interface iFPS
EndInterface

Procedure fps_Update(*this.cFPS)
	*this\FPSCount + 1
	If ElapsedMilliseconds() - *this\FPSTime > *this\UpdateRate
		*this\FPSTime  + *this\UpdateRate
		*this\FPS 		 = *this\FPSCount / *this\UpdateRate * 1000.0
		*this\FPSCount = 0
	EndIf
EndProcedure

Procedure.f fps_Get(*this.cFPS)
	ProcedureReturn *this\FPS
EndProcedure

Procedure fps_SetUpdateMS(*this.cFPS, ms.l)
	*this\UpdateRate = ms
EndProcedure
Alles muss in dem Stil geproggt sein, der Source ist zum nachschauen
dabei (ist zwar grässlich ^^).
Erstellt wird dabei folgendes:

Code: Alles auswählen

Structure cFPS
	VTable.l
	
	; Functions
	fUpdate.l
	fGet.l
	fSetUpdateMS.l
	
	; Data
	FPSTime.l
	UpdateRate.l
	FPSCount.l
	FPS.f
EndStructure

Interface iFPS
	Update()
	Get.f()
	SetUpdateMS(ms.l)
EndInterface

Procedure fps_Update(*this.cFPS)
	*this\FPSCount + 1
	If ElapsedMilliseconds() - *this\FPSTime > *this\UpdateRate
		*this\FPSTime  + *this\UpdateRate
		*this\FPS 		 = *this\FPSCount / *this\UpdateRate * 1000.0
		*this\FPSCount = 0
	EndIf
EndProcedure

Procedure.f fps_Get(*this.cFPS)
	ProcedureReturn *this\FPS
EndProcedure

Procedure fps_SetUpdateMS(*this.cFPS, ms.l)
	*this\UpdateRate = ms
EndProcedure


Procedure.l new_FPS()
	Protected *p.cFPS
	
	*p = AllocateMemory(SizeOf(cFPS))
	*p\VTable = *p + OffsetOf(cFPS\fUpdate)
	*p\fUpdate	= @fps_Update()
	*p\fGet	= @fps_Get()
	*p\fSetUpdateMS	= @fps_SetUpdateMS()
	
	ProcedureReturn *p
EndProcedure
greetz
Remi
Antworten