Προς το περιεχόμενο

Loop με Readkey σε Pascal


Cplusplas

Προτεινόμενες αναρτήσεις

Δημοσ.

για Τ-Pascal------

θέλω σε ένα πεδίο καταχώρησης μιας έγγραφης να καταχωρήσω π.χ. ένα όνομα και το πεδίο να έχει την δυνατότητα καταχώρησης μέχρι και π.χ. 10 χαρακτήρες, δηλ. από 10 χαρ. και πάνω ο κέρσορας να μην προχωρά.

Με ποιό τρόπο (loop φαντάζομαι ) μπορώ να το κάνω? Ενας φίλος μου είπε ότι εδώ έχει να κάνει ενας βροχος - loop (for) - με χρήση της Readkey αλλά όσο και να πεδευτηκα να τη βρω μάταιος ο κόπος. Μπορεί να μου δώσει κάποιος ένα παράδειγμα σε κώδικα?

Δημοσ.

Μιλάς για ένα πρόγραμμα Pascal που τρέχει σε κονσόλα ή σε γραφικό περιβάλλον δηλαδή; Θέλεις να περιμένει το πρόγραμμα για input μέχρι 10 χαρακτήρες και μετά να κάνει τι ακριβώς;

Δημοσ.
Μιλάς για ένα πρόγραμμα Pascal που τρέχει ή σε γραφικό περιβάλλον δηλαδή; Θέλεις να περιμένει το πρόγραμμα για input μέχρι 10 χαρακτήρες και μετά να κάνει τι ακριβώς;

 

oxi σε γραφικό περιβάλλον μα σε κονσόλα dos (έχω τον FPC για dos).

μετά την π.χ. καταχώρηση 10 χαρακτηρων θελω να πηγαίνει σε άλλη θέση ο κέρσορας (με gotoxy)

Δημοσ.

Απ' έξω χωρίς να το τσεκάρω:

>Uses Crt;
var
 s: string;
 i: integer;
begin
 s := '123456789'; {αρχικοποίηση σε 10 θέσεις}
 for i := 1 to 10 do 
 begin
   s[i] := ReadKey;
   write(s[i]); {γιατί με την Readkey δεν εμφανίζεται στην οθόνη}
 end;
 writeln;
 writeln('Έδωσες: ', s);
end.

Δημοσ.

Η λύση του Αλκη είναι σωστή, αλλά υποχρεώνει το φίλο μας να διαβάσει δέκα χαρακτήρες και όχι μέχρι δέκα.

Πάλι χωρίς compiler μπροστά μου, θα πρότεινα μια μικρή παραλλαγή:

>Uses Crt;
var
 s: string;
 i: integer;
 c: char;
begin
 s := ''; i:=0;
 repeat  
    c:=readkey;
    write(c);
    if c<>#13 then
       s:=s+c;
    i:=i+1;
 until (c=#13)or(i=10);
 writeln('Εδωσες    ',s);    
 writeln('Μήκος s= ',length(s));
end.

Εδώ το loop τερματίζει είτε δοθούν 10 χαρακτήρες (i=10), είτε πληκτρολογηθεί Enter (c=#13).

 

Ισως η μέθοδος αυτή δημιουργήσει πρόβλημα στο επόμενο πεδίο, καθώς το "Enter" του DOS δεν είναι ένας χαρακτήρας, αλλά δύο: Ο "Return" (ASCII-13) και ο Line Feed (ASCII-10).

Αυτός ο χαρακτήρας με κωδικό 10 που περισσεύει, αν θυμάμαι καλά θα επιστραφεί από την αμέσως επόμενη εκτέλεση readkey και θα καταλάβει τη θέση [1] στο επόμενο πεδίο. Αν το πρόβλημα υπάρχει (στην Borland υπήρχε σίγουρα, δεν θυμάμαι πώς το αντιμετωπίζει ο FPC), δοκίμασε αμέσως μετά μια κλήση flush(stdin)

Δημοσ.

ευχαριστώ παιδιά για τη βοήθεια αλλά γεροντα όντως πατώντας διπλό enter αλλάζει γραμμή.

Γενικώς θα ήθελα εναν πιο ευέλικτο χειρισμό του κέρσορα σε πεδίο καταχώρησης όπως στα περισσότερα προγράμματα διαχείρησης δεδομένων σε dos (πχ open sales της Singular αν έχετε υποψην). Δηλ.

*να σταματά ο κέρσορας σε συγκεκριμένη θέση του πεδίου καταχώρησης

*πατώντας enter να αλλάζει αυτόματα θέση(πχ σε άλλο πεδίο καταχώρησης)

*με backspace να διαγράφει χαρακτήρες στο συγκεκριμένο πεδίο

και γενικώς να διατρέχει ευέληκτα τις όποιες εγγραφές.

ζητάω πολλά μου φαίνεται, έτσι?

Δημοσ.

Κοίτα, μπορείς να γράψεις καμιά 100στή γραμμές κώδικα και να κάνεις αυτά που λες (maskedits κτλ), αλλά αν έχεις σκοπό να κάνεις full εφαρμογή με πολλά πεδία κτλ γιατί δεν πας σε Turbo Vision; Είναι ένα πακέτο παραθύρων, πεδίων, κουμπιών, με διαχείριση ποντικιού κτλ ενσωματωμένο στην Turbo Pascal 7...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...