![]() |
ein String einem TFont zuweisen
Hi,
ich habe mit dem TFontDialog experimentiert und habe folgendes probiert:
Delphi-Quellcode:
Nun bin ich soweit gekommen, dass ich den Label1.Font verändern kann (d. h. mit Schriftart, Farbe, Größe, etc.). Dann habe ich mir gedacht, das soll so bleiben, also speichere ich das doch in eine MeinProg.ini (nicht nur das, ich muss das auch mit
procedure TEinstellungen.Button7Click(Sender: TObject);
begin FontDialog1.Execute; Label1.Font := FontDialog1.Font; end;
Delphi-Quellcode:
senden können). Aber wie speichere ich das Format in einen String?
ClientSocket1.Socket.SendText(Meinfont);
Kann mir da einer helfen? THX im Voraus Gruß, Dima |
Re: ein String einem TFont zuweisen
FontToString()
oder FontToStr() weiss es nicht mehr genau :wink: |
Re: ein String einem TFont zuweisen
Hallo,
Zitat:
Ich habe es vor langer Zeit mal so gelöst:
Delphi-Quellcode:
function FontToString(Value: TFont) : String;
begin Result:=''; If Assigned(Value) then begin Result:='Name='+Value.Name+';'; Result:=Result+'Color='+IntToStr(Value.Color)+';'; FValue:=Result+'Size='+IntToStr(Value.Size)+';'; Result:=Result+'Style=['; If fsBold in Value.Style then Result:=Result+'B'; If fsItalic in Value.Style then Result:=Result+'I'; If fsUnderLine in Value.Style then Result:=Result+'U'; If fsStrikeOut in Value.Style then Result:=Result+'S'; Result:=Result+']'; end; end; |
Re: ein String einem TFont zuweisen
Hi,
OK, danke schön. Zumindest kann ich das in eine .ini speichern. Und wie wandle ich das Ganze wieder zurück? Oder kann ich einem Label1.Font einen String zuweisen? :wall: Gruß, Dima PS: kann ich trotzdem irgendwo StrToFont bzw FontToStr runterladen o. ä.? Ich meine, es ist bequem, nur eine Zeile zu haben :-D |
Re: ein String einem TFont zuweisen
Hi,
noch was: habe versucht, das Umgekehrte eigenhändig zu erstellen... Leider gab's eine Exception, als ich versucht habe, den String in den TFont umzuwandeln...
Delphi-Quellcode:
Was ist alles falsch?
function TEinstellungen.StringToFont(Value: String) : TFont;
begin begin // Schriftart Delete(Value, 1, 5); // 'Name=' entfernen Result.Name := Copy(Value, 1, pos(';', Value) - 1); // Den String bis zum ';' kopieren' Delete(Value, 1, pos(';', Value) - 1); // Das kopierte Stück entfernen // Farbe Delete(Value, 1, 7); // ';Color=' entfernen Result.Color := StrToInt(Copy(Value, 1, pos(';', Value) - 1)); // Den String bis zum ';' kopieren' Delete(Value, 1, pos(';', Value) - 1); // Das kopierte Stück entfernen // Größe Delete(Value, 1, 6); // ';Size=' entfernen Result.Size := StrToInt(Copy(Value, 1, pos(';', Value) - 1)); // Den String bis zum ';' kopieren' Delete(Value, 1, pos(';', Value) - 1); // Das kopierte Stück entfernen // Stil Delete(Value, 1, 8); // ';Style=[' entfernen if Value[1] = 'B' then begin Result.Style := Result.Style + [fsBold]; Delete(Value, 1, 1); end; if Value[1] = 'I' then begin Result.Style := Result.Style + [fsItalic]; Delete(Value, 1, 1); end; if Value[1] = 'U' then begin Result.Style := Result.Style + [fsUnderLine]; Delete(Value, 1, 1); end; if Value[1] = 'S' then begin Result.Style := Result.Style + [fsStrikeOut]; Delete(Value, 1, 1); end; end; end; Gruß, Dima |
Re: ein String einem TFont zuweisen
Das geht so auch nicht! TFont ist ein Objekt und kein Record, wie man vermuten könnte.
Deshalb müsste man erst Result := TFont.Create machen, aber besser ist es so:
Delphi-Quellcode:
procedure StrToFont(const Name: string; Font: TFont);
begin Font.Name := Name; end; |
Re: ein String einem TFont zuweisen
Hi,
ok, erstens: werden hier die ganzen Einstellungen in dem String gespeichert, wie Farbe und so oder nur die Schriftart? Ich brauche ja Farben, Größe, etc. -> siehe MSN Messenger Ich kann natürlich auch mehrere Strings hintereinander schicken, aber das ist Dummfug.. würde schon gerne so machen:
Delphi-Quellcode:
Gruß, Dima
// im Moment:
ClientSocket1.Socket.SendText(NickName + '#' + MyMessage); // soll werden: ClientSocket1.Socket.SendText(NickName + '#' + FontProfile + '#' + MyMessage); |
Re: ein String einem TFont zuweisen
Zitat:
Delphi-Quellcode:
ansonsten würde die font auch dem Label zugewiesen werden wenn der Dialog abgebrochen wird.
if FondDialog1.Execute then
Label1.Font := FontDialog1.Font; |
Re: ein String einem TFont zuweisen
Zitat:
|
Re: ein String einem TFont zuweisen
Hi,
Das Problem ist, dass ich weiß nicht, was jetzt Sache ist! das hier:
Delphi-Quellcode:
oder
function TEinstellungen.StringToFont(Value: String) : TFont;
begin Result := TFont.Create(Self); begin // Schriftart Delete(Value, 1, 5); // 'Name=' entfernen Result.Name := Copy(Value, 1, pos(';', Value) - 1); // Den String bis zum ';' kopieren' Delete(Value, 1, pos(';', Value) - 1); // Das kopierte Stück entfernen // Farbe Delete(Value, 1, 7); // ';Color=' entfernen Result.Color := StrToInt(Copy(Value, 1, pos(';', Value) - 1)); // Den String bis zum ';' kopieren' Delete(Value, 1, pos(';', Value) - 1); // Das kopierte Stück entfernen // Größe Delete(Value, 1, 6); // ';Size=' entfernen Result.Size := StrToInt(Copy(Value, 1, pos(';', Value) - 1)); // Den String bis zum ';' kopieren' Delete(Value, 1, pos(';', Value) - 1); // Das kopierte Stück entfernen // Stil Delete(Value, 1, 8); // ';Style=[' entfernen if Value[1] = 'B' then begin Result.Style := Result.Style + [fsBold]; Delete(Value, 1, 1); end; if Value[1] = 'I' then begin Result.Style := Result.Style + [fsItalic]; Delete(Value, 1, 1); end; if Value[1] = 'U' then begin Result.Style := Result.Style + [fsUnderLine]; Delete(Value, 1, 1); end; if Value[1] = 'S' then begin Result.Style := Result.Style + [fsStrikeOut]; Delete(Value, 1, 1); end; end; end;
Delphi-Quellcode:
wogegen hier nur die Schriftart gespeichert wird. Oder soll ich die oben genannten Beispiele anwenden und mir keinen Kopf sondern einen elend langen Quelltext machen? :wall:
procedure StrToFont(const Name: string; Font: TFont);
begin Font.Name := Name; end; Besser wäre natürlich das:
Delphi-Quellcode:
Gruß, Dima
FontToStr(MeinFont);
// bzw. StrToFont(MeinString); // also halt wie StrToInt('16'); :kotz: |
Re: ein String einem TFont zuweisen
Nun soweit mir bekannt ist gibt es keine vorgefertigte Funktion dafür. Deshalb musst du wohl oder übel den langen Quelltext (wenn du alle Daten nutzen möchtest) benutzen. Allerdings kannst du ihn doch in eine Funktion auslagern (am besten in einer eigenen Unit). Dann kannst du von überall diese Funktion aufrufen.
|
Re: ein String einem TFont zuweisen
das heißt die beiden quellcodes werden funktionieren?
(muss noch delphi neu installieren :lol: ) gruß, dima |
Re: ein String einem TFont zuweisen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe hier noch eine Möglichkeit anzubieten. TFont ist ein Nachfahre von TPersistent. Also muss man irgendwie das Delphi-Streamingsystem benutzen können. Angeregt durch einen anderen Thread (wie nicht mehr wo) habe ich jetzt folgenden Vorschlag. Für die Lösung werden wir ObjectTextToBinary und ObjectBinaryToText verwenden. Hier die Funktion, die das Objekt in einen String konvertiert
Delphi-Quellcode:
Die Funktion erwartet einen Parameter der Klasse TPersistent. Da TFont ein Nachfahre von
Type
TPersistentDummyComponent = class(TComponent) private FPersistent: TPersistent; published property Persistent : TPersistent read FPersistent write FPersistent; end; ... function PersitentToString(Persistent : TPersistent): string; var BinStream : TMemoryStream; StrStream : TStringStream; s : string; FPersitentDummy : TPersistentDummyComponent; begin FPersitentDummy:=TPersistentDummyComponent.Create(Nil); BinStream := TMemoryStream.Create; try FPersitentDummy.Persistent:=Persistent; StrStream := TStringStream.Create(s); try BinStream.WriteComponent(FPersitentDummy); BinStream.Seek(0, soFromBeginning); ObjectBinaryToText(BinStream, StrStream); StrStream.Seek(0, soFromBeginning); Result:= StrStream.DataString; finally StrStream.Free; end; finally FPersitentDummy.Free; BinStream.Free end; end; TPersistent ist, ist das auch kein Problem. Da die Methode WriteComponent eine Komponente als Parameter erwartet, können wir den Parameter Persistent nicht direkt verwenden. Dafür habe ich mir eine Dummyklasse (TPersistentDummyComponent) gebastelt. Diese Klasse hat die published (nur published properties werden automatisch gestreamt) property Persistent. Nach
Delphi-Quellcode:
hängt unser Paramter (also das Objekt, das wir in einen String verwandel wollen) an TPersistentDummyComponent. Dann wird ein bisschen getreamt und anschließend mit ObjectBinaryToText ein String daraus gemacht.
FPersitentDummy.Persistent:=Persistent;
Die Funktion StringToPersitent geht jetzt den umgekehrten Weg. Value ist das Objekt als String und der Parameter Persistent eine Referenz auf ein gültiges Objekt. Mit dieser Funktion kan das Objekt aus dem String wieder hergestellt werden.
Delphi-Quellcode:
Die Funktionen finden sich in der unit PersistentStr.pas.
function StringToPersitent(Value: string; Persistent : TPersistent): TPersistent;
var StrStream : TStringStream; BinStream : TMemoryStream; FPersitentDummy : TPersistentDummyComponent; begin FPersitentDummy:=TPersistentDummyComponent.Create(Nil); FPersitentDummy.Persistent:=Persistent; StrStream := TStringStream.Create(Value); try BinStream := TMemoryStream.Create; try ObjectTextToBinary(StrStream, BinStream); BinStream.Seek(0, soFromBeginning); Result:=(BinStream.ReadComponent(FPersitentDummy) as TPersistentDummyComponent).Persistent; finally BinStream.Free; end; finally FPersitentDummy.Free; StrStream.Free; end; end; Beispiel -> siehe Anlage Ach ja - man natürlich nicht nur TFont in einen String konvertieren, sondern auch jeden Nachfahren von TPersistent. |
Re: ein String einem TFont zuweisen
hi,
o-kay, thx, ich versuche was damit anzufangen ;-) danke für die mühe!!!!!!! gruß, Dima |
Re: ein String einem TFont zuweisen
Ich glaub ich hab da was schönes für dich :???:
Exakt das selbe Problem wie du hatte ich vor einiger Zeit auch, bis ich auf dieses schöne Stück Code gestoßen bin :wink: Font -> String
Delphi-Quellcode:
String -> Font
function FontToString(Font: TFont): string;
begin Assert(Assigned(Font)); // name, size, bold, italic, underline, strikethrough, colour Result := Format('%s,%d,%d%d%d%d,%s', [Font.Name, Font.Size, Integer(fsBold in Font.Style), Integer(fsItalic in Font.Style), Integer(fsUnderline in Font.Style), Integer(fsStrikeOut in Font.Style), ColorToString(Font.Color)]); end;
Delphi-Quellcode:
Hoffe ich konnte helfen!
procedure StringToFont(Str: string; Font: TFont);
const SEP = ','; var i: Integer; begin Assert(Assigned(Font)); i := Pos(SEP, Str); if i = 0 then raise EConvertError.Create(EXCEPT_MSG1); Font.Name := Copy(Str, 1, i - 1); Delete(Str, 1, i); i := Pos(SEP, Str); if i = 0 then raise EConvertError.Create(EXCEPT_MSG1); Font.Size := StrToInt(Copy(Str, 1, i - 1)); Delete(Str, 1, i); if Pos(SEP, Str) <> 5 then raise EConvertError.Create(EXCEPT_MSG1); Font.Style := []; if Str[1] = '1' then Font.Style := Font.Style + [fsBold]; if Str[2] = '1' then Font.Style := Font.Style + [fsItalic]; if Str[3] = '1' then Font.Style := Font.Style + [fsUnderline]; if Str[4] = '1' then Font.Style := Font.Style + [fsStrikeOut]; Delete(Str, 1, 5); Font.Color := StringToColor(Str); end; Schöne Vorweihnachtszeit, Interceptor |
Re: ein String einem TFont zuweisen
Hi,
Mann, ich werde ja bombardiert mit Beiträgen! :lol: Danke euch!! Ich werde natürlich alle Funktionen in eine Unit sammeln und zum Download anbieten. Frohe Weihnachten & einen Guten Rutsch!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz