Statisches Memofeld



  • Hallo zusammen,
    ich habe mir in einer Funktion ein Memofeld erstellt, über eine andere Funktion möchte ich dieses Feld ansprechen, leider geht dies nicht.

    Funktion zum erstellen des Memo's

    TTabSheet *pPage = new TTabSheet(PageControl1);
    pPage->PageControl = PageControl1;
    pPage->Caption = AnsiString(ERG);
    pPage->Name="TabSheet"+IntToStr(PageControl1->PageCount) ;
    
    TMemo *mMemo = new TMemo(pPage);
    mMemo->Parent=pPage;
    mMemo->Name="Memo"+IntToStr(PageControl1->PageCount);
    mMemo->Left=0;
    mMemo->Top=0;
    mMemo->Height=Form1->Height-PageControl1->Top-205;
    mMemo->Width=Form1->Width-PageControl1->Left-25;
    

    Bislang wollte ich es mit der FindComponent-Funktion machen, Leider macht er dies nicht sonderen sagt mir irgend einen Speicher Fehler... Ich hab diese Funktion nun beschränkt. Ich will diese NEUE Komponente nun folgendermassen ansprehcen

    Memo2->Name="Peter";
    

    Nun kommt ein Fehler... kann mir jemand sagen woran das liegt ?



  • Hallo,

    kleines Beispiel:

    dynamic_cast<TMemo*>(dynamic_cast<TTabSheet*>(PageControl1->ActivePage)->Components[0])->Text= "test";
    

    Kurzfassung der Zeile:
    Es wird auf den PageControl1 der aktuellen Seite (ActivePage) auf den TTabSheet der Components[0] das in dem Fall ein TMemo ist (vorher überprüfen) zugegriffen und den Text "test" übergeben.

    mfg
    VergissEs



  • äh VergissEs... du machst mit dieser Zeile
    a) einen unübersichtlichen Würg
    b) den Vorteil den dynamic_cast bietet schlicht zu Nichte.

    Bitte unbedingt überarbeiten!

    -junix



  • Hallo,

    dies soll ein beispiel sein wie man per dynamic_cast darauf zugreifen kann.
    das dies kein code aus einen bestehen Projekt ist versteht sich von selbst.

    und da wir hier ja keinen fertigen code posten dürfen, liegt es an den abschreiber, dieses in einer klaren form zu bringen.

    Mfg
    VergissEs



  • Das Problem an dem was du gepostet hast ist, dass der Code funktioniert - bis zu einem gewissen grad.

    Was das weitere problem ist, ist die Tatsache, dass du nicht auf die Gefahr hingewiesen hast. Wenn du das unterlässt, steht der fragende plötzlich wieder da, weil er access Voilations hat, weil er sich der gefahren gar nicht bewusst ist.
    Erfahrungsgemäss macht die Minderheit der Besucher hier das, was ich immer anrate nämlich das Nachlesen über die verwendeten Funktionen und Keywords, ohne dass man sie darauf aufmerksam macht, dass es da noch wichtige Infos gibt.

    -junix



  • VergissEs schrieb:

    ein TMemo ist (vorher überprüfen)

    und die überprüfung das es ein ActivePage gibt,
    sorry wollte hier kein tut schreiben und keinen fertigen code.



  • Lieber eine Minute mehr investieren und etwas mehr Infos reinpacken als sowas.

    -junix



  • Sorry bin jetzt auf der Arbeit.

    aber heute Abend bekommt er ein gutes Copy & Paste Snippel

    MfG
    VergissEs



  • so jetzt aber

    //Zeiger auf den PageControl
    	TPageControl *PControl = PageControl1;
    
    	//Überprüfen ob es ein TabSheet gibt
    	if (PControl->PageCount > 0)
    	{
    		TTabSheet *TSheet;
    
    		//Zeiger auf den Activen TabSheet
    		TSheet = dynamic_cast<TTabSheet*>(PControl->ActivePage);
    
    		//gibt es Komponenten auf dem TabSheet
    		if (TSheet->ComponentCount > 0)
    		{
    			//Alle Unterkomponeten des TabSheets durchlaufen
    			for (int i = 0; i < TSheet->ComponentCount; i++)
    			{
    				//Alle Memos des TabSheets suchen
    				if (TSheet->Components[i]->ClassNameIs("TMemo"))
    				{
    					//Zeiger auf den Memo
    					TMemo *MyMemo = dynamic_cast<TMemo*>(TSheet->Components[i]);
    
    					//MemoText zuweisen
    					MyMemo->Text = "Mein Memo Text";
    				}
    			}
    		}
    	}
    

    MfG
    VergissEs



  • Hallo,

    Mir ist nicht ganz klar, warum du das hier

    TSheet = dynamic_cast<TTabSheet*>(PControl->ActivePage);
    

    machst. Immerhin ist ActivePage schon vom Typ TTabSheet. Brauchst hier also nicht zu casten.
    Desweiteren würde ich das hier

    if (TSheet->Components[i]->ClassNameIs("TMemo")) 
    { 
    //Zeiger auf den Memo 
       TMemo *MyMemo = dynamic_cast<TMemo*>(TSheet->Components[i]); 
    
    //MemoText zuweisen 
       MyMemo->Text = "Mein Memo Text"; 
    }
    

    anders schreiben (ist aber Geschmackssache). Ich denk bloss immer, wenn ich dynamic_cast schon verwende, kann ich ihn auch zur Prüfung heranziehen. Also etwa so.

    TMemo* MyMemo = dynamic_cast<TMemo*>(TSheet->Components[i]);
    if (MyMemo != NULL) 
    { 
    //MemoText zuweisen 
       MyMemo->Text = "Mein Memo Text"; 
    }
    

    Ciao



  • Genau, das wars THX


Anmelden zum Antworten