Komponenten in Funktion übergeben



  • Hallo bestimmt gabs bzw gibt es dieses Thema schon zu Haufe, aber ich seh bei der Suche nicht ganz durch der findet immer nur einzelne Wörter...
    Zum Problem:

    String css(TObject *Sender,String name)
    {  
      string gen_css                      
      byte r,g,b;
      r = GetRValue(Sender->Font->Color);  // Farbe filtern
      g = GetGValue(Sender->Font->Color);
      b = GetBValue(Sender->Font->Color);
    
      gen_css = "color: #" + IntToHex(r,2)+ IntToHex(g,2)+ IntToHex(b,2)+ ";";
      return gen_css; 
    }
    

    Das ist nur ein Ausschnitt, das Problem ist natürlich, das der Compiler nun meckert, dass hier "Font" kein Element von "TObject" ist. Ich würde gerne wissen wie ich die Komponenten übergeben kann, es handelt sich hierbei um 2 Memos und 2 Editfeldern. Hintergrund ist die Analyse der Schrift um ein CSS-Klasse zurückzugeben in Form eines Strings (HTML-Editor)

    Danke für eure hilfe 👍



  • Hallo

    Ich würde gerne wissen wie ich die Komponenten übergeben kann, es handelt sich hierbei um 2 Memos und 2 Editfeldern

    Wie willst du denn mehrere Komponenten gleichzeitig übergeben?
    Du kannst in der Funktion Sender casten. Wenn du nur auch TFont zugreifen willst, reicht es auf TControl zu casten

    String css(TObject *Sender,String name)
    {  
      string gen_css                      
      byte r,g,b;
      TControl* control = dynamic_cast<TControl*>(Sender);
      if (!control) return ""; // Kein Control übergeben, abbrechen
      r = GetRValue(Control->Font->Color);  // Farbe filtern
      g = GetGValue(Control->Font->Color);
      b = GetBValue(Control->Font->Color);
    
      gen_css = "color: #" + IntToHex(r,2)+ IntToHex(g,2)+ IntToHex(b,2)+ ";";
      return gen_css;
    }
    

    bis bald
    akari



  • Hallo danke für deine schnelle Hilfe, ich habe mit TControl mal durchgelesen und eigentlich müsste es funktionieren, aber der Compiler meint:
    Zugriff auf TControl::Font nicht möglich, beim genaueren Nachlesen:
    Sie versuchen, auf ein Element einer C++ Klasse zuzugreifen, das private oder protected und aus dieser Funktion heraus nicht zugänglich ist.

    mfg



  • Hallo

    Sorry ich hab nicht dran gedacht das die Property Font erst in den konkreten Arbeitsklassen (TEdit) auf public gesetzt wird 🙄

    Dann bleibt dir nichts anderes übrig als für jeden Controltyp zu testen

    String css(TObject *Sender,String name)
    {  
      string gen_css                      
      byte r,g,b;
      TFont* Font = 0;
    
      TEdit* Edit = dynamic_cast<TEdit*>(Sender);
      if (Edit) Font = Edit->Font;
      TMemo* Memo = dynamic_cast<TMemo*>(Sender);
      if (Memo) Font = Memo->Font;
    
      if (!Font) return "";
    
      r = GetRValue(Font->Color);  // Farbe filtern
      g = GetGValue(Font->Color);
      b = GetBValue(Font->Color);
    
      gen_css = "color: #" + IntToHex(r,2)+ IntToHex(g,2)+ IntToHex(b,2)+ ";";
      return gen_css;
    }
    

    Das ist natürlich nicht schön, deshalb solltest du dein Konzept überprüfen. Wenn du doch noch vereinbaren kannst das wirklich nur genau ein Controltyp mit dieser Funktion aufgerufen wird, reicht ein einfacher static_cast.

    bis bald
    akari



  • Hey akari vielen vielen Dank das hat mir sehr geholfen und nebenbei ist man ein Stück schlauer geworden :p
    Ja das reicht völlig aus, da ich nur jeweils eine Komponente für den CSS-Check übergebe, dabei hätt ich noch eine kleine Frage. Ich finde die Eigenschaft Styles etwas verwirrend aufgebaut, d.h. er speichert mehrere Zustände ab (bold,italic,underline ..) ich weis nicht wie ich die Sachen einzeln abfragen kann ?

    String gcss;                 // CSS Stylesheet
        gcss = name+" {";
        gcss += " color: #"+IntToHex(r,2)+IntToHex(g,2)+IntToHex(b,2)+";";  // Color
        gcss += " font: "+IntToStr(Font->Size)+"pt";   // Size
        if (Font->Style == TFontStyles() << fsBold << fsItalic)  // Bold and Italic ?
            gcss += " bold italic";
        else if (Font->Style == TFontStyles() << fsBold)
            gcss += " bold";
        else if (Font->Style == TFontStyles() << fsItalic)
            gcss += " italic";
        gcss += " "+Font->Name+"; ";
        if (Font->Style == TFontStyles() << fsUnderline)  // Underline ?
            gcss += " text-decoration: underline;";
        gcss += "}";
        return gcss;
    

    Siehe Code, wenn man jetzt z.B. den text unterstreicht, fett und kursiv macht gibt er keine styles dafür aus, da alle 3 Sachen erfüllt sind. Ich hätte es aber gerne einzeln abgefragt da es verschiedene Style-Attribute dafür gibt.

    Danke für deine kompetente Hilfe 👍



  • Hallo

    Wie auch in der Builder-Hilfe zu dem Template Set<..> beschrieben :

    if (Font->Style.Contains(fsBold))
    

    bis bald
    akari



  • 🤡 Suppi thx

    Darauf wär ich nie gekommen 😃


Anmelden zum Antworten