Auto OpenMyIncludes in PB-IDE

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
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Jaja, ich geh ja gleich schlafen, aber diese Sache hält mich noch wach:

Das versteh ich nicht. Wieso heißen alle Fenster so? Willst ud damit sagen, dass es ein Allerweltsname ist? Und warum wird kein Fenster geöffnet?

Experimentiere gerade mit CreateMutex_() und ich kann wirklich einen einzigartigen Mutexnamen ermitteln! Somit dürfte, dieser einzigartige String in FindWindow_() eingesetzt, auch keine Probleme bereiten. Aber ich will ja auch so profimäßig sein wie du, deshalb müssen Mutex' her! <)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Hab ichdas so richtig gemacht, TS-Soft?
Laut Taskmanager warten mehrere Instanzen meines Tools, sie verschwinden nicht alle sofort. Scheint zu funktionieren.

Und wie du siehst, hab ich einen einmaligen Mutexnamen. Theoretisch kann der zwar woanders verwendet werden, aber das glaube ich nun wirklich nicht.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@ts-soft

Dein Programm funktioniert so weit. :allright:

Es versucht aber auskommentierte Include-Dateien zu öffnen.
So wie in den Sonderfall wenn das Schlüsselwort in Anführungszeichen steht.

Habe mal den Code erweitert mit FindStringLeft(...)

Code: Alles auswählen

; OpenIncludes
; Autor: Thomas (ts-soft) Schulz
; PB4 erforderlich

EnableExplicit

Global Mutex.l

Procedure FindStringLeft(String.s, StringToFind.s, Startposition.l = 0)

  Protected len, len2, index
  
  len = Len(String)
  len2 = Len(StringToFind)
  If Startposition = 0
    Startposition = len
  EndIf
  For index = Startposition To 1 Step - 1
    If Mid(String, index, len2) = StringToFind
      ProcedureReturn index
    EndIf
  Next
  ProcedureReturn 0
  
EndProcedure

Procedure OnlyOne()
  Mutex = CreateMutex_(0, 0, @"{112E4DF0-2388-41B2-87F4-CE683443180E}")
  If GetLastError_() = #ERROR_ALREADY_EXISTS
    ReleaseMutex_(Mutex)
    CloseHandle_(Mutex)
    ProcedureReturn #False
  EndIf
  ProcedureReturn #True
EndProcedure

Define.s Line, Path, Path2, IFile, PBDir, File = ProgramParameter()
Define.l FF, Pos, PosB, PosE, Ft = #PB_Ascii

While Not OnlyOne()
  Delay(10)
Wend

PBDir = GetPathPart(GetEnvironmentVariable("PB_TOOL_IDE"))

If File <> ""
  Path = GetPathPart(File)

  FF = ReadFile(#PB_Any, File)
  If FF
    If ReadStringFormat(FF) <> #PB_Ascii : Ft = #PB_UTF8 : EndIf

    While Not Eof(FF)
      IFile = ""
      Path2 = ""

      Line = ReadString(FF, Ft)

      Pos = FindString(Line, "IncludePath", 1)
      If FindStringLeft(Line, ";", Pos) Or FindStringLeft(Line, #DQUOTE$, Pos)
        Pos = 0
      EndIf
      If Pos
        PosB = FindString(Line, #DQUOTE$, Pos + 12) + 1
        PosE = FindString(Line, #DQUOTE$, PosB)
        If PosB And PosE
          Path = Mid(Line, PosB, PosE - PosB)
        EndIf
      EndIf

      Pos = FindString(Line, "IncludeFile", 1)
      If FindStringLeft(Line, ";", Pos) Or FindStringLeft(Line, #DQUOTE$, Pos)
        Pos = 0
      EndIf
      If Pos
        PosB = FindString(Line, #DQUOTE$, Pos + 12) + 1
        PosE = FindString(Line, #DQUOTE$, PosB)
        If PosB And PosE
          IFile = Mid(Line, PosB, PosE - PosB)
        EndIf
      EndIf

      Pos = FindString(Line, "XIncludeFile", 1)
      If FindStringLeft(Line, ";", Pos) Or FindStringLeft(Line, #DQUOTE$, Pos)
        Pos = 0
      EndIf
      If Pos
        PosB = FindString(Line, #DQUOTE$, Pos + 13) + 1
        PosE = FindString(Line, #DQUOTE$, PosB)
        If PosB And PosE
          IFile = Mid(Line, PosB, PosE - PosB)
        EndIf
      EndIf

      If FindString(Line, "#PB_Compiler_Home", Pos + 12)
        Path2 = PBDir
      EndIf

      If IFile <> ""
        If Path2 <> ""
          RunProgram(Path2 + IFile, "", "", #PB_Program_Wait)
        Else
          If FileSize(IFile) > 0
            RunProgram(IFile, "", "", #PB_Program_Wait)
          Else
            RunProgram(Path + IFile, "", "", #PB_Program_Wait)
          EndIf
        EndIf
      EndIf
    Wend
    CloseFile(FF)
  EndIf
EndIf
CloseHandle_(Mutex)

Danke auch noch. Das Programm ist sehr nützlich. <)

FF :wink:

P.S. Hatte zu Ostern auch mal wieder viel Zeit zum Programmieren.

Das Ergebnis...
http://www.purebasic.fr/german/viewtopic.php?t=12579
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Es versucht aber auskommentierte Include-Dateien zu öffnen.
Hab ich schon erwähnt, das meiner das nicht macht? Hey mk-soft! Hast du meines auch mal ausprobiert? :)

> Schlüsselwort in Anführungszeichen steht
Daran habe ich auch schon gedacht. Aber das Tool ist ja eh nur eine Überganslösung, sodass ich persönlich nicht weiß, ob sich der Aufwand lohnt. Und ich wüsste jetzt auch keine Gelegenheit, bei der das so sein sollte.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

AND51 hat geschrieben: > Schlüsselwort in Anführungszeichen steht
Daran habe ich auch schon gedacht. Aber das Tool ist ja eh nur eine Überganslösung, sodass ich persönlich nicht weiß, ob sich der Aufwand lohnt. Und ich wüsste jetzt auch keine Gelegenheit, bei der das so sein sollte.
Das Programm selber ist schon ein Beispiel wo das Schlüsselwort vor kommt. <)

Habe dein Code auch mal ausprobiert. Geht aber bei mir leider nicht. :(
Weis aber nicht warum.

Edit: GetEnvironmentVariable("PB_TOOL_Compiler") für bei mir zu kein ergebnis

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Es versucht aber auskommentierte Include-Dateien zu öffnen.
Das hat mich auch schon genervt, immer bei diesem Source kommts :mrgreen:
Hatte gestern aber keine grosse Lust mehr. Durch doppelpunkt mehrfache
Anweisungen werden auch nicht behandelt. Ich hab sowas für Include aber
sowieso nicht :mrgreen:
Danke für die Erweiterung :allright:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> GetEnvironmentVariable("PB_TOOL_Compiler") für bei mir zu kein ergebnis
Hehe, du musst die EXE ja auch von der IDE starten lassen. Um das zu WIssen solltest du schon mal die Hilfeseite "externe Werkzeuge" durchlesen. FF :wink:

> Das Programm selber ist schon ein Beispiel wo das Schlüsselwort vor kommt.
Ich weiß, aber im Gegensatz zu TS-Soft habe ich eine Prüfung drin, es werden nur existierende Dateien gestartet. Das Werkzeug kann bei meinem Code erkennen, was es will, es gibt keinen Fehler.

> Geht aber bei mir leider nicht.
Hast du denn PB 4? Ja oder?

> Durch doppelpunkt mehrfache
Anweisungen werden auch nicht behandelt.
Wollte es gestern noch einmachen und dachte, das könne man in ca. 5 Zeilen schaffen, aber dann hab ich mich verhakt und das war's.
Trotzdem behaupte ich mal, TS'is und meines können Doppelpunkte verarbeiten, beispielsweise das hier
>> Dleay(25) : IncludeFile "howdy.pbi"
Ist zwar Quatsch, aber meiner kanns <)
Bei TS-Soft weiß ich es grad nicht, aber meiner kann sogar Zeilen behandeln, in denen IncludePath und 1x IncFile vorkommt => Nur, um auch den letzten kleinen Vorteil hervorzuheben :lol:

> Ich hab sowas für Include aber sowieso nicht
Eben. :)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Ich weiß, aber im Gegensatz zu TS-Soft habe ich eine Prüfung drin, es werden nur existierende Dateien gestartet
Für was ist das Gut :mrgreen:
Meinste meiner schafft es per RunProgram nicht existende Dateien zu starten. Das würde mich aber sehr wundern.

PS: Deine Version ist wirklich hervorragend, ich werde aber trotzdem meine
bessere
nutzen :mrgreen:

>> Trotzdem behaupte ich mal, TS'is und meines können Doppelpunkte verarbeiten, beispielsweise das hier
Wenn juckts, Du hast es mal wieder nicht geschnallt. Es geht um:

Code: Alles auswählen

XIncludeFile "one.pb" : XIncludeFile "two.pb"
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Für was ist das Gut
Während der Entwicklung trat ein Fehler auf, der aus einer falschen Adressangabe resultierte. Dies kann unter realen Beindungen auch der Fall sein, wenn einer seine PB-Files verschiebt und dann erstmalig wieder öffnet.

Ich habe den Verlauf der zletzt geöffneten Dateien in der IDE auf 30 gestelllt. Schätzungsweise sind von diesen 30 Files immer 10%, die nicht mehr existieren. Und was, wenn eine davon ein Include ist, das auch in anderen Codes Verwendung findet?

Du kannst zwar eine nicht existierende Datei mit RunProgram starten. Aber icherhalte dann jedes Mal eine Fehelrmeldung "Die Datei XYZ funktioniert nicht, wurde nicht gefunden. Es ist Ostern, suchen Sie doch selber!"
Außerdem würde FileSize() einen negativen Wert zurückgeben, und der bei Delay() eingesetzt führt zu einer unendlichen Wartezeit.
Mit meinem Check kille ich two birds mit one stone oder schlage eben auch zwei Fliegen mit einer Klappe.


> Deine Version ist wirklich hervorragend
Es freut mich, das von einem ranghohen PB'ler wie dir zu höhren (ernstgemeint!) :allright:

> werde aber trotzdem meine bessere nutzen
Es hält dich ja auch niemand davon ab - aber versuchen, dich zu bekehren darf ich doch, oder? :mrgreen:

> Wenn juckts, Du hast es mal wieder nicht geschnallt. Es geht um:
Das von mir genannte ist nur ein Extrembeispeil, dasss funktioniert.
Dein Beispiel ist eines, erwartungsgemäß nicht funktioneiren würde (das erste wird als incX erkannt, das zweite würde als inc erkannt und gefiltert).

Meiner schafft aber das hier:

Code: Alles auswählen

IncludePath "D:\Meine Sammlung\" : XIncludeFile "Ts-Soft.pbi"
:-P
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

AND51 hat geschrieben: Meiner schafft aber das hier:

Code: Alles auswählen

IncludePath "D:\Meine Sammlung" : XIncludeFile "Ts-Soft.pbi"
:-P
Und meiner das:

Code: Alles auswählen

IncludePath "D:\Meine Sammlung" : IncludeFile "AND51.pbi" : XIncludeFile "Ts-Soft.pbi"
:mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten