| Autor | Beitrag | 
| Terra23 
          Beiträge: 872
 
 Win 8
 Delphi 7
 
 | 
Verfasst: So 08.07.12 17:04 
 
Hi!
 Ich habe leider schon wieder ein Problem. Ich habe es bereits geschafft, mit Hilfe der Suche und einigen Threads, den Quellcode einer Seite (z.B. dieser Seite ) in ein Memo zu laden. Nun möchte ich aus dem Quelltext nur den String auslesen, in dem das Wort "300px-" vorkommt.
 Hier mal für euch die Seite mit dem Quelltext zum Nachvollziehen: Klick Es sind auf diesen Wikia-Seiten immer so viele Images und Thumbnails verlinkt, deswegen muss es der folgende Teiltext sein, der "300px-" enthält.
 Für diese Beispielseite wäre das diese URL:
images4.wikia.nocook...rld-BP01-EN-R-1E.png Leider komme ich mit Pos und Copy nicht wirklich weiter, da ich ja, wie gesagt, nur die URL haben will, die den String "300px-" enthält.
 Und wenn ich diese URL dann extrahiert habe, wie kriege ich sie in ein Image geladen?
 Kann mir jemand vielleicht ein wenig unter die Arme greifen (gern auch mit passenden Suchbegriffen, sofern diese nicht Pos und Copy sind).    Gruß,
 Terra
Moderiert von  Narses: Topic aus Sonstiges (Delphi) verschoben am So 08.07.2012 um 18:34_________________Hasta La Victoria Siempre 
 Zuletzt bearbeitet von Terra23 am Di 10.07.12 18:44, insgesamt 1-mal bearbeitet
 | 
|  | 
| MDX 
          Beiträge: 595
 Erhaltene Danke: 4
 
 Windows 8.1, Linux Debian 8, Android Lollipop
 Delphi, PHP, Java (Android)
 
 | 
Verfasst: So 08.07.12 21:08 
 
Entweder du suchst alle src="URL"-Tags aus dem Quelltext heraus und filterst dann die Adresse raus wo "300px" vorkommt oder wenn es auf jeder Seite der Fall ist, dann filtere von src=" nach " width="300", sollte mit Pos, PosEx und Copy möglich sein.
 Aber:
 Du kannst hier auch mit Pos und PosEx/Copy nach <link rel="image_src" href=" und " /> filtern und dann die Adresse von 100px mit StringReplace zu 300px umändern.
 
 
 In ein Image bekommst du Sie geladen, wenn du sie herunterlädst, anders geht das IMHO nicht...
 | 
|  | 
| Terra23  
          Beiträge: 872
 
 Win 8
 Delphi 7
 
 | 
Verfasst: Mo 09.07.12 17:07 
 
Sorry, aber ich bin dazu irgendwie zu dämlich. Ich kann nichtmal die URL des Bildes extrahieren...  _________________Hasta La Victoria Siempre | 
|  | 
| bummi 
          Beiträge: 1248
 Erhaltene Danke: 187
 
 XP - Server 2008R2
 D2 - Delphi XE
 
 | 
Verfasst: Mo 09.07.12 17:10 
 
Du hast die nötigen Suchbegriffe bereits selbst genannt und darum gebeten Dir damit nicht unter die Arme zu greifen.
Das sind Basics die man sich erarbeiten muss....
 _________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
 DRY DRY KISS
 | 
|  | 
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Mo 09.07.12 17:16 
 
Poste doch einfach mal was du versucht hast.    Alternativ könntest du einen HTML Parser verwenden, sei es der von den JEDIs (ich glaube da gibt es einen, oder?   ), der des Internet Explorers oder ein anderer für Delphi.
 	  |  MDX hat folgendes geschrieben  : |  	  | In ein Image bekommst du Sie geladen, wenn du sie herunterlädst, anders geht das IMHO nicht... | 
 Ja, richtig, wobei man da immer mit Streams arbeiten kann. Herunterladen in den Arbeitsspeicher reicht also. (Nur zur Klarstellung, dass keine Datei benötigt wird, wenn du von Herunterladen schreibst.) | 
