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 13:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz