Autore Topic: E' possibile via codice conoscere le Classi possedute da un Componente ?  (Letto 953 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.597
  • Ne mors quidem nos iunget
    • Mostra profilo
Vi risulta sia possibile VIA CODICE conoscere, elencare le Classi possedute da un Componente ?
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.217
  • Tonno verde
    • Mostra profilo
Intendi qualcosa del genere?

Codice: [Seleziona]
Public Sub Main()

  Dim sRow As String
  Dim c As Class

  Component.Load("gb.util")
 
  If Exist(".../.project") Then
    For Each sRow In Split(File.Load(".../.project"), gb.NewLine)
      If sRow Begins "Component" Then
        Print "============="
        Print Mid(sRow, 11);; ":"
        Print "============="
        For Each c In Classes
          Print c.Name
        Next
      Endif

    Next
  Endif

End
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.597
  • Ne mors quidem nos iunget
    • Mostra profilo
Intendi qualcosa del genere?
No, perché - al di là del Componente presente o comunque richiamato - la lunga lista dei simboli resta invariata.
Più in particolare le Classi, appartenenti a un Componente, vengono sempre menzionate nella lista dei simboli creata con  quel ciclo
Codice: [Seleziona]
For Each c In Classes
Insomma l'elenco resta comunque invariato, mostrando numerosissimi simboli.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.597
  • Ne mors quidem nos iunget
    • Mostra profilo
Per ora sembra che sia possibile conoscere il Componente al quale appartiene una Classe:
Codice: [Seleziona]
Public Sub Form_Open()

  Dim c As Class

  c = Class.Load("Image")

  Print c.Component.Name

End
ma non sia possibile :-\ il contrario: dato un Componente, individuare nettamente ed elencare le Classi da questo possedute.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.597
  • Ne mors quidem nos iunget
    • Mostra profilo
mostrando numerosissimi simboli.
Si può ottenere una gran massa di simboli, anche penetrando in alcune Strutture costitutive dei sorgenti di Gambas:
Codice: [Seleziona]
Public Sub Form_Open()

  Dim cp As Component
  Dim p1, p2, p3, p4 As Pointer
  Dim s As String
 
  cp = Component.Load("gb.image")
 
  p1 = Object.Address(cp)
' Accedo alla Struttura "_CLASS" dichiarata nel file header "gbx_class.h":
  p2 = Pointer@(p1)
' Mi dice che l'identificatore "cp" si riferisce a un Componente:
  Print String@(Pointer@(p2 + 24))

' Accedo alla Struttura "CLASS_DESC_SYMBOL",dichiarata nel file header "gbx_class_desc.h" e puntata dal membro "*table" della Struttura "_CLASS":
  p3 = Pointer@(p2 + 40)
 
  For i As Integer = 0 To 8191
' Legge all'interno della Struttura "CLASS_DESC_SYMBOL":
    s = String@(Pointer@(p3 + i))
    If Not IsNull(s) Then
      If IsAlnum(s) Or (s Begins "_") Then Print i & "  " & s
    Endif
  Next

End
Anche in questo caso non riesco a ottenere, o meglio a ottenere specificate le Classi possedute - qui - dal Componente "gb.image".
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.217
  • Tonno verde
    • Mostra profilo
Qualcosa del genere allegato?
text1 lo ottieni dal ciclo di un progetto senza componenti:
Codice: [Seleziona]
For Each c In Classes
  Print c.Name
Next

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.597
  • Ne mors quidem nos iunget
    • Mostra profilo
Qualcosa del genere allegato?
Qualora vengano caricati manualmente o automaticamente (per dipendenza) due o più Componenti Gambas, il tuo codice non riesce ancora precisamente ad assegnare a ciascun Componente caricato le rispettive Classi, ma comunque le individua.
Ovviamente non fallisce, qualora sia caricato un solo Componente.
Concludo comunque complimentandomi con te: bravo:ok:
Ne farò una pagina nella nostra wiki.

Mi sono permesso di modificare un po' il tuo codice:
Codice: [Seleziona]
Public Sub Main()

  Dim simboli As String[] = ["Main", "Debug", "^System", "Highlight", "Expression", "Pointer[]", "Long[]", "Object[]",
      "Date[]", "Single[]", "Float[]", "Integer[]", "Short[]", "Byte[]", "Boolean[]", ".Array.Bounds",
      "Observer", "Timer", "Task", "_BoxedString", "String", "Jit", "User", "System",
      "Process", "Application", "Args", "Env", "File", "Stat", "Stat.Perm", ".Stream.Term",
      ".Stream.Lines", "Error", "Collection", "Object", "Components", "Classes", "Array", "String[]",
      ".Symbol", "Enum", "Variant[]", "Param", "gb", "Stream", "Component", "Class"]
  Dim cp As Component
  Dim c As Class
  Dim b As Byte

