안녕하세요 만해 입니다.
요즘 HTML Parser를 구해서 막 돌려보고 있는데요
맘에 드는게 있어서 빌더로 전환시키는데
이게 사람 미치게 만들어서요
분명히 같은 컴포넌트에 같은 루틴인데
전혀 틀린 결과를 내보내서요
소스좀 봐주세요
흑흑~
procedure TFormMain.btn_ParseClick (Sender: TObject);
const
TagLinkAttribList : array[0..12] of TTagAttrib = (
(Tag: tagA; Attrib: attribHref),
(Tag: tagAPPLET; Attrib: attribCode),
(Tag: tagAREA; Attrib: attribHref),
(Tag: tagBody; Attrib: attribBackGround),
(Tag: tagFRAME; Attrib: attribSrc),
(Tag: tagIFRAME; Attrib: attribSrc),
(Tag: tagINPUT; Attrib: attribSrc),
(Tag: tagIMG; Attrib: attribSrc),
(Tag: tagIMG; Attrib: attribLowSrc),
(Tag: tagLINK; Attrib: attribHref),
(Tag: tagTABLE; Attrib: attribBackGround),
(Tag: tagTD; Attrib: attribBackGround),
(Tag: tagTH; Attrib: attribBackGround)
);
var
a, i : Integer;
begin
Memo_Links.Clear;
Memo_Links.Perform (WM_SETREDRAW, 0, 0);
HtmlReporter.SourceString := Memo_Source.Text;
while HtmlReporter.Next do
begin
i := Low (TagLinkAttribList);
while i <= High (TagLinkAttribList) do
begin
if HtmlReporter.Tag.Tag = TagLinkAttribList[i].Tag then
begin
repeat
a := HtmlReporter.Tag.IndexOfAttrib (TagLinkAttribList[i].Attrib);
if a >= 0 then Memo_Links.Lines.Add (HtmlReporter.Tag.Values[a]);
Inc (i);
until (i > High (TagLinkAttribList)) or
(HtmlReporter.Tag.Tag <> TagLinkAttribList[i].Tag);
Continue;
end
else
Inc (i);
end;
end;
Memo_Links.Perform (WM_SETREDRAW, 1, 0);
end;
이게 델파이 코드고요
제가 변환 시킨 씨플플 코드 나옵니다
void __fastcall TForm1::Button3Click(TObject *Sender)
{
TTagAttrib TagLinkAttribList[13] = {
{Rjhtmltags::tagA,attribHREF},
{Rjhtmltags::tagAPPLET,attribCODE},
{Rjhtmltags::tagAREA, attribHREF},
{Rjhtmltags::tagBODY, attribBACKGROUND},
{Rjhtmltags::tagFRAME, attribSRC},
{Rjhtmltags::tagIFRAME,attribSRC},
{Rjhtmltags::tagINPUT, attribSRC},
{Rjhtmltags::tagIMG, attribSRC},
{Rjhtmltags::tagIMG, attribLowsrc},
{Rjhtmltags::tagLINK, attribHREF},
{Rjhtmltags::tagTABLE, attribBACKGROUND},
{Rjhtmltags::tagTD, attribBACKGROUND},
{Rjhtmltags::tagTH, attribBACKGROUND}
};
int a, i;
// Memo4->Perform(WM_SETREDRAW, 0, 0);
HtmlRep->SourceString = Memo2->Text;
for ( ; HtmlRep->Next() ; )
{
for ( i = Low(TagLinkAttribList) ; i < High(TagLinkAttribList) ;)
{
if (HtmlRep->Tag->Tag == TagLinkAttribList[i].Tag)
{
for ( ; ; )
{
a = HtmlRep->Tag->IndexOfAttrib(TagLinkAttribList[i].Attrib);
if (a >= 0)
Memo4->Lines->Add(HtmlRep->Tag->Values[a]);
i++;
if ((i > 13) ||
(HtmlRep->Tag->Tag != TagLinkAttribList[i].Tag)) break;
}
continue;
}
else
i ++;
}
}
// Memo4->Perform (WM_SETREDRAW, 1, 0);
}
//---------------------------------------------------------------------------
int __fastcall TForm1::Low(TTagAttrib* Tags)
{
int low=999;
for ( int i = 0 ; i < sizeof(Tags) ; i++ )
if (Tags[i].Tag < low)
low = Tags[i].Tag;
return low;
}
//---------------------------------------------------------------------------
int __fastcall TForm1::High(TTagAttrib* Tags)
{
int high=-1;
for ( int i = 0 ; i < sizeof(Tags) ; i++ )
if (Tags[i].Tag > high)
high = Tags[i].Tag;
return high;
}
도저히 뭐가 잘못된건지 감을 못 잡겠네요
고수님들의 도움 부탁 드립니다.
그리고 제가 사용하는 컴포넌트도 올릴께요
|