[Console] Cos a'la listbox i maskedit

0

Oczywiście wim, że czegoś takiego domyślnie nie ma... Mam wprawdzie bibliotekę crt32, ale tam funkcji wyświetlającej copś takiego też nie ma...

Ale po kolei... chodzi o to, żeby w CosoleApp wyświetli coś a'la listbox, umożliwiającej wyświetlenie listy w postaci tablicy stringów i przeskakiwanie i wybór konkretnych przez kursury i ENTER. ponadto chodzi o to wyświoetlenie czegoś w stylu maskedita (zczytujacego treśc wpisywaną jak read/readln, ale wyświetlającego jakiś określony znak n razy, lub nie wyświetlającego nic).

Crt32 ma podstawowe funkcje i procedury z modułu crt dla Pascala... Czy:

  1. jest komponent automatyzujący wykonanie tego, o co mi chodzi?
    lub
  2. jak można napisac funkcję, która to wykona?

Z góry dziękuję za odpowiedź.

0
  1. Odnośnie gotowych funkcji/procek/obiektów Nie znam. (komponent - nie sądzę :P)
  2. Czy przez tego listboxa rozumiesz takie jakby menu, że sobie jeździsz strzałkami i enterem wybierasz, czy coś bardziej w stylu listy, że możesz zaznaczać, odznaczać itp? Czy przez MaskEdit rozumiesz po prostu miejsce do wpisywania, przy czym zamiast literek pojawiałyby się znaczki w stylu * czy #? Bo jak tak, to jest to zwykły edit, maskedit służy do wprowadzania danych według jakiegoś wzorca.

// to odpal edit w trybie tekstowym, ciekaw jestem jak będzie wyglądać - Ł
//Ale nie o to mi chodziło - po prostu nie trzeba MaskEdit do wpisywania powiedzmy hasła czy czegoś. To, że w trybie tekstowym to wiem, tylko kwestia upewnienia się, jaki jest problem. - AP

0

Czy przez tego listboxa rozumiesz takie jakby menu, że sobie jeździsz strzałkami i enterem wybierasz
-- dokładnie tak

Czy przez MaskEdit rozumiesz po prostu miejsce do wpisywania, przy czym zamiast literek pojawiałyby się znaczki w stylu * czy #? Bo jak tak, to jest to zwykły edit, maskedit służy do wprowadzania danych według jakiegoś wzorca.
--Racja... jak to czasem człowiek z pośpiechu gafe walnie... [wstyd] Sorx...

Własnie na rozwiązaniu tych problemów w ConsoleApp mi zależy... thx.

0
  1. Pisałem kiedyś coś podobnego (oczywiście w prostszej formie ze względów technicznych) dla Turbo Pascala. Odgrzebać raczej nie da rady (kiedy to było :D), ale mogę spróbować taki zarys tego dać. Może nie działać, zapewne trzeba będzie dopracować, ale mam nadzieję, że pomoże:
function Menu(Options: TStringList): Integer;
//W parametrze podajesz opcje do wyboru, dostajesz numer wybranej opcji
var
  R: Integer; //Aktualnie wybrana opcja
  I: Integer; //Zmienna pomocnicza, indeks pętli
  X, Y: Integer; //Pozycja lewego górnego rogu menu;
  Width: Integer; //Szerokość belki - coby ładnie wyglądało
  Ch: Byte; //Wciśnięty klawisz
begin
  X:=GetX; //Być może trzeba zastąpić GetXPos albo czymś takim, z głowy piszę
  Y:=GetY; //J.w.
  Width:=0;
  For I:=0 to Options.Count-1 do if(Length(Options[I])>Width) then Width:=Length(Options[I]);
  For I:=0 to Options.Count-1 do while(Length(Options[I])<Width) do Options[I]:=Options[I]+' ';
  R:=0;
  Repeat
    For I:=0 to Options.Count-1 do begin //Wyswietlamy
      If I<>R then TextBackground(Black) //Tak to się robiło? :D
      else TextBackground(Blue); //Przykładowe kolory tła - Black zwykłe, Blue belka
      GotoXY(X, Y+I);
      Write(Options[I]);
      end;
    repeat until KeyPressed;
    while KeyPressed do Ch:=GetKey; //Tutaj też nie mam pewności co do nazwy funkcji GetKey
    if Ch=80 then R:=R+1;
    if Ch=75 then R:=R-1;
    if R=Options.Count then R:=R-1;
    if R=-1 then R:=0;
    until Ch=13; //Aż do entera
  Result:=R;
  end;

Chyba tyle :)
I sprawdź, czy GetKey zwraca Byte, czy Char, jak Char, to daj ord(GetKey) zamiast GetKey. No i nie każ mi z pamięci pisać, jakie numery ASCII mają strzałki :P
Oczywiście funkcja będzie sięwykładać trochę na ilości większej niż 25 (wysokość konsoli), no ale to trzeba dopracować :)

  1. W sumie na podobnej zasadzie by się dało. Tylko trochę prościej:
function HiddenEdit: String;
var
  R: String; //Aktualnie wpisany tekst
  I: Integer; //Zmienna pomocnicza, indeks pętli
  X, Y: Integer; //Pozycja lewego górnego rogu "edita"
  Ch: Byte; //Wciśnięty klawisz
begin
  X:=GetX; //Być może trzeba zastąpić GetXPos albo czymś takim, z głowy piszę
  Y:=GetY; //J.w.
  Width:=0;
  R:='';
  Repeat
    GotoXY(X, Y);
    For I:=0 to Length(R)-1 do begin //Wyswietlamy
      Write('*'); //Tutaj możesz wstawić jaki tam znaczek sobie tylko wymarzysz
      end;
    Write(' '); //Tak żeby na wypadek skasowania to puste miejsce usunąć :)
    repeat until KeyPressed;
    while KeyPressed do Ch:=GetKey; //Tutaj też nie mam pewności co do nazwy funkcji GetKey
    if (Ch=8) and (Length(R)>0) then Delete(R, Length(R), 1) //Zdaje się 8 to jest BackSpace :)
    else R:=R+chr(Ch); //Tutaj by trzeba zabezpieczyć przed znakami specjalnymi...
    until Ch=13; //Aż do entera
  Result:=R;
  end;

Powinno działać po analogicznych ewentualnych modyfikacjach co w powyższym kodzie :)

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