Teksteditor i Delphi

Tags:    delphi
Skrevet af Bruger #1 @ 17.06.2001
Lav en simpel teksteditor

At lave en teksteditor i Delphi med flere åbne vinduer og det hele, er ganske simpelt. De første 10 min. bruger vi ikke engang noget kode, der designer vi bare :-). Denne teksteditor skal være til simpel tekst i txt format, men der skal til gengæld, som tidligere nævnt, være mulighed for flere åbne vinduer (MDI), så man kan redigere flere filer på en gang. Dette program er som sagt ikke så svært at lave, men hvis du er helt ny til Delphi, vil jeg anbefale du kigger lidt på Thomas Løjmann's begynder artikel. Jeg beskriver lige hurtigt, hvilke komponenter der skal placeres.

Vi skal bruge 2 forms, den første kalder vi "MainForm" og den anden for "MDI". På "MainForm" skal vi bruge en TToolbar, en TOpenDialog og en TSaveDialog (Dialogs) og en TImageList (Win 32 fanen). På "MDI" skal vi bare bruge et TMemo (Standard). Sæt "MainForm"'s FormStyle til at være fsMDIForm og "MDI"'s til "fsMDIChild". Dette gør at MDI altid vil holde sig inden for MainForm. Hvis du compiler nu, vil du faktisk se, at vi allerede har skabt det simpleste af det simpleste, nemlig et memo felt hvor brugeren kan indtaste lige hvad der ønskes. Der er absolut ingen funktioner, så det må vi hellere lave om på. Dog vil jeg anbefale at ændre følgende ting, for pænhedens skyld:

Sæt alle ToolBarens EdgeBorders til false, sæt Memoens Lines til ingen ting, sæt MainForms Caption til fx "Simpel teksteditor", sæt MDI formens WindowState til wsMaximized, MDI's caption til "Ikke navngivet" og sæt Toolbarens Flat property til True. Bare et par skønhedstips fra min side, men det er jo smag og behag.

Funktioner for satan da

Jeps, det er helt bestemt på tide at få lidt funktioner med i spillet. Dobbeltklik på vores ImageList, så vi kan hente lidt billeder til ToolBaren. Jeg bruger Delphis standard Bitmaps, som jeg har tilføjet i Download sektionen (hent dem her). Du skal tilføje de billeder der hedder: new.bmp, open.bmp, save.bmp, cut.bmp, copy.bmp og paste.bmp. Sæt Toolbarens Images property til Playlist1. Derefter kan du tilføje 6 knapper til toolbaren ved at højreklikke og trykke New button 6 gange. Efter den 3. knap vil jeg dog anbefale en seperator :-). Nu har vi fået en pæn toolbar, og hvis du compiler, vil du se, at det hele jo ser ganske pænt ud. Hvis du har lyst, kan du jo tilføje Hints til knapperne, ved at sætte deres Hint property. Skulle du være i tvivl, er funktionerne, set fra venstre: Ny, åbn, gem, klip, kopier og sæt ind. Lad os hellere få set lidt på noget kode.

Kode, kode og...

Nu skal vi have lidt funktioner i knapperne, og det gør vi simpelthen fra en ende af. Jeg har ikke givet knapperne nogen navne, så de hedder bare ToolButton1 og op til 7 (6 knapper og en seperator, som også hedder ToolButton). Vi starter med funktionen Ny, fordi det er en af de vigtigste. Der er to dele: En der hedder CreateMDIChild som vi selv opretter og som vi kan bruge, hver gang vi skal lave et nyt vindue. Så skal der naturligvis også være en funktion der trigger CreateMDICild og den funktion ligger i ToolButton1. Vi kigger på det.
procedure TForm1.CreateMDIChild(const Name: string);
var
  Child: TMDI;
begin
  Child := TMDI.Create(Application);
  Child.Caption := Name;
end;

procedure TForm1.ToolButton1Click(Sender: TObject); begin CreateMDIChild('Ikke navngivet'); end;
Det der sker, er at vi opretter en ny Child (altså et slags barn af MainFormen) der fungerer som et redigerings vindue (det er derfor at vi har lagt Memo'en på MDI og ikke MainForm). Som i kan se, skal CreateMDIChild altid kaldes med et navn. Childens Caption bliver så sat til "Name". Det kan være lidt svært at forstå, men tro mig, det kommer lige pludselig :-). BTW, ToolButton'en bliver deklaret automatisk, men det gør vores CreateMDIChild jo ikke. Derfor skal den naturligvis deklares. Det gøres med denne linie, under fx Private:
procedure CreateMDIChild(const Name: string);

Da jeg lavede det her eksempel, kunne Delphi ikke finde ud af hvad TMDI er, selvom det jo er hvad vi har kaldt vores anden Form. Derfor vil jeg anbefale at oprette en ny Uses (den i toppen er til de forskellige units vi bruger, den her er til de andre forms i projektet). Jeg har taget et lille udklip af det der er over og under vores nye Uses med, så du kan se hvor den skal være:
{ Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses unit2;

{$R *.DFM}

procedure TForm1.CreateMDIChild(const Name: string);
var
  Child: TMDI;
Sådan ser det ud hos mig, og det skal helst se nogenlunde ud på samme måde hos dig :-). Jeg har gemt mine to forms som Unit1 og Unit2, og du bør gøre det samme. I næste funktion skal vi kunne åbne en fil til redigering. Mens vi er ved det, så sæt lige de to Dialogs Filter til "Tekst fil (*.txt)" under Filter name og "*.txt" under Filter. Det gør det lidt nemmere. I ToolButtons 2 kode, som jo er vores Åbn knap, skal der stå denne kode:
procedure TForm1.ToolButton2Click(Sender: TObject);
begin
If OpenDialog1.Execute then
begin
  CreateMDIChild(OpenDialog1.FileName);
  TMDI(ActiveMDIChild).Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
 end;
end;
Denne kode er jo sådan set ikke så avanceret, men det er faktisk her vi først får øje på den geniale kode "TMDI(ActiveMDIChild)" som gør, at vi altid får fat i den Child der er aktiv. Så hvis Åbndialogen bliver kørt (og det gør den med samme kommando), så laves der en ny MDI Child og dens memo fyldes op med indholdet af den fil vi har valgt i Dialogen. Det er da ganske simpelt. Gem er dog om muligt endnu mere simpel. Se selv:
procedure TForm1.ToolButton3Click(Sender: TObject);
begin
If SaveDialog1.Execute then
begin
  TMDI(ActiveMDIChild).Memo1.Lines.SaveToFile(SaveDialog1.FileName);
  TMDI(ActiveMDIChild).Caption := SaveDialog1.FileName;
 end;
end;
Koden ligner jo rimelig meget den vi brugte i Åbn knappen, så jeg vil sådan set ikke forklare den nærmere. Så nu har vi altså de 3 vigtigste funktioner. Men for at vise at vi ikke kun har fil funktioner, har jeg også lige smidt knapper ind til Windows' CilpBoard funktioner. De 3 knappers kode ser således ud:
procedure TForm1.ToolButton5Click(Sender: TObject);
begin
 TMDI(ActiveMDIChild).Memo1.CutToClipBoard;
end;

procedure TForm1.ToolButton6Click(Sender: TObject);
begin
 TMDI(ActiveMDIChild).Memo1.CopyToClipBoard;
end;

procedure TForm1.ToolButton7Click(Sender: TObject);
begin
 TMDI(ActiveMDIChild).Memo1.PasteFromClipBoard;
end;
Disse funktioners kode forklarer vist sig selv.

Færdig?

Nu er programmet faktisk færdigt, og du kan compile og se om det virker. Gør den ikke det, ved jeg sgu ikke lige hvad der er galt :-). Jeg vil dog anbefale dig at hente sourcekoden til projektet lige her. Er den helt gal, må du lige smide en besked i Delphi forum'et om hvad der går galt.

Programmet godt nok færdigt, men der var masser af ting der kunne være lavet langt bedre samt nogen smarte funktioner der kan tilføjes. Der er helt sikkert basis for en part 2 af denne artikel :-). Den kommer forhåbentligt snart.



Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (11)

User
Bruger #3275 @ 13.02.03 08:58
Den er ikke så detaljeret!!!!
User
Bruger #2412 @ 12.03.03 14:49
Nydelig artikel :)
User
Bruger #3713 @ 11.04.03 18:11
Fin artikel
User
Bruger #1739 @ 26.04.03 21:43
Den artikel kan jeg godt li' :D
User
Bruger #4081 @ 15.10.03 23:36
nice
User
Bruger #3275 @ 11.02.04 21:19
HMM...gammel kommentar (den nedenunder)! God artikel!
User
Bruger #5560 @ 08.04.04 05:46
ikk for noget men Delphi kan lave mdi uden alt ovenfor (oven for er dog stadig god til en nybegynder som jeg der gerne vil have lidt træning i at skrive kode etc...) med delphi kan lave den ved at gå ind i file->new->other|projects->mdi | stadig ikk for at træde nogen over tærene vill bare lige pointere det
igen jeg vil ikk træde nogen over tærene jeg er ikke særlig god til delphi (endu hehe) men (thumbs up) god beskrivelse kune gøre bedre (kan alt ikke det ?) nå men nice work
User
Bruger #5097 @ 09.05.04 21:25
Phuuuu.
Den er hård at komme igennem.
Måske burde du lave den lidt mere enkel, hvor du ikke opramser alle de kompomenter. Det finder folk nok ud af skal bruges...

Behøver faktisk næsten ingen tekst før den er god...
User
Bruger #6544 @ 20.10.04 23:01
jeg er en NOOB.... jeg fatter ikk dene artikel med alt det der mdichild... eller... min computer gider ikke at compile det..... hvad har jeg mon gjordt galt...?
User
Bruger #6653 @ 12.04.05 09:53
Det hele foregår meget hurtigt efter hinanden, og der er ikke ret meget forklaring -> for man skal efter min mening forstå det man skriver. Men selve indholdet af artiklen er nu veldigt godt!
User
Bruger #8341 @ 23.10.05 16:26
Det min delphi toutorial nr. 2 og jeg synes den var lidt svær. Jeg har stadig ikke fået den til at virke optimalt.

- Når jeg trykker på X i et child minimeres den.
- Når jeg maximerer et child kan det ikke gendannes eller minimeres igen.

Hvad med en samlet kildekode?
Du skal være logget ind for at skrive en kommentar.
t