Newsgroup: it.comp.lang.delphi
Titolo: Problema di logica nei loop

Salve a tutti!
Vi espongo subito il mio problema. :)
In una applicazione devo ricavare degli articoli di legge da un sito 
internet. Questi articoli sono strutturati in questa maniera:
- ogni articolo ha un numero (es. Art.1, Art.2, ecc.)
- ogni articolo può avere un subarticolo (es. Art.4-bis, Art.4-ter, ecc.)
- ogni articolo può avere diverse versioni (es. Art.1 vers.1 in vigore 
dal-al, Art.1 vers.2 correntemente in vigore)
Le pagine degli articoli vengono caricate passando dei valori GET alla 
pagina 
(
http://www.sito.com/articoli?art=#ATICOLO#&subart=#SUBARTICOLO#&vers=#VERSIONE#
) 
dove #ARTICOLO#, #SUBARTICOLO# e #VERSIONE# partono da 1.
La funzione che controlla il contenuto della pagina ritorna il testo 
dell'articolo richiesto, se presente; in caso contrario ritorna una stringa 
vuota.
Dov'è il problema? Si tratta di un problema di impostazione logica... non 
riesco a trovare una via funzionale per scorrere tutti gli articoli, 
subarticoli e versioni presenti nel database online. Io conosco a priori il 
numero totale di articoli, ma non so se un determinato articolo ha anche uno 
o più subarticoli e/o una o più versioni.
Non mi sono mai trovato davanti un simile problema e, onestamente, non 
riesco a cavare un ragno dal buco. Mi sarebbe di immenso aiuto qualche 
dritta da chi si è trovato ad affrontare problematiche simili o del 
(pseudo)codice
Grazie in anticipo
F. 

 F.
Scusa... ma se conosci  [dove #ARTICOLO#, #SUBARTICOLO# e #VERSIONE#
partono da 1. ]
il gioco è fatto da solo. Ho letto diverse volte il tuo post... e devo
dire che non capisco il problema, visto che mi pare tu abbia la
soluzione in mano.
PS. Delphi da quanto lo "macini" ??
Ciao

 Ciao
Cao, grazie ;) 

vuota.
mi sembra la classica domanda così facile... c'è tutto quel che ti serve 
che nasconde un tranello!
ARTICOLO-SUBARTICOLO-VERSIONE come ti vengono caricati?
Chiedi una norma, ti viene fornito il numero degli articoli, un intero 
che potrebbe non corrispondere al numero reale degli articoli, 
essendocene dei sub;
L'unica cosa che conosci è il numero degli articoli.
Chiedi un articolo.
La GET ti ritorna la pagina ARTICOLO richiesto.
Nella pagina ci possono essere o meno SUBARTICOLI (ritengo).
Chiedi un ARTICOLO oppure un SUBARTICOLO e ti viene fornito l'elenco 
delle VERSIONI.
Chiedi la VERSIONE e ti viene fornito il testo cercato.
Vediamo:
var I,W,NumArt: integer; Lista: TStringList; Testo: string;
io partirei da quel che so per certo, vale a dire il numero degli 
articoli, che ritraggo inizialmente ed inserisco nella variabile NumArt;
poi:
for I := 1 to NumArt do begin
  Testo := ...; //richiedo ed ottengo la stringa art. I
  if Testo <> '' then begin
     Lista.Add(IntToStr(I)+' - '+Testo);
     // il database avrà un metodo per codificare i numeri intermedi 
     // di articolo (bis, ter,), per cui
     repeat
       // stesso percorso: ricevo la stringa,
       // ricavo l'articolo
       // inserisco in "Lista"
     until ... // la stringa di ritorno ha un numero di articolo
               // maggiore di I     
  end;
end;
al termine avrò una lista i cui elementi saranno articolo e (credo) 
titolo dell'articolo.
Avrei bisogno di rivedere l'algoritmo, ma ora devo andare, dacci 
un'occhiata e rispondi
NioBi
--- posted by geoForum on 
http://www.delphiedintorni.it

Mentre andavo via, mi sono accorto che la routine fa acqua. 
La rivedo:
procedure...
var I,W,NumArt: integer; Lista: TStringList; Testo: string;
begin
for I := 1 to NumArt do begin
  Testo := ...; //richiedo ed ottengo la stringa art. I
  if Testo <> '' then begin
     Lista.Add(IntToStr(I)+' - '+Testo); // articolo
     // per le versioni puoi qui aggiungere una ulteriore ricerca
     // --
     // il database avrà un metodo per codificare i numeri intermedi 
     // di articolo (bis, ter,), per cui
  end;
  W := 0;
  while W <= I do begin   // serve per restare all'interno del ciclo
    // chiedo l'articolo successivo
    Testo := ...; //richiedo ed ottengo la stringa art. succ.   
    if Testo = '' then Break; // pagina vuota
    W := StrToInt(Copy(Testo,1,...));
    if W > I then Break;  // articolo successivo
    Lista.Add(IntToStr(W)+' - '+Testo); // sub-articolo
    // per le versioni puoi qui aggiungere una ulteriore ricerca
  end;
end;
ovviamente tutto quanto non tiene conto del formato della stringa di 
ritorno dalla GET e dell'organizzazione del database, ma ritengo sia un 
inizio.
Non che abbia più tempo, ora, ma devo scappare nuovamente.
