처음 보는 error 데요.. index의 범위를 벗어나다????
기능을 추가하고 있었는데, edit 아래에 dblistbox를 놓고, visible을 false로,
formcreate될때 table에 있는 특정 field를 while문으로 쑤셔넣고,
edit change event에서 비슷한 단어를 찾아서 enter눌르면, edit에 집어넣는
상황입니다. 신기하게도 잘 되길래, 원래 프로젝트에다가 합체를 했습니다.
원래 프로젝트 form에는 dbgrid가 3개(master/detail로 물려 있슴)있는데요,
첫번째, 두번째 grid에서는 이상이 없는데, 마지막 dblistbox에서 참조한 field가
있는 세번째 grid에서 스크롤바를 아래로 잡아 내리면,
'grid index out of range'라고 멋지게 뜹니다. 갖은 에러를 많이 당하고 있지만
왠지 불길한 예감(?)이 듭니다. Q&A를 찾아 보다 보니까 더욱.....음
부디 여러분들의 따듯한 손길을 기다리 겠습니다. 왕초보라서 자세히 좀...
네가지 정도의 event가 있습니다.
procedure TForm1.FormCreate(Sender: TObject);
var
pibada : String;
begin
Query1.Active := True;
DBListBox1.Clear;
Query1.First;
while not(Query1.EOF) do begin
pibada:= Query1.FieldByName('hosilname').AsString;
DBListBox1.Items.Add(''+pibada+'');
Query1.Next;
end;
end;
procedure TForm1.Edit1Change(Sender: TObject);
var
S: array[0..255] of Char;
i : Integer;
begin
StrPCopy(S, Edit1.Text);
DBListBox1.visible := True;
for i := 0 to DBListBox1.Items.Count - 1 do begin
if Pos(Trim(Edit1.Text), DBListBox1.Items[i]) > 0 then begin
DBListBox1.ItemIndex := i;
Break; //한번만 찾고 중지입니다.
end;
end;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
Const MVK_Return : Char = #13;
var pibada_field : Integer;
begin
if Key = #13 then begin
DBListBox1.SetFocus;
pibada_field := DBListBox1.Items.Count;
while pibada_field > 0 do begin
pibada_field := pibada_field - 1;
if DBListBox1.Selected[pibada_field] = True then begin
Edit1.Text := DBListBox1.Items[pibada_field];
end;
end;
end;
DBListBox1.Visible := False;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DBListBox1.Clear;
end;
ps : 혹시 참조필드를 인덱스로 잡지 않아서 그러나 했는데 상관 없이 에러를
아주 잘 뿌려주더군요.