' Carica il Componente:
  cp = Component.Load("gb.sdl2.audio")

  Print String(Len(cp.Name), "=\e[1m")
  Print cp.Name
  Print String(Len(cp.Name), "\e[0m=")

  For Each c In Classes
    If (Not simboli.Exist(c.name)) And (Left(c.name, 1) <> ".") Then
      Inc b
      If Left(c.name, 1) = "^" Then
        Print b;; Right(c.Name, Len(c.Name) - 1)
      Else
        Print b;; c.Name
      Endif
    Endif
  Next

End
« Ultima modifica: 09 Luglio 2024, 01:41:36 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.721
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo

Concludo comunque complimentandomi con te: bravo:ok:


Mettetegli qualche zavorra ai piedi altrimenti il Capitano mi vola via.....
 :P :P :P :P
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.217
  • Tonno verde
    • Mostra profilo
Per chi come me ha compilato Gambas seguendo le mie istruzioni, ha già una cartella nominata gambasdevel nella propria home.
Altrimenti può scaricare il codice da qui: https://gitlab.com/gambas/gambas
agendo sulla combo Code e scaricarlo come file compresso per poi decomprimerlo e rinominarlo nella propria home.
Fatta questa operazione può usare il progetto allegato

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.217
  • Tonno verde
    • Mostra profilo
Naturalmente funziona solo con i componenti scritti in Gambas e per evitare errori potremmo aggiungere/cambiare il codice così:
Codice: [Seleziona]
Try aComponent = Split(File.Load(sPath &/ sComp &/ ".list"), gb.NewLine)
If Error Then
  Print "Componente no Gambas\n"
  Continue
Endif
C'è anche da dire che alcuni componenti "no Gambas" hanno al loro interno una parte scritta in gambas e si potrebbe tener conto anche di quella che è sempre in .list ma all'interno della cartella src del componente nominata con il nome del componente stesso

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.597
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:E' possibile via codice conoscere le Classi possedute da un Componente ?
« Risposta #10 il: 09 Luglio 2024, 16:39:09 »
Si può ottenere una gran massa di simboli, anche penetrando in alcune Strutture costitutive dei sorgenti di Gambas:
Solo per mera curiosità accademica, modificando opportunamente il mio primo codice, è possibile ottenere, sebbene in modo apparentemente confuso: i simboli inseriti nel codice, nonché le Classi e le loro specifiche risorse appartenenti al Componente impostato.
Codice: [Seleziona]
Public Sub Main()
 
  Dim cp As Component
  Dim p1, p2, p3 As Pointer
  Dim s As String
  Dim c As Class
  Dim b As Byte
 
  cp = Component.Load("gb.sdl2.audio")     ' Il Componente Gambas in questo esempio prescelto per la ricerca delle sua risorse
 
  p1 = Object.Address(cp)
' Accede alla Struttura "_CLASS" dichiarata nel file header "gbx_class.h":
  p2 = Pointer@(p1)
' Dichiara che l'identificatore "cp" si riferisce a un "Componente":
  Print String@(Pointer@(p2 + (SizeOf(gb.Pointer) * 3)))

' Accede alla Struttura "CLASS_DESC_SYMBOL",dichiarata nel file header "gbx_class_desc.h" e puntata dal membro "*table" della Struttura "_CLASS":
  p3 = Pointer@(p2 + (SizeOf(gb.Pointer) * 5))

  For i As Integer = 0 To 50000000
' Legge all'interno della Struttura "CLASS_DESC_SYMBOL":
    s = String@(Pointer@(p3 + i))
    If IsAlnum(s) Then
      Select Case b
        Case 0
          If s = "Main" Then
            b = 1
          Endif
        Case 1
          If s <> "Main" Then
            Print s
            b = 2
          Else
            b = 1
          Endif
        Case 2
          If s <> "Main" Then
            Print s
          Else
            b = 1
          Endif
      End Select
    Endif
  Next
 
  Finally
 
  End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »