Menulis program yang lebih bermakna
Sebuah korektor ejaan sederhana
Dalam tutorial ini, kita akan membangun program yang lebih luas yang melakukan koreksi ejaan sangat sangat sederhana pada file teks. Ini menggambarkan sejumlah fitur penting dari Delphi, dan beberapa kekuatan Perpustakaan Run Time Delphi.
Program kami meminta user untuk memuat sebuah file teks dengan menekan tombol 'Load file' pada bentuk program utama. Ketika pengguna telah memilih file dari dialog pemilihan file yang muncul, isi ditampilkan dalam kotak TMemo di form, dan tombol hantu - 'Benar' - kemudian diaktifkan. Jumlah file baris ditampilkan.
Menekan 'benar' akan memperbaiki salah ejaan dari kata 'the' (sesuatu penulis adalah sering salah). Statistik tentang perubahan akan ditampilkan. Setelah selesai, tombol 'Simpan file' diaktifkan, yang memungkinkan file yang akan disimpan.
Lebih dari satu file dapat dimuat dalam satu sesi, dan tidak harus disimpan (tidak ada peringatan diberikan saat menyimpan atau ketika gagal untuk menyimpan).
Merancang form
Hal ini penting ketika menulis program (aplikasi) untuk desain untuk kemudahan penggunaan oleh user, dan tidak mudah digunakan untuk Anda, programmer. Ini sebenarnya adalah hal yang sangat sulit untuk dilakukan, tapi jauh akan meningkatkan penerimaan dari program Anda. Pendekatan tradisional, dan masih masuk akal adalah untuk merancang penampilan eksternal dan tindakan dari program Anda, dan kemudian bekerja ke kode dari sana. Untungnya, Delphi, seperti program berorientasi objek lain membuat transisi mudah.
Di screen shot di atas, bentuk kita ditunjukkan dibangun dengan 1 kotak Memo (TMemo), 4 label (TLabel), dan 3 tombol (TButton). Kotak Memo akan digunakan untuk menampilkan file teks. Panah merah menunjukkan tempat barang di bawah tab Standar grafis untuk memilih ini 'widget' (istilah yang digunakan untuk menggambarkan item kontrol grafis). Anda klik pada widget yang Anda inginkan, kemudian seret ukurannya di formulir. Label akhir ini ditunjukkan dengan sudut drag.
Perhatikan bahwa widget masing-masing memiliki nama yang ditampilkan di atasnya. Untuk kotak Memo, ini adalah isi awal yang akan ditampilkan (kode kita akan mengatur ulang ini untuk kosong). Untuk label dan tombol, ini disebut 'keterangan'.
Hal pertama yang akan kita lakukan adalah mengubah keterangan tombol. Klik pada Button1, dan Anda akan melihat atributnya di jendela Object Inspector. Mengubah judul dari 'Tombol1' menjadi 'Load file'. Demikian juga mengubah caption tombol2 untuk 'Simpan file' dan Tombol3 untuk 'Benar'.
Serta mengubah keterangan, kita akan mengubah nama dari default nilai Delphi digunakan untuk sesuatu yang lebih berguna. Memo1 menjadi MemoBox. Dan tombol-tombol yang sekarang bernama LoadButton, SaveButton dan CorrectButton. Label dapat tetap sebagaimana adanya.
Bentuk kami sekarang dirancang!
Menghubungkan kode untuk form
Pemrograman berorientasi objek berputar di sekitar objek dan bagaimana mereka berinteraksi bersama-sama. Kami memiliki bentuk, kotak memo, label dan objek tombol. Jika kita klik dua kali pada salah satu dari mereka, Delphi akan membuat kode untuk widget diklik. Ketika Anda menjalankan program, klik widget akan menjalankan kode. Sesederhana itu (kecuali bahwa Anda dapat melakukan jauh lebih banyak -. Melihat tab Events dari Object Inspector Bila Anda telah menambahkan suatu tindakan, link ke kode Anda akan muncul di sana).
Yang bekerja pada penciptaan bentuk
Jadi pertama-tama kita akan klik dua kali pada bagian kosong formulir. Ini akan membuat kode berikut di unit program anda, dan posisi kursor di dalamnya:
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
Kode ini, seperti namanya, akan dieksekusi ketika form dibuat (jangan khawatir dalam tutorial tentang parameter Sender). Hal ini sangat berguna. Hal ini efektif awal dari aplikasi Anda. Lebih penting lagi, adalah bagian paling awal dari aplikasi Anda ketika Anda dapat mengakses widget di formulir. Kita perlu akses ini karena kita akan bekerja dengan mereka - mereka inisialisasi, seperti dalam kode di sini:
procedure TForm1.FormCreate(Sender: TObject);
begin
// Set the title of the form - our application title
Form1.Caption := 'Very simple spell corrector';
// Disable all except the load file button
SaveButton.Enabled := false;
CorrectButton.Enabled := false;
// Clear the file display box
MemoBox.Clear;
// Enable scroll bars for this memo box - this allows us to scroll up
// and down and left and right to see all the text
MemoBox.ScrollBars := ssBoth;
// do not allow the user to directly type into the displayed file text
MemoBox.ReadOnly := true;
// Set the font of the memo box to a mono-spaced one to ease reading
MemoBox.Font.Name := 'Courier New';
// Set all of the labels to blank
Label1.Caption := '';
Label2.Caption := '';
Label3.Caption := '';
Label4.Caption := '';
// Create the open dialog object - used by the GetTextFile routine
openDialog := TOpenDialog.Create(self);
// Ask for only files that exist
openDialog.Options := [ofFileMustExist];
// Ask only for text files
openDialog.Filter := 'Text files|*.txt';
// Create the string list object that holds the file contents
fileData := TStringList.Create;
end;
Untuk saat ini, jangan khawatir tentang laporan openDialog. Mereka akan dibahas di bawah ini.
Hal terakhir yang kami lakukan adalah untuk membuat daftar string (klik di atasnya dalam kode di atas untuk mempelajari lebih lanjut). fileData mengacu pada variabel TStringList kami telah didefinisikan sebelumnya (sebelum bagian pelaksanaan unit):
var
// Global definitions in our unit
Form1: TForm1;
fileName : String;
fileData : TStringList;
openDialog : TOpenDialog;
Daftar string adalah harfiah bahwa - variabel objek yang dapat menyimpan sejumlah variabel string. Kita akan menggunakan ini untuk memegang isi file teks kita. Sebelum kita bisa melakukan itu, kita harus membuat (instantiate) suatu objek TStringList. Proses penciptaan mengalokasikan penyimpanan untuk objek dan Menginisialisasi secara internal. Hal ini didefinisikan sebagai global sehingga semua kode tindakan widget dapat bekerja dengannya. Hati-hati dengan data global - Anda harus tetap seminimal mungkin.
Jadi, ketika program kami sekarang dimulai, form dibersihkan dari label asing, dan potongan lain dan potongan diatur di tempat, seperti bar gulir untuk kotak memo (perhatikan bahwa Anda dapat melakukan ini pada tahap desain bentuk - lihat properti untuk kotak memo).
Bertindak atas tombol 'Load file' klik
Double klik tombol 'Load file' dan kode lebih akan dimasukkan ke unit Anda:
procedure TForm1.LoadButtonClick(Sender: TObject);
begin
end;
Kami ingin memuat sebuah file pengguna yang dipilih. Jadi kita perlu membiarkan pengguna memilih menggunakan dialog pemilihan file:
procedure TForm1.LoadButtonClick(Sender: TObject);
begin
// Display the file selection dialog
if openDialog.Execute then // Did the user select a file?
begin
...
Sekarang kita dapat melihat bahwa kita telah menggunakan openDialog didefinisikan dalam bagian variabel global, dan sebagai diinisialisasi dalam rutinitas penciptaan bentuk. Mari kita lihat lagi di inisialisasi bahwa:
// Create the open dialog object - used by the GetTextFile routine
openDialog := TOpenDialog.Create(self);
// Ask for only files that exist
openDialog.Options := [ofFileMustExist];
// Ask only for text files
openDialog.Filter := 'Text files|*.txt';
Pemilihan file (terbuka) objek dialog pertama harus diciptakan. Hal ini kemudian dapat digunakan sebanyak yang kita inginkan. Selanjutnya kita mengkonfigurasi dialog untuk menampilkan file teks saja yang ada. Klik pada kata kunci TOpenDialog di atas untuk mempelajari lebih lanjut.
Kembali ke kode LoadButton, sekarang kita memuat file ditentukan oleh pengguna:
if openDialog.Execute then // Did the user select a file?
begin
// Save the file name
fileName := openDialog.FileName;
// Now that we have a file loaded, enable the text correction button
CorrectButton.Enabled := true;
// Load the file into our string list
fileData.LoadFromFile(fileName);
end;
Kami menyimpan nama file tersebut (termasuk path lengkap nya) sehingga kita dapat menyimpan ke sini kelak. Kami memungkinkan tombol teks, dan kemudian melakukan sedikit elegan - memuat file ke daftar string (yang kita definisikan sebelumnya) menggunakan hanya satu pernyataan! Kami sekarang dapat mengakses setiap baris dari file dengan nomor indeks!
Akhirnya kami melakukan hal berikut:
// Display the file in the file display box
MemoBox.Text := fileData.Text;
// Clear the changed lines information
Label1.Caption := '';
Label2.Caption := '';
Label3.Caption := '';
// Display the number of lines in the file
Label4.Caption := fileName+' has '+IntToStr(fileData.Count)+
' lines of text';
kami menampilkan file lengkap dalam pernyataan lain yang sangat elegan - fileData.Text mengubah daftar string menjadi satu string besar yang kemudian ditulis ke kotak memo untuk ditampilkan.
Kami menghapus label kecuali keempat. Di sini kita menggunakan fitur lain dari kelas TStringList - properti Count. Ini memberikan jumlah baris dalam file dimuat.
Bertindak atas tombol 'Correct' mengklik
Sebelum kita melihat kode Tombol Benar, mari kita lihat tipe data baru, tipe enumerasi, diperkenalkan pada unit ini:
type
TheMisSpelled = (TEH, ETH, EHT); // Enumeration of 'the' miss-spellings
Ini mendefinisikan 3 salah ejaan dari kata 'the' bahwa kode kita akan memperbaiki dalam file dimuat. Lihat Set dan tutorial enumerations untuk lebih lanjut tentang enumerations. Di sini kita membatasi korektor ejaan kami untuk berbagai nilai-nilai kecil dari koreksi, seperti disebutkan di sini. Nilai-nilai ini, TEH, ETH dan EHT hanya placeholder. Kami menggunakan string untuk melakukan pengecekan dan koreksi.
Double klik pada tombol 'Correct', dan masukkan kode berikut:
procedure TForm1.CorrectButtonClick(Sender: TObject);
var
text : String;
line : Integer;
changeCounts : array[TEH..EHT] of Integer;
begin
// Set the changed line counts
changeCounts[TEH] := 0;
changeCounts[ETH] := 0;
changeCounts[EHT] := 0;
// Process each line of the file one at a time
for line := 0 to fileData.Count-1 do
begin
// Store the current line in a single variable
text := fileData[line];
// Change the 3 chosen basic ways of mis-spelling 'the'
if ChangeText(text, TEH) then Inc(changeCounts[TEH]);
if ChangeText(text, ETH) then Inc(changeCounts[ETH]);
if ChangeText(text, EHT) then Inc(changeCounts[EHT]);
// And store this padded string back into the string list
fileData[line] := text;
end;
// And redisplay the file
MemoBox.Text := fileData.Text;
// Display the changed line totals
if changeCounts[TEH] = 1
then Label1.Caption := 'Teh/teh changed on 1 line'
else Label1.Caption := 'Teh/teh changed on '+
IntToStr(changeCounts[TEH])+' lines';
if changeCounts[ETH] = 1
then Label2.Caption := 'eth changed on 1 line'
else Label2.Caption := 'eth changed on '+
IntToStr(changeCounts[ETH])+' lines';
if changeCounts[EHT] = 1
then Label3.Caption := 'eht changed on 1 line'
else Label3.Caption := 'eht changed on '+
IntToStr(changeCounts[EHT])+' lines';
// Finally, indicate that the file is now eligible for saving
SaveButton.Enabled := true;
// And that no more corrections are necessary
CorrectButton.Enabled := false;
end;
Ketika kita melakukan perubahan, kita tetap hitungan baris yang diubah dalam changeCounts array. Perhatikan bahwa ia memiliki batas didefinisikan oleh tipe enumerasi yang kita definisikan. Kami menyebutnya rutinitas ChangeText baru untuk melakukan perubahan pada semua string dalam daftar string (untuk indeks loop daftar string dari string pertama (indeks 0) ke (yang terakhir kurang dari jumlah string)). Kami kenaikan jumlah jika rutin disebut mengatakan bahwa membuat perubahan (ia mengembalikan nilai Boolean). Berikut adalah rutin yang:
function TForm1.ChangeText(var Text: String; theType: TheMisSpelled): Boolean;
var
changed : Boolean;
begin
// Indicate no changes yet
changed := false;
// First see if the string contains the desired string
case theType of
TEH :
if AnsiContainsStr(Text, 'teh') or AnsiContainsStr(Text, 'Teh') then
begin
Text := AnsiReplaceStr(Text, 'teh', 'the'); // Starts lower case
Text := AnsiReplaceStr(Text, 'Teh', 'The'); // Starts upper case
changed := true;
end;
ETH :
if AnsiContainsStr(Text, 'eth') then
begin
Text := AnsiReplaceStr(Text, 'eth', 'the'); // Lower case only
changed := true;
end;
EHT :
if AnsiContainsStr(Text, 'eht') then
begin
Text := AnsiReplaceStr(Text, 'eht', 'the'); // Lower case only
changed := true;
end;
end;
// Return the changed status
Result := changed;
end;
Klik pada kata kunci biru untuk mempelajari lebih lanjut. Rutin ini disebut 3 kali per baris - setiap kali melewati salah satu salah ejaan tipe enumerasi. Rute pernyataan Kasus ke kode yang tepat untuk melakukan menurut jenisnya. Kami menetapkan nilai yang dikembalikan - Hasil - untuk benar jika kami telah mengubah baris. Perhatikan bahwa perintah Ansi adalah case sensitif.
Kembali ke kode LoadButton atas, hal terakhir yang kita lakukan adalah untuk menampilkan kembali daftar string yang diubah dalam kotak memo dan menampilkan statistik baris berubah. Kami juga menonaktifkan CorrectButton dan memungkinkan SaveButton tersebut.
Fiuh!
Bertindak pada tombol 'Simpan file' klik
Akhirnya, mengklik ganda tombol simpan memungkinkan kita untuk menulis kode untuk menyimpan file sekarang berubah:
procedure TForm1.SaveButtonClick(Sender: TObject);
begin
// Simply save the contents of the file string list
if fileName <> '' then
fileData.SaveToFile(fileName);
// And disable the file save button
SaveButton.Enabled := false;
end;
Ini jauh lebih sederhana - jika kita memiliki nama file yang valid (ini adalah periksa bahwa kita memiliki sesuatu untuk menyimpan), maka kita menggunakan metode daftar string SaveToFile. Mudah! Kemudian kita nonaktifkan tombol simpan.
Menyatukan semuanya
Berikut ini adalah kode penuh, bersama dengan sampel sebelum dan sesudah isi file teks:
// Full Unit code.
// -----------------------------------------------------------
unit Unit1;
interface
uses
SysUtils, StrUtils,
Forms, Dialogs, Classes, Controls, StdCtrls;
type
TheMisSpelled = (TEH, ETH, EHT); // Enumeration of 'the' mis-spellings
TForm1 = class(TForm)
// Visual objects inserted by Delphi
LoadButton : TButton;
SaveButton : TButton;
CorrectButton : TButton;
MemoBox : TMemo;
Label1 : TLabel;
Label2 : TLabel;
Label3 : TLabel;
Label4 : TLabel;
// Methods added by Delphi
procedure LoadButtonClick(Sender: TObject);
procedure SaveButtonClick(Sender: TObject);
procedure CorrectButtonClick(Sender: TObject);
private
// Method added by the author
function ChangeText(var Text : String; theType : TheMisSpelled) : Boolean;
published
// Constructor added by Delphi
procedure FormCreate(Sender: TObject);
end;
var
// Global definitions in our unit
Form1: TForm1;
fileName : String;
fileData : TStringList;
openDialog : TOpenDialog;
implementation
{$R *.dfm} // Include form definitions
// Procedure called when the main program Form is created
procedure TForm1.FormCreate(Sender: TObject);
begin
// Set the title of the form - our application title
Form1.Caption := 'Very simple spell corrector';
// Disable all except the load file button
SaveButton.Enabled := false;
CorrectButton.Enabled := false;
// Clear the file display box
MemoBox.Clear;
// Enable scroll bars for this memo box
MemoBox.ScrollBars := ssBoth;
// do not allow the user to directly type into the displayed file text
MemoBox.ReadOnly := true;
// Set the font of the memo box to a mono-spaced one to ease reading
MemoBox.Font.Name := 'Courier New';
// Set all of the labels to blank
Label1.Caption := '';
Label2.Caption := '';
Label3.Caption := '';
Label4.Caption := '';
// Create the open dialog object - used by the GetTextFile routine
openDialog := TOpenDialog.Create(self);
// Ask for only files that exist
openDialog.Options := [ofFileMustExist];
// Ask only for text files
openDialog.Filter := 'Text files|*.txt';
// Create the string list object that holds the file contents
fileData := TStringList.Create;
end;
// Procedure called when the file load button is pressed
procedure TForm1.LoadButtonClick(Sender: TObject);
begin
// Display the file selection dialog
if openDialog.Execute then // Did the user select a file?
begin
// Save the file name
fileName := openDialog.FileName;
// Now that we have a file loaded, enable the text correction button
CorrectButton.Enabled := true;
// Load the file into our string list
fileData.LoadFromFile(fileName);
end;
// And display the file in the file display box
MemoBox.Text := fileData.Text;
// Clear the changed lines information
Label1.Caption := '';
Label2.Caption := '';
Label3.Caption := '';
// Display the number of lines in the file
Label4.Caption := fileName+' has '+IntToStr(fileData.Count)+' lines of text';
end;
// Procedure called when the file save button is pressed
procedure TForm1.SaveButtonClick(Sender: TObject);
begin
// Simply save the contents of the file string list
if fileName <> '' then
fileData.SaveToFile(fileName);
// And disable the file save button
SaveButton.Enabled := false;
end;
// Procedure called when the correct text button is pressed
procedure TForm1.CorrectButtonClick(Sender: TObject);
var
text : String;
line : Integer;
changeCounts : array[TEH..EHT] of Integer;
begin
// Set the changed line counts
changeCounts[TEH] := 0;
changeCounts[ETH] := 0;
changeCounts[EHT] := 0;
// Process each line of the file one at a time
for line := 0 to fileData.Count-1 do
begin
// Store the current line in a single variable
text := fileData[line];
// Change the 3 chosen basic ways of mis-spelling 'the'
if ChangeText(text, TEH) then Inc(changeCounts[TEH]);
if ChangeText(text, ETH) then Inc(changeCounts[ETH]);
if ChangeText(text, EHT) then Inc(changeCounts[EHT]);
// And store this padded string back into the string list
fileData[line] := text;
end;
// And redisplay the file
MemoBox.Text := fileData.Text;
// Display the changed line totals
if changeCounts[TEH] = 1
then Label1.Caption := 'Teh/teh changed on 1 line'
else Label1.Caption := 'Teh/teh changed on '+
IntToStr(changeCounts[TEH])+' lines';
if changeCounts[ETH] = 1
then Label2.Caption := 'eth changed on 1 line'
else Label2.Caption := 'eth changed on '+
IntToStr(changeCounts[ETH])+' lines';
if changeCounts[EHT] = 1
then Label3.Caption := 'eht changed on 1 line'
else Label3.Caption := 'eht changed on '+
IntToStr(changeCounts[EHT])+' lines';
// Finally, indicate that the file is now eligible for saving
SaveButton.Enabled := true;
// And that no more corrections are necessary
CorrectButton.Enabled := false;
end;
// Function to change a type of 'the' mis-spelling in a string
// Returns true if the string was changed
function TForm1.ChangeText(var Text: String; theType: TheMisSpelled): Boolean;
var
changed : Boolean;
begin
// Indicate no changes yet
changed := false;
// First see if the string contains the desired string
case theType of
TEH :
if AnsiContainsStr(Text, 'teh') or AnsiContainsStr(Text, 'Teh') then
begin
Text := AnsiReplaceStr(Text, 'teh', 'the'); // Starts lower case
Text := AnsiReplaceStr(Text, 'Teh', 'The'); // Starts upper case
changed := true;
end;
ETH :
if AnsiContainsStr(Text, 'eth') then
begin
Text := AnsiReplaceStr(Text, 'eth', 'the'); // Lower case only
changed := true;
end;
EHT :
if AnsiContainsStr(Text, 'eht') then
begin
Text := AnsiReplaceStr(Text, 'eht', 'the'); // Lower case only
changed := true;
end;
end;
// Return the changed status
Result := changed;
end;
end.
ok deh liat juga http://agoesmart.blogspot.com
BalasHapusuntuk bisa merancang sebuah program, apa yg pertama saya harus lakukan?
BalasHapussaya ingin bisa membuat program delphi, tp bingung mau belajar di mana
buku panduan apa saja yg hrs dipelajari untuk bisa menjadi programer delphi, dan langkah apa saja yg harus saya lakukan? mulai dari dasar program hingga tingkat mahir. dan apakah hanya dgn buku2 panduan saya bisa menjadi penulis/perancang program? trimss b4
BalasHapus