Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Text in Memo finden (https://www.delphipraxis.net/91759-text-memo-finden.html)

Tommy1988 9. Mai 2007 12:51


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?

Blackheart 9. Mai 2007 12:56

Re: Text in Memo finden
 
Pos, Copy

Tommy1988 9. Mai 2007 12:58

Re: Text in Memo finden
 
Leider kann ich mir daraus keinen Reim stricken :?

mkinzler 9. Mai 2007 13:01

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)

Sherlock 9. Mai 2007 13:03

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

Tommy1988 9. Mai 2007 13:20

Re: Text in Memo finden
 
Hab was gefunden, das das ist zu spezifisch:

Delphi-Quellcode:
var text, wort: String;
begin
  text := 'Das ist wirklich toll!';
  wort := Copy(text, 8, 8);
  // wort enthält nun "wirklich"
denn dieses (text, 8, 8);
.. das <title> steht ja auch nich immer ab der selben stelle.

Blackheart 9. Mai 2007 13:40

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;

Tommy1988 9. Mai 2007 13:50

Re: Text in Memo finden
 
Mh, ok,
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;
das sagt mir leider nicht viel, ohne zusatz von worten.

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:
function Between(<title>,</title>,Text:String):String;
begin
  Delete(Text,1,Pos(<title>,Text));
  Delete(Text,Pos(</title>,Text),Length(Text));
  Result:=Text;
end;
funktioniert nicht.

Blackheart 9. Mai 2007 13:56

Re: Text in Memo finden
 
Delphi-Quellcode:
Caption:=Between('>','<',Memo1.Text);

joachimd 9. Mai 2007 14:24

Re: Text in Memo finden
 
Zitat:

Zitat von Blackheart
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;

passt nicht, wenn er nach längeren Tags sucht (zB <title>...</title>). Dann bitte folgendes:
Delphi-Quellcode:
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;
Verwendung der Funktion:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption:=Between('<title>','</title>',Memo1.Text);
end;

Tommy1988 10. Mai 2007 16:07

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:
var Text: String;
begin
  Text := Memo1.Text;
  Text := StringReplace(text, '<head>', '<head>'+Edit1.Text+ []);
end;
Ich möchte gerne im Memo das Tag <head> aufsuchen, und AB <head> den inhalt von ein Paar Editfeldern hinzufügen.

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.

Blackheart 10. Mai 2007 16:17

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]);

joachimd 10. Mai 2007 16:28

Re: Text in Memo finden
 
Zitat:

Zitat von Blackheart
Ein Blick in die Delphihilfe hätte das Problem wahrscheinlich gelöst. :wink:
Delphi-Quellcode:
StringReplace(text, '<head>', '<head>' + Edit1.Text, [rfReplaceAll, rfIgnoreCase]);

reicht nicht!
@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;

Tommy1988 10. Mai 2007 18:23

Re: Text in Memo finden
 
Erm, und der Aufruf sieht dann wie folgt aus:

Delphi-Quellcode:
ReplaceBetween('<head>','<head>',Memo1.Text);
Falsch oder ? :cry:

marabu 10. Mai 2007 19:01

Re: Text in Memo finden
 
Hallo Tommy,

du musst das Ergebnis der Funktion auch seiner Verwendung zuführen:

Delphi-Quellcode:
 Memo1.Text := ReplaceBetween('<head>', '</head>', Memo1.Text);
Es gibt aber auch noch einen zuverlässigeren Weg:

Delphi-Quellcode:
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;
Natürlich brauchst du noch die Funktion GetDocument:

Delphi-Quellcode:
function GetDocument(const markup: WideString): IDispatch;
var
  doc: OleVariant;
begin
  Result := CoHtmlDocument.Create;
  doc := Result;
  doc.Open;
  doc.Write(markup);
  doc.Close;
end;
Dabei darfst du nicht vergessen die Units ActiveX und Mshtml einzubinden.

Freundliche Grüße vom marabu

Tommy1988 11. Mai 2007 16:27

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:
Memo1.Text := ReplaceBetween
('<head>', '<head>', Memo1.Text);
[Fehler] MetaTag.pas(47): E2035 Nicht genügend wirkliche Parameter

marabu 11. Mai 2007 16:39

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:
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;
Aber immer dran denken: Diese Methode funktioniert nur wenn "sauberes" HTML vorliegt und nur das erste Auftreten der Tag-Kombination bearbeitet werden soll.

Tommy1988 11. Mai 2007 18:25

Re: Text in Memo finden
 
Ich scheitere leider.
Die Syntax stimmt bei mit nicht.

Zitat:

Edit: Es muss noch der Ersetzungstext als viertes Argument übergeben werden.
Wie füge ich denn 2 Editfelder als 4. Argument ein?

Blackheart 11. Mai 2007 18:35

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