dave@tygra.UUCP (David Conrad) (04/01/91)
Recently the question was asked, "How can a string be read from the user while in graphics mode, readln doesn't cut it?" I forget who asked this. Anyway, in a program I wrote about a week ago, I had to solve just this problem. I've cut the code out of my program, and deleted the application specific stuff. I generalized it a little by letting the client pass the prompt, but much more could be done. The maximum length, for example, should be passed to it, and it could save the current fill state. Also, it works only with a fixed font/size. Perhaps the best solution there would be to require the client to have the text style already set before calling this routine. The only place the length is referenced is in the Until clause of the Repeat statement. Anyway, here is a simple, first order approximation of a solution to the problem. This article, including the program it contains, is in the Public Domain. David Conrad dave%tygra@sharkey.cc.umich.edu {$A+,B-,D-,E-,F-,I+,L-,N-,O-,R-,S+,V-} {$M 16384,0,655360} program grreadstr; uses graph, crt; procedure grgetstr (var s : string; prompt : string); var ch : char; i, x : integer; begin setfillstyle (SolidFill, 0); settextstyle (TriplexFont, HorizDir, 2); settextjustify (lefttext, toptext); i := 0; s := ''; x := 20; outtextxy (x, 8, prompt); x := x + textwidth(prompt); repeat ch := readkey; if ch = #0 then if readkey = #0 then; if ch > #31 then begin s := s + ch; inc (i); outtextxy (x, 8, ch); x := x + textwidth(s[i]); end; if (ch = #8) and (i <> 0) then begin bar (x - textwidth(s[i]), 0, x, 48); x := x - textwidth(s[i]); delete (s, length(s), 1); dec (i); end; if ch = #27 then begin bar (0, 0, getmaxx, 48); outtextxy (20, 8, prompt); x := 20 + textwidth(prompt); i := 0; s := ''; end; until (ch = #13) or (i > 32); end; var grd, grm, grerr : integer; name : string; begin grd := Detect; initgraph (grd, grm, ''); grerr := graphresult; if grerr <> grOk then begin writeln ('Error: ',grapherrormsg(grerr),'.'); halt; end; grgetstr (name, 'Enter your name: '); closegraph; writeln ('name = ',name); end. -- = CAT-TALK Conferencing Network, Computer Conferencing and File Archive = - 1-313-343-0800, 300/1200/2400/9600 baud, 8/N/1. New users use 'new' - = as a login id. AVAILABLE VIA PC-PURSUIT!!! (City code "MIDET") = E-MAIL Address: dave%tygra@sharkey.cc.umich.edu