Zum Inhalt springen

Narf!

Mitglieder
  • Gesamte Inhalte

    480
  • Benutzer seit

  • Letzter Besuch

Beiträge von Narf!

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

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

    Mit m_cListCtrl.GetView() erhalte ich immer 0.
  3. 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?

  4. 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++)
    
    

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

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

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

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

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

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

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

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

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

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

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