|
제 생각에는 데이터값을 가지고 검색을 하실꺼라면 굳이 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;
:
:
: }
:
|