|  | 
| Terra23  
          Beiträge: 872
 
 Win 8
 Delphi 7
 
 | 
Verfasst: Mo 09.07.12 17:26 
 
Ja, das mache ich gerne.
 												| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 
 | procedure TForm1.Button2Click(Sender: TObject);var S: String;
 Stelle: Integer;
 Start: Integer;
 I: Integer;
 Stop: Integer;
 begin
 Stelle := Pos('300px-', Memo1.Text);
 
 For I := Stelle DownTo 0 Do
 If Memo1.Text[I] = '"'
 Then Begin
 Start := I+1;
 Break;
 End;
 
 For I := Start To Length(Memo1.Text) Do
 If Memo1.Text[I] = '"'
 Then Begin
 Stop := I;
 Break;
 End;
 
 S := Copy(Memo1.Text, Start, (Stop-Start));
 Label1.Caption := S;
 end;
 |  Ich weiß, dass die Variable "Start" richtig befüllt wird; das habe ich probiert. Inzwischen weiß ich auch, wo der Fehler lag...    Gruß,
 Terra
 EDIT: QUELLCODE BEHOBEN!!!Moderiert von  Narses: Beiträge zusammengefasst Hab es jetzt raus. Es darf nicht heißen...
 		                       Delphi-Quelltext 
 ... sondern muss heißen...
 		                       Delphi-Quelltext 
 Habe das jetzt mit verschiedenen URLs ausprobiert und es klappt jedes Mal, die URL des Bildes zu extrahieren.
 Mal ne andere Frage: Geht das Laden des Quelltextes auch irgendwie schneller? Also im eigentlichen Programm will ich den Text nicht erst in ein Memo laden und dann extrahieren und dann das Bild anzeigen. Es soll für den User so aussehen, als wird nur das Bild gezeigt. Geht das vielleicht, wenn ich den Quelltext in eine Stringlist lade? Wenn ja, wie mache ich das?_________________Hasta La Victoria Siempre 
 Zuletzt bearbeitet von Terra23 am Mo 09.07.12 17:42, insgesamt 2-mal bearbeitet
 | 
|  | 
| haentschman 
          Beiträge: 285
 Erhaltene Danke: 33
 
 
 DX10 Berlin Professional
 
 | 
Verfasst: Mo 09.07.12 19:00 
 
Hallo...
 	  | Zitat: |  	  | Geht das vielleicht, wenn ich den Quelltext in eine Stringlist lade? Wenn ja, wie mache ich das? | 
 1. Stringlist erzeugen
 2. Text in Stringlist (wie beim Memo)
 3. damit arbeiten
 4. Stringlist freigeben
   | 
|  | 
| Terra23  
          Beiträge: 872
 
 Win 8
 Delphi 7
 
 | 
Verfasst: Mo 09.07.12 19:08 
 
Wäre das so richtig?
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 
 | procedure TForm1.Button1Click(Sender: TObject);begin
 Quellstream := TStringList.Create;
 Try
 Quellstream.Text := IdHTTP1.Get(Edit1.Text);
 MEINE ARBEIT MIT DEM STREAM
 Finally
 Quellstream.Free;
 End;
 end;
 |  Ich habe noch nie wirklich mit dem Try-Finally-End gearbeitet, daher nochmal meine Rückfrage.
 Gruß,
 Terra
 PS: Kann mir jemand erläutern, was Try-Finally-End macht?_________________Hasta La Victoria Siempre | 
|  | 
| MDX 
          Beiträge: 595
 Erhaltene Danke: 4
 
 Windows 8.1, Linux Debian 8, Android Lollipop
 Delphi, PHP, Java (Android)
 
 | 
Verfasst: Mo 09.07.12 19:26 
 
		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 
 | tryVersucheIrgendwas;
 finally
 HatFuntkioniertAlsoIrgendwasAnderesMachen;
 end;
 |  daneben gibts auch noch
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 
 | tryVersucheIrgendwas;
 except
 HatNichtFunktioniertAlsoFehlerAbfangen;
 end;
 |  Achja, willst du mehr als eine Zeile Code nach try , finally  oder except  ausführen musst du die Anweisungen alle in einen begin , end  Block setzen:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 
 | trybegin
 [...]
 end;
 finally
 begin
 [...]
 end;
 end;
 |  | 
|  | 
| haentschman 
          Beiträge: 285
 Erhaltene Danke: 33
 
 
 DX10 Berlin Professional
 
 | 
Verfasst: Mo 09.07.12 20:07 
 
Ergänzung:
 egal was zwischen try und finally passiert... der finally Block wird immer ausgeführt. Mal angenommen du wölltest deine procedure mit exit verlassen... der finally Block wird dann nach dem exit abgearbeitet und erst dann die procedure verlassen.
 | 
|  | 
| Terra23  
          Beiträge: 872
 
 Win 8
 Delphi 7
 
 | 
Verfasst: Mo 09.07.12 20:13 
 
Danke für eure Hilfe.
 Kann mir noch kurz jemand von euch erklären, warum ich keine Bilder laden kann?
 Erklärung:
 In Label1.Caption steht die URL des Bildes, das ich laden will.
 Hier mein aktueller Code:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 
 | ImgStream := TMemoryStream.Create;Try
 Begin
 IdHTTP1.Get(Label1.Caption, ImgStream);
 ImgStream.Position := 0;
 JvImage1.Picture.Graphic.LoadFromStream(ImgStream);
 End;
 Finally;
 ImgStream.Free;
 End;
 |  Ich würde das Bild gern anzeigen lassen ohne es auf der Festplatte zwischenzuspeichern. Ich hatte zwar einen langen Code gefunden (hier ) aber das geht nur für JPGs. Wenn ich ein PNG laden will, führt dies eine Exception herbei (logisch).
 Leider kann ich probieren, wie ich will ... ich finde nirgends die passende Antwort..._________________Hasta La Victoria Siempre | 
|  | 
| Narses 
          
  Beiträge: 10183
 Erhaltene Danke: 1256
 
 W10ent
 TP3 .. D7pro .. D10.2CE
 
 | 
Verfasst: Mo 09.07.12 21:46 
 
Moin!
 	  |  MDX hat folgendes geschrieben  : |  	  | Achja, willst du mehr als eine Zeile Code nach try, finally oder except ausführen musst du die Anweisungen alle in einen begin, end Block setzen: 
 | 
 Für´s Protokoll: Das ist nicht korrekt, das begin/end ist hier überflüssig. Die try-Blöcke sind wie begin eine Klammer.    		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 
 | tryfinally
 end;
 |  cu
 Narses_________________ There are 10 types of people - those who understand binary and those who don´t.
 | 
|  | 
| bummi 
          Beiträge: 1248
 Erhaltene Danke: 187
 
 XP - Server 2008R2
 D2 - Delphi XE
 
 | 
Verfasst: Mo 09.07.12 21:52 
 
Wenn Du ein PNG laden willst musst Du ein TPNGImage erzeugen, dieses aus dem Stream laden und dann Image.Picture.Graphic zuweisen (assign) und wieder freigeben. _________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
 DRY DRY KISS
 | 
|  | 
| Terra23  
          Beiträge: 872
 
 Win 8
 Delphi 7
 
 | 
Verfasst: Mo 09.07.12 23:01 
 
@bummi: Aber sowohl das normale Image als auch das Image aus den Jedi-Komponenten müssten doch eigentlich beide Dateiformate öffnen können. Wenn ich das über den Objektinspektor zuweise, klappt das ja auch. Ich bin verwirrt...
 @narses: Danke für die Richtigstellung bezüglich Begin / End...
 _________________Hasta La Victoria Siempre | 
