WebGadget zur Zeile x scrollen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Ähhh, ja ..... :freak:

Du lädst 'ne HTML-Datei, supi! Beantwortet meine Frage aber nicht ...
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
stalky13
Beiträge: 28
Registriert: 11.12.2007 18:59
Wohnort: Jever

Beitrag 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 :(
Aus großer Kraft folgt große Verantwortung.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
stalky13
Beiträge: 28
Registriert: 11.12.2007 18:59
Wohnort: Jever

Beitrag 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.
Aus großer Kraft folgt große Verantwortung.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
stalky13
Beiträge: 28
Registriert: 11.12.2007 18:59
Wohnort: Jever

Beitrag 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
Zuletzt geändert von stalky13 am 12.09.2008 14:42, insgesamt 1-mal geändert.
Aus großer Kraft folgt große Verantwortung.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten