Cara Menggunakan TADOQuery di Delphi


Cara Menggunakan TADOQuery di Delphi - Pada posting sebelumnya tentang Membuat Koneksi ke Database Access dengan ADO telah dibahas penggunaan ADOConnection untuk mengkoneksikan aplikasi yang dibuat dengan Delphi dengan database Microsoft Access. Pada aplikasi yang dibuat digunakan TADOTable untuk mengakses tabel pada database yang dibuat.

Pada kesempatan ini akan dibahas cara pengguaan TADOQuery, dengan fungsi yang sama dengan TADOTable tentunya bisa dijadikan pilihan dalam mengakses tabel-tabel yang ada di database.
Sama dengan aplikasi yang dibuat sebelumnya jadi cukup mengedit beberapa bagian saja, namun pada aplikasi ini digunakan TADOQuery (jika masih bingung silahkan baca Membuat Koneksi ke Database Access dengan ADO). Jika sebelumnya ditempatkan TADOTable maka untuk aplikasi sekarang ganti dengan menempatkan TADOQuery pada Form (Hapus TADOTable pada aplikasi sebelumnya)
  • Ubah isi pada event OnCreate dari Form menjadi seperti berikut,
           procedure TForm1.FormCreate(Sender: TObject);
           var
             linkdb : string;
           begin
             BitBtn1.Caption := 'Tampilkan Data';
             FolderWindows := GetWinDir;
             ADOConnection1.LoginPrompt := False;
          
             //koneksikan ke database access database1.mdb
             linkdb := FolderWindows+ '\Database1.mdb';
             with ADOConnection1 do begin
               Connected := False;
               LoginPrompt := False;
               Mode := cmShareDenyNone;
               ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;'+
                 'Data Source='+linkdb+';Mode=Share Deny None;Extended Properties="";'+
                 'Jet OLEDB:System database="";Jet OLEDB:Registry Path="";'+
                 'Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;'+
                 'Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;'+
                 'Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";'+
                 'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;'+
                 'Jet OLEDB:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;'+
                 'Jet OLEDB:SFP=False';
             end;
             try
               ADOConnection1.Connected := True;
             except
               on e:Exception do begin
                 MessageDlg('Gagal mengakses database' +#13+#10+
                    'Detail : ' +e.Message,mtWarning,[mbOK],0);
               end;
             end;
           end;
  • Kemudian ubah pada event OnClick dari TBitBtn1 menjadi seperti berikut,
           procedure TForm1.BitBtn1Click(Sender: TObject);
           begin
             ADOQuery1.Connection := ADOConnection1;
             try
               ADOQuery1.SQL.Text := 'select * from DaftarNama';
               ADOQuery1.Open;
             except
               on e:eDatabaseError do begin
                 MessageDlg('Gagal menampilkan data' +#13+#10+
                   'Detail : ' +e.Message,mtWarning,[mbOK],0);
                 exit;
               end;
             end;
             DataSource1.DataSet := ADOQuery1;
             DBGrid1.DataSource := DataSource1;
           end;



Berikut script lengkapnya,

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, DbChart,
  DB, DBTables, FileCtrl, Buttons, jpeg, ADODB, Grids, DBGrids, DBCtrls;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    BitBtn1: TBitBtn;
    ADOQuery1: TADOQuery;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
    FolderWindows : string;
    function GetWinDir: string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.GetWinDir: string;
var
  dir: array [0..MAX_PATH] of Char;
begin
  GetWindowsDirectory(dir, MAX_PATH);
  Result := StrPas(dir);
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  linkdb : string;
begin
  BitBtn1.Caption := 'Tampilkan Data';
  FolderWindows := GetWinDir;
  ADOConnection1.LoginPrompt := False;

  //koneksikan ke database access database1.mdb
  linkdb := FolderWindows+ '\Database1.mdb';
  with ADOConnection1 do begin
    Connected := False;
    LoginPrompt := False;
    Mode := cmShareDenyNone;
    ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;'+
      'Data Source='+linkdb+';Mode=Share Deny None;Extended Properties="";'+
      'Jet OLEDB:System database="";Jet OLEDB:Registry Path="";'+
      'Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;'+
      'Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;'+
      'Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";'+
      'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;'+
      'Jet OLEDB:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;'+
      'Jet OLEDB:SFP=False';
  end;
  try
    ADOConnection1.Connected := True;
  except
    on e:Exception do begin
      MessageDlg('Gagal mengakses database' +#13+#10+
         'Detail : ' +e.Message,mtWarning,[mbOK],0);
    end;
  end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  ADOQuery1.Connection := ADOConnection1;
  try
    ADOQuery1.SQL.Text := 'select * from DaftarNama';
    ADOQuery1.Open;
  except
    on e:eDatabaseError do begin
      MessageDlg('Gagal menampilkan data' +#13+#10+
        'Detail : ' +e.Message,mtWarning,[mbOK],0);
      exit;
    end;
  end;
  DataSource1.DataSet := ADOQuery1;
  DBGrid1.DataSource := DataSource1;
end;

end.

Perlu source-nya, silahkan download pada link di bawah ini :
Cara Menggunakan TADOQuery di Delphi


Ketentuan :
Teman-teman boleh menyebarkan tulisan ini dengan mencantumkan link berikut :
sumber : http://andsc.blogspot.com

<<<< Terima kasih >>>>


Baca selanjutnya

Membuat Koneksi ke Database Access dengan ADO di Delphi 7


Membuat Koneksi ke Database Access dengan ADO di Delphi 7 - Untuk keperluan administrasi data baik bersifat lokal ataupun client to client tentunya diperlukan cara untuk mengkoneksikannya ke sumber data dari aplikasi yang kita buat.

Ada banyak aplikasi database baik yang bersifat free ataupun berbayar, salah satu yang familiar yaitu bawaan Microsoft Office yaitu Microsoft Access.

Pada postingan kali ini admin coba untuk menjelaskan satu cara untuk mengkoneksikan aplikasi dengan Delphi ke Database Access dengan ADO. Untuk lebih jelasnya dibuat sebuah aplikasi dengan Delphi 7 seperti berikut ini,
Namun sebelumnya buat dulu sebuah Database dengan Microsoft Access, dengan ketentuan seperti berikut :
  • Buat database dengan nama database1.mdb
  • Buat table dengan nama DaftarNama, field-field dan isinya silahkan tentukan sendiri.
  •  Tempatkan database1.mdb di folder WINDOWS, contoh di C:\WINDOWS
Sekarang langsung kita buat aplikasinya di delphi,
  • Pertama tempatkan TBitBtn, TDBGrid, TADOConnection, TADOTable dan TDataSource pada Form.
  • Deklarasikan pada private seperti berikut,
          private
               { Private declarations }
               FolderWindows : string;
               function GetWinDir: string;
  • Buat sebuah function seperti berikut,
          function TForm1.GetWinDir: string;
          var
            dir: array [0..MAX_PATH] of Char;
          begin
             GetWindowsDirectory(dir, MAX_PATH);
             Result := StrPas(dir);
          end;
  • Tambahkan script pada event OnCreate dari form sperti berikut ini,
          procedure TForm1.FormCreate(Sender: TObject);
          var
            linkdb : string;
          begin
            BitBtn1.Caption := 'Tampilkan Data';
            FolderWindows := GetWinDir;
            ADOConnection1.LoginPrompt := False;
            ADOTable1.TableName := 'DaftarNama';
      
            //koneksikan ke database access database1.mdb
            linkdb := FolderWindows+ '\Database1.mdb';
            with ADOConnection1 do begin
              Connected := False;
              LoginPrompt := False;
              Mode := cmShareDenyNone;
              ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;'+
                'Data Source='+linkdb+';Mode=Share Deny None;Extended Properties="";'+
                'Jet OLEDB:System database="";Jet OLEDB:Registry Path="";'+
                'Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;'+
                'Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;'+
                'Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";'+
                'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;'+
                'Jet OLEDB:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;'+
                'Jet OLEDB:SFP=False';
            end;
            try
              ADOConnection1.Connected := True;
              ADOTable1.Connection:= ADOConnection1;
              ADOTable1.Active := True;
            except
              on e:Exception do begin
                MessageDlg('Gagal mengakses database' +#13+#10+
                   'Detail : ' +e.Message,mtWarning,[mbOK],0);
              end;
            end;
          end;
  • Tambahkan pada event OnClick dari BitBtn1 seperti berikut ini,
          procedure TForm1.BitBtn1Click(Sender: TObject);
          begin
             //Menampilkan data dari ADOTable1
             DataSource1.DataSet := ADOTable1;
             DBGrid1.DataSource := DataSource1;
          end;



Berikut Script lengkapnya,

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, DbChart,
  DB, DBTables, FileCtrl, Buttons, jpeg, ADODB, Grids, DBGrids, DBCtrls;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOTable1: TADOTable;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    BitBtn1: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
    FolderWindows : string;
    function GetWinDir: string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.GetWinDir: string;
var
  dir: array [0..MAX_PATH] of Char;
begin
  GetWindowsDirectory(dir, MAX_PATH);
  Result := StrPas(dir);
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  linkdb : string;
begin
  BitBtn1.Caption := 'Tampilkan Data';
  FolderWindows := GetWinDir;
  ADOConnection1.LoginPrompt := False;
  ADOTable1.TableName := 'DaftarNama';

  //koneksikan ke database access database1.mdb
  linkdb := FolderWindows+ '\Database1.mdb';
  with ADOConnection1 do begin
    Connected := False;
    LoginPrompt := False;
    Mode := cmShareDenyNone;
    ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;'+
      'Data Source='+linkdb+';Mode=Share Deny None;Extended Properties="";'+
      'Jet OLEDB:System database="";Jet OLEDB:Registry Path="";'+
      'Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;'+
      'Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;'+
      'Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";'+
      'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;'+
      'Jet OLEDB:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;'+
      'Jet OLEDB:SFP=False';
  end;
  try
    ADOConnection1.Connected := True;
    ADOTable1.Connection:= ADOConnection1;
    ADOTable1.Active := True;
  except
    on e:Exception do begin
      MessageDlg('Gagal mengakses database' +#13+#10+
         'Detail : ' +e.Message,mtWarning,[mbOK],0);
    end;
  end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  //Menampilkan data dari ADOTable1
  DataSource1.DataSet := ADOTable1;
  DBGrid1.DataSource := DataSource1;
end;

end.

Tidak mau repot silahkan download source lengkapnya di link di bawah ini :
Membuat Koneksi ke Database Access dengan ADO di Delphi 7

Ketentuan :
Teman-teman boleh menyebarkan tulisan ini dengan mencantumkan link berikut :
sumber : http://andsc.blogspot.com

<<<< Terima kasih >>>>
Baca selanjutnya

Mendapatkan Path Drive dan Folder Windows dengan Delphi


Mendapatkan Path Drive dan Folder Windows dengan Delphi - Pada saat membuat aplikasi dengan Delphi kadang perlu mendeklarasikan path drive maupun path folder windows dari komputer yang akan diinstal aplikasi yang dibuat. Berikut dijelaskan dengan contoh aplikasi berikut ini,
  • Pertama tempatkan beberapa komponen pada Form seperti berikut,

  • Deklarasikan function pada private,
          private
              { Private declarations }
              function GetSystemDrive: string;
              function GetWinDir: string;
  • Buat Function seperti berikut,
          function TForm1.GetSystemDrive: string;
          begin
             SetLength(Result, MAX_PATH);
             if GetWindowsDirectory(PChar(Result), MAX_PATH) > 0 then begin
               SetLength(Result, StrLen(PChar(Result)));
               Result := ExtractFileDrive(Result);
             end else
               RaiseLastOSError;
          end;

          function TForm1.GetWinDir: string;
          var
             dir: array [0..MAX_PATH] of Char;
          begin
            GetWindowsDirectory(dir, MAX_PATH);
            Result := StrPas(dir);
          end;
  • Tambahkan pada event OnCreate dari Form1,
          procedure TForm1.FormCreate(Sender: TObject);
          begin
            Label1.Caption := 'Path Drive Windows';
            Label2.Caption := 'Path Folder Windows';
            Label3.Caption := GetSystemDrive;
            Label4.Caption := GetWinDir;
          end;


Berikut full scriptnya,

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, DbChart,
  DB, DBTables, FileCtrl, Buttons, jpeg;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    function GetSystemDrive: string;
    function GetWinDir: string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function TForm1.GetSystemDrive: string;
begin
  SetLength(Result, MAX_PATH);
  if GetWindowsDirectory(PChar(Result), MAX_PATH) > 0 then begin
    SetLength(Result, StrLen(PChar(Result)));
    Result := ExtractFileDrive(Result);
  end else
    RaiseLastOSError;
end;

function TForm1.GetWinDir: string;
var
  dir: array [0..MAX_PATH] of Char;
begin
  GetWindowsDirectory(dir, MAX_PATH);
  Result := StrPas(dir);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1.Caption := 'Path Drive Windows';
  Label2.Caption := 'Path Folder Windows';
  Label3.Caption := GetSystemDrive;
  Label4.Caption := GetWinDir;
end;

end.


Ketentuan :
Teman-teman boleh menyebarkan tulisan ini dengan mencantumkan link berikut :
sumber : http://andsc.blogspot.com

<<<< Terima kasih >>>>

Baca selanjutnya

Contoh Menggunakan TSplitter di Delphi 7


Contoh Menggunakan TSplitter di Delphi 7 - TSplitter di Delphi berguna untuk membuat ukuran komponen bisa diubah-ubah ukurannya secara manual, seperti pemisah antara dua komponen dan bisa digeser-geser sesuai kebutuhan. Untuk lebih jelasnya bisa dilihat seperti contoh berikut ini.

  • Pertama buat sebuah form dan tempatkan sebuah TDirectoryListBox, sebuah TSplitter dan sebuah TFileListBox seperti gambar berikut
  • Kemudian tambahkan script pada event OnCreate dari Form1 seperti berikut,
          procedure TForm1.FormCreate(Sender: TObject);
          begin
             DirectoryListBox1.Parent := Form1;
             DirectoryListBox1.Align := alLeft;
             Splitter1.Parent := Form1;
             Splitter1.Align := alLeft;
             FileListBox1.Parent := Form1;
             FileListBox1.Align := alClient;
             DirectoryListBox1.FileList := FileListBox1;
           end;








Berikut script lengkapnya :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, DbChart,
  DB, DBTables, FileCtrl, Buttons, jpeg;

type
  TForm1 = class(TForm)
    FileListBox1: TFileListBox;
    DirectoryListBox1: TDirectoryListBox;
    Splitter1: TSplitter;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  DirectoryListBox1.Parent := Form1;
  DirectoryListBox1.Align := alLeft;
  Splitter1.Parent := Form1;
  Splitter1.Align := alLeft;
  FileListBox1.Parent := Form1;
  FileListBox1.Align := alClient;
  DirectoryListBox1.FileList := FileListBox1;
end;

end.


Ketentuan :
Teman-teman boleh menyebarkan tulisan ini dengan mencantumkan link berikut :
sumber : http://andsc.blogspot.com

<<<< Terima kasih >>>>
Baca selanjutnya

Membuat Enkripsi Data dengan Delphi 7


Membuat Enkripsi Data dengan Delphi 7 - Pada saat mengirim dan menerima data, terutama dalam dunia maya tentunya diperlukan pengamanan terhadap data yang dikirim. Apalagi data yang dikirim merupakan data yang penting dan tidak boleh dilihat sembarang orang. Salah satu pengamanannya bisa menggunakan teknik enkripsi.
Berikut salah satu model enkripsi data, seperti contoh aplikasi berikut ini :
  • Pertama buat form seperti berikut :
  • Deklarasikan function pada private :
          private
              { Private declarations }
              function Encrypt(t: string): string;

  • Buat function seperti berikut :
          function TForm1.Encrypt(t: string): string;
          var i : integer;
          begin
             for i:=1 to length(trim(t)) do begin
               t[i] :=  chr(ord(t[i]) xor  2 ) ;
             end;
             result := t;
          end;
  • Pada action OnClick dari Button1(Encrypt) isi dengan script berikut :
          procedure TForm1.Button1Click(Sender: TObject);
          begin
             Memo2.Text := Encrypt(Memo1.Text);
          end;

Berikut full script-nya :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    function Encrypt(t: string): string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.Encrypt(t: string): string;
var i : integer;
begin
    for i:=1 to length(trim(t)) do begin
          t[i] :=  chr(ord(t[i]) xor  2 ) ;
    end;
    result := t;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo2.Text := Encrypt(Memo1.Text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Text := '';
  Memo2.Text := '';
end;

end.

Ketentuan :
Teman-teman boleh menyebarkan tulisan ini dengan mencantumkan link berikut :
sumber : http://andsc.blogspot.com

<<<< Terima kasih >>>>
Baca selanjutnya

Indonesia vs Singapura Disiarkan Secara Langsung


Sore ini Timnas Indonesia akan menghadapi Singapura dalam lanjutan AFF Suzuki Cup 2012, pertandingan yang rencananya akan disiarkan secara langsung di RCTI pada pukul 17:00 dari Stadion Bukit Jalil Kuala Lumpur Malaysia.

picture from goal.com

Setelah sebelumnya ditahan imbang oleh Laos, Timnas Indonesia mendapat tantangan berat menghadapi Timnas Singapura yang dalam pertandingan sebelumnya berhasil meraih tiga poin setelah megalahkan tuan rumah Malaysia 0-3. Timnas Indonesia harus meraih poin untuk mengamankan posisi melaju ke babak semifinal.

Timnas Indonesia tergabung dalam Grup B bersama Singapura, Laos dan tuan rumah Malaysia, saat ini berada pada posisi kedua setelah Singapura dengan poin 1 hasil dari satu pertandingan melawan Laos.


Ketentuan :
Teman-teman boleh menyebarkan tulisan ini dengan mencantumkan link berikut :
sumber : http://andsc.blogspot.com

<<<< Terima kasih >>>>

Baca selanjutnya

AVO.NET SCAM ?


Emang kalau bukan luck-nya gini nih, baru saja gabung sekitar satu bulan dan belum sekalipun withdraw di bisnis ini...eh udah ngilang dan banyak yang menyatakan SCAM. Sungguh menyesakkan memang tapi inilah resiko yang memang harus ditanggung dalam menjalakan bisnis online.



Sebelumya banyak yang menyatakan avo.net ini akan menjadi bisnis SCAM, dan akan berakhir tidak lama lagi, karena memang begitulah kecenderungan HYIP. Tapi dikarenakan bentuk web yang profesional, dan kegiatan bisnis yang lancar-lancar saja membuat banyak orang tidak sadar akan bahaya ini.

Tanda dari bisnis ini mulai akan berakhir, ditandai dengan tidak dibayarkannya request withdraw member, dan pada akhirnya avo.net berdalih keterlambatan diakibatkan Liberty Reserve yang memberlakukan batas limit untuk accountnya...yah emang dasar masa Liberty Reserve dianggap SCAM katanya..hehe...

Dan sehari setelahnya avo.net sudah tidak bisa diakses lagi..ya mungkin emang sudah berhenti beneran...keterlaluan nih orang dah nipu sampai ribuan member...yah moga jadi pelajaran untuk kedepanya untuk lebih selektif lagi dalm memilih bisnis...terutama bisnis di dunia maya.

Ketentuan :
Teman-teman boleh menyebarkan tulisan ini dengan mencantumkan link berikut :
sumber : http://andsc.blogspot.com

<<<< Terima kasih >>>>


Baca selanjutnya

Tentang Saya

Kompas News

Pengunjung