StringGrid1->Canvas->Font->Style speichern
-
Hallo akari,
das finde ich ja super, dass du dich meine Probleme annimmst. Versuche zunächst, deinen Source genau zu verstehen. Wie kann ich jetzt Style meiner StringGrid->Canvas->Font ausgeben lassen. Etwa so?FontStyles << StringGrid->Canvas->Font->Style;
Value = SetToInt(FontStyles, fsStrikeOut);Möchte StringGrid1->Canvas->Font folgendermaßen speichern.
[cpp][code]
void __fastcall TForm1::SpaltenSchrift1Click(TObject *Sender)
{
int ACol=StringGrid1->Col;
if (FontDialog1->Execute())
{
String S = "<0>"+FontDialog1->Font->Name;
S += "<1>"+IntToStr(FontDialog1->Font->Size);
S += "<2>"+IntToStr(FontDialog1->Font->Color);
S += "<3>“+... hier soll Style gespeichert werden ...+”<4>";
StringGrid1->Cells[ACol][2]=S; // speichern im Haeder der betreffenden Spalte
StringGrid1->Refresh();
}
}
//---------------------------------------------------------------------------Was meinst du dazu?
Gruß Egbert
PS
Irgendwie kriege ich das mit der Code-Eingabe hier nicht hin. Was mache ich falsch?
-
Hallo
Um die Funktionen zu verstehen, mußt du dich mit Templates beschäftigen (Set ist übrigens auch ein Template).
Im Grunde geht es darum, gleiche Methoden für ähnliche Typen zu schreiben, ohne für jeden Typ eine eigene Funktion schreiben zu müßen.S += "<3>"+IntToStr(SetToInt(FontDialog1->Font->FontStyle))+"<4>";
Wenn du dann das wieder einlesen willst, schreibst du
TFont *Font; int Value; ... // Integer-Wert zwischen <3> und <4> auslesen und in Value schreiben // danach Integer in TFontStyles umwandeln Font->Styles = IntToSet<TFontStyles,TFontStyle>(Value,fsStrikeOut);
bis bald
akari
-
Hallo akari,
jetzt komme ich allmählich dahinter. Nimm es mir aber bitte nicht übel, wenn ich dich mit meiner Unerfahrenheit belästige. Nur so kann ich es ja lernen!!!.
Werde deine Routinen einbinden und letzteres nachvollziehen. Ebenfalls werde ich mich mit Templates beschäftigen, um das Ganze einfach besser zu verstehen. Jetzt mache ich aber erst mal Schluss hier und lege den Hebel um.
Hab vielen Dank. Ohne deine Hilfe hätte ich es jedenfalls nicht hinbekommen.
Gruß Egbert
-
Suchfunktion benutzen! Z.B.
http://www.c-plusplus.net/forum/viewtopic.php?t=78972&highlight=font+style+speichern
-
Hallo
Für TFontStyles ist das ja eine Lösung. Aber leider kann man das nicht in ein Template bringen, was an der globalen Variable liegt. Wo liegt denn der Unterschied zwischen dem
// Konvertierung funktioniert, ist aber durch globale Variable sinnlos, denn // nur für TFontStyles nutzbar TFontStyles style_dummy; template <typename SetType> int SetToInt(SetType Set) { style_dummy = Set; long &ref = (long &) style_dummy; return(ref); }
und dem
// Konvertierung funktioniert nicht, Rückgabewert ist ein wilder Wert // (Speicheradresse?) template <typename SetType> int SetToInt(SetType Set) { SetType dummy = Set; long &ref = (long &) dummy; return(ref); }
Meine Lösung ist zwar umständlich (muß noch optimiert werden) aber zumindestens
ist sie für alle Sets anwendbar./Edit : was ist das long &ref eigentlich? soetwas habe ich noch nie gesehen. (In so einen Zusammenhang. Ansonsten ist es ja eine Referenz.)
bis bald
akari
-
Hallo akari,
komme nochmal auf mein Problem zurück. Habe deine Routinen eingebaut. Außer fsBold, wird kein Wert zurückgegeben.
Beim compilieren der Unit wird die Warnung:
W8006 const TFontStyle wird mit int initialisiert
ausgegeben. Kann eigentlich nicht verstehen, dass es so schwierig ist, die Werte für Style zu bekommen.
Inzwischen habe ich mir folgende, umständliche Möglichkeit ausgedacht, die einwandfrei funktioniert.Byte StyleToByte(TFont *FST) { Byte re=255; if (FST->Style == (TFontStyles() << fsBold << fsItalic << fsUnderline)) re=9; else if (FST->Style == (TFontStyles() << fsBold << fsItalic << fsStrikeOut)) re=10; else if (FST->Style == (TFontStyles() << fsBold << fsItalic)) re=4; else if (FST->Style == (TFontStyles() << fsBold << fsUnderline)) re=5; else if (FST->Style == (TFontStyles() << fsBold << fsStrikeOut)) re=6; else if (FST->Style == (TFontStyles() << fsItalic << fsUnderline)) re=7; else if (FST->Style == (TFontStyles() << fsItalic << fsStrikeOut)) re=8; else if (FST->Style == (TFontStyles() << fsBold)) re=0; else if (FST->Style == (TFontStyles() << fsItalic)) re=1; else if (FST->Style == (TFontStyles() << fsUnderline)) re=2; else if (FST->Style == (TFontStyles() << fsStrikeOut)) re=3; return re; } TFontStyles ByteToStyle(Byte FST) { if (FST == 0) return (TFontStyles() << fsBold); else if (FST == 1) return (TFontStyles() << fsItalic); else if (FST == 2) return (TFontStyles() << fsUnderline); else if (FST == 3) return (TFontStyles() << fsStrikeOut); else if (FST == 4) return (TFontStyles() << fsBold << fsItalic); else if (FST == 5) return (TFontStyles() << fsBold << fsUnderline); else if (FST == 6) return (TFontStyles() << fsBold << fsStrikeOut); else if (FST == 7) return (TFontStyles() << fsItalic << fsUnderline); else if (FST == 8) return (TFontStyles() << fsItalic << fsStrikeOut); else if (FST == 9) return (TFontStyles() << fsBold << fsItalic << fsUnderline); else if (FST == 10) return (TFontStyles() << fsBold << fsItalic << fsStrikeOut); else TFontStyles(); return TFontStyles(); }
Gruß Egbert
-
Hallo
Habe deine Routinen eingebaut. Außer fsBold, wird kein Wert zurückgegeben.
Beim compilieren der Unit wird die Warnung:
W8006 const TFontStyle wird mit int initialisiert
ausgegeben.Dieser Fehler kommt bei mir nur, wenn ich bei
Value = SetToInt(FontStyles, fsStrikeOut);
statt dem fsStrikeOut eine Zahl wie 4 übergebe
Kann eigentlich nicht verstehen, dass es so schwierig ist, die Werte für Style zu bekommen.
Inzwischen habe ich mir folgende, umständliche Möglichkeit ausgedacht, die einwandfrei funktioniert.Schau dir noch mal den Link von Jansen an, da werden für TFontStyles bereits vorgefertigte Funktionen dargestellt (Den Link zu den Newsgroups folgen).
Das ist auf jeden Fall besser als deine Variante (Zumal die nicht vollständig ist).bis bald
akari
-
Hallo,
ja ok, das ist ja auch nur aus Verzweifelung entstanden.
Auf dem Link von Jansen war ich schon, habe aber nichts Konkretes gefunden. Werde da trotzdem noch mal nachschauen.
Gruß Egbert…
-
Hallo
Bin auf dem Link pfundig geworden und jetzt klappt alles, wie gewünscht. Manchmal sieht man den Wald vor lauter Bäumen nicht.
Hier nun, wie ich es gemacht habe.TFontStyles style_dummy; ... try { long &style_ref = (long &)style_dummy; style_ref = 0; p4=S.Pos("<4>"); style_ref = S.SubString(p3+3,p4-p3-3).ToInt(); StringGrid1->Canvas->Font->Style=style_dummy; } catch(...) { StringGrid1->Canvas->Font->Style=TFontStyles(); } ...
Möchte mich auf diesem Wege noch mal für die Hilfe und Hinweise herzlich bedanken.
Gruß Egbert…
-
Hallo
hab nochmal meine Templates überarbeitet
// Umwandlung beliebiges Set in Integer // Eingabewerte : // SetType Source - das umzuwandelnde Set template <class Enum, unsigned char MinElem, unsigned char MaxElem> int SetToInt(const Set<Enum, MinElem, MaxElem> & Source) { int Result = 0; // Rückgabewert int CurrPower = int(pow(2, MinElem)); // Jede einzelne Option abfragen und wenn vorhanden, in Ergebnis eintragen for (int Lv = MinElem; Lv <= MaxElem; Lv++) { if (Source.Contains(Enum(Lv))) Result = Result ^ CurrPower; CurrPower *=2; } return(Result); } // Umwandlung Integer in beliebiges Set // Eingabewerte : // int Integer - die umzuwandelnde Zahl // SetType Dest - Set, das vom selbem Typ ist wie das Ziel-Set (wird nicht verändert) template <class Enum, unsigned char MinElem, unsigned char MaxElem> Set<Enum, MinElem, MaxElem> IntToSet(int Integer, const Set<Enum, MinElem, MaxElem> & Dest) { Set<Enum, MinElem, MaxElem> Result = Set<Enum, MinElem, MaxElem>(); // Rückgabewert int Buffer = int(pow(2,MaxElem)); // Zwischenspeicher // Jede 2-Potenz vom höchsten Wert angefangen bis 0 abfragen und // wenn vorhanden, in Ergebnis aktivieren for (int Lv = MaxElem; Lv >= MinElem; Lv--) { if (Integer >= Buffer) { Integer -= Buffer; Result << Enum(Lv); } Buffer /= 2; } return(Result); }
Verwendung mit (hier mit TFontStyles, funktioniert aber auch mit allen anderen Sets)
TFontStyles FontStyles; int Value; FontStyles << fsBold << fsUnderline; Value = SetToInt(FontStyles); FontStyles.Clear(); FontStyles = IntToSet(Value, FontStyles); // Das FontStyles als Parameter wird nicht veränder!
bis bald
akari
-
Hallo
ja, jetzt laufen deine Templates ufb !!!
Gruß Egbert