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
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]