Avatar billede mr.meincke Nybegynder
28. december 2003 - 04:38 Der er 12 kommentarer og
1 løsning

Richedit, bunden istedet for toppen

Hej,

Hvordan gør jeg så teksten i en richedit bliver "alignet" i bunden - Ligsom IRC fx ??

//Mr.Meincke
Avatar billede mr.meincke Nybegynder
28. december 2003 - 04:50 #1
Giver gerne flere points ;)
Avatar billede mr.meincke Nybegynder
28. december 2003 - 07:58 #2
Slet ikke nogen som kender det svar?
Avatar billede hrc Mester
28. december 2003 - 13:24 #3
Har ikke lige haft lyst til den slags GUI - vil prøve at tumle lidt med det. Forventer/frygter dog, at man ikke kan "vride" den eksisterende TRichEdit i den retning, men må forlade sig på komponentfremstilling - men hvad ved jeg, endnu...
Avatar billede mr.meincke Nybegynder
28. december 2003 - 18:24 #4
hehe oki :)
Avatar billede zerohero Nybegynder
29. december 2003 - 03:30 #5
Et eksempel der viser resultatet på formens canvas. Derfor sæt din RichEdit ca. midt på din form når du tester den. Du vil let kunne ændre koden, til at tegne på andre komponenter end formens canvas!

skriv følgende i din RichEdit's OnSelectionChange property:

procedure TForm1.RichEdit1SelectionChange(Sender: TObject);
var
  I, Y : Integer;
  S : string;
  L : TStringList;
begin
  //Laver en midlertidig TStringList
  L := TStringList.Create;

  //kopiere TRichEdit til TStringList
  for I := 0 to RichEdit1.Lines.Count-1 do
  L.Add(RichEdit1.Lines[I]);

  //Bytter om på linjerne (Alignet)
  for I := L.Count div 2 downto 1 do
  begin
    S := L[I-1];
    L[I-1] := L[L.Count-I];
    L[L.Count-I] := S;
  end;

  Canvas.FillRect(RichEdit1.ClientRect);

  //Tegner teksten på formen
  for I := 0 to RichEdit1.Lines.Count-1 do
  Canvas.Textout(0,I*(ABS(RichEdit1.Font.Height)+2),L[I]);

  //Beregner og tegner den nye caret
  if RichEdit1.CaretPos.Y = RichEdit1.Lines.Count-1 then
  Y := 1
  else
    if RichEdit1.CaretPos.Y < L.Count div 2 then
    Y := L.Count-RichEdit1.CaretPos.Y
    else
      Y := (L.Count div 2) -(RichEdit1.CaretPos.Y - (L.Count div 2)) ;
  Y := (Y-1)*(ABS(RichEdit1.Font.Height)+2);
  I := Canvas.TextWidth(Copy(RichEdit1.Lines[RichEdit1.CaretPos.Y],0,RichEdit1.CaretPos.X));
  Canvas.MoveTo(I,Y);
  Canvas.LineTo(I,Y+Canvas.TextHeight('|'));

  //Frigør TStringList
  L.Free;
end;

Held og Lykke
ZeroHero
Avatar billede mr.meincke Nybegynder
02. januar 2004 - 08:16 #6
Som sagt sagde jeg på RichEdit'en og ikke på formen - Jeg aner nada om canvas :)
Avatar billede zerohero Nybegynder
02. januar 2004 - 11:25 #7
Jeg kunne jo ikke vide, at du ikke er så knøv med Canvas ;))...

Det er ikke særligt redigervenligt at gøre det på denne måde! Men hvis det er fordi der skal skrives en linje af gangen (Ligesom et Chat program eller lign.) så skulle det være ok at bruge!
Hvis du ikke skal kunne redigere i den overhovdet ville jeg vælge at lade den tegne på en TPanel eller lign. og dernæst lade en skjult TRichEdit gøre arbejdet! Vil du derimod lave en 100% redigervenlig TRichEdit, ville jeg lave en ny komponent fra bunden, da der vil komme for mange komplikationer ved bare at overbygge en eksisterende komponent!

Her er et eksempel der tegner på sig selv! Jeg har ladet teksten der bliver alignet blive rødt, da det er lidt lettere at forstå hvad der sker!

procedure TForm1.RichEdit1SelectionChange(Sender: TObject);
var
  I, Y : Integer;
  S : string;
  L : TStringList;
  MyCanvas : TControlCanvas;
begin
  //Laver en midlertidig Canvas for TRichEdit
  MyCanvas := TControlCanvas.Create;
  MyCanvas.Control := RichEdit1;

  //Laver en midlertidig TStringList
  L := TStringList.Create;

  //kopiere TRichEdit til TStringList
  for I := 0 to RichEdit1.Lines.Count-1 do
  L.Add(RichEdit1.Lines[I]);

  //Bytter om på linjerne (Alignet)
  for I := L.Count div 2 downto 1 do
  begin
    S := L[I-1];
    L[I-1] := L[L.Count-I];
    L[L.Count-I] := S;
  end;

  MyCanvas.FillRect(RichEdit1.ClientRect);

  //Alt hvad der bliver alignet bliver tegnet rødt
  MyCanvas.Font.Color := clRed;

  //Tegner teksten på formen
  for I := 0 to RichEdit1.Lines.Count-1 do
  MyCanvas.Textout(0,I*(ABS(RichEdit1.Font.Height)+2),L[I]);

  //Beregner og tegner den nye caret
  if RichEdit1.CaretPos.Y = RichEdit1.Lines.Count-1 then
  Y := 1
  else
    if RichEdit1.CaretPos.Y < L.Count div 2 then
    Y := L.Count-RichEdit1.CaretPos.Y
    else
      Y := (L.Count div 2) -(RichEdit1.CaretPos.Y - (L.Count div 2)) ;
  Y := (Y-1)*(ABS(RichEdit1.Font.Height)+2);
  I := MyCanvas.TextWidth(Copy(RichEdit1.Lines[RichEdit1.CaretPos.Y],0,RichEdit1.CaretPos.X));
  MyCanvas.MoveTo(I,Y);
  MyCanvas.LineTo(I,Y+MyCanvas.TextHeight('|'));

  //Frigør TStringList
  L.Free;
  //Frigør TControlCanvas
  MyCanvas.Free;
end;
Avatar billede mr.meincke Nybegynder
04. januar 2004 - 17:54 #8
Tegner jeg stadig på formen. det _SKAL_ være i RichEdit'en. Hvis du finder et component som gør det så msg mig lige :)
Avatar billede zerohero Nybegynder
04. januar 2004 - 23:28 #9
Den sidste kode del jeg har givet dig tegner altså på din TRichEdit (Tjekkede den selv igennem inden jeg postede den!)!!!!!!!!!! Ikke for at være uhøflig, men det er altså alt jeg gider at lave for 30 points! Prøv eventuelt selv at gå videre med det! Jeg har ikke tænkt mig at lave hele opgven for dig, så lære du jo ingenting :))
Avatar billede mr.meincke Nybegynder
05. januar 2004 - 00:54 #10
zerohero. Jeg havde ikke lige lagt mærke til dit nye svar var "nyt", da jeg postede den comment. Men som sagt, vil jeg godt have en komplet kode som tegner i bunden (og som bliver i bunden når man resizer. Og ja, jeg giver da gerne flere points.
Avatar billede Slettet bruger
10. januar 2004 - 17:58 #11
Avatar billede mr.meincke Nybegynder
05. maj 2004 - 07:48 #12
Fandt ikke det jeg ledte efter, sry.
Avatar billede zerohero Nybegynder
06. maj 2004 - 02:36 #13
Tak for ingenting!!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester