Seite 2 von 2

Verfasst: 12.09.2008 13:43
von Fluid Byte
Ähhh, ja ..... :freak:

Du lädst 'ne HTML-Datei, supi! Beantwortet meine Frage aber nicht ...

Verfasst: 12.09.2008 13:45
von stalky13
als erstes markiert man mit der maus ganz normal eine bestimmte stelle im text... dann wird die markierung in die zwischenablage kopiert und dann aus der zwischenablage in einen normalen string kopiert und im html text gesucht wird der text nur eineinziges mal im html code gefunden dann wird um den text ein anker gesetzt andernfalls wird ein fehler ausgegeben "text nicht oder zuoft gefunden" oder so ... dann muss man halt einen kürzeren oder längeren text markieren ja anch dem...

hier mal ein democode der funzt ... wird nur ne html datei benötigt

Code: Alles auswählen

#OLECMDID_COPY = 12
#OLECMDEXECOPT_DONTPROMPTUSER = 2
#Web_400 = 0
Ankername.s = "Anker"
Quelldatei.s = "D:\Quelle.htm"
Zieldatei.s = "D:\Ziel.htm"

Procedure SetAnkerIntoHTML(source.s, destination.s, text.s, anker.s)
  If Not text Or Not anker : ProcedureReturn 2 : EndIf          ;Parameter Prüfen
  If Not source Or Not destination : ProcedureReturn 1 : EndIf  ;Parameter Prüfen
  If Not ReadFile(0, source)  ;Quelle öffnen
    ProcedureReturn 1
  EndIf
  html.s = Space(Lof(0)) ;Speicher reservieren
  ReadData(0, @html, Lof(0))  ;Daten Lesen
  CloseFile(0)  
  cnt = CountString(html, text) ;Text zählen (darf nur einmal vorkommen
  If cnt = 0 : ProcedureReturn 2 : EndIf
  If cnt > 1 : ProcedureReturn 3 : EndIf
  pos = FindString(html, text, 1) ;Text position ermitteln
  If pos = 0 : ProcedureReturn 2 : EndIf
  outhtml.s = Left(html, pos-1) + "<a name="+Chr(34)+anker+Chr(34)+">" ;Teil vor dem text + anker anfang
  outhtml = outhtml + Mid(html, pos, Len(text)) + "</a>"  ;Text + Anker ende
  outhtml = outhtml + Right(html, Len(html)-Len(text)-(pos-1)) ;Teil nach dem Text
  If Not CreateFile(0, destination) ;Ziel datei erstellen
    ProcedureReturn 1
  EndIf
  WriteData(0, @outhtml, Len(outhtml)) ;HTML code reinschreiben
  CloseFile(0)  ;fertig...
  ProcedureReturn 0
EndProcedure


If OpenWindow(0, 0, 0, 600, 300, "WebGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  WebGadget(#Web_400, 10, 10, 580, 280, Quelldatei)
  timestamp = ElapsedMilliseconds()+5000
  While GetGadgetAttribute(#Web_400, #PB_Web_Busy) Or ElapsedMilliseconds() < timestamp
    WindowEvent()
  Wend
  
  SetClipboardText("") ;Zwischenablge leeren
  WebObject.IWebBrowser2 = GetWindowLong_(GadgetID(#Web_400), #GWL_USERDATA) ;Pointer zum Interface holen
  WebObject\ExecWB(#OLECMDID_COPY, #OLECMDEXECOPT_DONTPROMPTUSER, 0, 0) ;Markierten text kopieren
  Sprungziel.s = GetClipboardText() ;Zwischenablage auslesen
  res = SetAnkerIntoHTML(Quelldatei, Zieldatei, Sprungziel, Ankername) ;Text Suchen und Anker einbinden
  If res = 1 ;File Error
    MessageRequester("Fehler", "File Error!", #MB_ICONERROR)
  ElseIf res = 2 ;Text nicht gefunden
    MessageRequester("Fehler", "Text konnte nicht im HTML-Code gefunden werden!", #MB_ICONERROR)
  ElseIf res = 3 ;Text zu oft
    MessageRequester("Fehler", "Text wurde zu oft im HTML-Code gefunden!", #MB_ICONERROR)
  Else
    SetGadgetText(#Web_400, Zieldatei+"#"+Ankername) ;HTML Code Laden
  EndIf


  Repeat 
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
einfach mal ne html datei erstellen und pfad anpassen dann starten und innerhalb von 5 sec eine stelle im text markieren. dann wird eine neu html datei erstellt (Pfad anpassen!) und geöffnet. :allright: ... biite entschuldigt meine unordung :(

Verfasst: 12.09.2008 13:55
von AND51
> Wie willst du jetzt mit einem Anker bspw. zur Zeile #3 springen?
OK, ich wusste vorher natürlich auch nicht, dass "reiner Text" angezeigt werden soll. Hätte ja sein können, dass es HTML-Code ist, der z. B. BR oder P-Tags enthält. Man zählt einfach 2 dieser Tags ab und schon ist man in der 3. Zeile. Oder man sucht im Quellcode nach #CRLF$ , oder, oder, oder - je nachdem wie der Quellcode vorliegt.

> Auch wenns vielleicht nicht ganz ernst gemeint war
Richtig, das war wirklich nicht ernst gemeint. Ich wollte nur eine Reaktion wie diese provozieren:
Fluidi hat geschrieben:piss mal nicht ganz so 'nen dicken Strahl ...
Weil ich wusste, das sowas kommen würde... :lol: Hab grad nen bisschen Spaß dran.


@ stalky
Warum der umständliche Weg über die Zwischenablage?
Es geht doich einfacher mit GetGadgetItemText() und #PB_Web_SelectedText...
Du brauchst die HTML-Datei nicht auf die Festplatte zwischenspeichern, wenn du dir nur mal richtig die Befehle angucken würdest!
Ich sag's ja imemr wieder, man soll sich Zeit nehmen und nen bisschen in der Hilfedatei schmökern, dann kommt man von selbst auf die Lösung seiner Probleme.

Verfasst: 12.09.2008 14:04
von stalky13
AND51 hat geschrieben:Es geht doich einfacher mit GetGadgetItemText() und #PB_Web_SelectedText...
das kann ja jeder 8)
AND51 hat geschrieben:Du brauchst die HTML-Datei nicht auf die Festplatte zwischenspeichern
doch aus zwei gründen 1. weil mir die anker ja auch noch nach beenden des programms erhalten bleiben sollen und 2. weil sonst die bilder nicht angezeigt werden wenn ich den html text in das gadget streame weil er dann den pfad zu den bildern ned kennt.

Verfasst: 12.09.2008 14:21
von Fluid Byte
Abgefahren ... :shock:

Ich weiß zwar nicht genau was der spätere Verwendungszweck sein wird (gibt es einen?) aber ich denke diese Methode ist wohl eher "suboptimal". Zumal das Ganze in die Hose geht sobald ein Wörter mehr als einmal vorhanden ist.

Verfasst: 12.09.2008 14:38
von stalky13
Fluid Byte hat geschrieben:Zumal das Ganze in die Hose geht sobald ein Wörter mehr als einmal vorhanden ist.
mann kann ja auch einen ganzen satzt markieren. und wenn der markierte text mehrmals vorhanden ist dann wird eh ein fehler ausgegeben.

Fluid Byte hat geschrieben:Ich weiß zwar nicht genau was der spätere Verwendungszweck sein wird (gibt es einen?)
jepp :wink: ... Stichwortlisten ... beim auswählen eines Stichwortes wird eine bestimmte HTML Datei an einer bestimmten stelle angezeigt

Verfasst: 12.09.2008 14:40
von ts-soft
Man kann die Anker auch nummerieren für jedes vorkommen. Je mehr
Anker man zu Wasser läßt, um so sicherer steht das Boot :mrgreen: