C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[4845] Re:Re:Re:답변 감사.. . 한번 더..
한동훈 [] 3488 읽음    2001-01-10 11:40
제 생각에는 데이터값을 가지고 검색을 하실꺼라면 굳이 TList를 사용하시겠다면요

for문으로 데이터값을 비교해서 돌리는것이 가장 좋을 것 같고요, (그렇게 되면 IndexOf를

못쓰겠죠?)

아닐 경우에는 TStringList를 사용해서 간단한 파싱함수를 만들어서 데이터를 저장

해서 찾는것도 괜찮은 방법일듯 싶습니다.

// 짝퉁 코딩1입니다.
// 데이터 갯수대로 List를 만들어 사용하는건데 Index값을 꼭 관리하셔야 할 겁니다.
class TSample
{
private:
  TStringList* m_listData1;
  TStringList* m_listData2;
}

void __fastcall TSample::InitList()
{
  m_listData1 = new TStringList;
  m_listData2 = new TStringList;
}

void __fastcall TSample::DataInsert()
{
  m_listData1->Add(IntToStr(100));
  m_listData2->Add("c");
}

void __fastcall TSample::FindData()
{
  int nIndex1 = m_listData1->IndexOf("100");
  int nIndex2 = m_listData2->IndexOf("c");
}

// 짝퉁 코딩2
// Parsing 함수를 만들어서 사용할때 입니다.
// 아래는 파싱함수들
// Packet : Command (0,1) Data 형식의 Parsing
AnsiString __fastcall Parsing(AnsiString strPacket, int nParamPos)
{
    // 최초 공백의 위치 파악
    int nPos = strPacket.Pos(" ");
    int nLength = strPacket.Length();
    AnsiString strReturnValue;

    for (int i=nPos;i<=nLength;i++)
    {
        // Data 값 입력을 받음
        if (strPacket[i] != ',')
            strReturnValue = strReturnValue + strPacket[i];
        if (strPacket[i] == ',')
        {
            // 마지막 Data임이 증명되었을때
            if (nParamPos == 0)
            {
                return Trim(strReturnValue);
            }
            // 마지막 Data가 아닐경우 strReturnValue를 공백으로 처리
            else
            {
                strReturnValue = "";
                nParamPos--;
            }
        }
    }
    // 마지막 값 Return
    return Trim(strReturnValue);
}
// Packet내에 Data의 갯수를 Return하는 함수
int __fastcall GetParamCount(AnsiString strPacket)
{
    int nReturnValue = 0;

    for (int i=1;i<strPacket.Length();i++)
    {
        // 콤마의 갯수로 Data의 갯수를 파악한다
        if (strPacket[i] == ',')
            nReturnValue++;
    }
    // 결과값 Return
    return ++nReturnValue;
}
// Packet내에 Command부분을 읽어 Return 하는 함수
AnsiString __fastcall GetCommand(AnsiString strPacket)
{
    AnsiString strCommand;

    for (int i=1;i<=strPacket.Length();i++)
    {
        //최초의 공백이 발생하였을때 Loop를 정지함
        if (strPacket[i] == ' ')
            break;
        strCommand = strCommand + strPacket[i];
    }
    // 결과값 Return
    return strCommand;
}
void __fastcall Replace(AnsiString &source, AnsiString find, AnsiString repl)
{
    int ind = source.Pos(find);
    while (ind != 0)
    {
        source = source.SubString(1, ind-1) + repl + source.SubString(ind + find.Length(), 10000);
        ind = source.Pos(find);
    }
}
// 실질적 코딩 부분
class TSample
{
private:
  TStringList* m_listData;
}

void __fastcall TSample::InitList()
{
  m_listData = new TStringList;
}

void __fastcall TSample::DataInsert()
{
  m_listData->Add("SAMPLEDATA 100,c");
  // 위와 같이 데이터를 넣으면 파싱함수에서
  // GetCommand 로 SAMPLEDATA를 받을 수 있고
  // Parsing(String, 0) = 100
  // Parsing(String, 1) = c
}

void __fastcall TSample::FindData()
{
  int nIndex = m_listData1->IndexOf("SAMPLEDATA 100,c");
}


뭐 위와 같이 짝퉁 코딩을 해도 될테고..
위의 1 코딩은 2개의 List에 데이터를 각각 넣는것으로 각각의 Index 값이 동기화 되어 있어야
합니다.

직접 코딩을 해서 틀린 부분이 있더라 이해해 주시기 바랍니다.

향기 님이 쓰신 글 :
: 답변 감사 드립니다.
: 한가지 더 질문 드리겠습니다. 제가 만든 SampleList 는 실질적으로 는 Global 변수 입니다.
: 모든 함수에서 이 리스트에 Data 를 넣고 빼고 참조하고 가능하다는 얘기죠..
:
: void __fastcall TForm1::Button20Click(TObject *Sender)
: {
:   // 이 함수에서 쓰는 SampleList 는 Global 이고 이미 100,c 라는 Data를 Add 시켜 놓았습니다.
:
:   //검색에 사용할 객체를 만듭니다.
:   TSample *Temp = new TSample;
:   Temp->I = 100;
:   Temp->C = 'c';
:
:   int indexof;
:
:   // 인자로 넘김니다. 역시 찾지를 못합니다. 알려 주신대로 이 Temp 와
:   // Add 당시의 주소가 다르기 때문이겠죠.. 그러면 어떻게 해야 하죠??
:   indexof = SampleList->IndexOf(Temp);
:
:   if(indexof >=0)
:     Memo1->Lines->Add("Index Number : " + IntToStr(indexof));
:   else
:     Memo1->Lines->Add("Index Number : Can't Find" + IntToStr(indexof));
:
:   delete Temp;
:
:
: }
:

+ -

관련 글 리스트
4800 TList 에 대한 질문입니다. 도움좀 주세요.. 향기 3435 2001/01/08
4832     Re:TList 에 대한 질문입니다. 도움좀 주세요.. 조재영 3652 2001/01/09
4808     Re:TList 에 대한 질문입니다. 도움좀 주세요.. 한동훈 3438 2001/01/08
4817         Re:Re:답변 감사.. . 한번 더.. 향기 3193 2001/01/09
4845             Re:Re:Re:답변 감사.. . 한번 더.. 한동훈 3488 2001/01/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.