![]() |
Text in Memo finden
Hallo an alle,
ich möchte gerne den Text zwischen <title> und </title> in einem Memo finden, und als Caption angezeigt bekommen. Nu das Problem, ich weis nicht, wie ich gerade dieses Stück aus dem Memo holen soll. Kann mir wer Hilfe leisten? |
Re: Text in Memo finden
Pos, Copy
|
Re: Text in Memo finden
Leider kann ich mir daraus keinen Reim stricken :?
|
Re: Text in Memo finden
Mit Pos kannst du Position eines Strings in einem anderen finden (Beginn Anfang-Tag, Beginn-Ende-Tag)und mit Copy kannst du einen teil eines Strings ausschneiden (von Beginn-Anfangtag+Länge Anfang-Tag bis Beginn Endetag-1)
|
Re: Text in Memo finden
Der Text in Memos ist in Lines:TStrings untergebracht. Iteriere durch die Lines und führe auf jeden String ein pos aus.
Sherlock |
Re: Text in Memo finden
Hab was gefunden, das das ist zu spezifisch:
Delphi-Quellcode:
denn dieses (text, 8, 8);
var text, wort: String;
begin text := 'Das ist wirklich toll!'; wort := Copy(text, 8, 8); // wort enthält nun "wirklich" .. das <title> steht ja auch nich immer ab der selben stelle. |
Re: Text in Memo finden
Delphi-Quellcode:
function Between(Tag,Tag2,Text:String):String;
begin Delete(Text,1,Pos(Tag,Text)); Delete(Text,Pos(Tag2,Text),Length(Text)); Result:=Text; end; |
Re: Text in Memo finden
Mh, ok,
Delphi-Quellcode:
das sagt mir leider nicht viel, ohne zusatz von worten.
function Between(Tag,Tag2,Text:String):String;
begin Delete(Text,1,Pos(Tag,Text)); Delete(Text,Pos(Tag2,Text),Length(Text)); Result:=Text; end; tag und tag2 stellen wohl <title> und </title> dar, wenn ja, wie sage ich der funktion denn, dass es diese beiden tags sind? denn:
Delphi-Quellcode:
funktioniert nicht.
function Between(<title>,</title>,Text:String):String;
begin Delete(Text,1,Pos(<title>,Text)); Delete(Text,Pos(</title>,Text),Length(Text)); Result:=Text; end; |
Re: Text in Memo finden
Delphi-Quellcode:
Caption:=Between('>','<',Memo1.Text);
|
Re: Text in Memo finden
Zitat:
Delphi-Quellcode:
Verwendung der Funktion:
function Between(Tag1, Tag2, Text: String): String;
begin Delete(Text,1,Pos(Tag1,Text)+length(Tag1)-1); //Änderung hier! Delete(Text,Pos(Tag2,Text),Length(Text)); Result:=Text; end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin Caption:=Between('<title>','</title>',Memo1.Text); end; |
Re: Text in Memo finden
Halöle, danke an euch ALLE. hat gut geklappt.
Habe mich auch länger jetzt mit Strings ersetzen beschäftigt, nur leider finde ich für mein Problem keine Lösung.
Delphi-Quellcode:
Ich möchte gerne im Memo das Tag <head> aufsuchen, und AB <head> den inhalt von ein Paar Editfeldern hinzufügen.
var Text: String;
begin Text := Memo1.Text; Text := StringReplace(text, '<head>', '<head>'+Edit1.Text+ []); end; So wie ich es probiert habe, siehe Code, klappt es nicht. Ihr werdet sicher über den Code lachen, aber anders weis ich nicht wie das gehen soll. |
Re: Text in Memo finden
Ein Blick in die Delphihilfe hätte das Problem wahrscheinlich gelöst. :wink:
Delphi-Quellcode:
StringReplace(text, '<head>', '<head>' + Edit1.Text, [rfReplaceAll, rfIgnoreCase]);
|
Re: Text in Memo finden
Zitat:
@Tommy: Such Dir die Positionen von <HEAD> und </HEAD> und bastel Dir einen String über Copy zusammen:
Delphi-Quellcode:
function ReplaceBetween(Tag1, Tag2, Text, NewText: String): String;
var iTag1, iTag2: integer; begin iTag1:=Pos(Tag1,Text)+length(Tag1); iTag2:=Pos(Tag2,Text); Result:=Copy(Text,1,iTag1)+NewText+Copy(Text,iTag2+1,Length(Text)); end; |
Re: Text in Memo finden
Erm, und der Aufruf sieht dann wie folgt aus:
Delphi-Quellcode:
Falsch oder ? :cry:
ReplaceBetween('<head>','<head>',Memo1.Text);
|
Re: Text in Memo finden
Hallo Tommy,
du musst das Ergebnis der Funktion auch seiner Verwendung zuführen:
Delphi-Quellcode:
Es gibt aber auch noch einen zuverlässigeren Weg:
Memo1.Text := ReplaceBetween('<head>', '</head>', Memo1.Text);
Delphi-Quellcode:
Natürlich brauchst du noch die Funktion GetDocument:
procedure TDemoForm.ButtonClick(Sender: TObject);
var doc: IDispatch; ec: IHTMLElementCollection; title: IHTMLTitleElement; begin doc := GetDocument(Memo.Text); // oder direkt aus dem Internet mit // doc := GetDocument(HTTP.Get('http://localhost')); with doc as IHTMLDocument3 do begin ec := getElementsByTagName('title'); if ec.length > 0 then begin title := ec.item(0, null) as IHTMLTitleElement; title.text := 'potzblitz'; end; Memo.Lines.Text := documentElement.outerHTML; end; end;
Delphi-Quellcode:
Dabei darfst du nicht vergessen die Units ActiveX und Mshtml einzubinden.
function GetDocument(const markup: WideString): IDispatch;
var doc: OleVariant; begin Result := CoHtmlDocument.Create; doc := Result; doc.Open; doc.Write(markup); doc.Close; end; Freundliche Grüße vom marabu |
Re: Text in Memo finden
Langsam verstehe ich hier nicht mehr..
Ich bleibe lieber bei Methode 1 (ReplaceBetween), auch wenn ich nicht weis, wie ich es richtig anwende. Meine BDS ist eine PE deswegen kein MShtml. Edit:
Delphi-Quellcode:
[Fehler] MetaTag.pas(47): E2035 Nicht genügend wirkliche Parameter
Memo1.Text := ReplaceBetween
('<head>', '<head>', Memo1.Text); |
Re: Text in Memo finden
Hallo Tommy,
wie du ReplaceBetween() richtig anwendest, habe ich dir gleich am Anfang meines Beitrages beschrieben. Den Rest kannst du getrost ignorieren. Er ist vielleicht für Mitleser von Nutzen, die erkennen, dass die Ersetzungsmethode bei auskommentierten HTML-Codes scheitern kann. Freundliche Grüße Edit: Es muss noch der Ersetzungstext als viertes Argument übergeben werden. Edit2: Im Code von Joachim ist noch ein kleiner Fehler - hier die Korrektur:
Delphi-Quellcode:
Aber immer dran denken: Diese Methode funktioniert nur wenn "sauberes" HTML vorliegt und nur das erste Auftreten der Tag-Kombination bearbeitet werden soll.
function ReplaceBetween(Tag1, Tag2, Text, NewText: string): string;
var iTag1, iTag2: Integer; begin iTag1 := Pos(Tag1, Text) + Length(Tag1); iTag2 := Pos(Tag2, Text); Result := Copy(Text, 1, iTag1 - 1) + NewText + Copy(Text, iTag2, Length(Text)); end; |
Re: Text in Memo finden
Ich scheitere leider.
Die Syntax stimmt bei mit nicht. Zitat:
|
Re: Text in Memo finden
Du solltest Dir vieleicht noch mal den Crashkurs anschauen. :wink:
Delphi-Quellcode:
Memo1.Text:=ReplaceBetween('<head>','</head>',Memo1.Text,Edit1.Text);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz