* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 24, 2024, 02:15:09 am

Inserisci il nome utente, la password e la durata della sessione.

53 Visitatori, 0 Utenti

Autore Topic: Creazione di output html con lazarus  (Letto 9710 volte)

00261

  • Newbie
  • *
  • Post: 10
  • Karma: +0/-0
Creazione di output html con lazarus
« il: Ottobre 25, 2019, 11:55:02 am »
Dopo essermi presentato nell’apposita sezione ed appena arrivato, sia sul forum che nel mondo Lazarus, vorrei porre la mia prima domanda: ovviamente ho cercato in giro ma non sono stato in grado di trovare risposta, quindi chiedo qui…

La domanda è questa.

Avendo un file estratto da un DB così costituito,

Codice: [Seleziona]
,,,,
Disney
,Pippo
,,Pluto
,,Paperino
,,,Paperina
,,,,Minnie
,,,Paperone
,,,Paperoga
,,Gambadilegno
,Topolino
,,Basettoni
,,Clarabella
,,Paperinik
,,,Orazio

vorrei ottenere un output come quello nella Jpg allegata ottenuto da un codice html come questo:

Codice: [Seleziona]
 
<div class="tf-tree">
  <ul>
    <li>
      <span class="tf-nc">Disney</span>
      <ul>
        <li><span class="tf-nc">Pippo</span>           
          <ul>
            <li><span class="tf-nc">Pluto</span></li>
            <li><span class="tf-nc">Paperino</span>
              <ul>
                <li><span class="tf-nc">Paperina</span>
                  <ul>
                   <li><span class="tf-nc">Minnie</span></li>
                  </ul>
                <li><span class="tf-nc">Paperone</span>
                <li><span class="tf-nc">Paperoga</span>
                </li>
              </ul>
               </li>
            </li>
            <li><span class="tf-nc">Gambadilegno</span></li>
          </ul>
        </li>
        <li><span class="tf-nc">Topolino</span>
          <ul>
            <li><span class="tf-nc">Basettoni</span></li>
            <li><span class="tf-nc">Clarabella</span>
            <li><span class="tf-nc">Paperinik</span>           
             <ul>
              <li><span class="tf-nc">Orazio</span></li>
             </ul>
            </li>
          </ul>       
        </li>
      </ul>
    </li>
  </ul>
</div>

Ora, farlo a mano è piuttosto semplice per me, ma essendo a zero di Lazarus, vorrei che fosse lui, facendo il parsing del file di esempio (quello estratto dal DB), a crearmi la struttura del <ul> <li>, per automatizzare la creazione di viste (talvolta con centinaia di elementi).

Grazie a chi vorrà aiutarmi

 


xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3276
  • Karma: +12/-0
Re:Creazione di output html con lazarus
« Risposta #1 il: Ottobre 25, 2019, 12:03:30 pm »
Concettualmente dai tuoi dati sembrerebbe che mancano delle informazioni per fare quello che vuoi tu. Ad esempio ad ogni voce dovrebbe essere corrisposta un id che identifica la voce, e anche un id padre che identifica qual'è l'id del nodo superiore. Altrimenti è impossibile fare quello che chiedi
Ieri è passato, domani è futuro, oggi è un dono...

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:Creazione di output html con lazarus
« Risposta #2 il: Ottobre 25, 2019, 12:42:37 pm »
partirei dal DOM, anzi da THTMLDocument (che eredita da TDOMLDocument), se non ricordo male è nella unit dom_html del package fcl-xml.

Chiaramente il parser della tua struttura dati lo dovrai fare tu, ma credo che questo possa essere un buon approccio.
Imagination is more important than knowledge (A.Einstein)

00261

  • Newbie
  • *
  • Post: 10
  • Karma: +0/-0
Re:Creazione di output html con lazarus
« Risposta #3 il: Ottobre 25, 2019, 12:46:52 pm »
Concettualmente dai tuoi dati sembrerebbe che mancano delle informazioni per fare quello che vuoi tu. Ad esempio ad ogni voce dovrebbe essere corrisposta un id che identifica la voce, e anche un id padre che identifica qual'è l'id del nodo superiore. Altrimenti è impossibile fare quello che chiedi
Vedo con piacere che la mente del programmatore è diversa da quella del sistemista  ;D
Si, potresti avere ragione, ma dal file del db ho estratto solo il minimo indispensabile, e credimi, quello che chiedi è presente in quel file di esempio:

Disney è il nodo di livello 0 ed è il padre di tutti i nodi di livello 1 (zero virgole = livello zero, una virgola = livello 1)
quindi Pippo e Topolino sono i figli di Disney,

Pippo è il padre di Paperino che lo è di paperina che lo è di minnie.

Vedi, la semplicità della rappresentazione di noi vecchi  ;)

00261

  • Newbie
  • *
  • Post: 10
  • Karma: +0/-0
Re:Creazione di output html con lazarus
« Risposta #4 il: Ottobre 25, 2019, 12:50:38 pm »
partirei dal DOM, anzi da THTMLDocument (che eredita da TDOMLDocument), se non ricordo male è nella unit dom_html del package fcl-xml.

Chiaramente il parser della tua struttura dati lo dovrai fare tu, ma credo che questo possa essere un buon approccio.

Non ho la minima idea di cosa tu mi abbia detto di fare!  ;D ;D ;D

Io pensavo di scrivere in un file ti testo le stringhe html per ricreare la pagina e poi eseguirla con il browser di default. Non voglio certo visualizzarla con Lazarus
L'applicazione dovrebbe solo automatizzare il parsing del file, ma è proprio quello che non so fare...  :o

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Creazione di output html con lazarus
« Risposta #5 il: Ottobre 25, 2019, 01:13:15 pm »
Ciao

Per iniziare, così in modo semplice potresti:
Usare una TStringList per leggere il file.
Tramite "Lines" puoi ottenere ogni singola riga.
Conti le "," prima del test che ti interessa (la banda disney nel tuo esempio).
Inizierei da lì insomma.

Stilgar


Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:Creazione di output html con lazarus
« Risposta #6 il: Ottobre 25, 2019, 01:15:53 pm »
ok, diciamo che devi fare 2 procedure
1) lettura file
2) generazione html

la mi risposta era relativa al problema (2)
vedo però che hai in mente di generare le stringhe html in un file, penso vada bene ugualmente ma dopo ti proporrei di rifarlo col THTMLDocument così che puoi vedere la differenza ;)

problema (1): L'applicazione dovrebbe solo automatizzare il parsing del file
se vogliamo rimanere ad un livello fai-da-te potrei dirti di usare una TStringList: carichi tutto il file e poi ti passi riga riga e ti generi l'HTML
esempio:
Codice: [Seleziona]
procedure ....
var sl: TStringList;
begin
  sl:=TStringList.Create;
  try
    sl.LoadFromFile(...);

   // loop per scansione righe e generazione HTML

  finally
    sl.Free;
  end;
end;



Edit:
stilgar mi hai fregato di un soffio ;)
Imagination is more important than knowledge (A.Einstein)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Creazione di output html con lazarus
« Risposta #7 il: Ottobre 25, 2019, 01:20:58 pm »
Il famoso filo di lana :)
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

00261

  • Newbie
  • *
  • Post: 10
  • Karma: +0/-0
Re:Creazione di output html con lazarus
« Risposta #8 il: Ottobre 25, 2019, 01:26:27 pm »
ahahah! Vedo che c'è competizione! :-)
Grazie!
Intanto mi leggo un pò di esempi sul'uso delle tstringlist e poi su come implementare i loop.

Buona fortuna a me! 

00261

  • Newbie
  • *
  • Post: 10
  • Karma: +0/-0
Re:Creazione di output html con lazarus
« Risposta #9 il: Ottobre 25, 2019, 10:57:48 pm »
Eccomi ancora…
È successo quanto segue:

    • Sono riuscito ad “infilare” il file nella tstringlist (piuttosto facile)
    • Poi con il for do ho fatto il loop che mi percorre tutte le stringhe.
    • Ho fatto una funzione che mi conta le virgole e mi restituisce il “livello”
    • Ho imparato come scrivere in un file.
    • Quello che non riesco a fare è capire come montare la struttura corretta, usando i dati che sto “parsando”, per ottenere il giusto output.

 :'( :'( :'(

Va bene dai, fino a martedi scorso non sapevo neppure che faccia avesse Lazarus, se continuo così tra qualche giorno smetterò di dargli del Voi e passerò al Lei! :-)