|  | 
| MDX 
          Beiträge: 595
 Erhaltene Danke: 4
 
 Windows 8.1, Linux Debian 8, Android Lollipop
 Delphi, PHP, Java (Android)
 
 | 
Verfasst: Mo 09.07.12 23:21 
 | 
|  | 
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Di 10.07.12 01:38 
 
	  |  Terra23 hat folgendes geschrieben  : |  	  | @bummi: Aber sowohl das normale Image als auch das Image aus den Jedi-Komponenten müssten doch eigentlich beide Dateiformate öffnen können. Wenn ich das über den Objektinspektor zuweise, klappt das ja auch. Ich bin verwirrt... | 
 Da gibt es aber die Dateierweiterung als zusätzliche Information. Deshalb kann beim Laden einer gespeicherten Datei automatisch die passende Klasse benutzt werden.
 Wenn du aber ein Bild aus einem Stream lädst, gibt es diese Information nicht. Und deshalb musst du die korrekte Klasse selbst zur Erzeugung des Bildobjekts auswählen. | 
|  | 
| Terra23  
          Beiträge: 872
 
 Win 8
 Delphi 7
 
 | 
Verfasst: Di 10.07.12 13:17 
 
Hi!
 Ich habe jetzt mal die Dateiendung ausgelesen. Das klappt auch einwandfrei. Die Endung speichere ich in der String-Variablen namens "Art" zwischen.
 Dann starte ich folgende Abfrage, die eigentlich auch korrekt sein müsste:
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 
 | If Art = 'jpg'Then Begin
 Try
 ImgStream := TMemoryStream.Create;
 IdHTTP1.Get(Label1.Caption, ImgStream);
 ImgStream.Position := 0;
 JPGBild := TJPEGImage.Create;
 JPGBild.LoadFromStream(ImgStream);
 JvImage1.Picture.Assign(JPGBild);
 Finally
 JPGBild.Free;
 ImgStream.Free;
 End;
 End;
 
 If Art = 'png'
 Then Begin
 Try
 ImgStream := TMemoryStream.Create;
 IdHTTP1.Get(Label1.Caption, ImgStream);
 ImgStream.Position := 0;
 PNGBild := TPNGImage.Create;
 PNGBild.LoadFromStream(ImgStream);
 JvImage1.Picture.Assign(PNGBild);
 Finally
 PNGBild.Free;
 ImgStream.Free;
 End;
 End;
 |  Wenn ich das Programm dann starten will, bekomme ich die Meldung "Undefinierter Bezeichner: 'TPNGImage'", was ich mir leider nicht erklären kann. Ich dachte, wenn ich die Variablen so definiere...
 		                       Delphi-Quelltext 
 									| 1:2:
 
 | var JPGBild: TJPEGImage;PNGBild: TPNGImage;
 |  ... dass es dann funktionieren würde.
 Kann mich mal jemand bitte auf den richtigen Weg schubsen??_________________Hasta La Victoria Siempre | 
|  | 
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Di 10.07.12 14:50 
 
Du hast die Unit für TPngImage nicht eingebunden, deshalb findet Delphi die Klasse nicht. Die Unit heißt in der Regel PngImage, sei es die von Delphi selbst oder eine fremde. | 
|  | 
| bummi 
          Beiträge: 1248
 Erhaltene Danke: 187
 
 XP - Server 2008R2
 D2 - Delphi XE
 
 | 
Verfasst: Di 10.07.12 14:58 
 
häng mal in eine Deiner Units
 		                       Delphi-Quelltext 
 									| 1:2:
 
 | initializationRegisterClasses([TIcon, TMetafile, TBitmap, TJPEGImage,TPngImage]);
 |  bzw. was Du davon brauchst._________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
 DRY DRY KISS
 | 
|  | 
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Di 10.07.12 16:32 
 
Das ist hier nicht das Problem, dann würde die Meldung lauten, dass die Klasse nicht gefunden wurde. Hier handelt es sich nicht um einen Laufzeitfehler sondern um einen Fehler beim Kompilieren.   | 
|  |