Zum Inhalt springen

Narf!

Mitglieder
  • Gesamte Inhalte

    480
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Narf!

  1. Hallo an alle, ich habe Visual Studio 2010 bekommen und ein erstes C++/MFC-Projekt von 2003 auf 2010 gebracht. Jetzt will das Lesen und Schreiben auf dem COM-Port nicht mehr so richtig. Schreiben geht, aber das angeschlossene Gerät zuckt sich nicht und liefert auch nichts zurück. Wenn ich das alte Projekt starte läuft es wie immer. Wo fehlt der Haken?
  2. Ich habe das mit dem Manifest noch eingerichtet und dann geht es.
  3. Geben mir genau die Werte zurück, die es sein sollen. Es scheint wirklich nur daran zu liegen, dass die Elemente nicht neu angeordnet werden. Ich habe mir mit TRACE das gezogene Element und das Element, wo eingefügt werden soll ausgeben lassen. Und das ist das Ergebnis: Ausgehend von: 0 - Item 1 1 - Item 2 2 - Item 3 3 - Item 4 Item 1 gezogen auf Item 4 = Gezogen 0, Eingefügt 3; die obige Liste bleibt gleich. Item 1 gezogen auf Item 4 = Gezogen 2, Eingefügt 3; die obige Liste bleibt gleich. Es fehlt also nur das neue Anordnen der Elemente. Und jetzt kommt mir eine Idee: In den Eigenschaften des CListCtrl-Fensters bei "Verhalten -> Automatisch Anordnen" auf TRUE setzen :upps Das wars. Und zum Schluss: Wie bekomme ich raus, ob das ListCtrl in der Bericht- oder Symbolansicht ist? Wie schon geschrieben, mit GetView() erhalte ich immer 0.
  4. Habe alle Zeilen, die es betrifft, auf "lvi.mask=LVIF_TEXT|LVIF_IMAGE;" ergänzt. Bleibt alles gleich.
  5. ggflächerlichmach: Welchen MFC-Code? Ich fange mit OnLvnBegindragList das Beginnen des Drag-Vorganges ab und führe den Beispielcode aus. Den Beispielcode habe ich auskommentiert, sodass nur die erste Zeile LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); und die letzte Zeile *pResult = 0; übrig bleiben. Und was die Ansicht betrifft:
  6. Ich habe in OnLvnBegindragList alles bis auf die erste und letzte Zeile auskommentiert. Es passiert nichts. Mit m_cListCtrl.GetView() erhalte ich immer 0.
  7. Die MSDN bezieht sich auf CListView. Was auch komisch ist: In der Bildansicht wird ein DragImage erzeugt (zeigt den Titel des Items an) und in der Listenansicht nicht.
  8. Hallo an alle Zieher und Loslasser, ich habe für Drag and Drop in einem ListCtrl das Beispiel von codeproject genommen. Zum Nachbauen unbedingt die Kommentare lesen. Wenn das ListCtrl in der Listen- oder Bericht-Ansicht ist, dann werden die Elemente neu angeordnet. In der Bildansicht (Icon, Minisymbol) nicht. Es werden alle Schritte abgearbeitet, aber das gezogene Element tauscht den Platz nicht. Müssen für Bildansichten andere Flags gesetzt werden?
  9. Es leckt nicht mehr: ... std::vector<CWinThread*>::iterator it1 = vecThr.begin(); std::vector<CWinThread*>::iterator it2 = vecThr.end(); while ( it1 != it2 ) { delete *it1; ++it1; } ...
  10. Hallo an alle, ich möchte Text nicht nur "normal" ausgeben sondern auch "Über Kopf" oder "Rund". Wie geht das? Bei CreateFont () kann ich einen Winkel angeben, der aber vom Wortanfang ausgeht.
  11. CloseHandle(hAll[job]) kommt nach dem GetExitCode. Habe ich hier mit ... gekürzt. Bei CloseHandle(vecThr[job]->m_hThread) übergebe ich ein ungültiges Handle. Ob vor oder nach vecThr[job]->Delete() ist egal.
  12. Es leckt noch immer. Es sieht jetzt so aus: std::vector <CWinThread*> vecThr(dlg->m_cListCtrl_Jobs.GetItemCount()); //Für jeden Server einen Thread starten for(int job=0; job<=dlg->m_cListCtrl_Jobs.GetItemCount()-1; job++) { vecThr.at(job)=AfxBeginThread(ThrDoTheJob, dlg, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL); vecThr.at(job)->m_bAutoDelete=false; hAll[job]=vecThr[job]->m_hThread; vecThr.at(job)->ResumeThread(); }//end for(int job=0; job<=dlg->m_cListCtrl_Jobs.GetItemCount()-1; job++) ... //ExitCodes aller Threads abfangen for(int job=0; job<=dlg->m_cListCtrl_Jobs.GetItemCount()-1; job++) { ... vecThr.at(job)->Delete(); }//end for(int job=0; job<=dlg->m_cListCtrl_Jobs.GetItemCount()-1; job++)
  13. Na gut, dann werde ich das mal solide machen. Und danke für die Hilfe.
  14. Aha, naja. Da ich Visual C++ 2003 nutze mache ich das wohl eher wie bisher. Wenn ich irgendwo auf das Schließen achten muss, dann schreibe ich gleich nach dem Öffnen als nächstes das Schließen und weiteren Quellcode dazwischen. Im Moment läuft alles prima, habe aber ein neues Problem: Beim Beenden erhalte ich die Warnung eines Speicherlecks. Detected memory leaks! Dumping objects -> thrdcore.cpp(311) : {303} client block at 0x00BC3F08, subtype c0, 64 bytes long. a CWinThread object at $00BC3F08, 64 bytes long thrdcore.cpp(311) : {290} client block at 0x00BC3450, subtype c0, 64 bytes long. a CWinThread object at $00BC3450, 64 bytes long Object dump complete. Ich nehme mal an, das sind die beiden (da zwei Jobs) CWinThread *thr aus der ersten for-Schleife. Wie kriege ich die gelöscht? Kann ich da auch ein Array CWinThread[x] nehmen und thr[x]->Delete() aufrufen?
  15. Also wieder eine for-Schleife, darin CloseHandle(hAll[job]). RAII: Was'n das?
  16. Hallo an alle, ich starte mehrere Threads, möchte auf alle warten und die Exitcodes abfragen. Auch geht es mir darum alle Thread-Handles zu löschen, da m_bAutoDelete=false gesetzt wird, sonst komme ich nicht an die Exitcodes. Im Moment sieht das so aus: HANDLE *hAll=new HANDLE[dlg->m_cListCtrl_Jobs.GetItemCount()]; //Für jeden Auftrag einen Thread starten for(int job=0; job<=dlg->m_cListCtrl_Jobs.GetItemCount()-1; job++) { CWinThread* thr=AfxBeginThread(ThrDoTheJobs, &dlg, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL); thr->m_bAutoDelete=false; hAll[job]=thr->m_hThread; thr->ResumeThread(); }//end for(int job=0; job<=dlg->m_cListCtrl_Jobs.GetItemCount()-1; job++) //Auf alle Threads warten WaitForMultipleObjects(dlg->m_cListCtrl_Jobs.GetItemCount(), hAll, TRUE, INFINITE); //ExitCodes aller Threads abfangen, hier erstmal nur einer DWORD dwExitCode=0; GetExitCodeThread(hAll[0], &dwExitCode); CloseHandle(hAll); delete hAll; Da ich bisher nur mit einer bekannten Anzahl von Threads gearbeitet habe, also auf jeden einzelnen warten konnte, habe ich etwas Muffensausen.
  17. Hallo halli, ich möchte ein Feld in der AS/400 updaten. Normalerweise geht das so: CMyRecordset_AS400 rs400; rs400.Open(); //tu was mit rs400-Feldern rs400.Edit(); rs400.Feld=L"Neuer Wert"; rs400.Update(); rs400.Close(); Bei Update kommt die CDBException "SQL0501: Cursor ... nicht geöffnet." Ich habe schon folgendes probiert: m_nDefaultType von snapshot auf dynaset gesetzt -> Fehler bei rs400.Open(); m_nDefaultType von snapshot auf dynamic gesetzt -> Fehler bei rs400.Update(); Den AS/400- Nutzer geändert -> Fehler bei rs400.Update(); Zur Kontrolle vorher rs400.CanUpdate()==1; sollte also gehen, aber naja. Was kann ich noch tun?
  18. Das war das Problem: #if !defined(AFX_XMLCONTENTHANDLER_H__E0CFBC18_CCC1_42F3_B0A4_B03331AB9693__INCLUDED_) #define AFX_XMLCONTENTHANDLER_H__E0CFBC18_CCC1_42F3_B0A4_B03331AB9693__INCLUDED_ #endif //#if !defined(AFX_XMLCONTENTHANDLER_H__E0CFBC18_CCC1_42F3_B0A4_B03331AB9693__INCLUDED_) Das darf nur einmal vorkommen, stand aber in jeder XMLContentHandler.h-Datei. Ich habe das jetzt in die SAXContentHandlerImpl.h-Datei gechrieben. Die wird ja in jeder XMLContentHandler.h-Datei includiert.
  19. Hallo an alle, ich habe jetzt einen zweiten XMLContentHandler:SAXContentHandlerImpl im Programm. Mit nur einem ist alles prima. Hier passiert der Fehler. CreateInstance() erwartet keine Argumente. XMLContentHandler2 *pXMLContent=XMLContentHandler2::CreateInstance(); Das Verrückte dabei ist, wenn ich die beiden Include-Zeilen der XMLContentHandler vertausche, ist jeweils der zuletzt genannte nicht bekannt. Ich habe mich an die Implementierungsvorgaben gehalten. Beide XMLContentHandler sind von SaxContentHandlerImpl abgeleitet. Muss ich beim zweiten etwas weglassen, damit es geht?
  20. Hallo an alle, ich möchte von Windows nach Linux kopieren und dort verschieben. So sieht es aus und die Ergebnisse: BOOL res=FALSE; DWORD erg=0; NETRESOURCE pNR; ZeroMemory(&pNR, sizeof(pNR)); pNR.dwType=RESOURCETYPE_ANY; pNR.lpLocalName=L"S:"; pNR.lpRemoteName=L"\\\\[LinuxServer mit Samba]\\test"; erg=WNetAddConnection2(&pNR, L"[PWD]", L"[USER]", 0); //erg=0, Laufwerk S: ist da erg=GetLastError(); //erg=997 res=SHCreateDirectory(GetConsoleWindow(), L"S:\\Temp\\Ziel"); //res=0, Ziel ist da erg=GetLastError(); //erg=6 res=CopyFileEx(L"F:\\[Datei]", L"S:\\Temp\\Ziel\\[Datei]", CB_CopyProgress, NULL, FALSE, COPY_FILE_ALLOW_DECRYPTED_DESTINATION|COPY_FILE_RESTARTABLE); //res=1 , Datei wurde kopiert erg=GetLastError(); //erg=2 res=MoveFileEx(L"S:\\Temp\\Ziel", L"S:\\SmallJobs\\Source\\Ziel2", MOVEFILE_COPY_ALLOWED|MOVEFILE_WRITE_THROUGH); //res=1, Ordner wurde verschoben erg=GetLastError(); //erg=2 erg=WNetCancelConnection2(L"S:", CONNECT_UPDATE_PROFILE, TRUE); //erg=2, S: ist weg erg=GetLastError(); //erg=997 Es scheint also alles zu funktionieren, ist aber nicht ganz sauber. Gibt es noch irgendwas zu beachten oder gibt es andere Wege?
  21. Es geht darum Dateien (möglichst schnell) zu kopieren, sowohl lokal oder im LAN oder über Internet. Wie ermittelt man die optimale Puffergröße? Ich würde mit 64k*BufMulti(1) anfangen und wenn der Lese- und Schreibvorgang weniger als eine Sekunde dauert, den BufMulti um 1 erhöhen oder wenn es länger dauert wieder um 1 verringern. Kann man das so machen?
  22. Hallo liebe Gemeinde, da ja alles schnell gehen soll mal eine generelle Frage zum Dateikopieren ob lokal oder LAN oder INet: Was wäre die optimale Puffergröße zum Lesen bzw. Schreiben? Zur Zeit arbeite ich mit 4096 Byte pro Read/Write-Schleifendurchlauf bzw. lasse ich mir die Blockgröße des Zieldatenträgers geben, meistens 4k, im INet ca. 2k. Ist es eigentlich notwendig bzw. sinnvoll sich die Blockgröße des Zieldatenträgers geben zu lassen, um eine Dateifragmentierung zu verhindern bzw. möglicht gering zu halten? Hier im Forum habe ich gelesen, dass man auch 1% der Dateigröße als Puffergröße nehmen kann. Wäre das eine generelle Lösung?
  23. Das Bild soll sich der Größe des Fensters anpassen. Beim Drucker ist das so: CDC prt_DC; double druckBreite_mm=0.0; double druckHoehe_mm=0.0; CPrintDialog prtDlg(FALSE); //Eigenschaften des Standard-Druckers abfragen prtDlg.GetDefaults(); if(prt_DC.Attach(prtDlg.GetPrinterDC())) { prt_DC.m_bPrinting=TRUE; //ermitteln des tatsächlichen Druckbereiches druckBreite_mm=((float) prt_DC.GetDeviceCaps(HORZRES)/(float) prt_DC.GetDeviceCaps(LOGPIXELSX))*25.4; druckHoehe_mm=((float) prt_DC.GetDeviceCaps(VERTRES)/(float) prt_DC.GetDeviceCaps(LOGPIXELSY))*25.4; DOCINFO di; ZeroMemory(&di, sizeof(DOCINFO)); di.cbSize=sizeof(DOCINFO); //eine vorgegebene Label-Datei if(LabelDatei.Right(4).CompareNoCase(L".bmp")==0) { di.lpszDocName=LabelDatei; //*.bmp Label=LabelDatei; }//end if(LabelDatei.Right(4).CompareNoCase(L".bmp")==0) //oder das Basis-Label else { di.lpszDocName=Label; //basis.bmp }//end else by if(LabelDatei.Right(4).CompareNoCase(L".bmp")==0) BOOL bPrintingOK=prt_DC.StartDoc(&di); CPrintInfo Info; Info.SetMaxPage(1); //Maximale Druckgröße des Druckers ermitteln int maxw=prt_DC.GetDeviceCaps(HORZRES); int maxh=prt_DC.GetDeviceCaps(VERTRES); //Seitengröße für Dokument setzen Info.m_rectDraw.SetRect(0, 0, maxw, maxh); for(UINT page=Info.GetMinPage(); page<=Info.GetMaxPage() && bPrintingOK; page++) { //Starte neue Seite prt_DC.StartPage(); Info.m_nCurPage=page; CBitmap bitmap; if(bitmap.Attach(::LoadImage(::GetModuleHandle(NULL), Label, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_DEFAULTSIZE))) { BITMAP bm; bitmap.GetBitmap(&bm); int w=bm.bmWidth; int h=bm.bmHeight; // create memory device context; [B]Wozu?[/B] CDC mem_DC; mem_DC.CreateCompatibleDC(&prt_DC); CBitmap *pBmp=mem_DC.SelectObject(&bitmap); mem_DC.SetMapMode(prt_DC.GetMapMode()); prt_DC.SetStretchBltMode(BLACKONWHITE); // now stretchblt to maximum width on page prt_DC.StretchBlt(0, 0, maxw, maxh, &mem_DC, 0, 0, w, h, SRCCOPY); /*** Hier kommen jetzt die Texte für die Felder dazu ***/ // clean up mem_DC.SelectObject(pBmp); prt_DC.Detach(); }//end if(Attach)
  24. Zuerst möchte ich, das Basis-BMP in das Static-Feld laden, aber es wird nicht angezeigt. Ich habe in den Eigenschaften des Static-Feldes das "Bild" IDB_BITMAP1, was die BMP-Datei enthält entfernt, weil es sich nicht an den Fensterbereich anpasst. Jetzt möchte ich die BMP-Datei in den DC des Static-Feldes so reinsetzen, dass es sich an den Fensterbereich anpasst, dann sollten auch die Textfelder an der richtigen Stelle sein. Für das Drucken habe ich ein Code-Beispiel genommen, und ehrlich gesagt verstehe ich nur die Hälft von dem, was da steht, was nicht gut ist, denn man sollte schließlich verstehen, was man da macht. Und einfach das DC des Druckers mit dem des Static-Feldes zu tauschen geht auch nicht einfach so.
  25. Oje. Eigentlich möchte ich das Static-Feld so nutzen wie den Drucker, auf dem das Etikett gedruckt wird. Kann ich das Drucker-DC irgendwie dem Static-Feld beibringen?

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...