Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Pascal - tryb graficzny i pobieranie zmiennych

25 Maj 2010 22:36 4833 12
  • Poziom 11  
    Witam!

    Jestem w trakcie pisania programu na zaliczenie roku z Turbo Pascala. Natknąłem się na problem, który nie mogę rozwiązać. Potrzebuje pobrać kilka zmiennych od użytkownika w trybie graficznym. Szukałem informacji na ten temat, ale niestety nic nie znalazłem, wszystko dotyczy trybu tekstowego. Wie ktoś z forumowiczów jak wydzielić kawałek ekranu w trybie graficznym aby w nim pobrać w trybie tekstowym zmienne?

    Korzystam z Free Pascala i modułu Graph.

    Pozdrawiam!
  • Moderator Programowanie
    Zmienne pobiera się dokładnie w ten sam sposób, co w trybie tekstowym.
  • Poziom 11  
    Próbowałem w ten sposób.
    Nie wiem jak wywołać przypisanie danych wpisanych w klawiaturę, nie dzieła enter.
    Można wydzielić miejsce na ekranie w trybie graficznym dla typowego trybu tekstowego?
  • Moderator Programowanie
    Nie da się tego zrobić. Po zmianie tryby, zmienia się cały ekran.
    Spróbuj takiego kodu :
    Code:
    uses Graph;
    
    Var
      ster,tryb:integer;
    a,b:char;
    Begin
    writeln('wybierz litere a');
    readln(a);
    writeln('wybierz litere b');
    readln(b);
    ster:=VGA;  tryb:=VGAHi;
    InitGraph(ster, tryb, 'C:\BP\BGI' );
    outtextxy(20,30,'a = '+a);
    outtextxy(20,60,'b = '+b);
    outtextxy(20,90,'Nacisnij ENTER');
    readln;
    CloseGraph;
    End.

    Pobiera on dane z klawiatury w trybie tekstowym, a następnie wchodzi w tryb graficzny i je wyświetla.
  • Poziom 18  
    Wszystko da się zrobić. Kwestia pomysłu. Kiedyś robiłem takie rzeczy z bajerami.. Napewno nie stosuj read i readln w trybie graficznym! bo efekt jest krótko mówiąc.. brzydki. Działa ale to nie eleganckie.

    Zrób jakiś guzik czy menu w którym po wybraniu elementu do którego chcesz pisać, następnie pętle w której po każdym naciśnięciu guzika będzie rysowana literka za pomocą outtext. Składaj stringa w jakimś buforze a potem przekonwertuj.

    Nie pamiętam już pascala ale to będzie chyba jakoś tak:

    Code:
    while (1)
    
    {
      key=readkey;
      if key=#27 then break; // ESC

     a=a+1;
     bufor[a]=key;
     outtextxy(x+a*10,y,key);

    }


    O to chodziło?

    Proszę pamiętać o używaniu znaczników code. - arnoldziq
  • Moderator Programowanie
    AVRowiec napisał:
    Wszystko da się zrobić. Kwestia pomysłu.
    Zazwyczaj się zgadzam z tym stwierdzeniem, ale chodziło mi, w tym przypadku, o to pytanie :
    lisiujaw napisał:
    Można wydzielić miejsce na ekranie w trybie graficznym dla typowego trybu tekstowego?
    Czego zrobić się zdecydowanie nie da.
  • Poziom 11  
    Cytat:
    Nie pamiętam już pascala ale to będzie chyba jakoś tak:

    Kod:
    Code:
    while (1)
    
    {
      key=readkey;
      if key=#27 then break; // ESC

     a=a+1;
     bufor[a]=key;
     outtextxy(x+a*10,y,key);

    }


    To nie Pascal.
  • Poziom 34  
    Istnieją 2 instrukcje, które się rzadko stosuje:
    restoreCRTmode;
    SetGraphMode(tryb); tryb wcześniej ustalony
    jednak gdy istnieje konieczność, można przechodzić między trybami.
  • Poziom 20  
    Znalazłem w swoim archiwum pisany kiedyś program w trybie graficznym Turbo Pascala (Borland). Program skompilowałem i działa. Oto moja propozycja wczytywania tekstu w trybie graficznym:
    Code:
    procedure czytaj(komentarz: string; var napis: string; wspx, wspy: integer;
    
                     max, skala :byte; znaki: zakres_znakow);

    var znak: char; i :byte; wstawianie: boolean; pamnapis: string;

    procedure kursor;
    begin
      setfillstyle(solidfill,black);
      bar(wspx-2,wspy-2,wspx+8*skala*(max+1)+2,wspy+10*skala);
      if wstawianie then
        rectangle(wspx+8*skala*(i-1),wspy+8*skala,wspx+8*skala*i,wspy+9*skala)
       else
        rectangle(wspx+8*skala*(i-1),wspy+8*skala,wspx+8*skala*i,wspy+10*skala);
      OutTextXY(wspx,wspy,napis);
    end;

    begin
      settextstyle(0,0,skala);
      pamnapis:=napis;
      wstawianie:=true;
      i:=length(napis)+1;
      if komentarz<>'' then komentarz:=komentarz+': ';
      OutTextXY(wspx,wspy,komentarz);
      wspx:=wspx+8*skala*length(komentarz);
      kursor;
      repeat
       repeat
        setcolor(black);
        if wstawianie then
        rectangle(wspx+8*skala*(i-1),wspy+8*skala,wspx+8*skala*i,wspy+9*skala)
       else
        rectangle(wspx+8*skala*(i-1),wspy+8*skala,wspx+8*skala*i,wspy+10*skala);
        if not keypressed then delay(150);
        setcolor(white);
        if wstawianie then
        rectangle(wspx+8*skala*(i-1),wspy+8*skala,wspx+8*skala*i,wspy+9*skala)
       else
        rectangle(wspx+8*skala*(i-1),wspy+8*skala,wspx+8*skala*i,wspy+10*skala);
        if not keypressed then delay(150);
       until keypressed;
       znak:=ReadKey;
       if (znak in znaki) and (length(napis)<max) then
         begin
           if wstawianie then insert(znak,napis,i)
              else
                if i<=length(napis) then napis[i]:=znak
                                    else napis:=napis+znak;
           i:=i+1; kursor;
         end;
       case znak of
       #27: begin
              napis:=pamnapis;
              kursor;
              exit;
            end;
       #8: begin {backspace}
            if i>1 then
              begin
                i:=i-1;
                delete(napis,i,1);
              end;
           end;
       #0: begin
             znak:= ReadKey;
             case znak of
               #75: begin if i>1 then i:=i-1; kursor end; {left}
               #77: begin if i<=length(napis) then i:=i+1; kursor end; {right}
               #71: begin i:=1; kursor end; {home}
               #79: begin i:=length(napis)+1; kursor end; {end}
               #82: begin wstawianie:=Not wstawianie; kursor end; {insert}
               #83: begin delete(napis,i,1); kursor end; {delete}
             end;
           end;
       end;
       kursor;
      until znak=#13;
      OutTextXY(wspx,wspy,napis);
      end;

    Przeanalizuj i wykorzystaj. W razie potrzeby pytaj...
  • Poziom 18  
    Z tego co pamiętam to włączenie readln w trybie graficznym powodowało nałożenie się trybu tekstowego na graficzny. Tak jakby tekst był pod spodem i tylko wyłaził tam gdzie użyjesz gotoxy. Dało się z tego korzystać ale trzeba było pilnować wszystkich pikseli żeby do siebie pasowały - dlatego lepiej napisać własną funkcje..
    Bardzo możliwe że to o czym mówię nie działa na każdym komputerze i nie pod każdym kompilatorem, ja pracowałem na bardzo starej maszynie w Turbo Pascalu (nie wiem której wersji).
  • Poziom 34  
    wrych: a co robi procedura czytaj(...) ?
    Autor pytania nie odzywa się i dokładnie nie wiadomo o co mu chodzi. W zdecydowanej większości przypadków nie ma potrzeby przechodzenia między trybami. Kiedyś napisałem program który rzeczywiście zmienia tryby. Załączam:

    Code:

    uses crt,graph;
    var x:char;
        st,tryb:integer;

               procedure czw;
            begin
             SetGraphMode(tryb);
             rectangle(100,100,400,400);
             outTextXY(50,450,'press any key');
             readkey;
           end;
               procedure tr;
            begin
             SetGraphMode(tryb);
             moveto(300,100);
             lineto(100,400);
             lineto(500,400);
             lineto(300,100);
             outTextXY(50,450,'press any key');
             readkey;
           end;
               procedure trap;
            begin
             writeln('naapisz procedure rysujaca trapez');
             writeln('press any key');
             readkey;
           end;

               procedure menu;
         begin
          repeat
          restoreCRTmode;
          clrscr;
           writeln('jezeli czworokat nacisnij 1');
           writeln('jezeli trojkat nacisnij 2');
           writeln('jezeli trapez nacisnij 3');
           writeln('KONIEC nacisnij dowolny inny klawisz');
           readln(x);
           case x of
            '1':czw;
            '2':tr;
            '3':trap;
            else halt;
          end;
          until x>'3';
         end;
     begin
       detectgraph(st,tryb);
       initgraph(st,tryb,'c:\tp\bgi');
     menu;
    end.
  • Poziom 20  
    ed-ek napisał:
    wrych: a co robi procedura czytaj(...)?[/code]


    Zadeklarujemy:
    Code:
    var liczba: string;

    Nagłówek procedury:
    Code:
    procedure czytaj(komentarz: string; var napis: string; wspx, wspy: integer; max, skala :byte; znaki: zakres_znakow); 

    Wywołanie:
    Code:
    czytaj('Podaj liczbę ', liczba, 10, 30, 7, 2, ['1'..'9', '0', '.', '-');
    powoduje wyświetlenie na ekranie (w trybie graficznym) napisu "Podaj liczbę" i migającego kursora. (10, 30) to współrzędne lewego górnego rogu tego napisu, 7 - maksymalna ilość wczytanych znaków, 2 - pismo o literach 2x większych od znaków systemowych w trybie graficznym (matryca znaku 8x8 pikseli), dopuszczalnymi znakami są cyfry, kropka i minus. Klepiemy w klawisze i naciskamy Enter. Zmienna liczba zawiera wprowadzony cią znaków. Pozostaje ewentualnie dokonać konwersji na Integer, Real lub inny typ liczbowy...
    Obsługiwane są podczas edycji klawisze: [<-] [->] [HOME] [END] [BackSpace] [Insert] [Delete] oraz [ESC] (rezygnacja ze zmiany wartości edytowanej zmiennej).
    Ta funkcja zastępowała (symulowała) mi Readln w trybie graficznym.
    Odkurzone wspomnienia z roku 1996!
  • Poziom 11  
    Problem rozwiązany:

    Użyłem polecenia RestoreCrtMode w pętli repeat until.

    Dziękuje wszystkim!