Witam! W tym artykule zajmiemy się pisaniem prostego edytora tekstów. Fajnie?
Nasz Edytor będzie miał niektóre możliwości formatowania tekstu np. wytłuszczenie, pochylenie, podkreślenie czcionki.
W pierwszym artykule z tej serii - 'Delphi - Własny odtwarzacz' opisałem Delphi'ego powierzchownie. Także do tego art'u nie będzie nam potrzebna bliższa znajomość. Jednak pokaże dzisiaj co zrobić by w właściwościach naszego programu widniała zakładka 'Wersja'.
Przypomnę teraz sposób w jaki umieszczamy komponenty. Otóż należy kliknąc na odpowiedni komponent (np. Button - Przycisk) znajdujący się na palecie:

(siódmy od lewej), a następnie umieszczamy go klikając raz na formę. W ten sposób umieściliśmy komponent :)
w inspektorze obiektów znajdującym się po lewej stronie na dole (opisywałem go w poprzednim arcie), odnajdujemy, a następnie zmieniamy właściwość 'Flat' na wartość 'True' i właściwość 'ShowCaptions' na 'True'. Klikamy na nasz ToolBar, prawym przyciskiem myszy wybierając 'New Button'. Tworzy się fajny przycisk :) Powtarzamy tę czynność 2 razy, tak aby w sumie tych przycisków było 3. Pierwszemu przyciskowi nadajemy tekst 'Nowy' odnajdując właściwość caption w inspektorze obiektów i wpisując w to pole tekst 'Nowy'. Dla drugiego przycisku wpisujemy 'Otwórz', trzeci będzie 'Zapisz'.Zaznaczam tutaj, że do przełączania się między edytorem kodu, a formularzem posłuży nam klawisz F12. Klikamy teraz podwójnie na przycisk 'Nowy'. Ukazuje się nam edytor kodu, w którym widzimy na razie coś takiego:
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
end;
Pomiędzy słówka 'begin' i 'end' będziemy wpisywali kod procedury tworzącej nam nowy dokument. Czyli po kliknięciu na przycisk 'Nowy' program ma wyczyścić zawartość komponentu 'RichEdit' ('re') (w tym wypadku wpisany przez użytkownika tekst). Instrukcja wykonująca tę czynność jest banalna:
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
re.Clear;
end;
Kod przycisku Otwórz uzupełniamy następująco (musimy przejść do widoku formy - klawisz F12 - i kliknąć dwukrotnie przycisk 'Otwórz')
procedure TForm1.ToolButton2Click(Sender: TObject);
begin
If OpenDialog1.Execute Then // Wywołanie okna służącego do otwierania plików
re.Lines.LoadFromFile(OpenDialog1.FileName); // Wczytanie zawartości pliku w RichEdit
end;
Tu mamy już coś trudniejszego. Pierwsza linijka wywołuje nam okno (otwiera je) otwierania pliku. Można ją tłumaczyć następująco: Jeśli OpenDialog1 jest otwarty to... OpenDialog właśnie w tej linijce się otwiera. Dziwne? Przyzwyczaicie się... Jeśli powyższe wytłumaczenie do Was nie przemawia to mogę wyjaśnić to w ten sposób: Obiekt OpenDialog1 posiada funkcję Execute() - służy ona do wyświetlania okna i zwraca pewną wartość po jego zamknięciu. Jeśli użytkownik zamknie okno wyboru pliku poprzez OK, funkcja Execute() zwróci True, jeśli natomiast kliknie Anuluj - funkcja zwróci False (i w tym przypadku w naszym programie nie zostaną wykonane czynności zawarte po słówku Then - czyli instrukcje wczytywania pliku do komponentu RichEdit (nazwanego u nas 're').)
Druga linia ładuje do RichEdit ('re') linijki zawarte w pliku wskazanym przez użytkownika. OpenDialog1.FileName to nic innego jak ścieżka do pliku, który chce otworzyć użytkownik.
Notka: Aby załadować do komponentu RichEdit jakiś plik np. informacje o autorze nie wyświetlając okna 'Otwórz plik...' zamiast tych dwóch linii możemy napisać:
procedure TForm1.ToolButton2Click(Sender: TObject);
begin
re.Lines.LoadFromFile('C:\autor.txt'); // Otworzenie pliku w RichEdit
end;
Jednak taki sposób w Edytorze tekstu nie jest nam potrzebny, gdyż przy każdym kliknięciu na przycisk 'Otwórz' do RichEdit'a ładowałby się nam plik C:\autor.txt.
Przyszła kolej na ostatni przycisk z serii Standard ;) Kod przycisku Zapisz uzupełniamy następująco:
procedure TForm1.ToolButton3Click(Sender: TObject);
begin
If SaveDialog1.Execute Then // Otworzenie okna 'Zapisz plik...'
Begin
re.PlainText := True; // Zwykły tekst
re.Lines.SaveToFile(SaveDialog1.FileName); // Zapisanie Lini RichEdit'a do pliku
end;
end;
Taki kod nie jest zbyt rozbudowany. Wywołując okno zapisu musimy ręcznie określać rozszerzenie dla naszego pliku np. plik.txt
W pierwszej linii mamy do czynienia z otworzeniem okna. Druga linia naszego kodu to słówko 'Begin' stawia się je wtedy go pod warunkim If ... Then mamy więcej niż jedną linie (zauważ, że w procedurze otwierania pliku nie było 'Begin' ponieważ kod warunku
If OpenDialog1.Execute Then
Miał tylko jedną linię czyli :
re.Lines.LoadFromFile(OpenDialog1.FileName);
Trzecia linika naszego kodu (procedura służąca do zapisywania pliku) to jakby skonwertowanie zawartości RichEdit na zwykły tekst tj. taki który można otworzyć za pomocą innego programu i nie pokażą się dziwne znaki jak :
{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fnil MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\fswiss\fcharset1 MS Sans Serif;}}
{\colortbl\red0\green0\blue0;}
\deflang1045\pard\plain\f2\fs16 ssssssssssssssss
\par }
Dziwne? To po prostu zapis formatowania tekstu (np. użyta czcionka itp.)
Czwarta linijka to zapisanie lini RichEdit'a do pliku o ścieżce tkwiącej w 'FileName'
Teraz mamy kolejne, trzy ostatnie przyciski formatowania:
Uzupełniamy ich kod następująco:
Wytłuszczenie:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
If SpeedButton1.Down Then
re.SelAttributes.Style:= re.SelAttributes.Style + [fsBold]
else
re.SelAttributes.Style:= re.SelAttributes.Style - [fsBold];
end;
Można to przetłumaczyć: Jeśli przycisk odpowiadający wytłuszczeniu jest wciśnięty to dodaj do zaznaczonego tekstu styl pogrubienia (fsBold), jeśli natomiast przycisk nie jest wciśnięty to odbierz zaznaczonemu fragmentowi tekstu styl pogrubienia. Dla pochylenia i podkreślenia postępujemy analogicznie.
Pochylenie:
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
If SpeedButton2.Down Then
re.SelAttributes.Style:= re.SelAttributes.Style + [fsItalic]
else
re.SelAttributes.Style:= re.SelAttributes.Style - [fsItalic];
end;
Podkreślenie:
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
If SpeedButton3.Down Then
re.SelAttributes.Style:= re.SelAttributes.Style + [fsUnderline]
else
re.SelAttributes.Style:= re.SelAttributes.Style - [fsUnderline];
end;
Pogrubianie, pochylanie i podkreślanie tekstu zachowuje się już u nas tak jak w Wordzie:
Jeśli chcesz zobaczyć taki program, napisz: lukas.home.page@gmail.com .
Rozwiązałem ten problem następująco:
var
roz: integer;
begin
SaveDialog1.FileName := 'Dokument';
If SaveDialog1.Execute Then
Begin
roz := SaveDialog1.FilterIndex;
// Wybór rozszerzenia (roz=numer filtru rozszerzenia pliku)
If roz=1 Then
begin
SaveDialog1.FileName := SaveDialog1.FileName+'.tek';
end;
If roz=2 Then
begin
SaveDialog1.FileName := SaveDialog1.FileName+'.doc';
end;
If roz=3 Then
begin
re.PlainText := True; // wyłączanie formatowania tekstu
SaveDialog1.FileName := SaveDialog1.FileName+'.txt';
end;
If roz=4 Then
begin
re.PlainText := True; // wyłączanie formatowania tekstu
SaveDialog1.FileName := SaveDialog1.FileName+'.html';
end;
If roz=5 Then
begin
re.PlainText := True; // wyłączanie formatowania tekstu
SaveDialog1.FileName := SaveDialog1.FileName+'.pas';
end;
re.Lines.SaveToFile(SaveDialog1.FileName);
re.PlainText := False; // ponowne włączenie formartowania
end;
Należy w inspektorze obiektów (w komponencie SaveDialog1) wybrać Filter (pojawi się okno) i uzupełnić je następująco:

W ten sposób umożliwimy zapisanie pliku w wielu formatach...
Mam nadzieję, że artykuł się podobał? Było coś dla początkujących, było dla 'średnio-zaawansowanych'. Wydaje mi się, że wszystko tłumaczyłem, ale jeśli czegoś nie rozumiesz - pisz: lukas.home.page@gmail.com
Do artykułu dołączam również kod źródłowy pisanego edytora tekstu.
| Dżyszla (wystawiony dnia 2008-10-30 o 14:11) |
| Ten zapis do HTML i innych to taki pic na wodę trochę chyba ;) |
| mam problem 2 : (wystawiony dnia 2008-05-01 o 15:04) |
| kurcze ten sam błąd co w odtwarzaczu :( Klkam na \"pogrubienie\" i błąd ... |
Łukasz "Lukas" Wyporek
lukas.home.page@gmail.com