Problem z Tablicami

0

Otóż:

  Ctrls : array [1..4,1..6] of Char =
 (('W', 'S', 'A', 'D', 'J', '?'),
  ('?', '?', '?', '?', '?', '?'),
  ('?', '?', '?', '?', '?', '?'),
  ('?', '?', '?', '?', '?', '?'));

A w OnKeyDown

Case Char(Key) of
   Ctrls[1, 1]:  {Jakaś instrukcja}
   Ctrls[1, 2]:  {Jakaś instrukcja}
   Ctrls[1, 3]:  {Jakaś instrukcja}
   Ctrls[1, 4]:  {Jakaś instrukcja}
   Ctrls[1, 5]:  {Jakaś instrukcja}
   Ctrls[1, 6]:  {Jakaś instrukcja}
 end;

W tej linji

   Ctrls[1, 1]:  {Jakaś instrukcja}

wywala błąd
[Error] Unit1.pas(393): Constant expression expected

Czemu?

1

To nie problem z tablicą tylko z case... Jak chcesz żeby to działało widziałeś kiedyś instrukcję case?

0

Ej, nawet tak

Case Ord(Char(Key)) of
   Ord(Ctrls[1, 1]):  {Jakaś instrukcja}
   Ord(Ctrls[1, 2]):  {Jakaś instrukcja}
   Ord(Ctrls[1, 3]):  {Jakaś instrukcja}
   Ord(Ctrls[1, 4]):  {Jakaś instrukcja}
   Ord(Ctrls[1, 5]):  {Jakaś instrukcja}
   Ord(Ctrls[1, 6]):  {Jakaś instrukcja}
 end;

Nie działa, i wywala ten sam błąd.

wywala błąd
[Error] Unit1.pas(393): Constant expression expected

0

No nie dziwne że nie działa, pytam co chciałbyś uzyskać. Co ta instrukcja (case) miałaby robić?

1

Log błędu mówi sam za siebie. W przypadku case wartości muszą być znane i stałe, u ciebie nie są bo możesz wartości tej tablicy zmieniac.

1

i tak będziesz musiał w instrukcji case .. of podać WSZYTKIE stany do przechwycenia
więc spoko możesz zrobi coś takiego

procedure TEST(key: Byte);
var
  tmp: Byte;
begin
  tmp := Ord(Char(Key));
  case tmp of
    Ord('W'): ; {Jakaś instrukcja}
    Ord('S'): ; {Jakaś instrukcja}
    Ord('A'): ; {Jakaś instrukcja}
    Ord('D'): ; {Jakaś instrukcja}
    Ord('J'): ; {Jakaś instrukcja}
    Ord('?'): ; {Jakaś instrukcja}
  else
{Jakaś instrukcja}
  end;
end;

w tym układzie akurat nie potrzebujesz tablic

//EDIT
jeśli w trakcie programu zmieniasz wartości w tablicy, to, żeby było uniwersalnie, stwórz procedurę inicjacji zmiennych

klaw_x:=Ctrls[i,j]

klaw_x wstaw zamiast Ord('x')

użyj jej w zdarzeniu formy OnCreate i za każdym razem, jeśli zmieniasz wartości w tablicy

1

Jedynym wyjściem jest wielokrotne zastosowanie instrukcji if.

  if Char(Key)=Ctrls[1, 1] then {Jakaś instrukcja} else
  if Char(Key)=Ctrls[1, 2] then {Jakaś instrukcja} else
  itd...
0

Ostatnio często to mówię, ale: "Żal mi mnie"

Jak przypisać do tablicy wartość z Ini?

uses INIFiles;

var
  INI : TINIFile;
begin
INI := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'controls.ini');
 try
   for I := 1 to 4 do
     for J := 1 to 6 do
       Con[I, J]:= Chr(INI.ReadString(IntToStr(I), IntToStr(J), '?'));
 finally
   INI.Free;
 end;
end;

Jakby ktos się czepiał plik ini wygladał tak:

[1]
1=W
2=S
3=A
itd...

Wywala błąd
//Invaild Typecast

Edit:
Sory:
//Incompatible types

1

Zakładam że w INI są poprawne warosci

Con[I, J]:= INI.ReadString(IntToStr(I), IntToStr(J), '?')[1];
0

Dziękuje wszystkim za odpowiedzi, i męczenie się ze mną

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