Jak usunąć linię? Alternatywa dla clrscr w pascalu.

0

Program wyświetla pewne stałe informacje w pierwszych 10 linijkach, w kilku następnych treść się zmienia co kilka sekund, albo nawet częściej. Na końcu znowu jest tekst, który zmienia się znacznie rzadziej, bo przejściu jednej pętli, a więc kilku zapewne kilkudziesięciu sekund. Do tej pory używałem clrscr, ale to powodowało miganie. Znalazłem też coś takiego jak DelLine, ale to usuwa całą linie, a każdą kolejną przesuwa w górę, a więc nie jest to rozwiązanie odpowiednie. Jeszcze jednym wariantem, który stosowałem było przeniesienie kursora w odpowiednie miejsce i wypisanie: ' '. Jednak myślę, że w jakiś inny sposób można to zrobić. Pomożecie?
Dzięki

0

A można prosić o jakiś konkretny przykład? Ja nie potrafię tak przejrzeć wszystkiego i znaleźć rozwiązania, za to potrafię analizować kod i wtedy szybko rozumiem o co chodzi.

Jeszcze jedna sprawa, po wejściu w ten link wyświetla się kod w C, a ja używam Pascala. Chyba zapomniałem to dodać.

0

To jak pomoże ktoś?

0

Całe WinAPI jest zaimportowane do pascala wystarczy odpowiedni unit dołączyć.
Jeżeli nie potrafisz wstukać ncurses do googla to tobie już nikt i nic nie pomoże.

0

Dobra mam dosyć. Zaskakuje mnie bardzo, że ktoś Twojego konta jeszcze nie skasował. A to już prawie 10 lat. Czy Ty kiedykolwiek, komukolwiek pomogłeś? Dziś szukając różnych rzeczy trafiałem na różne tematy tego forum, a tam zawsze to samo z Twojej strony. Odsyłania do google, albo jeszcze lepiej polecenie wpisanie w google frazy "jak korzystać z google". Oczywiście, tradycyjnie w kazdym temacie w którym się wypowiadałeś musiało paść "programowanie nie dla Ciebie", "daruj sobie", albo to co napisałeś w tym temacie "tobie już nikt i nic nie pomoże".

Wytłumacz mi proszę po co Ci jest to konto? Chcesz poprawić sobie własnego ego? Ty jesteś taki dobry, a inni z googla nie potrafią korzystać. Uuuu, no gratulację. Nie wiem czy zauważyłeś, Twoje komentarze w 99% nic nie wnoszą. W tym temacie też żaden Twój komentarz nic nie dał. To trochę tak jakby nauczyciel matematyki na lekcji powiedział uczniom "tu macie wszystkie wzory matematyczne, korzystajcie z nich". Tylko, że sam wzór nic nie da, jak się nie wie jak z niego skorzystać. Podałeś link do strony, na której znajdują się 63 funkcje, które pierwszy raz w życiu na oczy widzę. Gdybym je znał to bym nie pisał na forum. Ale nie znam i nie wiem jak z nich korzystać. Chcę osiągnąć coś co napisałem, a nie marnować cały dzień na poszukiwania i nie znalezienie odpowiedzi. Poprosiłem o przykład, konkretny kod, ale nie.

Na koniec, admin możesz dać mi jakieś ostrzeżenie, bana czy cokolwiek. _13th_Dragon jesteś największym frajerem jakiego kiedykolwiek spotkałem na jakimkolwiek forum. Nie nabijaj sobie nigdy więcej postów w tematach, które zakładam, bo marnujesz mój czas, a także na pewno Twój również. Może akurat ktoś potrzebuje instrukcji jak włączyć komputer... ale też odeślesz do google.

0

Aha. Ja proszę o informację jak wyczyścić linijkę a podajesz mi całą bibliotekę. Dokładnie tak jak napisałem o wzorach matematycznych.

0
lucasp17 napisał(a):

Wytłumacz mi proszę po co Ci jest to konto?
Pomagam tym którzy posiadają mózg, np tu: http://4programmers.net/Forum/C_i_C++/232043-dfs_graf_skierowany?p=1025422#id1025422

0

Data rejestracji sugeruje, że jesteś w wieku, w którym powinieneś zachowywać się jak normalny, dojrzały człowiek. A zachowujesz się jak gimnazjalista.

Ja nie wiem czego mam szukać, gdybym wiedział już dawno bym to znalazł. Dlatego prosiłem o kod, zastosowanie, przykład. To bym sobie przeanalizował i zrozumiał. Może po prostu Ty nie potrafisz tego zrobić? Jeżeli chcesz pomagać w używaniu internetu to może nie pisz na tym forum, bo jak już napisałem 99% Twoich postów się do niczego nie nadaje.

0
  1. jaki Pascal? Free Pascal? Turbo Pascal?
  2. jaki system? Windows?
0

@lucasp17 i @_13th_Dragon - nie róbcie off-topu bez potrzeby, a prywatne dyskusje przenieście najlepiej do wiadomości prywatnych;

A co do tematu, to najprościej w pętli przenosić kursor do odpowiedniej linijki za pomocą procedury GotoXY i wypisać linię, składającą się jedynie ze znaków o kodzie 32, którą można wygenerować za pomocą funkcji StringOfChar;

Oczywiście "najprościej" nie znaczy "najlepiej", bo szerokość konsoli może być różna na różnych komputerach/wersjach systemu, więc tutaj trzeba by najpierw ją sprawdzić, zanim wygeneruje się łańcuch do kasowania wybranych linii; No i od razu trzeba zaznaczyć, że kolory tekstu i tła trzeba mieć odpowiednio dobrane, aby ta operacja faktycznie wyglądała jak zamazywanie.

0

Azarian, szczerze mówiąc nie wiem. Wiem tyle, że Pascal i Lazarus. Nie wiem czym się różni Free Pascal i Turbo Pascal. Ja mam W8.

furious programming napisał(a):

A co do tematu, to najprościej w pętli przenosić kursor do odpowiedniej linijki za pomocą procedury GotoXY i wypisać linię, składającą się jedynie ze znaków o kodzie 32, którą można wygenerować za pomocą funkcji StringOfChar;

Oczywiście "najprościej" nie znaczy "najlepiej", bo szerokość konsoli może być różna na różnych komputerach/wersjach systemu, więc tutaj trzeba by najpierw ją sprawdzić, zanim wygeneruje się łańcuch do kasowania wybranych linii; No i od razu trzeba zaznaczyć, że kolory tekstu i tła trzeba mieć odpowiednio dobrane, aby ta operacja faktycznie wyglądała jak zamazywanie.

Używanie GotoXY jest bezpieczne? Do tej pory miałem pewne opory. Pamiętam, że jak się uczyłem to nauczyciel mówił, że używanie tego nie jest najlepsze. A teraz druga sprawa. W jaki sposób sprawdzić szerokość konsoli. Też tego dziś szukałem, żeby wyśrodkować tekst, ale nie znalazłem. Napisałeś, że szerokość konsoli może się różnic w zależności od różnych systemów. A jak to jest jeśli w ustawieniach skrótu zmienia się rozmiar ekranu i buforu ekranu?

A jak już mowa o szerokości i wielkości okna... to dlaczego w Lazarusie po uruchomieniu programu ta konola jest taka miniaturowa? Ciężko dojrzeć co się wyświetla. Jeszcze kilka dni temu było normalnie i nagle się zmniejszyło.

1

Nie wiem czym się różni Free Pascal i Turbo Pascal.

Wiekiem i funkcjonalnością;

Używanie GotoXY jest bezpieczne? Do tej pory miałem pewne opory. Pamiętam, że jak się uczyłem to nauczyciel mówił, że używanie tego nie jest najlepsze.

Jest bezpieczne, pod warunkiem, że wie się jak tego używać i robi się to z głową;

W jaki sposób sprawdzić szerokość konsoli. Też tego dziś szukałem, żeby wyśrodkować tekst, ale nie znalazłem.

A wystarczyło kuknąć sobie w źródła modułu Crt, są tam funkcje GetScreenHeight i GetScreenWidth - zobacz sobie jak działają; Nie są one dostępne, bo znajdują się w sekcji Implementation, ale jak koniecznie chcesz to zrób sobie takie, albo skopiuj istniejące;

Napisałeś, że szerokość konsoli może się różnic w zależności od różnych systemów.

I od użytkowników, bo bufor konsoli, jej rozmiary, kolory itd. można dowolnie zmieniać w opcjach edycji edytora konsoli.

0

Tak na prawdę nie wiem czego mam szukać. Niestety, nie do końca zrozumiałem akapit w którym są GetScreen...

Za to w czasie poszukiwań znalazłem coś takiego jak ClrEol. W połączeniu z gotoXY działa tak jak bym chciał. Macie jakieś zastrzeżenia co do tej funkcji?

1

Właśnie o to @_13th_Dragonowi chodziło - tą procedurę miałeś znaleźć w dokumentacji;

Co prawda nie umożliwia skasowania wielu linii naraz, ale przynajmniej zwalnia Cię z konieczności obliczania szerokości edytora konsoli i tworzenia białego łańcucha o długości równej jego szerokości; Możesz tą procedurę wykorzystać w pętli, albo przerobić ją tak, aby kasowała wiele linii naraz, przyjmując w parametrach np. indeks pierwszej i ostatniej linii do skasowania;

Kod procedury ClrEol poniżej:

procedure ClrEol;
var
  Temp: DWord;
  CharInfo: Char;
  Coord: TCoord;
  X,Y: DWord;
begin
  GetScreenCursor(x, y);

  CharInfo := #32;
  Coord.X := X - 1;
  Coord.Y := Y - 1;

  FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), CharInfo, WindMaxX - X + 1, Coord, @Temp);
  FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), TextAttr, WindMaxX - X + 1, Coord, @Temp);
end;

Tyle że zamiast kasowania linii od aktualnej pozycji kursora, Ty potrzebujesz od pierwszego znaku danej linii; Szerokość okna możesz obliczyć za pomocą globalnych zmiennych WindMaxX i WindMinX (szerokość bieżącego okna, bo możesz stworzyć "wewnątrz" konsoli mniejsze okno, za pomocą procedury Window); Zobacz sobie jak to robi procedura ClrScr;

Pobaw się i zmontuj sobie gotową procedurę, bez zewnętrznej zabawy z pętlą i GoToXY.

0

Raczej nie chodziło Ci o to co zrobiłem, ale pobawiłem się procedurą window. W ten sposób można zrobić fajny program do sterowania chociaż strzałkami. Tak przynajmniej myślę, bo jeszcze tego nie zrobiłem. Stworzyłem sobie 3 okna. Jedno to tytuł, drugie menu i trzecie część właściwa, ale mam problem z przemieszczaniem pomiędzy nimi ponieważ gotoxy przenosi kursor o danych współrzędnych, ale w obecnym oknie, a nie w całej konsoli. Szkoda tylko, że ta konsola jest tak mała. U mnie 135 x 39 to max. 39 linijek to nie za dużo.

Ale wracając do tematu, nie za bardzo rozumiem w jaki sposób można to zrobić nie używając gotoxy.

2

Zainteresuj się ConEmu. Będziesz miał w pełni konfigurowalną konsolę o dodatkowych możliwościach. A co najważniejsze nawet wyświetlaną na pełnym ekranie, jeśli chcesz.

0

Przeczytałem na szybko co to jest i spodobała mi się opcja przezroczystości. Przyda się to bardzo, szczególnie przy przepisywaniu nazw. Ale problem jest jeden. Jeżeli ja z tego będę korzystał to dla mnie będzie ok. Ale jeżeli będę chciał podzielić się z kimś moim programem to jest możliwość ustawienia, aby automatycznie otwierało się z moimi ustawieniami?

0

Wystarczy wyeksportować userowi swoje ustawienia do następującego klucza Rejestru HKEY_CURRENT_USER\Software\ConEmu\.Vanilla. Przynajmniej tak jest póki co w wersji, którą ja używam. Tylko należy mieć na uwadze, że ilośc kolumn czy wierszy na pełnym ekranie może się komuś różnić w zależności od rozdzielczości.

0

Może powinienem założyć nowy temat, ale problem dotyczy procedury window. Mam taki kod:

program project1;

uses crt, math;

Var
 c1,c2:char;
 y:byte;
 tablica:array[1..8]of string;
 tablica2:array[1..8]of string;
 oknox, oknoy :integer;
 szerokosc_menu :integer;
 i :integer;
 j :integer;
 puste :integer;

Begin
  oknox := windmaxx;
  oknoy := windmaxy;
  cursoroff;
  Tablica[1]:='OPCJA PIERWSZA';
  Tablica[2]:='MENU 2';
  Tablica[3]:='TROJKA';
  Tablica[4]:='CZWARTY WYBOR';
  Tablica[5]:='5 - PIEC';
  Tablica[6]:='OPCJA SZESC';
  Tablica[7]:='WYSZUKIWANIE';
  Tablica[8]:='ZAKONCZ';
  for i := 1 to 8 do
       begin
         if length(tablica[i]) > szerokosc_menu then szerokosc_menu := length(tablica[i]);
       end;
  if szerokosc_menu mod 2 = 1 then
       szerokosc_menu := szerokosc_menu + 7
  else
       szerokosc_menu := szerokosc_menu + 6;
  for i := 1 to 8 do
       begin
         puste := (szerokosc_menu - length(tablica[i])) div 2;
         for j := 1 to puste do
              begin
                tablica2[i] := tablica2[i] + ' ';
              end;
         tablica2[i] := tablica2[i] + tablica[i];
         for j := 1 to puste do
              begin
                tablica2[i] := tablica2[i] + ' ';
              end;
         if length(tablica2[i]) < szerokosc_menu then tablica2[i] := tablica2[i] + ' ';
       end;
  for i := 1 to 8 do
       tablica[i] := tablica2[i];
  window(1,1,szerokosc_menu, oknoy);
  textbackground(red);
  ClrScr;
  TextColor(15);
  For y:=1 to 7 do
    Begin
      TextColor(15);
      TextBackGround(0);
      GotoXY(1,0+y);
      Write(tablica[y]);
    End;
      TextColor(15);
      TextBackGround(0);
      GotoXY(1,0+oknoy-1);
      Write(tablica[8]);
  y:=1; 

Co zrobić aby ostatnia opcja wyświetlała się linijkę niżej?

0

Wstaw sobie do tablicy pod indeks 8 pustą linię, a opcję ZAKONCZ przesuń pod indeks 9;

Możesz to:

  if szerokosc_menu mod 2 = 1 then
       szerokosc_menu := szerokosc_menu + 7
  else
       szerokosc_menu := szerokosc_menu + 6;

zamienić na:

Inc(szerokosc_menu, (szerokosc_menu and 1) + 6);

jeśli już o poprawianie kodu chodzi ;-)


Odbiegasz nieco od pierwotnego tematu; Może najpierw poczytaj o tym jak posługiwać się wieloma oknami, poćwicz, a dopiero później ewentualnie pytaj; Bo póki co prowadzimy Cię za rękę, a tak być nie powinno; Powinieneś najpierw poczytać dokumentację i popróbować różnych rzeczy, a dopiero później zakładać wątki i pytać, jak już będziesz miał tą podstawową wiedzę; Inaczej to ten wątek będzie się ciągnął w nieskończoność.

0

Jeśli mówimy o tej samej lini to można wypisać klawisz backspace 79 razy, pozniej spacje 79 razy i potem znowu backspace 79 razy (kod ascii 8 albo 9 - nie pamietam). Generalnie nie jest to idealne rozwiazanie, ale nie wymaga zadnych dodatkowych bibliotek. Jak na przyklad wypisujesz ile procent juz sie skonczylo lub cos w ten desen to nie jest to zle rozwiazanie. Jak cos wiecej chcesz to ncurses.

0
furious programming napisał(a):

Wstaw sobie do tablicy pod indeks 8 pustą linię, a opcję ZAKONCZ przesuń pod indeks 9;


Odbiegasz nieco od pierwotnego tematu; Może najpierw poczytaj o tym jak posługiwać się wieloma oknami, poćwicz, a dopiero później ewentualnie pytaj; Bo póki co prowadzimy Cię za rękę, a tak być nie powinno; Powinieneś najpierw poczytać dokumentację i popróbować różnych rzeczy, a dopiero później zakładać wątki i pytać, jak już będziesz miał tą podstawową wiedzę; Inaczej to ten wątek będzie się ciągnął w nieskończoność.

Ok. Postaram się trochę pokombinować. Ale po prostu tak mam, pewnie jak większość ludzi, że jak chcę coś zrobić i mi to nie wychodzi to szukam pomocy. Być może tydzień czasu na takie ćwiczenia i szukanie by mi pomógł, ale jak coś potrzebuję na teraz to ciężko jest tak po prostu to odłożyć. Ale jak napisałem, postaram się następnym razem.

W sumie ogólnie z każdą chwilą idzie mi coraz lepiej. Oczywiście problemy się pojawiają. Np. po dodaniu clrscr, okno zmienia kolor z zielonego na czarny. A clrscr jest przed wywołaniem procedury, w której okno jest malowane na zielono. Bez clrscr, wyswietla się prawidłowo. Ale myślę, że do tego dojdę. A na koniec dodam kod, żeby sprawdzić czy jest optymalny, czy gdzieś coś można poprawić, bo pewnie będzie można.

Na zakończenie tematu proszę tylko o pomoc w tym przesunięciu linijki. Dodanie pustej linijki w tablica[8] nie da nic. Bo rzeczywiście obniżyło by to Zakoncz w dół, ale pod warunkiem, że opcje wyświetlane byłyby w pętli. Ja chcę opcję zakończ umieścić na samym dole konsoli/okna. Jednak gdy ustawię kursor w miejscu 1, wysokośc to wtedy wszystko się rozjeżdża.

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