Ругается, если не задана одна из размерностей. Проставь в едитах по умолчанию тройки, и код модифицируй как-то так (мог напутать в выделенных строках, писал прямо тут).
	Код:
	  m:=StringGrid1.ColCount; // ??
  n:=StringGrid1.RowCount; // ??
  for i:=0 to m-1 do
    for j:=0 to n-1 do
      a[i,j] := StrToInt(StringGrid1.Cells[i,j]);
  p:=StringGrid2.ColCount; // ??
  q:=StringGrid2.RowCount; // ??
  for i:=0 to p-1 do
    for j:=0 to q-1 do
      b[i,j] := StrToInt(StringGrid2.Cells[i,j]);
  For i:=0 to m-1 do
    For j:=0 to q-1 do
      Begin
        x[i,j]:=0;
        For l:= 1 to n-1 do
          x[i,j]:=x[i,j]+a[l,i]*b[j,l];
      end;
  for i:=0 to m-1 do
    for j:=0 to q-1 do
      StringGrid3.cells[i,j]:=IntToStr(x[i,j]);  P.S. И ещё заметил любопытную ошибку. При изменении A.Y (кол-во столбцов первой матрицы) изменяется B.X. А вот если менять B.X - изменений в A.Y не происходит.
P.P.S. Код желательно чистить от мусора перед заливкой - *.~*, *.dcu, *.ddp... Хорошо, что хоть *.exe удалён 

P.P.P.S. Иконка приложения из Delphi 5? Да-да, я её ещё помню 
