[PASCAL] Html tabel webschrijven in .txt

Pagina: 1
Acties:

  • MrDirk
  • Registratie: Januari 2002
  • Laatst online: 04-07-2023
Goedemiddag,

Ik ben bezig een simpel pascal programmatje om een html file te maken.
Ik doe dit in Turbo Pascal. Jaja, ouderwets, maar een mooie taal om mee te beginnen.

Ik ben nu bij het gedeelte dat de gebruiker een tabel kan invoegen op zijn website.
Hierbij moet hij het aantal kolommen en rijen zelf kunnen specificeren.
Het aantal kolommen is niet zo`n probleem. Doormiddel van een while do lusje wordt het aantal kolommen in de textfile geprint.

Het probleem is nu: Als de gebruiker het aantal RIJEN opgeeft dan moet Pascal de html code voor een rij tussen de <tr></tr> plaatsen! Alleen pascal schrijft alles sequetieel weg, het komt er dus gewoon onder te staan!

Weet iemand hoe ik dit op kan lossen?


De code tot en met het invoegen van een tabel met 1 kolom is wel gelukt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
     {Hier komt de code om tabellen in te voegen}
    writeln('Wilt u tabel plaatsen? (J/N): ');
        readln(Antw2);
                        If Antw2 = 'j'
                        Then
            writeln(WebF, '<table border="1">');
            write('Geef aantal kolommen: ');
                        readln(K);
            I := 0;
                while I < K do
                begin
        writeln (WebF, '<tr><td>',I+1,'</td></tr>');
        I := I + 1;
                end;
                        write('Geef aantal rijen: ');
                        readln(R)
                        I := 0;
                while I < R do
                begin
                writeln (WebF, ?

[ Voor 9% gewijzigd door MrDirk op 28-11-2004 13:24 ]

"We do not first see, then define, we define first and then see" (Lippmann)


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je zal toch een meer hierarchische structuur in je code moeten aanbrengen zodat het beter op html past. Een soort stack? Misschien zelfs een classe structuur?

We adore chaos because we like to restore order - M.C. Escher


  • MrDirk
  • Registratie: Januari 2002
  • Laatst online: 04-07-2023
Ik wilde het eigenlijk heel simel, houden. Of denk je dat dat niet gaat lukken?

"We do not first see, then define, we define first and then see" (Lippmann)


Verwijderd

Probeer eens iets meer als dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
<vraag om rijen en kolommen>
if rijen<1 then rijen=1;
if kolommen<1 then kolommen=1;
write '<table'>;
for kolomlus=1 to kolommen do
  begin
    write '<tr>'
    for rijlus=1 to rijen do
      write '<td></td>';
    write '</tr>'
  end;
write '</table>';

[ Voor 22% gewijzigd door Verwijderd op 28-11-2004 14:15 ]


  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 22:22
MrDirk schreef op zondag 28 november 2004 @ 14:10:
Ik wilde het eigenlijk heel simel, houden. Of denk je dat dat niet gaat lukken?
Simpel houden is een goed streven, maar wat jij nu probeert, is wel heel erg simpel.

je probeert HTML code sequentiëel te schrijven in de verkeerde volgorde.

Als je toch op deze voet verder wil, kun je beter eerst beide getallen opvragen en daarna met een geneste for je tabelletje bouwen.

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


  • MrDirk
  • Registratie: Januari 2002
  • Laatst online: 04-07-2023
Ik zat te denken. Is er niet een manier om de lines in een .txt te indexeren ofzo? Dan kan ik die <td></td> er later toch nog tussen zetten.

"We do not first see, then define, we define first and then see" (Lippmann)


Verwijderd

MrDirk schreef op zondag 28 november 2004 @ 14:22:
Ik zat te denken. Is er niet een manier om de lines in een .txt te indexeren ofzo? Dan kan ik die <td></td> er later toch nog tussen zetten.
Waarom zou je? Wat is er mis met de methode die ik voorstel?

Waarom enorm ingewikkeld gaan doen, terwijl het ook eenvoudig kan?

  • MrDirk
  • Registratie: Januari 2002
  • Laatst online: 04-07-2023
ow sorry! ik heb over je post heen gekeken!
je hebt gelijk, ik ga dat proberen.

"We do not first see, then define, we define first and then see" (Lippmann)


  • MrDirk
  • Registratie: Januari 2002
  • Laatst online: 04-07-2023
De oplossing van De Generaal was inderdaad de juiste, bedankt! :)
Wat ik nog niet bij mijn vorige vraag had gezet is dat er in die tabel ook de gegevens van de cel moeten komen. Deze gegevens zijn het Rij- en kolomnummer.
Nu lukt het RIJ nummer wel, maar het KOLOM nummer niet.


Dit is de code die ik nu heb:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
     {Hier komt de code om tabellen in te voegen}
    writeln('Wilt u tabel plaatsen? (J/N): ');
        readln(Antw2);
                        If Antw2 = 'j'
                        Then write('Geef aantal kolommen: ');
            readln(k);
            write('Geef aantal rijen: ');
            readln(R);
            I := 1;
            S := 1;
            if  R<1 then R:=1;
            if  K<1 then K:=1;
            writeln(WebF, '<table>');
            for kolomlus :=1 to K do
                begin
                writeln(WebF, '<tr>');
                S := S + 1;
                        for rijlus :=1 to R do
                        writeln(WebF, '<td>',I,S,'<td>');
                    writeln(WebF, '</tr>');
                    I := I + 1;
                end;

            writeln(WebF, '</table>');


De code levert het onderstaande resultaat:
Afbeeldingslocatie: http://diweb.nl/voorbeeld.jpg

"We do not first see, then define, we define first and then see" (Lippmann)


Verwijderd

MrDirk schreef op zondag 28 november 2004 @ 16:12:
Dit is de code die ik nu heb:

De code levert het onderstaande resultaat:
[afbeelding]
Je gebruikt de verkeerde variabelen, waarom gebruik je niet gewoon de for-variabelen?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  writeln('Wilt u tabel plaatsen? (J/N): ');
  readln(Antw2);
  If Antw2 = 'j' then 
    begin
      write('Geef aantal kolommen: ');
      readln(k);
      write('Geef aantal rijen: ');
      readln(R);
      if  R<1 then R:=1;
      if  K<1 then K:=1;
      writeln(WebF, '<table>');
      for kolomlus :=1 to K do
        begin
          writeln(WebF, '<tr>');
          for rijlus :=1 to R do
            writeln(WebF, '<td> Kolom:', kolomlus,', rij:',rijlus,'<td>');
          writeln(WebF, '</tr>');
        end;
      writeln(WebF, '</table>');
  end;


Let ook op de identatie van mijn code (inspringen etc). De code is zo een stuk leesbaarder.

Let ook op welke scope een bepaalde functie heeft. Als je bv. schrijft:

code:
1
2
3
If <iets> then
  <doiets>;
<doeietsanders>


Dan zal indien de conditie <iets> naar waar evalueerd, de regel <doiets> uitgevoerd worden. De regel <doeietsanders> wordt altijd uitgevoerd!

Om te laten zien hoe het met jouw oplossing had gemoeten:
code:
1
2
3
4
5
6
7
8
9
10
11
  for kolomlus :=1 to K do
    begin
      writeln(WebF, '<tr>');
      S := S + 1;
      for rijlus :=1 to R do
         begin
           writeln(WebF, '<td>',I,S,'<td>');
           I := I + 1;
         end;
      writeln(WebF, '</tr>');
    end;

[ Voor 23% gewijzigd door Verwijderd op 28-11-2004 16:22 ]


  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 22:22
Waarom niet ipv.
code:
1
writeln(WebF, '<td>',I,S,'<td>');


de
code:
1
writeln(WebF, '<td>',kolomlus, rijlus,'<td>');

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


  • MrDirk
  • Registratie: Januari 2002
  • Laatst online: 04-07-2023
@ De Generaal: Bedankt voor je tips. Ben pas sinds kort met pascal bezig. Moet inderdaad mijn overzicht behouden. Ook deze oplossing werkt :)

Laatste vraagje, beetje uit gemakzucht omdat jij het allemaal zo uit je hand schudt en ik er uren mee bezig kan zijn.

Als ik die hele code tussen een repeat until plaats (voor meerdere tabellen).
Dan krijg ik een foutmelding:
code:
1
2
3
4
5
6
repeat
        begin
                ...
                ...
         end;
until (Antw2 = 'N');

[ Voor 56% gewijzigd door MrDirk op 28-11-2004 16:43 ]

"We do not first see, then define, we define first and then see" (Lippmann)


Verwijderd

Bij een repeat until hoef je geen begin..end te gebruiken.

Dus:

code:
1
2
3
Repeat 
  <je code>
Until <voorwaarde>

[ Voor 11% gewijzigd door Verwijderd op 28-11-2004 16:47 ]


  • MrDirk
  • Registratie: Januari 2002
  • Laatst online: 04-07-2023
Dan nog werkt hij niet. Als ik dan 'N' invoer gebeurt er gewoon niks.

"We do not first see, then define, we define first and then see" (Lippmann)


Verwijderd

MrDirk schreef op zondag 28 november 2004 @ 16:48:
Dan nog werkt hij niet. Als ik dan 'N' invoer gebeurt er gewoon niks.
Hmm.. wat is de hele code?

  • MrDirk
  • Registratie: Januari 2002
  • Laatst online: 04-07-2023
De code vanaf het tabellen gedeelte, tot aan het einde van het programma.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        {Hier komt de code om tabellen in te voegen}
        repeat
    writeln('Wilt u tabel plaatsen? (J/N): ');
        readln(Antw2);
                        If Antw2 = 'j'
                        Then write('Geef aantal kolommen: ');
            readln(k);
            write('Geef aantal rijen: ');
            readln(R);
            if  R<1 then R:=1;
            if  K<1 then K:=1;
            writeln(WebF, '<table>');
            for kolomlus :=1 to K do
                begin
                writeln(WebF, '<tr>');
                        for rijlus :=1 to R do
                        writeln(WebF, '<td> Kolom: ', Rijlus, '  Rij: ', kolomlus,'<td>');
                    writeln(WebF, '</tr>');
                end;

            writeln(WebF, '</table>');
        until (Antw2 ='n');
        readln;
    close (WebF);
end.

"We do not first see, then define, we define first and then see" (Lippmann)


Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        {Hier komt de code om tabellen in te voegen}
  repeat
    writeln('Wilt u tabel plaatsen? (J/N): ');
    readln(Antw2);
    If Antw2 = 'j' then 
      begin
        write('Geef aantal kolommen: ');
        readln(k);
        write('Geef aantal rijen: ');
        readln(R);
        if  R<1 then R:=1;
        if  K<1 then K:=1;
        writeln(WebF, '<table>');
        for kolomlus :=1 to K do
          begin
            writeln(WebF, '<tr>');
            for rijlus :=1 to R do
              writeln(WebF, '<td> Kolom: ', Rijlus, '  Rij: ', kolomlus,'<td>');
            writeln(WebF, '</tr>');
          end;
        writeln(WebF, '</table>');
      end;
  until (Antw2 ='n');
  readln;
  close (WebF);


bovenstaande code zou imo gewoon moeten werken. Welke foutmelding krijg je?

Let overigens op het verschil tussen 'n' en 'N', en 'j' en 'J'.

Wat ik probeerde uit te leggen, jij schrijft dit:

code:
1
2
        If Antw2 = 'j' then write('Geef aantal kolommen: ');
        readln(k);


Wat hier gebeurd is dat als er 'j' geantwoord is, drukt hij de tekst 'geef kolommen af'. De readln(k) wordt ALTIJD uitgevoerd, ongeacht wat er ingevuld wordt. Let daarmee op, alle code die je na een if wilt uitvoeren dien je tussen een begin..end block te zetten, indien het meer dan 1 regel is. Zet een then overigens op dezelfde regel als de IF.

[ Voor 54% gewijzigd door Verwijderd op 28-11-2004 17:29 ]


  • MrDirk
  • Registratie: Januari 2002
  • Laatst online: 04-07-2023
nou ik krijg geen foutmelding. Zolang ik J in toets op de vraag of ik een tabel wil invoegen gaat het goed, ik krijg ook netjes weer een nieuwe tabel. Maar als ik dan 'n' invoer, gebeurt er niets, hij springt gewoon naar de volgende regel met een knipperende cursor....

en als ik dan op enter druk, verspringt de knipperende cursor naar een onderstaande regel.

Afbeeldingslocatie: http://diweb.nl/voorbeeld2.jpg

[ Voor 25% gewijzigd door MrDirk op 28-11-2004 17:32 ]

"We do not first see, then define, we define first and then see" (Lippmann)


Verwijderd

Dat kom door wat ik beschreef met die if conditie. Wat je ziet is dat de readl(k) inderdaad gewoon uitgevoerd wordt, evenals de rest van de code. Je dient het hele blok wat je uitgevoerd wilt zien als er 'j' geantwoord wordt, tussen 'begin .. end' te zetten, zoals ik in mijn code hier ook gedaan had ;)
Wat ik probeerde uit te leggen, jij schrijft dit:

code:
1
2
        If Antw2 = 'j' then write('Geef aantal kolommen: ');
        readln(k);


Wat hier gebeurd is dat als er 'j' geantwoord is, drukt hij de tekst 'geef kolommen af'. De readln(k) wordt ALTIJD uitgevoerd, ongeacht wat er ingevuld wordt. Let daarmee op, alle code die je na een if wilt uitvoeren dien je tussen een begin..end block te zetten, indien het meer dan 1 regel is. Zet een then overigens op dezelfde regel als de IF.

[ Voor 48% gewijzigd door Verwijderd op 28-11-2004 17:36 ]


  • MrDirk
  • Registratie: Januari 2002
  • Laatst online: 04-07-2023
AH Inderdaad. Super bedankt voor je uitleg. De drank van gisteravond was nog niet uitgewerkt.
Het werkt nu helemaal!

"We do not first see, then define, we define first and then see" (Lippmann)


Verwijderd

Graag gedaan.. zoals je ziet, drank maakt meer bugs dan je lief is :)
Pagina: 1