@Ifndef lib_KB
@Define lib_KB lib_KB

// コメントを回避する、前方参照マクロ
// CFLDとかで呼ぶので、明示的に使うところはあまりないかも
function FNOwithoutCOMMENT(id2,id1, l_id,l_fmtno)
{
//MsgBox("id1=[" id1 "]", "test");
  if(id2 >= 0)
    return 0;
  if(Length(id1) == 0)
    id1 = FNO;

  l_fmtno = GetFormatNo(0);
  l_id = 0;
  while(id2 < 0)
  {
    l_id--;
    if(GetFieldAttr(l_fmtno, id1 + l_id, 5) == 1)
      continue;

    id2++;
  }
//MsgBox("l_id=[" l_id "]", "test");
  return l_id;
}

// グルーバル変数CFLD/FLNTHに値を入れる。戻り値も返す。
// 「CFLD [-1]」の形にも対応。GetCFLD(-1)で呼ぶこと。
// ※「文字・左詰め・ブランクパディング」で返す。
function GetCFLD(id, l_id,l_value)
{
CFLD = GetText(RNO, FNO);
FLNTH = Length(CFLD);

l_id = FNOwithoutCOMMENT(Int(id));
if(l_id < 0 && FNO - l_id > 0)
{
  l_value = GetText(RNO, FNO + l_id);
  return l_value;
}
return CFLD;
}

// グルーバル変数CLZFLD/FLNTHに値を入れる。戻り値も返す。
// 「CLZFLD [-1]」の形にも対応。GetCLZFLD(-1)で呼ぶこと。
// ※「数値・右詰め・ゼロパディング」で返す。
function GetCLZFLD(id, l_id,l_value)
{
l_value = GetText(RNO, FNO);
FLNTH = Length(l_value);
CLZFLD = Format("%0*d", FLNTH, l_value);

l_id = FNOwithoutCOMMENT(Int(id));
if(l_id < 0 && FNO - l_id > 0)
{
  l_value = GetText(RNO, FNO + l_id);
  return Format("%0*d", Length(l_value), l_value);
}

return CLZFLD;
}

// FLDの置き換え
// ※「文字・左詰め・ブランクパディング」で返す。
function GetFLD(name)
{
return GetText(RNO, GetFNO(name));
}

// FLDの置き換え
// ※「数値・右詰め・ゼロパディング」で返す。
function GetLZFLD(name, l_value)
{
l_value = GetText(RNO, GetFNO(name));
return Format("%0*d", Length(l_value), l_value);
}

// グルーバル変数CFLDに値を入れる。
// CFLD [-1] -> CFLD_B1とする。CFLD_B9まで対応
// ※正確には「文字・左詰め・ブランクパディング」で返す必要がある。
function GetCFLDs(l_no)
{
CFLD = GetText(RNO, FNO);
l_no = FNOwithoutCOMMENT(-1);
CFLD_B1 = GetText(RNO, FNO+l_no);
l_no += FNOwithoutCOMMENT(-1,FNO+l_no);
CFLD_B2 = GetText(RNO, FNO+l_no);
l_no += FNOwithoutCOMMENT(-1,FNO+l_no);
CFLD_B3 = GetText(RNO, FNO+l_no);
l_no += FNOwithoutCOMMENT(-1,FNO+l_no);
CFLD_B4 = GetText(RNO, FNO+l_no);
l_no += FNOwithoutCOMMENT(-1,FNO+l_no);
CFLD_B5 = GetText(RNO, FNO+l_no);
l_no += FNOwithoutCOMMENT(-1,FNO+l_no);
CFLD_B6 = GetText(RNO, FNO+l_no);
l_no += FNOwithoutCOMMENT(-1,FNO+l_no);
CFLD_B7 = GetText(RNO, FNO+l_no);
l_no += FNOwithoutCOMMENT(-1,FNO+l_no);
CFLD_B8 = GetText(RNO, FNO+l_no);
l_no += FNOwithoutCOMMENT(-1,FNO+l_no);
CFLD_B9 = GetText(RNO, FNO+l_no);
}

// BKSP FLD.の置き換え
function BKSP_FLD()
{
  Locate(0,0,1);
  CANCEL=1; // 項目移動をキャンセル
}

// SEARCHの置き換え(簡易版:二次元対応なし)
function SEARCH(table,value, l_table,l_value)
{
//  if(Range(value, table, 1, 1)) // 文字比較の場合、Rangeでの比較はうまくない？
  l_table = "," table ","
  l_value = "," value ","

  if(Match(l_table, l_value))
    return 1;

    return 0;
}

// CFLD 1-3の構文を再現
// "K"OBOLの"MID"でKMID
function KMID(value,start,end,add, l_start,l_len)
{
  l_start = start + add;
  if(end == 0 || end <= start)
    l_len = 1;
  else
    l_len = end - start + 1;

  return Mid(value, l_start, l_len);
}

// ALPHAを再現
// A〜Z、a〜z、ブランク
function isALPHA(value)
{
MsgBox(value,"isALPHA");
  if(Match(value, "^[a-zA-Z\\s]+$") > 0)
    return 1;
  return 0;
}

// UALPHAを再現
// A〜Z、ブランク
function isUALPHA(value)
{
MsgBox(value,"isUALPHA");
  if(Match(value, "^[A-Z\\s]+$") > 0)
    return 1;
  return 0;
}

// NUMを再現
// 0〜9、マイナスサイン
function isNUM(value)
{
  if(Match(value, "^([0-9]+|-[0-9]+)$") > 0)
    return 1;
  return 0;
}

// NOBLNKを再現
// ブランク以外のすべての文字
function isNOBLNK(value)
{
  if(Match(value, "^[^\\s]+$") > 0)
    return 1;
  return 0;
}

// KANAを再現
// カナ、ブランク
function isKANA(value)
{
  if(Match(value, "^[ｦ-ﾟ\\s]+$") > 0)
    return 1;
  return 0;
}

// ALLを再現
function isALL(value,char, l_reg)
{
//MsgBox(value ":" char,"isALL");
  if(char == " " || char == "　")
  {
    if(Match(value, "^(　+|\\s+)$") > 0)
      return 1;
  }
  else
  {
    l_reg = "^" char "+$";
    if(Match(value, l_reg) > 0)
      return 1;
  }
  return 0;
}

@Endif
