2012-01-10 3 views
0

나는 edtId라는 하나의 텍스트 상자를 가지고 버튼 (btnFind를) 찾을 수있을 내 양식이텍스트 파일에서 데이터를 읽고 메모 필드에 표시하는 방법은 무엇입니까?

1 Sharon Jasper Male 
2 Steven John Male 
3 Mary Hill Female 

같은 데이터를 포함 profile.txt라는 텍스트 파일을 가지고 있고, 메모 field.While은 찾기 버튼을 클릭 해당 데이터가 메모에 표시되어야합니다. 감사합니다.

답변

-1

다음 proc은 메모 내의 문자열을 선택합니다. 텍스트 파일을 메모에로드하려면 Memo1.LoadFromFile (filepath);

procedure TForm1.btnFindClick(Sender: TObject); 
var i,l,p: integer; 
begin 
    l := Length(edtId.Text); 
    for i := 0 to Memo1.Lines.Count - 1 do begin 
    p := Pos(edtId.Text,Memo1.Text); 
    if p <> 0 then begin 
     Memo1.SetFocus; 
     Memo1.SelStart := p-1; 
     Memo1.SelLength := l; 
     break; 
    end; 
    end; 
end; 

단순히, 텍스트의 한 줄을 표시 해당 프로 시저 내부의 라인 인덱스를 저장하고 Memo1.Lines.Delete (인덱스)를 사용하여 다른 모든 행을 삭제해야하는 경우.

+1

이 코드는 매우 비효율적입니다. 한 가지는 루프가 쓸모가 없다는 것입니다. 루프를 사용한다면'Memo1.Text' 대신에'Memo1.Lines [i]'를 사용해야하지만,'p'가 잘못된 값이기 때문에'Memo1.SelStart' 할당 방법을 변경해야합니다. 더 간단한 해결책은 루프를 완전히 없애는 것입니다. 더 좋은 점은'TRichEdit'으로 전환하고'Pos()'대신'FindText()'메소드를 사용하는 것입니다. –

+0

당신은 맞지만이 코드는 하위 문자열 (이 경우에는 id) 만 찾아 선택합니다. TMemo에서 하위 문자열을 찾는 다른 방법은 없습니다. Memo1.Lines [i]를 사용해야합니다. (예 : edtId 1이 1 행에있는 경우에만 작동합니다.) 메모에서 "기록"을 찾고 싶다면 Memo1.Lines [i]를 사용해야합니다. TRichEdit으로 전환하는 것에 동의합니다. 그러나 메모의 레코드 관리가 최악의 방법이라고 생각합니다. 데이터베이스 또는 적어도 레코드 배열을 사용하는 것이 좋습니다. –

+0

내 이전의 의견은 여전히 ​​있습니다. 한번에 한 줄씩'Memo'를 반복한다면'Text' 속성을 전혀 사용하지 마십시오. 그렇지 않으면 TRichEdit을 사용하고 내장 검색 기능을 활용하십시오. –

관련 문제