RichEdit problem z kolumnami

0

Mam problem bo nie wiem jak w Delphi zrobic wyswietlanie tekstu w kolumnach. Najlepiej bylo by w komponencie RichEdit. Moze bedzie ktos wiedzial i bedzie tak mily aby podpowiedziec?

0

w richedit ? to sie możesz bawić w odpowiednią liczbę spacji

0

to sie przeciez mozna zajechac [???]
to jak zrobic, zeby byl o w kolumnach?
moze w innym komponencie?

0

Więc może jedna kolumna to jeden Richedit? :-)
Jeśli ci już na tym komponencie zależy...

0
RedbaK napisał(a)

Więc może jedna kolumna to jeden Richedit? :-)
Jeśli ci już na tym komponencie zależy...

Może to i prymitywne/pracochłonne rozwiązanie ale spróbować warto :-)

W sekcji private dodać:

private
    procedure RichKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);

A dalej z górki:

//----------------------------------------------------------------------------------
// cięcie tekstu ZNAJDUJĄCEGO SIĘ w RichEdit na zadaną liczbę kolumn
//----------------------------------------------------------------------------------
var
  Rich: array[1..256] of TRichEdit; //zmienne globalne
  ile_jest_utworzonych_kolumn : byte = 0; //żeby usunąć kolumny trzeba wiedxieć ile ich powstało
  Dlugosc : integer; //liczba znaków w pojedyńczej kolumnie (o zadanej szerokości i długości)

procedure potnij_na_kolumny( RichEdit : TRichEdit; liczba_kolumn : byte; szerokosc_col : integer; wysokosc_col : integer; odstep : byte);
var
  i, x, temp : integer;
  text : string;
Begin
  text := TRichEdit(RichEdit).Text;
  TRichEdit(RichEdit).Text := '';
  temp := 0;
  //TRichEdit(RichEdit).Brush.Style := bsclear;
  TRichEdit(RichEdit).HandleNeeded;
  SetWindowLong(TRichEdit(RichEdit).handle, GWL_EXSTYLE, WS_EX_TRANSPARENT);

  Dlugosc := 40; // ręczne przypisanie, należy to zautomatyzować uwzględniając wielkość używanej czcionki!

  // ???
  //zmienna Dlugosc określa liczbę znaków mieszczącą się w jednej kolumnie
  //policzyć ile zmieści się liter w jednej kolumnie i przypisać do zmiennej długość
  //uwzględnić wysokość, szerokość kolumny i wielkość czcionki (pole kolumny podzielone przez wielkość czcionki)
  // ...
  // ???

  for i := 1 to liczba_kolumn do
  Begin
    ile_jest_utworzonych_kolumn := ile_jest_utworzonych_kolumn + 1;
    Rich[i] := TRichEdit.Create( RichEdit );
    Rich[i].Parent := Richedit;
    Rich[i].Align := alNone; //jeżeli nie ma być odstępów między kolumnami zmienić na alLeft
    Rich[i].BevelInner := bvNone;
    Rich[i].BevelOuter := bvNone;
    Rich[i].BorderStyle := bsNone;
    //Rich[i].Color := clScrollBar; //jeżeli kolumny mają mieć inny kolor odznacz komentarz i ustaw kolor
    Rich[i].ScrollBars := ssNone; //suwak - i tu również ustawić do potrzeb
    Rich[i].Width := szerokosc_col;
    Rich[i].Height := wysokosc_col;
    Rich[i].OnKeyUp:= Form1.RichKeyUp; //zamiast form1 nazwa formularza
                                             
      if i > 1 then //porozmieszczaj kolumny równolegle
      Rich[i].Left := Rich[i - 1].Left + szerokosc_col + odstep;                                                   ;

    for x := 1 to dlugosc do
    begin
      if (x + temp) > length( Text) then break;
      
      //???
      //można uzupełnić o nierozrywanie wyrazów
      //przejście do nowej kolumny tylko po wykryciu spacji
      //tudzież zastosowania myślnika w wyrazach wielosylabowych
      //???
      Rich[i].Text := Rich[i].Text + Text[x + temp];
    end;

    temp := (temp + x) - 1;

  end;

