Potrzebowalbym jakiegos komponentu, najlepiej memo/RichEdit, ktory by mial mozliwosc wyswietlania poteg, ulamkow <- to niezbedne, choc dobrze by bylo, gdyby byly jeszcze pierwiastki, i znaki typu alfa, beta, gamma, delta, pi itp. itd.
"alfa, beta, gamma, delta, pi itp. itd" to są w czcionce "symbol". Z resztą nie wiem jak sobie poradzić w richedicie.
fuckt. Potege drugiego i trzeciego stopnia tez mozna stamtad wziac. Jeszcze tylko >4 i ulamki :/
Niestety, ulamki sa niezbedne, a w tym komponencie ich nie ma.
A na torrym nic nie znalazlem [glowa]
w FAQ masz opisane jak robic indexy
(kod tam jest troche taki dziwny, ja musialem go sobie poprawiac :))
tym sposobem zrobisz potegi
ulamki mozesz otrzymac korzystajac z indexow (z tymze nie bedzie to napisane jedno pod drugim...choc dla chciacego nic trudnego :])
wystarczy napisac 1 (z indexem gornym) potem "/" a na koniec np. 2 (z indexem dolnym) i otrzymamy cos podobnego do tego symbolu w dosie.
wyglada ladniej niz zwykle 1/2 choc gorzej niz te na kartce papieru.
Jednakze z richedit nic innego raczej nie wskurasz
To moze w HTML-u? Uzylbym wtedy WebBrowsera...
To z RichEditem sprawdze..
W HTMLu to tylko LATEX .. generuje obrazek wstawiony w kodzie np :
$\frac{1}{\sqrt{x}}$
Da w rezultacie 1/sqrt(x)...
W HTMLu to tylko LATEX .. generuje obrazek wstawiony w kodzie np :
$\frac{1}{\sqrt{x}}$
Da w rezultacie 1/sqrt(x)...
Nie tylko!!
http://4programmers.net/Forum/viewtopic.php?id=51706
Marooned.. "tylko" w sensie, że jest imho najlepszy...
//no chyba, że tak - choć które rozwiązanie lepsze to można by polemizować - ale to nie ważne - autor pytania sobie wybierze - m.M
TeX-a byloby chyba trudno uzywac w swojej aplikacji, poza tym musialbym sie go najpierw nauczyc itp., a troche czasu....
Marooned: Na twoim linku nie moge jakos nic znalezc, niby sa przyklady, ale nie ma tam zadnych formul matematycznych.. :-8
//szukajcie a znajdziecie - ja stamtąd to zassałem i sobie używałem - m.M
Ok, mam z torry:
type
TCharacterFormat = (CFM_Sup, CFM_Sub, CFM_Normal);
procedure RE_SetCharFormat(Rich: TRichEdit; CharacterFormat: TCharacterFormat);
var
Format: TCharFormat;
begin
FillChar(Format, SizeOf(Format), 0);
with Format do
begin
cbSize := SizeOf(Format);
dwMask := CFM_OFFSET;
case CharacterFormat of
CFM_Sup: yOffset := 60;
CFM_Sub: yOffset := -60;
CFM_Normal: yOffset := 0;
end;
end;
Rich.Perform(EM_SETCHARFORMAT, SCF_SELECTION, LParam(@Format));
end;
I potem:
RE_SetCharFormat(RichEdt, CFM_Sup);
RichEdt.Text:= RichEdt.Text + '1';
RE_SetCharFormat(RichEdt, CFM_Normal);
RichEdt.Text:= RichEdt.Text + '/';
RE_SetCharFormat(RichEdt, CFM_Sub);
RichEdt.Text:= RichEdt.Text + '2';
Ale nie dodaje atrybutow (indeksow)
Zauwazylem to: SCF_SELECTION, sprawdzilem - i dziala, ale na zaznaczony text.
Poszukalem w zrodelkach richEdita (:)) i:
{ EM_SETCHARFORMAT wParam masks }
{$EXTERNALSYM SCF_SELECTION}
SCF_SELECTION = $0001;
{$EXTERNALSYM SCF_WORD}
SCF_WORD = $0002;
{$EXTERNALSYM SCF_DEFAULT}
SCF_DEFAULT = $0000;{ set the default charformat or paraformat }
{$EXTERNALSYM SCF_ALL}
SCF_ALL = $0004; { not valid with SCF_SELECTION or SCF_WORD }
{$EXTERNALSYM SCF_USEUIRULES}
SCF_USEUIRULES = $0008; { modifier for SCF_SELECTION; says that }
{ the format came from a toolbar, etc. and }
{ therefore UI formatting rules should be }
{ used instead of strictly formatting the }
{ selection. }
Sprawdzilem wszystkie po kolei, i zaden parametr nie dziala tak, jak chce - zastosowac atrybutow do richedita dla tekstu, ktory bedzie dopiero wpisany :-8
moze cos pominalem, albo da sie to jakos inaczej?
Siemka wasyl
To co znalazłeś na necie (chyba nawet jest to na 4p) to tylko takie pseudo indeksy górne i dolne bo korzystają jedynie z podniesienia i opuszczenia tekstu w stosunku do linii bazowej.
Ja kiedyś przechodziłem podobne męki (nie tworzyłem ułamków), ale musiałem utworzyć NORMALNE indeksy (takie, żeby dobrze je odczytywał Word), więc musiałem uzyć typu TCharFormat2, a nie TCharFormat jak jest domyślnie zdefiniowany w klasie TRichEdit. TCharFormat2 i TParaFormat2 (czyli pełna obsługa paragrafów) są zdefiniowane w unicie RichEdit.
Niestety taka działalność wiąże się ze zdefiniowaniem własnej klasy (np. TRichEdit2), która będzie potomna po TRichEdit, ale będzie używała dodatkowych opcji.
interface
TRichEdit2=class;
TTextAttributes2= class(TPersistent)
private
RichEdit: TRichEdit2;
.....
function GetSubscript: Boolean;
function GetSuperscript: Boolean;
.....
procedure SetSubscript(Value: Boolean);
procedure SetSuperscript(Value: Boolean);
procedure InitFormat(var Format2: TCharFormat2);
public
constructor Create(AOwner: TRichEdit2);
procedure GetAttributes(var Format2: TCharFormat2);
procedure SetAttributes(var Format2: TCharFormat2);
........
property Subscript: Boolean read GetSubscript write SetSubscript;
property Superscript: Boolean read GetSuperscript write SetSuperscript;
end;
TParaAttributes2 = class(TPersistent)
private
RichEdit: TRichEdit2;
.......
procedure InitPara(var Paragraph2: TParaFormat2);
public
constructor Create(AOwner:TRichEdit2);
procedure GetAttributes(var Paragraph2: TParaFormat2);
procedure SetAttributes(var Paragraph2: TParaFormat2);
........
end;
TRichEdit2 = class(TRichEdit)
private
FFormat2:TTextAttributes2;
FParagraph2: TParaAttributes2;
.........
protected
..........
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
.........
property Format2: TTextAttributes2 read FFormat2;
property Paragraph2: TParaAttributes2 read FParagraph2;
end;
implementation
{ TTextAttributes2 }
constructor TTextAttributes2.Create(AOwner:TRichEdit2);
begin
inherited Create;
RichEdit:=AOwner;
end;
function TTextAttributes2.GetSubscript: Boolean;
var Format2:TCharFormat2;
begin
GetAttributes(Format2);
Result:=(Format2.dwEffects and CFE_SUBSCRIPT)<>0;
end;
procedure TTextAttributes2.SetSubscript(Value: Boolean);
var Format2: TCharFormat2;
begin
InitFormat(Format2);
Format2.dwMask:=CFM_SUBSCRIPT;
if Value then Format2.dwEffects:=CFE_SUBSCRIPT;
SetAttributes(Format2);
end;
function TTextAttributes2.GetSuperscript: Boolean;
var Format2:TCharFormat2;
begin
GetAttributes(Format2);
Result:=(Format2.dwEffects and CFE_SUPERSCRIPT)<>0;
end;
procedure TTextAttributes2.SetSuperscript(Value: Boolean);
var Format2: TCharFormat2;
begin
InitFormat(Format2);
Format2.dwMask:=CFM_SUPERSCRIPT;
if Value then Format2.dwEffects:=CFE_SUPERSCRIPT;
SetAttributes(Format2);
end;
procedure TTextAttributes2.InitFormat(var Format2: TCharFormat2);
begin
FillChar(Format2, SizeOf(TCharFormat2), 0);
Format2.cbSize := SizeOf(TCharFormat2);
end;
procedure TTextAttributes2.GetAttributes(var Format2: TCharFormat2);
begin
InitFormat(Format2);
if RichEdit.HandleAllocated then
SendMessage(RichEdit.Handle, EM_GETCHARFORMAT, SCF_SELECTION, LPARAM(@Format2));
end;
procedure TTextAttributes2.SetAttributes(var Format2: TCharFormat2);
begin
RichEdit.HandleNeeded;
if RichEdit.HandleAllocated then
SendMessage(RichEdit.Handle, EM_SETCHARFORMAT, SCF_SELECTION, LPARAM(@Format2));
end;
{ TParaAttributes2 }
constructor TParaAttributes2.Create(AOwner:TRichEdit2);
begin
inherited Create;
RichEdit:=AOwner;
end;
.........
procedure TParaAttributes2.InitPara(var Paragraph2: TParaFormat2);
begin
FillChar(Paragraph2, SizeOf(TParaFormat2), 0);
Paragraph2.cbSize := SizeOf(TParaFormat2);
end;
procedure TParaAttributes2.GetAttributes(var Paragraph2: TParaFormat2);
begin
InitPara(Paragraph2);
if RichEdit.HandleAllocated then
SendMessage(RichEdit.Handle, EM_GETPARAFORMAT, 0, LPARAM(@Paragraph2));
end;
procedure TParaAttributes2.SetAttributes(var Paragraph2: TParaFormat2);
begin
RichEdit.HandleNeeded;
if RichEdit.HandleAllocated then
SendMessage(RichEdit.Handle, EM_SETPARAFORMAT, 0, LPARAM(@Paragraph2));
end;
{ TRichEdit2 }
constructor TRichEdit2.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FFormat2:=TTextAttributes2.Create(Self);
FParagraph2:=TParaAttributes2.Create(Self);
end;
destructor TRichEdit2.Destroy;
begin
FFormat2.Free;
FParagraph2.Free;
inherited Destroy;
end;
Moze to coś pomoże
Ja to bym te wszystkie ułamki potęgi itp robił na Image.Canvas. Wszystkie współrzedne mnożyłbym od razu przez współczynnik powiększenia. Na koniec mamy zooma a drukowanie załatwią te same proc zastosowane do Printer.Canvas.