Menulis Program di Delphi 7


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.


3 komentar:

  1. ok deh liat juga http://agoesmart.blogspot.com

    BalasHapus
  2. untuk bisa merancang sebuah program, apa yg pertama saya harus lakukan?
    saya ingin bisa membuat program delphi, tp bingung mau belajar di mana

    BalasHapus
  3. 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