end;

//------------------------------------------------------------------------------------------
// procedura usuwa wszystkie dodane kolumny i przywraca tekst do RichEdit`a
//------------------------------------------------------------------------------------------
procedure usun_kolumny(RichEdit : TRichEdit; liczba_kolumn : byte);
var
  i : integer;
Begin
    for i:=1 to ( liczba_kolumn ) do
    Begin
      TRichEdit(RichEdit).Text := TRichEdit(RichEdit).Text + Rich[i].Text;
      Rich[i].Destroy; //ewentualnie, a pewno i lepiej Rich[i].Free;
    end;
end;

//--------------------------------------------------------------------------
// Obsługa zdarzenia OnKeyUp - naciśbnięcie klawisza w kolumnie
//--------------------------------------------------------------------------
procedure TForm1.RichKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  i : integer;
  num_kol, num_tmp, ile_liter : integer;
  kursor : TPoint;
  tekst : string;
  znak : char;
Begin

//wykrycie w której kolumnie jest użytkownik
  for i:=1 to 256 do
  Begin
    if Rich[i].Focused = true then
    begin
      num_kol := i;
      break;
    end;
  end;

 if ile_jest_utworzonych_kolumn = num_kol then
 Begin
    //jeżeli użytkownik jest w ostatniej kolumnie to
    //nie rób nic, możliwa modyfikacja na: sprawdź ile liter w kolumnie
    //jezeli za dużo utwórz nową kolumnę
 end else
 Begin  //jeżeli uzytkownik jest w innej kolumnie niż ostatnia
    if (key <> 8) then //jeżeli naciśniętą inny klawisz niż backspace
    begin
      if (length(rich[num_kol].Text) < dlugosc ) then //jeżeli w kolumnie jest miejsce na znak to;
      exit;                                           //zakończ procedurę;

      num_tmp := num_kol;                             //jeżeli nie to przesuń ostatni znak do kolumny n + 1

      for i := num_tmp to ile_jest_utworzonych_kolumn - 1 do
      begin
        // ???
        //uzupełnić o wykrycie czy kursor znajduje się na końcu kolumny n
        //jeżeli tak to przenieś kursor na początek kolumny n + 1
        //jeżeli nie zrób to co poniżej już napisno :)
        // ???

        tekst := Rich[i].Text;
        znak :=  Rich[i].Text[length(tekst)];
        delete(tekst, length(tekst), 1);
        kursor := Rich[i].CaretPos; //zapamiętaj pozycję kursora
        Rich[i].Text := tekst;
        Rich[i].CaretPos := kursor; //ustaw na nowo kursor
        Rich[i + 1].Text := znak + Rich[i + 1].Text;
        num_tmp := num_tmp + 1;
      end;
      end else
      begin
         // ???        
        //jezeli wciśnięto backspace, odwrotnie jak powyżej :)
       // ???
      end;

   end;

end;

Przykładowe wywołanie procedur:

potnij_na_kolumny(RichEdit1, 5, 50, RichEdit1.Height, 10);
Usun_kolumny(RichEdit1, 5); //najlepiej usunąć tyle kolumn ile się utworzyło :)

Kod w niektórych miejscach trzeba uzupełnić i aby w pełni obsłużyć kolumny należy zatroszczyć się dodatkowo o

  • synchroniczne przewijanie wszystkich kkolumn jednocześnie
  • zaznaczania za pomoca myszki tekstu z kilku kolumn
  • funkcji drukującej
    ale od czego są gotowe komponenty :)

Bynajmniej taka jest moja wizja kolumn w komponencie RichEdit [rotfl]

0

PROBLEM POJAWIA SIĘPRZY PRÓBIE WYDRUKU LUB ZAPISANIU DO PLIKU [diabel]

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