events für elemente



  • ich habe in der faQ gelesen, wie man verschiedenen bildobjekten das gleiche event zuweist, das klappt auch.
    jetzt wüsste ich nur noch gern wie ich dann in dem verallgemeinersten event wissen kann, welches objekt gedrückt wurde ?
    ich habe das folgendermaßen versucht, es geht aber nicht, ich blick da eh nicht ganz durch mit der eventzuweisung... danke im voraus!

    void __fastcall TForm1::Image1Click(TObject *Sender)
    {
    TComponent *comp;
    
    for(int i=0;i<this->ComponentCount;i++)
    {
    comp = this->Components[i];
    AnsiString aClass = comp->ClassName();
    if(aClass=="TImage")
    {
    TImage *img = ((TImage *)(comp));
    img->OnClick = Image1Click;
    
    if (aim == false)
    {
    myfile = "bla";
    aim = true;
    Panel4->Color = clTeal;
    
            }
    else
    {
    Memo1->Lines->Add(TComponent);
    aim = false;
    Panel4->Color = clRed;
    
    }
    
    }
    }
    }
    


  • ups da hab ich falsch gepastet:

    das folgende event ist mit dem faQ-code allen anderen events zugewiesen worden.

    void __fastcall TForm1::Image1Click(TObject *Sender)
    {
    
    if (aim == false)
    {
    myfile = "bla";
    aim = true;
    Panel4->Color = clTeal;
    
    }
    else
    {
    Memo1->Lines->Add("");
    aim = false;
    Panel4->Color = clRed;
    }
    }
    

    **ich möchte, z.b. wenn image7 geklickt wird, panel 7 die farbe clteal zuweisen und das bild von image7 in der AnsiString variable "myfile" speichern.
    **



  • Siehe FAQ unter "Komponenten - Sender identifizieren"



  • hi,

    über den parameter sender kannst du ermitteln welches geklickt wurde.
    z. b.:

    void __fastcall TForm1::Image1Click(TObject *Sender)
    {
        switch (dynamic_cast<TImage*>(Sender)->Tag)
        {
            case 0: ShowMessage("Bild1"); break;
            case 1: ShowMessage("Bild2");
        }
    }
    

    du mußt bei dieser art natürlich den tag bei image2 auf 1 setzen. aber es gibt auch noch etliche andere möglichkeiten...

    mfg
    murph



  • Du solltest erst über Sender->Classname sicherstellen, daß es sich um TButton handelt. Dann kannst du über
    dynamic_cast<TButton*>(Sender)->Name

    Auf den Namen Button1 zugreifen und abfragen.

    das steht in der faq, mit dem dynamic_cast<TButton*>(Sender)->Name kann ich nur nichts anfangen weil ich es nicht verstehe.

    wie kann ich das (dynamic_cast (...)) in eine(n) variable / pointer packen, das ich später mit
    meinevariable->Picture->LoadFromFile("...");
    aufrufen kann?
    danke für die hife schonmal bis jetzt!



  • bis jetzt habe ichs so weit:
    es kommt nur der compiler-error :
    Zeiger auf Struktur auf linker seite von -> oder von ->* erforderlich*

    void __fastcall TForm1::Image1Click(TObject *Sender)
    {
      TComponent *dascomp;
      AnsiString istclass = dascomp->ClassName();
      if(istclass=="TImage")
      {
        AnsiString dasobjekt = dynamic_cast<TImage*>(Sender)->Name;
    
        if (aim == false)
        {
          myfile = "bla";
          aim = true;
          Panel4->Color = clTeal;
          dasobjekt->Picture->LoadFromFile("G:\\AktueLL\\Schach\\pferd-weis.jpg");
        }
        else
        {
          dasobjekt->Picture = 0;
          aim = false;
          Panel4->Color = clRed;
        }
      }
    }
    

    Edit:
    Bitte auch Einrückungen verwenden. Danke!

    [ Dieser Beitrag wurde am 04.06.2003 um 16:55 Uhr von Jansen editiert. ]



  • Hi,
    1. WO? [kommt der Fehler]

    2. Speicherplatz muss reserviert werden mit new!

    MFG

    Alexander Sulfrian

    PS: Liegt das Image in dem Panel welches die Farbe ändern soll? Soll das vielleicht irgend so ein Spiel werden?
    ala:
    Image wird gedrückt
    -> Panel wird makiert
    -> 2. Image wird gedrückt
    -> Zug wird ausgeführt

    Nur so'ne Frage?



  • ja das soll ein "schach-brett" werden, was heist eigentlich werden (?!), das ist schon eins :).
    die figuren werden wie auf [url] www.jippii.de [/url] (in java) erst markiert und dann ans zieg geschoben.



  • dasobjekt->Picture->LoadFromFile("G:\\AktueLL\\Schach\\pferd-weis.jpg");

    da kommt der fehler.

    ich möchte das "dasobjekt" wie "Image1" verwenden.



  • dasobjekt ist bei dir ein AnsiString, und der hat nun mal keine Picture-Eigenschaft.



  • wie weise ich ihm die denn zu?



  • Gar nicht, denn AnsiString hat nun mal keine Picture-Eigenschaft. 😉

    Wenn du ein TImage-Objekt benötigst dann musst du halt ein solches deklarieren und ihm zB. per dynamic_cast den Sender zuweisen. Benutz endlich mal die Suchfunktion hier, zu dynamic_cast findest du sicher zig Beispiele.



  • ich habe alle beispiele mit dynamic_cast durchgelesen, ich glaube du verstehst mich falsch:

    ich möchte NICHT ein neues TImage erstellen!
    ich möchte einen pointer oder soetwas ähnliches auf
    dynamic_cast<TImage*>(Sender)->Name;
    setzen, da ich eine große anzahl von TImages habe nicht für jedes ein event schreiben kann!
    beispielsweise:
    dasobjekt = dynamic_cast<TImage*>(Sender)->Name;
    //und später
    dasobjekt->Picture->LoadFromFile("G:\\bild.jpg");

    ich werde aus den bispielen echt nicht schlau, und bei dem o.g. bekomme ich einen compiler error. könnte mir irgendjemand ein codesnippet geben, dass einen pointer auf dynamic_cast<TImage>(Sender)->Name; anlegt !?*



  • Stell dich doch nicht so bescheuert an (sorry ;)). Was willst du immerzu mit Zeigern auf den Namen? Den sollst du nur benutzen, um festzustellen, welches Image geklickt wurde

    TImage *tmp = dynamic_cast<TImage*>(Sender);
    tmp->Picture->LoadFromFile...
    // oder
    dynamic_cast<TImage*>(Sender)->Picture->LoadFromFile...
    


  • Hi,
    ich will mal nicht so sein! Hier ein kleines BSP:

    void __fastcall TForm1::Image1Click(TObject *Sender)
    {
      // den Sender (TObject) zu TImage casten und temp zuweisen
      TImage *temp = dynamic_cast<TImage*>(Sender);
      // wenn erfolgreich
      if(temp != NULL)
      {
       // wenn noch nicht geklickt
       if (temp->Tag == 0)
       {
        // geklickt setzen
        temp->Tag = 1;
    
        // Panel auf welchem des Image liegt ermitteln und nach TPanel casten
        TPanel *panel = dynamic_cast<TPanel*>(temp->Parent)
        // wenn erfolgreich -> Farbe ändern
        if (panel != NULL) 
         panel->Color = clTeal;
    
        // Bild laden
        temp->Picture->LoadFromFile("G:\\AktueLL\\Schach\\pferd-weis.jpg");
       }
       // wenn schon mal geklickt
       else
       {
        // selber machen, ist ja fast das gleiche
       }
      }
    }
    

    MFG

    Alexander Sulfrian

    [ Dieser Beitrag wurde am 04.06.2003 um 20:59 Uhr von Alexander Sulfrian editiert. ]



  • DANKE 😉


Anmelden zum Antworten