- 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ć :)
- 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 :)