Zugriff auf Member von Steuerelement einer anderen Form löst Zugriffsverletzung aus



  • void __fastcall TKommandozentrale::ResIntervalTimer(TObject *Sender)
    {
    	if (StrToInt(IncomeRate->Caption) > 0)
    	{
    		IncomeRate--;
    		Income->Progress++;
    	}
    	else
    	{
    		Income->Progress = 0;
    		switch(Lobby->ResGenSpeed->ItemIndex)
    		{
    			case(0):
    			{
    				IncomeRate->Caption = 50;
    				break;
    			}
    			case(1):
    			{
    				IncomeRate->Caption = 35;
    			}
    			case(2):
    			{
    				IncomeRate->Caption = 22;
    			}
    			case(3):
    			{
    				IncomeRate->Caption = 10;
    			}
    		}
        }
    }
    //---------------------------------------------------------------------------
    

    Dieser Quelltext löst eine Zugriffsverletzung aus.
    Das müsste doch möglich sein oder irre ich mich, wie es immer tue (was das angeht).

    PS: In der Schleife war das ein ziemlicher Schock "DRRRRRRRRRRRRRRÖÖÖÖÖÖHHHHHHNNNNNNN --- ERROR".
    Sollte das wirklich nicht möglich sein brauche ich eine Alternative.
    (Bei Labeln gehts doch ???)



  • Schon mal den Debugger genutzt?

    if (StrToInt(IncomeRate->Caption) > 0)  // IncomeRate ist ein Label?
        { 
            IncomeRate--;                   // Dekrement kann so nicht funktionieren 
            ...
        }
    

    evtl. Header der anderen Form korrekt eingebunden?



  • Ups sorry, das war überstürzt.
    Korekt wäre es natürlich so:

    void __fastcall TKommandozentrale::ResIntervalTimer(TObject *Sender)
    {
    	if (StrToInt(IncomeRate->Caption) > 0)
    	{
    		IncomeRate->Caption = IntToStr(StrToInt(IncomeRate->Caption)-1);
    		Income->Progress++;
    	}
    	else
    	{
    		Income->Progress = 0;
    		IncomeRate->Caption = Generationspeed->Caption;
    		switch(StrToInt(Generationspeed->Caption))
    		{
    			case(0):
    			{
    				IncomeRate->Caption = 50;
    				break;
    			}
    			case(1):
    			{
    				IncomeRate->Caption = 35;
    				break;
    			}
    			case(2):
    			{
    				IncomeRate->Caption = 22;
    				break;
    			}
    			case(3):
    			{
    				IncomeRate->Caption = 10;
    				break;
    			}
    		}
    	}
    }
    //---------------------------------------------------------------------------
    


  • Zeile 11 ist überflüssig, wenn du in dein Switch nen default machst, sonst wird unnötigerweise 2x die Caption gesetzt, wenn eine der Cases zutrifft.

    Ansonsten wie immer: Das Glaskugel-Plugin des Forums ist leider in Reparatur. Ohne Fehlermeldung / Fehlerzeile wird das hier munteres Kaffeesatzlesen...

    mfg
    xXx



  • ja ja, tut mir leid, ich hab sowieso viel zu früh gepostet.
    Was ich nur lustig finde, dass der Quelltext oben so compiliert wurde

    IncomeRate--;
    

    Wenn IncomeRate ein Label ist. Den Fehler mach ich übrigens öfters, wenn ich etwas geistesabwesend oder müde bin.



  • Hallo

    IncomeRate ist ein Zeiger, und -- verändert die Zieladresse des Zeigers (Ein Byte wird abgezogen, weiteres unter dem Stichwort Zeigerarithmetik). Das kompiliert prima, aber verursacht in diesem Fall potentiell Speicherzugrifffsfehler. Merke : Der Computer macht genau das, was du sagst, nicht das, was du meinst.

    bis bald
    akari


Anmelden zum Antworten