Probelme mit Printer() und weiterem Programm ablauf



  • Hallo,

    ich habe ein kleines Problem mit Printer() und dem weiteren Programmablauf.

    ich drucke mit Printer() den inhalt eines TMemo feldes aus den ich vorher mittels einer struktus aus eine datei eingelesen habe

    struct Struktur
    {
            char Nummer[6];
            char ob_1[100];
            char ob_2[100];
            char ob_3[100];
            char ob_4[100];
    };
    
    void __fastcall TForm1::Open(...)
    {
    struct Struktur Dat;
    
    FILE *Read_Datei;
    Read_Datei = fopen("datei.dat","r");
    
    while(fread(&Dat,sizeof(Struktur),1, Read_Daten))
    {
    ...
    }
    }
    

    wenn ich nach dem drucken die datei wieder einlesen will bleibt der debugger
    an der stelle "while(fread(&Dat,sizeof(Struktur),1, Read_Daten))" stehen
    und es kommt eine fehlermeldung "Access violation at adress ... in module 'CC3260MT.DLL'. Read of adress ... ."

    ich benutze BCB6

    Wer weis Rat?



  • Hmm.. hast du die Datei mittels fclose wieder ordnungsgemäß geschlossen? Ansonsten wäre vllt. etwas mehr Quelltext hilfreich.



  • ja die datei ist auch mit fclose geschlossen worden
    habe auch den reserviereten speicher für die struktur mit delete und free() freigegeben. aber bringt nix.



  • Hmm... In welchem Modus wurde die Datei denn geschrieben? Vllt. musst du binär lesen.



  • Die datei hat die selbestruktur und ich habe sie mit fwrite() geschreiben.
    wenn ich nicht drucke kann ich so oft ich will die datei neu lesen, das hatte ich vergessen zu sagen 😉



  • Dann wirst du uns wohl doch zeigen müssen, wie du das Memo befüllst und wie du druckst, also alle relevanten Codeabschnitte. Idealerweise erstellst du dafür ein Minimalprojekt, dass du dann komplett posten kannst.



  • ok hier der Code

    void __fastcall Tprint::Print()
    {
    int DPI = 96;
    int randx = 0;
    int randy = 0;
    int left = 0;
    int page = 1;
    bool links = false;
    String Seite;
    
    Printer()->BeginDoc();
    
    DPI = GetDeviceCaps(Printer()->Canvas->Handle, LOGPIXELSX);
    randx = GetDeviceCaps(Printer()->Canvas->Handle, PHYSICALOFFSETX);
    randy = GetDeviceCaps(Printer()->Canvas->Handle, PHYSICALOFFSETY);
    Vorlage(); //fucktion zum zeichnen einer vorlage
    int j = 0;
    for(int i = 0;i<= Form1->Memo1->Lines->Count;i++)
    {
            Printer()->Canvas->TextOut(cmToPixel(4,DPI,randx)+left,cmToPixel(6+(j*0.5),DPI,randy),Form1->Memo1->Lines->Strings[i]);
            j++;
    
            if((j == 42)&&(links == true))
            {
            Printer()->NewPage();
            left = 0;
            links = false;
            j = 0;
    
            Vorlage(); 
    
            }
            if(j == 42)
            {
                    j = 0;
                    left = cmToPixel(7.5,DPI,randx);
                    links = true;
            }
    
    }       
    
    Printer()->EndDoc();
    
    void __fastcall TForm1::Open(String AObjekt, String AMonat, String AJahr)
    {
    struct Objektdaten objekt;
    struct Daten SUDaten;
    Memo1->Clear();
    Label1->Caption = AObjekt;
    FILE *Read_Objekt;
    Read_Objekt = fopen("objekte.azo","r");
    
    while(fread(&objekt,sizeof(Objektdaten),1, Read_Objekt))
    {
            String OBJ = LeftStr(objekt.Objektnr,6);
            if(OBJ == LeftStr(AObjekt,6))
            {
                    Label2->Caption = objekt.ob_1;
                    Label3->Caption = objekt.ob_2;
                    Label4->Caption = objekt.ob_3;
                    Label5->Caption = objekt.ob_4;
                    break;
            }
            else
            {
                    Label2->Caption = "Keine Objektdaten vorhaden";
                    Label3->Caption = "";
                    Label4->Caption = "";
                    Label5->Caption = "";
            }
    }
    fclose(Read_Objekt);
    
    FILE *Read_Daten;
    char pfad[1000];
    strcpy(pfad, GetCurrentDir().c_str());
    strcat(pfad, "\\Daten\\");
    strcat(pfad, AJahr.c_str());
    strcat(pfad, "\\");
    strcat(pfad, AMonat.c_str());
    strcat(pfad, "-");
    strcat(pfad, AJahr.c_str());
    strcat(pfad, ".azs");
    
    Read_Daten = fopen(pfad,"r");
    
    while(fread(&SUDaten,sizeof(SUDaten),1, Read_Daten))
    {
            if(AObjekt == LeftStr(SUDaten.Objektnr,8))
            {
                    Memo1->Lines->Add(LeftStr(SUDaten.datum,10) + "  " + LeftStr(SUDaten.zeit,5) + "  " + SUDaten.meldung);
            }
    }
    
    fclose(Read_Daten);
    
    }
    //---------------------------------------------------------------------------
    

Anmelden zum Antworten