Wie Formatierten Text in ein Rich-Edit-Steuerelement bekommen???
-
Hallo.
Ich brauche in meinem Dialogfenster ein scrollbares Textfeld.
Ich habe deshalb ein Rich Edit Steuerelement genommen.
Wie kriege ich in das Rich Edit Steuerelement einen Formatierten Text hinein?
hal_ibm
-
In dem Du ihn entweder per ReplaceSel reinpackst oder per StreamIn lädst!
-
Hallo Martin Richter.
Erst mal Danke.
Habe auch schon gelesen das es mit StreamIn gehen soll aber ohne ein
Beispiel kriege ich es nicht hin. Die MSDN macht mich auch nicht viel schlauer.Hast du ein Beispiel?
hal_ibm
-
Hallo.
Habe nun ein Beispiel gefunden. Geht aber nicht. Bekomme eine Fehlermeldung.Benutze folgenden Code.
1. CFile cFile(TEXT("liz.rtf"), CFile::modeRead);
2. EDITSTREAM es;3. es.dwCookie = (DWORD) &cFile;
4. es.pfnCallback = MEditStreamInCallback;
5. m_RC.StreamIn(SF_RTF, es);und nun das MEditStreamInCallback
DWORD __stdcall MEditStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CString *psBuffer = (CString *)dwCookie;if (cb > psBuffer->GetLength()) cb = psBuffer->GetLength();
for (int i=0;i<cb;i++) {
*(pbBuff+i) = psBuffer->GetAt(i);
}*pcb = cb;
*psBuffer = psBuffer->Mid(cb);
return 0;
}Ich bekomme bei Zeile 4. folgende Fehlermeldung
: error C2440: '=' : 'unsigned long (__stdcall Liz::*)(unsigned long,unsigned char *,long,long *)' kann nicht in 'unsigned long (__stdcall *)(unsigned lon
g,unsigned char *,long,long *)' konvertiert werden
Es gibt keinen Kontext, in dem diese Konvertierung moeglich ist
Generieren von Code...Ich kriege es einfach nicht hin.
Was mache ich denn falsch?hal_ibm
-
Du kannst einen Methodenzeiger nicht als normalen Funktionszeiger verwenden (und der Fehlermeldung nach zu urteilen ist deine Callback-Funktion eine Methode der Klasse 'Liz'). Als Lösung könntest du entweder eine globale Funktion oder eine statische Methode verwenden.
-
Hallo CStoll.
Ja meine Callback funktion ist eine Methode von Liz.
In der LIz.h steht folgendes.DWORD __stdcall MEditStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb);
Habe auch mal ein static davor gesetz nützt aber nichts.Wo soll den die Callback-Funktion hin?
Wie kriege ich sie denn global oder statisch?
hal_ibm
-
hal_ibm schrieb:
Habe auch mal ein static davor gesetz nützt aber nichts.
Wie äußert sich dieses "nützt nichts"? Bei einer statischen Methode sollte die oben zitierte Fehlermeldung nicht mehr auftreten.
(allerdings hast du bei einer statischen Methode keinen this-Zeiger mehr, kannst also nicht mehr auf Elemente deiner Klasse zugreifen. Wenn das notwendig ist, mußt du dir ein Objekt von woanders besorgen.)
-
Hallo CStoll.
Ich habe ein neues Beispiel gefunden und das in mein Programm integriert.
Die Fehlermeldung beim Compilieren ist erst einmal weg.Wenn ich auf den Button klicke damit der Text in das CRichEditCtrl eingefügt wird wird folgender Code abgearbeitet.
void Liz::OnButton1()
{
CFile fis;char* pFileName = "liz.rtf";
fis.Open(pFileName, CFile::modeRead | CFile::shareExclusive );// Read the text in
EDITSTREAM es;
es.dwError = 0;
es.pfnCallback = MyStreamInCallback;
es.dwCookie = (DWORD)fis;
m_RC.StreamIn(SF_RTF, es); // in der Liz.h steht CRichEditCtrl m_RC;}
Hier mein Callback
DWORD CALLBACK Liz ::MyStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG pcb)
{
CFile pFile = (CFile*) dwCookie;
ASSERT_KINDOF(CFile,pFile);
*pcb = pFile->Read(pbBuff, cb);
return 0;
}und das steht in der Liz.h
static DWORD CALLBACK MyStreamInCallback(DWORD dwCookie,LPBYTE pbBuff, LONG cb, LONG *pcb);
So beim compilieren ist alles O.K. aber wenn das Programm läuft und ich auf den besagten Button klicke stürzt das Programm ab.
Fehlermeldung: Micro.. Visual C++ Debug Library
Debug Assertion Failed!
Programm: … und so weiter.Wenn ich dann auf ignorieren klicke kommt eine neue Meldung; Das Programm hat ein Problem festgestellt und muss beendet werden.
Ganz toll. Das Programm aus dem ich den code habe geht aber.
hal_ibm
-
Wenn du statt auf "Ignorieren" auf "Wiederholen" klickst, öffnet sich afair der Debugger - dann kannst du dir mal ansehen, wo die Assertion aufgetreten ist.
-
Hallo CStoll.
Habe das Programm über den Debuger also mit F5 gestartet.Dann auf den Button um den Text einzufügen. Dann kommt die Fehlermeldung und dann habe ich auf wiederholen geklickt. Dann erscheint diese Klasse und in der 3. Zeile wird ein Fehler angezeigt. Es ist ein gelber Peil dot zu sehen.
Fehlermeldung wenn ich Wiederholen anklicke in der 3. Zeile
BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const
{
1. ASSERT(this != NULL);
2. // it better be in valid memory, at least for CObject size
3. ASSERT(AfxIsValidAddress(this, sizeof(CObject))); Fehler4. // simple SI case
CRuntimeClass* pClassThis = GetRuntimeClass();
return pClassThis->IsDerivedFrom(pClass);
}Habe auch mal ignorieren angeklickt.
Fehlermeldung wenn ich ignorieren anklicke
Unbehandelte ausnahme in Zettel.exe: 0xC0000005: Access Violationhal_ibm
-
Hallo Ihr beiden.
Danke für die hilfe.
Habe ein Beispiel im internet gefunden und jetzt funktioniert es.Ich weiss zwar noch nicht warum der andere code nicht ging aber das kriege ich
auch noch raus.Noch mal vielen Dank für die Ünterstützung.
hal_ibm