Registriert seit: 29. Mai 2003
Ort: Berlin
87 Beiträge
Delphi 10.2 Tokyo Professional
|
AW: HTML einlesen, Parsen und Einträge zählen
21. Jun 2021, 17:31
Ziel, eine vorhandene Unit nach einem Quellcode durchsuchen (hier das gerade geschriebene Project selber ) und diesen in die Zwischenablage packen
ACHTUNG, nicht durchdacht, eher schnell hingetippselt. Funktioniert aber ...
auswahl in einem treeview ->
Code:
procedure TFormEinst.TreeView1DblClick(Sender: TObject);
type TproceArray = Array of Array of string;
var node :TTreenode; myTreeView:TTreeView; pA: TproceArray; sT,eT :string; indI, tempI :integer;
begin
node := formeinst.TreeView1.Selected;
myTreeView := formeinst.TreeView1;
setlength(pA, 10,3);
log(0, 'TV.Node: ' + node.Text );
pA[0,0] :='copy_procedure_start';
pA[0,1] :='procedure StarteProg( prog, P_DLL_DAT, para, user, U_DLL_DAT_PW : string; runAS, ADT, as_Thread, is_Thread :integer );';
pA[0,2] :='end;// ENDE Procedure StarteProg //';
pA[1,0]:= 'copy_function_GCP_array';
pA[1,1]:= 'function GCP_array( RW , index : integer; wert1, wert2 :PChar ):string;';
pA[1,2]:= 'end; // function GCP_array ende';
pA[2,0] := 'copy_TFormLOG_JvStringGrid1DrawCell';
pA[2,1] := 'procedure TFormLOG.JvStringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);';
pA[2,2] := 'end; //ende procedure TFormLOG.JvStringGrid1DrawCell';
pA[3,0] := 'copy_procedure_EINSTELLUNG';
pA[3,1] := 'procedure EINSTELLUNG( RW: integer; ObjName , wertS1, wertS2 :String; wertI, HalteOffen :integer );';
pA[3,2] := 'end; //procedure EINSTELLUNG end';
pA[4,0] := 'copy_function_EINSTELLUNG_Records_IO';
pA[4,1] := 'function EINSTELLUNG_Records_IO( func, s1, s2 :string):string;';
pA[4,2] := 'end;//ende function EINSTELLUNG_Records_IO';
pA[5,0] := 'copy_function_EINSTELLUNG_translate_WertS1';
pA[5,1] := 'function EINSTELLUNG_translate_WertS1( s1 :string):string;';
pA[5,2] := 'end; //ende function EINSTELLUNG_translate_WertS1';
pA[6,0] := 'copy_procedure_log';
pA[6,1] := 'procedure log( svn: integer; msg :string );';
pA[6,2] := 'end;//end procedure log';
// eintrag suchen
for indI := 0 to length( pA ) - 1 do
begin
if ( node.Text = pA[ indI,0] ) then
begin
tempI := indI;
break;
end;
end;
FormEinst.Memo2.Clear;
Copy_Quellcodes( node.Text , pA[ tempI,1] , pA[ tempI , 2] );
end;
grundeinstellungen für parser setzen, treeview füllen usw. -->
Code:
Procedure Copy_Quellcodes( func, startTag, endTag :string );
var node :TTreenode; myTreeView:TTreeView; indI:integer;
begin
log(1, 'Copy_Quellcodes-> func : ' + func + ' -> begin');
// PROBLEMCHEN ---> die Conditionen dürfen NICHT im zu durchsuchenden Dokument stehen <<<<<<<<<<<<<<
// date fup.pas laden - durchsuchen - inhalt is memo or ( func = '00000000000000000')
node := formeinst.TreeView1.Selected;
myTreeView := formeinst.TreeView1;
if ( func = 'fill_treeview' ) then
begin
for indI := FormEinst.TreeView1.Items.Count - 1 downto 0 do
begin
node := formeinst.TreeView1.Items[ indI ];
myTreeView.Items.Delete( node );
end;
node := myTreeView.Items.Add(nil, 'copy_procedure_start');
node := myTreeView.Items.Add(nil, 'copy_function_GCP_array');
node := myTreeView.Items.Add(nil, 'copy_procedure_EINSTELLUNG');
myTreeView.Items.AddChild( node, 'copy_function_EINSTELLUNG_Records_IO');
myTreeView.Items.AddChild( node, 'copy_function_EINSTELLUNG_translate_WertS1');
node := myTreeView.Items.Add(nil, 'copy_procedure_log');
node := myTreeView.Items.Add(nil, 'copy_TFormLOG_JvStringGrid1DrawCell');
end;
if ( func = 'copy_procedure_start' ) or ( func = 'copy_function_GCP_array') or ( func = 'copy_procedure_EINSTELLUNG')
or ( func = 'copy_function_EINSTELLUNG_Records_IO') or ( func = 'copy_function_EINSTELLUNG_translate_WertS1') or ( func = 'copy_procedure_log') then
begin
// parser settings setzen
Parser( 'set_PArrayZeilen', 1 );
ParserArray[0,0] := 'E:\**********************\FuP.pas'; // pfad zur datei
ParserArray[0,1] := 'FormEinst.Memo2'; // ausgabe element
ParserArray[0,2] := '0'; // ergebnisvariante
ParserArray[0,3] := '1'; // startTag und endTag mit einfügen 1/0
//procedure_start suchstrings als
ParserArray[1,0] := func;
ParserArray[1,1] := startTag;
ParserArray[1,2] := endTag ;
Parser('parser_start',0);
end;
if ( func = 'copy_TFormLOG_JvStringGrid1DrawCell' ) then
begin
// parser settings setzen
Parser( 'set_PArrayZeilen', 1 );
ParserArray[0,0] := 'E:\**********************\UnitLog.pas'; // pfad zur datei
ParserArray[0,1] := 'FormEinst.Memo2'; // ausgabe element
ParserArray[0,2] := '0'; // ergebnisvariante
ParserArray[0,3] := '1'; // startTag und endTag mit einfügen 1/0
//procedure_start suchstrings als
ParserArray[1,0] := 'copy_procedure_start';
ParserArray[1,1] := startTag;
ParserArray[1,2] := endTag ;
Parser('parser_start',0);
end;
log(1,'Copy_Quellcodes-> func : ' + func + ' -> end');
end;
parser parameter setzen -->
Code:
function Parser( func: string; PArrayZeilen: integer ):string;
var indI : integer;
begin
// zeile 0 sind die einstellungen für den Parser
// 0 = pfad zur datei, 1 = ausgabeelement bsp:memo1 , 2 ausgabevariante, 3 = startTag und endTag mit einfügen 1/0
// array dynamischer inhalt 0 = Key, 1 = starttag, 2 = endtag;
if ( func = 'set_PArrayZeilen' ) and ( PArrayZeilen <> 0 ) then
begin
setlength( ParserArray , PArrayZeilen + 1, 5 );
log(0,'Parser->set_PArrayZeilen: ' + inttostr( length(ParserArray) ));
end;
if ( func = 'parser_start' ) and ( length( ParserArray ) > 1 ) then
begin
// zum lesen kann der parser direkt von datei lesen
form1.JvHTMLParser1.FileName := ParserArray[0,0]; // pfad zur datei
//parser suchstrings
form1.JvHtmlParser1.ClearConditions;
for indI := 1 to length(ParserArray) - 1 do
begin
form1.JvHtmlParser1.AddCondition( ParserArray[indi,0] , ParserArray[indi,1] , ParserArray[indi,2] , strtoint(ParserArray[0,2]) );
log(0,'Parser->AddCondition->startT->' + ParserArray[indi,1] );
log(0,'Parser->AddCondition->endT->' + ParserArray[indi,2] );
end;
//parser starten
form1.JvHtmlParser1.AnalyseFile; log(0,'Parser1.AnalyseFile');
end;
end;
ergebnisse -->
Code:
procedure TForm1.JvHTMLParser1KeyFound(Sender: TObject; Key, Results,
OriginalLine: string);
var indI :integer; compo : Tcomponent;
begin
//ausgabe element suchen wenn vorhanden
if ( ParserArray[0,1] <> '' ) then // 1 = ausgabeelement bsp:memo1
begin
compo := nil;
compo := FindComponentEx( ParserArray[0,1] );
if ( compo <> nil ) then
begin
log(0,'Form1.JvHTMLParser1KeyFound->compo found');
end else
begin
log(9,'Form1.JvHTMLParser1KeyFound->ERROR');
EXIT;
end;
end;
// arrayzeilen ermitteln
for indI := 1 to length(ParserArray) - 1 do
begin
log(0,'Form1.JvHTMLParser1KeyFound->durchgang: ' + inttostr( indi ) +' key:' + ParserArray[indi,0] );
if ( compo.ClassType = TMemo ) and ( key = ParserArray[indi,0] ) then
begin
log(0,'Form1.JvHTMLParser1KeyFound->key found');
//startTag und endTag mit einfügen 1/0
if ( ParserArray[0,3] = '1' ) then TMemo( compo ).lines.add( ParserArray[indi,1] );
TMemo( compo ).lines.add( results );
//startTag und endTag mit einfügen 1/0
if ( ParserArray[0,3] = '1' ) then TMemo( compo ).lines.add( ParserArray[indi,2] );
{zur ersten Zeile:}
TMemo( compo ).Perform(EM_LineScroll, 0 , - TMemo( compo ).Lines.Count-1);
end;
end;
end;
schreiben wenn fertig -->
Code:
procedure TForm1.JvHTMLParser1KeyFoundEx(Sender: TObject; Key, Results,
OriginalLine: string; TagInfo: TTagInfo; Attributes: TStrings);
var compo : Tcomponent;
begin
// im array schreiben fertig
log(0,'Form1.JvHTMLParser1KeyFoundEx->Parser Done');
if ( ParserArray[0,1] <> '' ) then // 1 = ausgabeelement bsp:memo1
begin
compo := nil;
compo := FindComponentEx( ParserArray[0,1] );
if ( compo <> nil ) then
begin
log(0,'Form1.JvHTMLParser1KeyFoundEx->compo found');
clipboard.AsText := TMemo( compo ).Text;
end else
begin
log(9,'Form1.JvHTMLParser1KeyFoundEx->ERROR');
EXIT;
end;
end;
end;
|