Wyswietlanie ulamkow, poteg itp.

0

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.

0

"alfa, beta, gamma, delta, pi itp. itd" to są w czcionce "symbol". Z resztą nie wiem jak sobie poradzić w richedicie.

0

fuckt. Potege drugiego i trzeciego stopnia tez mozna stamtad wziac. Jeszcze tylko >4 i ulamki :/

0

Niestety, ulamki sa niezbedne, a w tym komponencie ich nie ma.
A na torrym nic nie znalazlem [glowa]

0

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

0

To moze w HTML-u? Uzylbym wtedy WebBrowsera...
To z RichEditem sprawdze..

0

W HTMLu to tylko LATEX .. generuje obrazek wstawiony w kodzie np :

$\frac{1}{\sqrt{x}}$

Da w rezultacie 1/sqrt(x)...

0

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

0

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

0

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

0

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?

0

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

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1