Budowanie Interface'u w trybie tekstowym

2011-02-23 21:38

Rejestracja: 9 lat temu

Ostatnio: 6 lat temu

0

Witam,
mam pewien problem. otóż podany nizej kod nie sprwadza się. nie wiem dlaczego, wiec licze na Waszą pomoc w rozwiązaniu problemu.

chce napisac program. bedzie to program dzialajacy na bazie danych, ale przydala by sie jakas oprawa graficzna. dlatego chcialem stworzyc kilka okien ograniczonych ramką (skladajaca sie ze znakow specjalnych "-", "|" i naroznikow
ale juz na samym poczatku natknalem sie na problem.

windowsy zawsze cos u mnie kulaly.
wg mnie procedura rysuj_okna powinna zadzialac. przy zabawie z ustawieniami parametrow czasami sie ulapie i to rzeczywiscie wyglada jak ramka, ale zwykle jest "syf".

czy to moze jest wina procedur? zmienne globalne, lokalne?

dzieki za pomoc.

program test;

uses
    crt;

procedure rysuj_okno(x1, y1, x2, y2: byte);
var
   i: byte;
begin
     window(x1, y1, x2, y2);

     textbackground(0);
     clrscr;

     textcolor(8);

     for i:=x1 to x2 do                         {ramka gorna}
     begin
          gotoxy(i, y1);

                    if i=x1 then write(#218);

                    if i=x2 then
                    begin
                         write(#191);
                         break;
                    end;
          write(#196);
     end;

     for i:=x1 to x2 do                         {ramka dolna}
     begin
          gotoxy(i, y2);

                    if i=x1 then write(#192);

                    if i=x2 then
                    begin
                         write(#217);
                         break;
                    end;
          write(#196);
     end;

     for i:=y1+1 to y2-1 do                         {ramka lewa}
     begin
          gotoxy(x1, i);
          write(#179);
     end;

     for i:=y1+1 to y2-1 do                         {ramka prawa}
     begin
          gotoxy(x2, i);
          write(#179);
     end;

end;

procedure okno_gorne;
var
   wsp_x1, wsp_y1, wsp_x2, wsp_y2: byte;
begin

     wsp_x1:= 1;
     wsp_y1:= 1;
     wsp_x2:= 80;
     wsp_y2:= 10;

     rysuj_okno(wsp_x1, wsp_y1, wsp_x2, wsp_y2);

end;

procedure okno_menu;
var
   wsp_x1, wsp_y1, wsp_x2, wsp_y2: byte;
begin

     wsp_x1:= 1;
     wsp_y1:= 11;
     wsp_x2:= 80;
     wsp_y2:= 25;

     rysuj_okno(wsp_x1, wsp_y1, wsp_x2, wsp_y2);

end;

begin
     textmode(CO80);
     okno_gorne;
     okno_menu;
     readln;
end. 
edytowany 1x, ostatnio: madmike, 2011-02-23 21:41

Pozostało 580 znaków

2011-02-24 08:32

Rejestracja: 16 lat temu

Ostatnio: 12 godzin temu

0

Nie czytałem twojego kodu, ale jeśli robisz to dla siebie (a nie jako zadanie) to zainteresuj się biblioteką Turbo Vision/Free Vision dostępną w Turbo Pascalu i Free Pascalu. Jest to biblioteka, z której korzystają IDE tych kompilatorów.

uses app;
var a:TApplication;
begin
  a.Init;
  a.Run;
  a.Done;
end.

Pozostało 580 znaków

2011-02-24 08:57

Rejestracja: 9 lat temu

Ostatnio: 6 lat temu

0

niestety robie to jako zadanie.
takze wszelkie bilbioteki odpadają

Pozostało 580 znaków

2011-02-24 19:32

Rejestracja: 9 lat temu

Ostatnio: 5 lat temu

2

To, że Twój program nie rysuje takiej ramki, jak zakładałeś, wynika z niezrozumienia istoty działania procedury Window.

Window(1, 10, 80, 15); // Wydziela na ekranie okno o rozmiarze 80x6 znaków
GotoXY(1, 1);          // Ustawienie kursora na początku okna - współrzędne ekranu (1, 10)
GotoXY(80, 6);         // Ustawienie kursora na końcu okna - współrzędne ekranu (80, 15)
GotoXY(80, 15)         // Procedura nie zostanie wykonana - współrzędne poza aktualnym oknem

Mam nadzieję, że ten kod rozjaśnił jaki błąd popełniłeś. Poniżej zmodyfikowana procedura rysująca okno

procedure RysujOkno(x1, y1, x2, y2: Byte);
var i: Byte;
begin
  Window(x1, y1, x2, y2);
  TextBackground(0);
  ClrScr;
  TextColor(2);
  GotoXY(1, 1);
  for i:= 1 to x2-x1+1 do                       {ramka gorna}
  begin
    if i = 1 then Write(#218)
    else if i = x2-x1+1 then writeln(#191)
    else write(#196);
  end;
  for i:= 2 to y2-y1 do                         {ramka lewa}
  begin
    GotoXY(1, i);
    write(#179);
  end;
  for i:= 2 to y2-y1 do                         {ramka prawa}
  begin
    GotoXY(x2-x1+1, i);
    write(#179);
  end;
  GotoXY(1, y2-y1+1);
  for i:= 1 to x2-x1+1 do                       {ramka dolna}
  begin
    if i = 1 then write(#192)
    else if i= x2-x1+1 then {write(#217)}
    else write(#196);
  end;
end;

Niestety jest jeszcze mały problem - nie można nic wyświetlić w prawym dolnym rogu okna, bo nastąpi przesunięcie całej jego zawartości o jedną linijkę. Usuń komentarz przy instrukcji Write(#127), to się przekonasz.

Jeżeli chciałbyś zrobić ramkę w sposób bardziej profesjonalny, to proponuję pod rozwagę zapis bezpośrednio do pamięci ekranu:
http://4programmers.net/Forum/Newbie/173420-ramka_w_trybietekstowym-_turbo_pascal
W taki sposób są tworzone okna w kompilatorze Turbo Pascala. Można wyświetlić na ekranie nowe okno (uprzednio zapamiętując to, co znajdowało się w tym miejscu przedtem), a następnie je zamknąć przywracając poprzednią zawartość ekranu.

That's it! Ha, ha, ha... ;) cytat z Janis Joplin (Mercedes Benz - gdyby ktoś nie wiedział)

Pozostało 580 znaków

2011-02-25 01:01

Rejestracja: 9 lat temu

Ostatnio: 6 lat temu

0

po 3ech dniach kombinowania, udało mi się rozwiązac ten problem.
troche trwalo zanim na to wpadlem, ale rzeczywiscie, problem polegal na tym ze nie uwzgleednilem polozenia kursora w "nowym" oknie.
co do kursora na ostatniej pozycji okna...
powiekszylem nie co okno, i rysowane ramki pomniejszylem o 1 pozycje. dzieki temu, nie ma juz tego problemu.

ale mimo wszystko dzieki,
wskazniki, jak narazie sa dla mnie czarna magia, ale postaram sie to rozpracowac :)

piwo!

Pozostało 580 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0