Zum Inhalt springen

Narf!

Mitglieder
  • Gesamte Inhalte

    480
  • Benutzer seit

  • Letzter Besuch

Beiträge von Narf!

  1. Hab es hinbekommen. Vielleicht etwas umständlich, aber es geht:

    
    void CExplorerTestDlg::MarkiereText(CString Fragment)
    
     {
    
      //Den gesamten Body-Inhalt des HTML-Dokumentes einlesen,
    
      //Fragment-String finden,
    
      //danach InsertText einfügen
    
      //Neues Dokument mit Markierung laden und in Sicht scrollen
    
    
    
      LPDISPATCH disp=0;
    
      IHTMLDocument2 *doc2=0;
    
      IHTMLElement *element=0;
    
      IHTMLBodyElement *body=0;
    
      IHTMLTxtRange *range=0;
    
      CString Text;
    
    
      //macht den Hintergrund orange
    
      CString InsertText=" style=\"BACKGROUND-COLOR: ORANGE\" ";
    
    
      static CString Fragment_alt="";
    
      CComBSTR ID=0;
    
      int pos=0;
    
      int x=0;
    
      int y=0;
    
      HRESULT res=0;
    
      VARIANT_BOOL suc=0;
    
      long ac_count=0;
    
    
      //wurde das Fragment zuletzt verwendet?
    
      if(Fragment_alt!=Fragment)
    
       {
    
        disp=m_cExpl.get_Document();    
    
    
        disp->QueryInterface(IID_IHTMLDocument2, (void**) &doc2);
    
    
        disp->Release();
    
    
        doc2->get_body(&element); 
    
    
        doc2->Release();
    
    
        element->get_innerHTML(&ID); // HTML-Text (mit Tags) laden
    
    
        Text=ID;
    
    
        if(!Fragment_alt.IsEmpty()) //ist letztes Fragment vorhanden?
    
         {
    
          //altes Fragment suchen
    
          pos=Text.Find(Fragment_alt, 0)+Fragment_alt.GetLength();
    
    
          //[InsertText] löschen
    
          Text.Delete(pos, 33);
    
         }//end if(Fragment!=Fragment_alt)
    
    
        //neues Fragment suchen
    
        pos=Text.Find(Fragment, 0)+Fragment.GetLength();
    
    
        //[InsertText] bei gefundener Position einfügen
    
        Text.Insert(pos, InsertText);
    
    
        for(x=pos+33; x<=Text.GetLength(); x++)
    
         {
    
          //ab Position, wo Fragment gefunden wurde nach '>' suchen
    
          if(Text[x]=='>' && Text[x+1]!='<')
    
           Text.Insert(x+1, "[]"); //dort "[]" einfügen
    
    
          //ab Position, wo Fragment gefunden wurde nach "</" suchen
    
          if(Text[x]=='<' && Text[x+1]=='/')
    
           x=Text.GetLength(); //for-Schleife beenden
    
    
          y++; //Zeichen für Textrange zählen, s.u.
    
         }//end for(x=pos+33; x<=Text.GetLength(); x++)
    
    
        ID.Empty(); //[ID] leeren
    
    
        ID.Append(Text); //in [ID] Body-Text laden
    
    
        res=element->put_innerHTML(ID); //geänderden Text im Explorer anzeigen
    
    
        element->QueryInterface(IID_IHTMLBodyElement, (void**) &body);
    
    
        body->createTextRange(&range); //Textbereich anlegen
    
    
        ID.Empty(); //[ID] leeren
    
    
        ID.Append("[]"); //"[]" anfügen
    
    
        range->findText(ID, sizeof(ID), 2, &suc); //nach "[]" suchen
    
    
        //den Textbereich auf y Zeichen erweitern
    
        range->moveEnd((BSTR)CComBSTR("character"), (long) y, &ac_count);
    
    
        range->select(); //selektieren (blau markieren)
    
    
        res=range->scrollIntoView(false); //den Bereich in Sicht scrollen
    
    
        //ab hier wieder suchen nach "[]" und löschen, würde sonst mit im Explorer stehen
    
    
        element->get_innerHTML(&ID);
    
    
        Text=ID;
    
    
        pos=Text.Find("[]", 0);
    
    
        Text.Delete(pos, 2);
    
    
        ID.Empty();
    
    
        ID.Append(Text);
    
    
        element->put_innerHTML(ID);
    
    
        element->Release();
    
    
        Fragment_alt=Fragment;
    
      }//end if(Fragment_alt!=Fragment)
    
     }//end void CExplorerTestDlg::MarkierePhrase(CString Fragment)
    
    

    Ich hoffe, ich kann damit weiterhelfen. Wenn jemand einen einfacheren Weg kennt, bitte schreiben.

  2. Hallo wiedermal,

    ich habe einen Hauptdialog in dem ein anderer Dialog mit DoModal geöffnet wird. Dieser Dialog hat ein Text-Edit-Feld, in das nur Zahlen eingetragen werden können.

    Wenn ich eine Zahl eingeben will, springt er gleich nach dem Tastendruck raus mit folgender Fehlermeldung:

    "Unbehandelte Ausnahme bei 0x00534125 in [Programm].exe: 0xC00000FD: Stack overflow."

    Und zeigt die Datei chkstk.asm bei folgendem Inhalt an:

    (--> ist der gelbe Pfeil am Seitenrand)

    ***

    probepages:

    sub ecx,_PAGESIZE_ ; yes, move down a page

    sub eax,_PAGESIZE_ ; adjust request and...

    --> test dword ptr [ecx],eax ; ...probe it

    cmp eax,_PAGESIZE_ ; more than one page requested?

    jae short probepages ; no

    ***

    Das Erstaunliche ist, dass es vorher schonmal funktioniert hat.

    Der Dialog hat eine eigene Klasse und wird so aufgerufen:

    DlgKlasse dlg;

    if(dlg.DoModal()==IDOK)

    ...

    Wo liegt das Speicherproblem?

  3. Hallo an alle,

    gibt es eine schnelle Methode, den Inhalt einer Textdatei auf einmal in eine CString-Variable zu speichern?

    Zur Zeit mache ich das Zeichenweise.

    Oder gibt es eine Möglichkeit eine Datei zeilenweise auszulesen, wobei die Länge der Zeile bzw. des Puffers variieren kann?

    Im Moment muss ich immer eine konstante Pufferlänge mit angeben.

    Ich arbeite mit fstream(.h) und MFC.

  4. Hallo an alle,

    ich habe einen Dialog mit einem IE-Fenster in das ich ein HTML-Dokument geladen habe.

    Mit dem folgenden Beispiel suche ich mir eine ID aus den HTML-Tags, ergänze dieses Tag mit einem Style-Aufruf, der die Hintergrundfarbe dieser Zeile ändert. Das klappt auch ganz gut, aber wenn die Zeile außerhalb des sichtbaren Bereichs des IE-Fensters liegt, kann man als Nutzer damit nicht viel anfangen.

    Wie kann ich diese Zeile nach der Änderung in den sichtbaren Bereich scrollen?

    
      (VS .NET 2003 C++ MFC)
    
    
      LPDISPATCH disp=0;
    
      IHTMLDocument2 *doc2=0;
    
      IHTMLElement *element=0;
    
      CString suchID="[ID-Text]";
    
      CString Text;
    
      CComBSTR ID=0;
    
      CString InsertText=" style=\"BACKGROUND-COLOR: ORANGE\" ";
    
      int pos=0;
    
    
      disp=m_cExpl.get_Document();
    
    
      disp->QueryInterface(IID_IHTMLDocument2, (void**) &doc2);
    
    
      disp->Release();
    
    
      doc2->get_body(&element);
    
    
      doc2->Release();
    
    
      element->get_innerHTML(&ID);
    
    
      Text=ID;
    
    
      pos=Text.Find(suchID, 0)+strlen(suchID);
    
    
      Text.Insert(pos, InsertText);
    
    
      ID.Empty();
    
    
      ID.Append(Text);
    
    
      res=element->put_innerHTML(ID);
    
    
      //Hier soll die geänderte Zeile im Fenster erscheinen
    
    

  5. Ich habe mir bei CodeProject die Funktion FindText() kopiert.

    Sie funktioniert bis zum Aufruf

    
    lpHtmlDocument->get_body(&lpBodyElm);
    
    
    ASSERT(lpBodyElm);
    
    

    Beim Aufruf wird die Variable lpBodyElm auf 0x0000000 gesetzt und HRESULT gibt S_OK aus.

    Nach get_body kommt eine Debug Assertion Fehlermeldung mit Verweis auf die aufrufende Zeile.

    :confused:

  6. Hallo Leute,

    ich habe den IE als ActiveX in meinem MFC-Dialog, der eine HTML-Seite anzeigt.

    Ich möchte diese angezeigte Seite bearbeiten, ohne die ursprüngliche Datei zu verändern, d.h. die Änderungen sollen nicht abgespeichert werden.

    Der geänderte Bereich soll in der Mitte des Explorerfensters angezeigt werden.

    Wie bekomme ich Zugriff auf die angezeigte Seite und wie kann ich diese im Fenster ausrichten?

  7. Hallo an alle.

    Ich habe folgendes vor: Ich starte einen Thread, danach SetTimer(), der das Ende des Threads prüft und erst danach sollen folgende Anweisungen abgearbeitet werden.

    Jetzt ist es so:

    
     {
    
      CreateThread(...);
    
    
      SetTimer(1, 250, 0);
    
    
      Weitere Anweisung(en);
    
     }
    
    

    Wenn der Timer gesetzt wurde, führt er die Weiteren Anweisungen aus, die aber erst nach dem Ende des Threads abgearbeitet werden sollen.

    Gibt es Timer-Funktionen, die das Abarbeiten anhalten, bis sie fertig sind?

  8. Und wieder mal zu früh gefreut... :confused:

    Ich möchte das Ende des Threads abwarten und erst dann weitermachen. Den Thread habe ich gestartet, um die Dialoganzeige aktuell zu halten.

    Ich habe folgendes Beispiel aus der MSDN angepasst:

    
    ...
    
    CWinThread* pThread=0;
    
    DWORD exitCode=0;
    
    ...
    
    pThread=AfxBeginThread(ArbeitsThread, &m_cSmiley, 0, 0, 0, 0);
    
    
    pThread->m_bAutoDelete=false;
    
    
    do
    
     {
    
      GetExitCodeThread(pThread->m_hThread, &exitCode);
    
     }
    
    while(exitCode==STILL_ACTIVE);
    
    
    AfxEndThread(0, true);
    
    
    ...
    
    

    Nur bleibt er in der do-while-Schleife stecken und führt den Thread bzw. dessen Funktion nicht aus.

    Ich habe hier den Tipp gefunden, in die Schleife ein Sleep() einzubinden. Das hat auch nicht geholfen.

    Und noch ein Hinweis: Verschiedene Themen-Links sind nicht mehr zu erreichen.

  9. Das hat nur soweit geholfen, dass ich jetzt nur noch die Fehlermeldung mit der ListCtrl-Variable bekomme.

    Deklaration:

    static UINT ArbeitsFunktion(LPVOID);

    Aufruf:

    AfxBeginThread(ArbeitsFunktion, &m_cSmiley, 0, 0, 0, 0);

    Fehler:

    Der linke Teil von '.GetItemCount' muss eine Klasse/Struktur/Union sein

    "m_cSmiley.GetItemCount();" in einer for-Schleife.

    Weder mit &m_cSmiley noch ohne & hat es etwas gebracht.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...