In ogni caso un aiutino non sarebbe male!

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Creazione di output html con lazarus
« Risposta #10 il: Ottobre 26, 2019, 08:28:22 am »
Se per iniziare le idee sono più o meno le stesse, per l'organizzazione del resto è un pochino il far West.

Di base un documento html è un insieme di nodi.  Ogni nodo può avere uno o più sotto nodi.
Ora dipende da quanto vuoi sbatterti.

Esistono delle classi pronte in freepascal per manipolare il dom. Il supporto non è completo, quindi se hai esperienza con altri linguaggi potresti trovare delle carenze. Le cose importanti ci sono però.
Concettualmente potresti usare quelle per creare in memoria il documento html e poi usarle per salvarlo su disco.

Un altro modo, vecchio e più impegnativo, è tradurre direttamente in html il testo che stai intercettando in lettura.

Per iniziare ti consiglierei di usare le classi pronte.

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:Creazione di output html con lazarus
« Risposta #11 il: Ottobre 26, 2019, 08:46:54 am »
se ci mostri il codice che hai buttato giù possiamo darti una mano
anche la funzione che conta le virgole e restituisce il livello è importante

il DOM è il modo migliore ma penso che l'HTML si potrebbe fare anche scrivendo "a mano" (alla fine si tratta di generare un brano di HTML e non una pagina completa)
Imagination is more important than knowledge (A.Einstein)

00261

  • Newbie
  • *
  • Post: 10
  • Karma: +0/-0
Re:Creazione di output html con lazarus
« Risposta #12 il: Ottobre 27, 2019, 01:38:03 am »
La funzione per contare le virgole è la seguente:

Codice: [Seleziona]
Function ContaVirgole(T:String):Integer;
Var
  MyParse: TStringList;
  Conta,I:integer;
begin
   MyParse:=TStringList.Create;
   MyParse.StrictDelimiter:=True;
   MyParse.Delimiter := ',';
   MyParse.DelimitedText:=T;

   Conta:=0;
   For I:=0 to MyParse.Count -1 do
     begin
        If Trim(MyParse[I])='' then
         Begin
           Inc(Conta);
         end
        else
         Begin
           Result:=Conta;
           Break;
         end;
     end;

end; 
   

Per fare lo split ed eliminare la parte di stringa che non mi serve e le virgole è questa:

Codice: [Seleziona]
Function Splittamelo(T:String):string;
var
MyParse: TStringList;
begin
MyParse:=TStringList.Create;
MyParse.StrictDelimiter:=True;
MyParse.Delimiter := ':';
MyParse.DelimitedText:=T;
Result:= StringReplace(MyParse[0],',','', [RfReplaceall]);
MyParse.Free;
end; 

Sto lavorando al parsing del file ma sto facendo delle cialtronate senza precedenti... Impresentabili! :-(

Appena avrò qualcosa di cui possa non "vergognarmi" la posto! :-)

                 

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:Creazione di output html con lazarus
« Risposta #13 il: Ottobre 27, 2019, 10:27:05 am »
vedo che ti ci metti d'impegno ;) bene

noto che in Splittamelo hai fatto bene invocando MyParse.Free mentre in ContaVirgole te ne sei dimenticato

probabilmente ContaVirgole potrebbe restituire tutti e 2 i valori
Imagination is more important than knowledge (A.Einstein)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:Creazione di output html con lazarus
« Risposta #14 il: Ottobre 27, 2019, 11:19:40 am »
mi sono permesso di fare qualche esperimento

in particolare:
  • Test_ContaVirgole_e_Splittatamelo: conta le virgole e splitta con le 2 funzioni separate
  • Test_ContaSplitta: versione conta & splitta con una unica procedura (ContaSplitta)
  • Test_Scansione: ipotesi di come si potrebbe produrre l'HTML


Codice: [Seleziona]
program project_00261;

uses sysutils, Classes;

Function ContaVirgole(T:String):Integer;
Var
  MyParse: TStringList;
  Conta,I:integer;
begin
   MyParse:=TStringList.Create;
   MyParse.StrictDelimiter:=True;
   MyParse.Delimiter := ',';
   MyParse.DelimitedText:=T;

   Conta:=0;
   For I:=0 to MyParse.Count -1 do
     begin
        If Trim(MyParse[I])='' then
         Begin
           Inc(Conta);
         end
        else
         Begin
           Result:=Conta;
           Break;
         end;
     end;
   MyParse.Free;
end;

Function Splittamelo(T:String):string;
var
MyParse: TStringList;
begin
MyParse:=TStringList.Create;
MyParse.StrictDelimiter:=True;
MyParse.Delimiter := ':';
MyParse.DelimitedText:=T;
Result:= StringReplace(MyParse[0],',','', [RfReplaceall]);
MyParse.Free;
end;


Procedure ContaSplitta(T:String; out Virgole: integer; out TestoSplittato: string);
Var
  MyParse: TStringList;
  Conta,I:integer;
begin
   MyParse:=TStringList.Create;
   MyParse.StrictDelimiter:=True;
   MyParse.Delimiter := ',';
   MyParse.DelimitedText:=T;

   Conta:=0;
   For I:=0 to MyParse.Count -1 do
     begin
        If Trim(MyParse[I])='' then
         Begin
           Inc(Conta);
         end
        else
         Begin
           Virgole:=Conta;
           Break;
         end;
     end;

   // calcola testo splittato
   TestoSplittato:=copy(T, Conta + 1, Length(T) - Conta);

   MyParse.Free;
end;




  procedure Test_ContaSplitta(sl: TStringList);
  var I: integer;
      s: string;
      ResVirgole: integer;
      ResSplit: string;
   begin
     Writeln('Test_ContaSplitta');
     Writeln;
      for I := 0 to sl.Count - 1 do
       begin
          ContaSplitta(sl[I], ResVirgole, ResSplit);
          s := Format('Testo: %-20.20s - Livello: %2d - Split: %s',
                      [
                       sl[I],
                        ResVirgole,
                        ResSplit
                      ] );
          Writeln( s );
       end;
  end;

  procedure Test_ContaVirgole_e_Splittatamelo(sl: TStringList);
  var I: integer;
      s: string;

  begin
     Writeln('Test_ContaVirgole_e_Splittatamelo');
     Writeln;

     for I := 0 to sl.Count - 1 do
       begin
          s := Format('Testo: %-20.20s - Livello: %2d - Split: %s',
                      [
                        sl[I],
                        ContaVirgole(sl[I]),
                        Splittamelo(sl[I])
                      ] );
          Writeln( s );
       end;
  end;


  procedure Test_Scansione(sl: TStringList);
  const INIZIO_LIVELLO = 'inizio livello';
        FINE_LIVELLO = 'fine livello';
  var I, Livello, ResLivello: integer;
      s, ResSplittato: string;
  begin
     Livello:= -1;
     for I:=0 to sl.Count-1 do
       begin
          s:=sl[I];
          ContaSplitta(s, ResLivello, ResSplittato);

          // test nuovo livello
          if ResLivello > Livello then
           begin
             Livello:=ResLivello;
             WriteLn(StringOfChar(' ', Livello*2) + INIZIO_LIVELLO);
           end;

          // test fine livello
          if ResLivello < Livello then
           begin
             WriteLn(StringOfChar(' ', Livello*2) + FINE_LIVELLO);
             Livello:=ResLivello;
           end;

          // scrittura elemento
          WriteLn( StringOfChar(' ', Livello*2) + ResSplittato);


       end;

  end;


var Albero: TStringList;

begin
  Albero:=TStringList.Create;
  try
    // valorizza Albero a runtime
    Albero.Add('Disney');
    Albero.Add(',Pippo');
    Albero.Add(',,Pluto');
    Albero.Add(',,Paperino');
    Albero.Add(',,,Paperina');
    Albero.Add(',,,,Minnie');
    Albero.Add(',,,Paperone');
    Albero.Add(',,,Paperoga');
    Albero.Add(',,Gambadilegno');
    Albero.Add(',Topolino');
    Albero.Add(',,Basettoni');
    Albero.Add(',,Clarabella');
    Albero.Add(',,Paperinik');
    Albero.Add(',,,Orazio');


    Test_ContaVirgole_e_Splittatamelo(Albero);
    WriteLn;
    WriteLn;
    WriteLn;
    Test_ContaSplitta(Albero);

    WriteLn;
    WriteLn;
    WriteLn;
    Test_Scansione(Albero);

  finally
    Albero.Free;
  end;


end.
Imagination is more important than knowledge (A.Einstein)

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19180
  • Topic in totale: 2288
  • Online Today: 97
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 53
Total: 53

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.