Pembaruan Aplikasi KataBaku ver.1.1

Alhamdulillah, pembaruan dari aplikasi gratis pemeriksa kata baku yang pertama telah diunggah sini.

Perubahan yang dilakukan adalah penambahan beberapa ratus pasang kata baru dan kata yang salah telah diganti di bagian bawah naskah yang disalin. Jadi penulis naskah bisa membandingkan sebelum dan sesudah diganti.

katabaku_1_1

Beberapa fitur di basis data yang mungkin belum kalian ketahui:

  • Mencari kata tertentu dengan cepat. Pindahkan tetikus ke bagian kanan dari judul “Salah” atau “Benar”, klik tunggal pada segitiga hitam untuk mencari kata atau menyaringnya

filter

Bagaimana dengan menampilkan semua kata yang dimulai dengan kata “re”?

Pilih custom.

filter_1

re% artinya semua kata yang diawali dengan “re”. %re% artinya kata yang di tengahnya mengandung kata “re”, dst.

filter_2

Ayo, ditunggu masukan untuk menambah fitur aplikasinya, ya!

 

Aplikasi Gratis Pemeriksa Kata Baku

Beberapa waktu yang lalu, pas zamannya masih aktif menulis fiksi mini, sahabat dunia maya saya, Carolina Ratri sering membagikan daftar kata baku dan yang tidak, melalui Facebook Group yang kami ikuti. Saya tergelitik untuk membuat aplikasi kecil yang bisa digunakan penulis untuk memeriksa apakah ada kata tidak baku yang ada dalam naskahnya. Dengan aplikasi ini penulis atau penyunting naskah akan lebih terbantukan dalam proses penyuntingan artikel sebelum ditayangkan secara daring atau dicetak.

Cara menggunakannya cukup mudah.

  • Salin dan Tempel (Copy and Paste)naskah ke dalam aplikasi

copas

  • Klik tombol Periksa Kata di bagian kiri bawah dan jika ada kata yang sama dengan kata-kata tidak baku di basis data, akan muncul frekuensinya di sebelah kanan

periksa

Lanjutkan membaca Aplikasi Gratis Pemeriksa Kata Baku

Panduan Penggunaan Aplikasi Werewolf Admin Helper v2.0

Aplikasi Werewolf Admin Helper adalah sebuah tool berbasis Windows yang dapat digunakan untuk membantu Moderator agar permainan sosial Werewolf menjadi lebih mudah dimainkan.

Aplikasi ini tidak perlu diinstal, cukup disalin ke sembarang folder di mana Anda ingin menyimpan aplikasi ini (stand alone), tidak perlu DLL atau framework apapun.

File yang Dibutuhkan

Aplikasi EXE ini ditemani sebuah file yang bernama role.ini yang harus diletakkan dalam folder yang sama dengan aplikasinya. Anda bisa ubah isinya sesuai mahdzab atau aliran Werewolf yang Anda sukai yang banyak tersedia di Internet. Pastikan ada score untuk masing-masing role.

Berikut adalah contoh isi file role.ini yang ada:

[SIMPLICITY]
Apprentice Seer=4
Blood Wolf=-4
Bomber=3
Cupid=-3
Drunker=3
Fool=1
Framer=-2
Guardian Angel=3
Hunter=2
Little Girl=2
Lone Wolf=-5
Lycan=-1
Mason=2
Mayor=2
Seer=7
Spellcaster=2
Villager=1
Virgin=3
Voodoo Lady=-2
Wolf Cub=-8
Werewolf=-6

[ULTIMATE]
Apprentice Seer=4
Aura Seer=3
Beholder=2
Big Bad Wolf=-9
Bloody Mary=1
Bodyguard=3
Bogeyman=-6
Chupacabra=4
Count Dracula=-2
Cult leader=1
Cupid=-3
Cursed=-3
Dire Wolf=-4
Diseased=3
Doppelganger=-2
Dream Wolf=-5
Drunk=3
Fruit Brute=-3
Ghost=2
Hunter=3
Insomniac=3
Leprechaun=5
Little Girl=2
Lone Wolf=-5
Lycan=-1
Martyr=3
Mason=2
Mayor=2
Minion=-6
Nostradamus=1
Old Man=0
Pacifist=-1
Priest=3
Prince=3
Paranormal Investigator=3
Sasquatch=-2
Seer=7
Sorcerer=-3
Spellcaster=1
Tanner=1
The Count=5
Tough Guy=3
Troublemaker=2
Vampire=-7
Village Idiot=2
Villager=1
Werewolf=-6
Witch=4
Wolf Cub=-8
Wolf Man=-9

Pastikan section tidak anda ubah (harus SIMPLICITY dan ULTIMATE). Lainnya bisa diubah dengan format <role>=<nilai>.

Menyiapkan Permainan

Pastikan Anda memiliki setidaknya 5 orang yang akan bermain di luar Moderator.

Pergi ke Tab Sheet : SKENARIO

Default DECK yang digunakan adalah SIMPLICTY WEREWOLF, dan Anda dapat pindah ke ULTIMATE WEREWOLF dengan mengeklik pilihan yang Anda inginkan.

Img5

Masukkan Jumlah Pemain di combo box bagian Atas.

Jumlah Variasi menunjukkan banyaknya kombinasi skenario yang Anda ingin hasilkan.

Ada 5 kolom di gambar di atas.

Kolom paling kiri akan berisi skenario yang dihasilkan oleh tool ini. Anda bisa copy and paste ke tempat lain atau disimpan untuk future reference.

Kolom nomor dua dari kiri berisi semua role yang tersedia, kolom di sebelahnya berisi daftar role yang tidak ingin Anda inginkan berada di hasil skenario yang dihasilkan.

Kolom nomor lima merupakan kebalikannya, berisi role yang harus disertakan dalam setiap kombinasi skenario yang dihasilkan. Kolom nomor tiga dan nomor 5 tidak harus diisi.

Setelah Anda siap menghasilkan skenario, klik tombol Acak Skenario untuk menghasilkan semua skenario yang Anda inginkan. Caption tombol akan berubah menjadi Stop jika misalnya Anda mencoba menghasilkan 1000 variasi kemungkinan lalu berubah pikiran. Hal lain juga apabila Anda terlalu banyak memasukkan role mandatory sehingga total score sesuai slide bar (-2, -1, 0, 1, dan 2) tidak bisa terpenuhi. Ini bisa dilihat dari angka yang terus merangkak naik di samping tombol Acak/Stop namun aplikasi tidak bisa mencari kemungkinan lain agar total score sama dengan angka slide bar tersebut. Permainan ini harus dibuat seimbang mungkin. Sisi jahat (werewolf dan teman-temannya) selalu negatif sementara sisi Villager dan teman-temannya yang baik nilainya positif. Total kesemuanya sebaiknya 0. Nilai negatif jika Anda merasa sisi jahat harus dominan di awal, dan positif jika Villager dominan di awal permainan.

Img6

Dalam skenario di Atas ada 5 pemain dengan 3 variasi skenario di mana Lycan tidak ingin dimainkan dan role yang wajib adalah Guardian Angel dan Seer.

Setelah Anda cocok dengan suatu skenario, pilih nomor Skenario yang diinginkan, lalu klik Pilih Skenario. Anda akan dibawa ke Tab sheet Game.

Masukkan nama ke 5 orang pemain. Lalu klik Acak Peran ke Para Pemain.

Img7

Tombol Hitung Balance Score digunakan untuk menghitung nilai total permainan sesuai dengan banyaknya role yang akan dimainkan. Nilai totalnya muncul di sebelah tombol tersebut.

Pada setiap siang hari, nilai vote yang diterima setiap pemain diketikkan di kolom Lynch Vote. Jangan lupa simpan perubahan dengan mengeklik tombol navigasi checklist berwarna hijau di bawah grid.

Klik Tombol Statistik Vote untuk menampilkan di bagian bawah siapa yang harus dieliminasi siang itu.

Contohnya:

Hasil vote adalah sebagai berikut:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Joni -> 3
Broto -> 1
Sugeng -> 1
Yang akan mati berikutnya dibakar warga adalah Joni
Pemain Joni telah mati…
Game Balance Status : 3
Kekuatan didominasi oleh GOOD SIDE

Img8

Anda juga bisa menyalin tulisan di atas ke WhatsApp / Line / Telegram Group jika Anda bermain daring.

Jika ada warga yang akan dimakan warga, klik saja pemainnya, lalu klik tombol Dimakan Serigala. Jika dia Lycan, perannya akan otomatis berubah menjadi Werewolf. Jika seseorang mati karena dibunuh Hunter atau Bloody Mary atau karena pasangannya dibunuh, maka klik checkbox Hidup dan tekan tombol simpan (Checklist Hijau) untuk mengubah statusnya.

werewolf

Selamat Bermain! Kalau mau mengunduhnya silakan ambil di sini, gratis!

 

 

 

Review Social Game Werewolf a.k.a Mafia

Setiap kali kita jalan-jalan menginap ke suatu tempat bersama keluarga besar atau pas mudik hari raya, sering kita bingung mau ngapain pas ngumpul bareng. Demikian juga pas ngumpul bareng sama teman-teman pas reunian atau pas ada acara gathering kita suka bingung mau ngapain. Nah pemecah suasana atau pengisi waktu luang kebersamaan kita bisa dilakukan dengan jalan main game yang menyenangkan. Kalau pegang gawai masing-masing, semua asyik sendiri, tidak ada interaksi satu sama lain. Mendingan kalau pegang iPad atau HP, jangan main sendiri-sendiri pas ngumpul. Lebih asyik main social game, di mana banyak orang bisa berpartisipasi aktif dan bisa mengakrabkan satu sama lain.

Nah, pada postingan kali ini saya ingin membahas mengenai permainan Werewolf yang sepertinya sedang hangat dibicarakan dan dimainkan para seleb di Indo. Bagaimana sih mainnya?

Jadi gini. Kita tinggal di sebuah desa di mana ada werewolf di antara kita. Tujuan permainan ini adalah jika kamu bukan werewolf, kamu bersama warga desa lainnya harus menemukan semua werewolf untuk diamankan. Sedangkan jika kamu kena kutuk menjadi werewolf, kamu harus memangsa semua warga hingga minimal perbandingan jumlah warga dan werewolf adalah 1:1. Di antara warga desa ada yang punya kekuatan cenayang, yaitu Seer. Dia bisa mengetahui seseorang itu werewolf atau bukan. Ada juga Guardian Angel atau Bodyguard yang bisa mengamankan pemain lainnya dari serangan werewolf. Permainan ini harus dipimpin oleh seorang moderator dan setidaknya lima orang pemain. Ada banyak varian dari permainan ini, dengan role yang mirip-mirip. Untuk permainan werewolf simplicity series, rolenya tidak banyak, namun cocok untuk pemain 5 – 10 orang. Sedangkan jika pemainnya lebih dari 10 orang, bisa menggunakan Ultimate Werewolf yang rolenya bisa sampai puluhan, dan bisa dimainkan hingga sekitar 70 orang.

Ini contoh penampakan kartu simplicity series:

Kartu simplicity series juga memiliki ekspansion atau tambahan untuk menambah kompleksitas permainan ketika pemainnya bertambah, misal sampai 20 orang. Saya membeli yang versi simplicity yang lebih murah dan sederhana, karena ingin mencoba mendapatkan feeling permainannya dulu. Harganya sekitar 60-80 ribu rupiah, bisa beli di toko online kok. Google aja : beli kartu werewolf, otomatis kamu bisa membeli dari pranala yang tersedia.

Kalau ini adalah penampakan packaging yang ultimate.

Img5

Berikut ini adalah tampilan kartu-kartunya:

Img6

Harga yang ultimate versi orisinil harganya sekitar 360 ribu rupiah, sementara yang menjual KWnya sekitar 160 ribu rupiah. Silakan lihat role lengkap yang ditawarkan ultimate di pranala ini.

Gimana? Penasaran? Coba tengok video tutorial dari Raditya Dika berikut ini:

Di channel Youtube banyak sekali contoh memainkan permainan ini. Tinggal pilih saja.

Oh ya, selain dimainkan secara langsung, permainan ini juga bisa dimainkan di Whatsapp melalui group (masih perlu moderator), atau memanfaatkan bot di telegram (tidak perlu ada moderator karena perannya digantikan bot). Masing-masing ada kelebihan dan kekurangan. Main bertemu langsung membutuhkan moderator, harus berkumpul pada tempat yang sama. Kalau mau main di WA, masih perlu moderator, tetapi bisa di tempat yang berbeda-beda. Kalau main di Telegram dengan bot bisa main tanpa moderator, namun tentu saja dinamika permainan yang dikembangkan moderator biasa kurang terasa, karena pada akhirnya akan membosankan dilayani bot. Lebih seru kalau moderatornya manusia, jago bercerita dan improvisasi, dan bisa mengatur keseimbangan permainan selama mungkin.

Saya sendiri membuat program kecil sederhana yang dibuat dengan Object Pascal (Delphi) untuk membantu Administrator melakukan tugasnya.

Img7

WishCraft adalah ID saya dalam permainan Hearthstone  yang sudah saya mainkan selama lebih kurang dua setengah tahun terakhir.

Aplikasi ini bisa membantu menghitung keseimbangan permainan. Setiap role memiliki nilai positif dan negatif. Positif dimiliki sisi baik, negatif dimiliki oleh sisi buruk. Kalau kita lihat di wikipedia, beberapa role yang ada nilainya sebagai berikut:

Villager=1
Werewolf=-6
Mayor=2
Bodyguard=3
Hunter=3
Mason=2
Seer=7
Wolf Cub=-8
Sorcerer=-3
Cursed=-3
Apprentice Seer=4
Prince=3
Witch=4
Drunk=3

Kita ambil contoh kasus permainan dengan 5 orang:

Img10

Aplikasi akan menghitung dari role yang akan dimainkan, seberapa seimbang. Semakin mendekati 0 maka permainan akan seimbang. Dengan alat bantu ini kita tidak ngawur memilih komposisi role yang akan dipakai, karena bisa saja sudah tidak seimbang dari permainan belum dimulai. Dengan alat ini pula setiap permainan bisa kita ubah komposisi peran yang akan dimainkan sehingga moderator akan menambahkan efek twist tak terduga.

Saya sendiri ketika bertindak sebagai moderator menikmati betul peran ini karena bisa menentukan dinamika permainan. Peran drunker di versi ultimate bisa kita gunakan untuk menyeimbangkan permainan ketika sudah mulai berat sebelah. Role yang tidak dimainkan bisa ditanyakan pada malam hari seolah-olah role itu ada, padahal tidak ada. Ini bisa digunakan untuk menambah kompleksitas permainan, terutama jika pemainnya sedikit.

Dengan alat bantu ini moderator juga dibantu menentukan suara terbanyak ketika vote berlangsung, otomatis bisa mengubah role Cursed yang dimakan serigala menjadi werewolf berikutnya, dan seterusnya. Jika bermain whatsapp aplikasi ini juga menghasilkan beberapa kalimat yang bisa disalin dari aplikasi ke web.whatsapp.com sehingga moderator pekerjaannya lebih ringan.

Mari kita lihat cuplikan permainan yang saya mainkan bersama teman-teman sepulang kerja, ketika penentuan siapa yang akan dipilih untuk disingkirkan dari permainan karena diduga serigala jadi-jadian.

Buat yang suka naik gunung dan berkemah, permainan ini juga bisa dimainkan untuk menambah seru suasana.

Gimana, asyik gak? Pernah mainin juga? Ayo ceritakan pengalamanmu bermain Werewolf di kolom komentar di bawah ini.

Tunggu review saya berikutnya untuk Spyfall dan Resistance yang mirip dengan game ini. Insya Allah coming soon!

Letterpress for iOS, a Brand New Word Game with Adrenalin

A new app, Letterpress,  just came from Apple Store, created by Loren Brichter who created the best Twitter App, called Twetie which is bought by Twitter. The game is totally addictive, you may need a few games for learning curve, and you know exactly how to win.

The rule is simple. You are given 5×5 letters without background color. Meaning, nobody owns them. You will play with exactly one opponent, you may invite him/her from Game Center, or the servers will pick one randomly for you. Once the letters being played to form a valid word based on their dictionary, the background of the letter will turn to either your or your opponents, depends who plays them. The game is over when all letters are used at least once. The winner is the one who owns more letters than his/her opponents. You may protect your own letter by surrounding it with your own other letters. All protected letters cannot be turned to the opponent when they are protected.

Tips for the game:

  1. Try not only form a long word (use as many as possible letters), but also think how to protect your own letters
  2. When there are few letters left being used, try to form a word long enough using those unclaimed letters with final amount of your letters more than your opponent has

As usual, after creating a helper application for Draw Something phenomenon in my earlier blog here, I updated the application so it can be used for Letterpress as well. Well, don’t use it if you don’t want to lose the excitement of playing the game! But if you insist, you can download the ‘helper’ here.

Letter Press in Action!

The pink letters are belong to my opponent but still can be turned when I use them. The red one cannot. It is protected.

Word Cruncher for Letterpress and Draw Something

This helper application comes with a dictionary.txt that contains words from internet. Since the Letterpress dictionary is different with this app’s, this helper sometimes cannot help you 🙂

You may group all words with the same length by dragging the header of the column (length) to upper area of the grid. Or you may filter it by clicking the pick column / combobox for length header.

Filtering the result by its length

Or you may filter all results with 8 in length and contains S and K, like this.

All words with S and K and 8 in length

Once again, don’t over use this helper app since it will ruin the excitement. Use your own brain, not the CPU 🙂

Misteri TObjectList

Kalau kebetulan menggunakan collection TObjectList, pastikan waktu create objectnya memperhatikan parameternya dengan baik. Kalau ingin memusnahkan masing-masing object di array sendiri, pastikan parameter Createnya diisi False. Jangan dibiarkan saja, karena defaultnya True. Kalau True maka asumsinya si TObjectList yang akan memusnahkan masing-masing objectnya. Sehingga kalau kita hanya panggil constructor Create tanpa parameter (which is dianggap kita tidak akan memusnahkan elemen di array secara manual) lalu kita panggil Free untuk TObjectListnya, dia akan upset. Sepertinya banyak programmer yang terjebak di sini. Mungkin desain TObjectList kurang benar. Seharusnya defaultnya bukan True, tetapi False.

Mau lihat contoh kodenya? Coba tengok di sini.

Untuk constructornya sendiri di Help bisa dilihat:

constructor Create(Collection; AOwnsObjects: Boolean = True);

 The AOwnsObjects parameter is a boolean that indicates whether object entries are owned by the list. If the object is owned, when the entry is removed from the list, the object is freed. The OwnsObjects property is set from the value of this parameter. The default is true.

Tulisan ini dibuat sebagai pengingat diri sendiri yang sudah 
dua kali terjatuh dalam jebakan yang sama, 
walau rentang waktunya memang sangat berjauhan. :D

Wisnu Widiarta Tokyo Flash ver 2.0 Windows Application

Buat Anda yang telah mengunduh aplikasi versi 1.0 Tokyo Flash Wannabe dari Wisnu Widiarta sebelumnya, kini telah hadir aplikasi versi 2.0. Ada 2 jam pilihan Anda. Blue Roman dan Nine Circles.

Fiturnya:

1. Bisa mengingat lokasi terakhir jam dimunculkan

2. Bisa mengingat warna dan atribut jam

Programmingnya menggunakan Delphi 2010, menggunakan fitur interface dan frame. Idenya adalah setiap jam akan diimplementasikan dalam bentuk Frame yang mengimplementasikan interface ITokyoFlash.

Buat Anda yang suka teka-teki, silakan unduh programnya secara gratis di sini, lalu untuk menebak polanya, bisa dengan mengubah jam pada settingan komputer Anda, lalu lihat polanya.

Slideshow ini membutuhkan JavaScript.

Buat Anda yang ingin tahu polanya, silakan lihat petunjuk berikut ini:
Untuk Blue Roman, 12 lingkaran menunjukkan jam. Saat ini belum membedakan 24 jam. Versi berikutnya mungkin ditambahkan.  Huruf romawi di tengah menunjukkan menit.
Untuk Nine Circles, lihat ada 4 bujur sangkar di dalam jam. Kotak kiri atas menunjukkan digit pertama jam, kotak kanan atas menunjukkan digit kedua jam, sedangkan di kiri bawah merupakan digit pertama menit dan kanan bawah adalah digit keduanya. Bayangkan ada 9 lingkaran dalam tiap kotak berjumlah 3 x 3. Lingkaran 1 menunjukkan angka 1, semakin ke kanan dan semakin ke bawah bertambah 1. Untuk angka 0 diwakili dengan tanpa lingkaran sama sekali. Gambar pada contoh menunjukkan jam 05:04. Paham?
Semoga bermanfaat dan selamat menggunakan!

Setting Master Detail dengan Dev Express Quantum Grid

Ternyata barang canggih konfigurasinya juga tidak trivial. Tulisan ini digunakan untuk siapa saja yang belum tahu atau lupa melakukan konfigurasi master detail dengan Quantum Grid dari Dev Express.

ExpressQuantumGrid is capable of displaying data from several datasets. You can present data either from independent datasets in one control or datasets that are linked by a master-detail relationship. One-to-many relationships or master-detail relationships can be represented in one of two ways. The first method is to use two grid controls. A detail grid control displays only the records corresponding to the current record in a master table. In the second method only one grid control is used to present master-detail relationships. This method is specific to the ExpressQuantumGrid and employs grid levels to create a hierarchical data structure.

You can see, for instance, the MasterDetailTableDemo for a complete example of implementing a master-detail relationship. This topic describes the basic principles involved in setting up master-detail relationships based on the database used in this demo.

Data in this example is loaded using the default loading mode (when Grid Mode is not applied). Grid mode is a special loading mode provided where there are a large number of records. The Grid Mode: Master-Detail section shows how to create a master-detail relationship between tables in grid mode.

EQGrid allows you to populate views with data from non data-aware sources using provider and unbound modes. Refer to the Provider Mode: Master-Detail and Unbound Mode: Master-Detail sections to see how to set up master-detail relationships in these modes.

Database structure
Let us consider two tables that are shipped with the EQGrid demos: FILMS and FILMSPERSONSSTAFF. The FILMS table contains information on the films in the catalog and contains fields such as CAPTION, YEAR, PHOTO, TAGLINE, ID and others. ID is the table key field name.

The FILMSPERSONSSTAFF table describes people involved in film production. It also has an ID field uniquely identifying records in the table. Other fields are PERSONID, PERSONLINEID, DESCRIPTION and FILMID. FILMID denotes a value of the ID field from the FILMS table. It associates each record in the FILMSPERSONSSTAFF table with a specific film from the FILMS table. Thus a master-detail relationship can be established between these tables in which FILMS is a master table and FILMSPERSONSSTAFF is a detail table.

Creating connections to tables
The Connecting to Data topic outlines the steps required to connect a grid control to a database. It involves:

creating TDataSet and TDataSource objects for all data tables in the project

linking TDataSet to a database table

linking TDataSource to the TDataSet

Other steps relate to adjusting the grid’s properties and will be discussed below.

We have created a table (dataset) and datasource objects for the FILMS table: tblFilms and dsFilms. The dataset and data source for the FILMSPERSONSSTAFF table are tblFilmsPersonsStaff and dsFilmsPersonsStaff, respectively.

Creating the data structure
To display a master-detail relationship, you need to have at least two grid levels with associated DB views (one for a master table and the other for its detail table). Views must be connected to data sources identifying master and detail tables respectively. Please refer to the Working With Levels topic to learn more about creating a data structure within a grid control. The following grid levels (TcxGridLevel) and views (TcxGridDBTableView) were created to represent the FILMS and FILMSPERSONSSTAFF tables:

The lvFilms level is linked to the tvFilms view connected to the dsFilms data source.

The lvFilmsPersonsStaff level is a child level of lvFilms. It is associated with the tvFilmsPersonsStaff view connected to the dsFilmsPersonsStaff data source.

The following image shows the Structure Navigator with the levels and views created:

Structure Navigator

Also, you have to link views to corresponding TDataSource objects and add columns within these views to display the data in the tables. See Connecting to Data and Create And Delete Columns for more details.

 

Setting up a master-detail relationship

To link the tables’ data, you need to set the DetailKeyFieldNames and MasterKeyFieldNames properties of the detail view’s data controller.

  • Set MasterKeyFieldNames of the detail view’s data controller to ID. It identifies the field from a master table (FILMS).
  • Set DetailKeyFieldNames to FILMID. FILMID specifies the field in the current detail table (FILMSPERSONSSTAFF). It corresponds to the field(s) set via MasterKeyFieldNames.
  • Set KeyFieldNames to ID. The KeyFieldNames property specifies one or more key field names to identify each dataset record uniquely. This is not required for the actual master-detail relationship, but it is necessary for some operations to work, such as editing detail view data, deleting records, etc.

At design time, select the tvFilmsPersonsStaff view so that the Object Inspector displays its properties and then expand the DataController property. The following image shows the Object Inspector with MasterKeyFieldNames, DetailKeyFieldNames and KeyFieldNames set to values as described above:

Setting for the detail

The following code performs the same operations:

//Delphi

tvFilmsPersonsStaff.DataController.KeyFieldNames := ‘ID’;

tvFilmsPersonsStaff.DataController.MasterKeyFieldNames := ‘ID’;

tvFilmsPersonsStaff.DataController.DetailKeyFieldNames := ‘FILMID’;

Sorting the detail dataset

The last step of setting up a master-detail relationship is to sort the detail dataset (for parameterized queries this is not necessary). Providing that the detail dataset is sorted, the data controller will correctly retrieve all the necessary records from it. The detail dataset must be sorted against the fields specified by the DetailKeyFieldNames property.

To enable sorting for query datasets, you should use the “ORDER BY” SQL command. For TTable and TCustomADODataSet components, the sorting of dataset records is implemented via the IndexFieldNames property. In this example, we need to set the IndexFieldNames property of the dsFilmsPersonsStaff dataset to FILMID (the same value as for the tvFilmsPersonsStaff.DataController.DetailKeyFieldNames property).

//Delphi

dsFilmsPersonsStaff.IndexFieldNames := ‘FILMID‘;

The grid below demonstrates two tables linked by the ID & FILMID fields:

Example final master detail view

Word Cruncher Helper for Draw Something Phenomenon and Letter Press App

If you get stucked or start to yelling WTF of the meaning of your opponent’s drawing when playing the famous Social Drawing Application – Draw Something, this simple tool may help you to reduce the millions or probably trillions of the possibility answer for the question. Use this application wisely since it may spoil the fun of the game. Use it just when you want to keep the long streak that you have achieved with your opponent and you are in a deep stress unable guessing the question.

This tool was coded using Delphi and it uses dictionary found by googling from this site. Of course the result of this tool really depends with the entry of the dictionary. You may add your own words, celebrity names, famous phrases, etc by manually add your own entries in the dictionary.txt file which comes along with the application. Ensure the file is located in the same folder with the application. You may share the application freely or share the link among of your friends who play the game. You may download the application from this link.

Actually you may get help from the bomb feature to eliminate some unused letters when you get stucked. The problem is, you have a limited bomb to use. When you are running out of bombs, you may purchase it from the store, adding some money to Draw Something. This tool eliminate you from purchasing any bombs (1200 coins for 4.99 USD, 3000 coins for 9.99 USD, and 10000 coins for 24.99 USD). So this cool tool really save you money!!!

Here is the source code (you may enhance it or put some refactoring to increase the speed) or recoding it with your favorite programming language. Click this link to see the code.

Here is the sample of images that you may not find in the dictionary. You’re on your own.

The reason I made this tool was one night, I was really sleepy in my bedroom, and yet still playing this addictive game. I wrote a sentence to my opponent before drawing the question : This is the last drawing before go to bed. Good Night. And then I touched the erase icon to erase the sentence and drew the question. The next morning I grabbed my iPad, my opponent replied my sentence with Good Night, and she forgot to draw the question!!! There are thousands of possible words that I need to try. I have 36 turn in streak that both of us always correctly guess the answer. I don’t want to start from all over again, so I decided to code this tool. Hahaha.. another excuse to code for a programmer, huh?

The other reason was when my son  playing the same game in his iPod touch, his opponent drew numbers 1, 2, 3, and 4. And NO OTHER CLUE. We were thinking about words: COUNTING, NUMBERS, MATH, etc. When we gave up, the actual answer was PASSWORD. This is a kind of WTF drawing that impossible to guess, and with this tool you may avoid crunching all possibilities with just a reasonable number of guess.

Guessing PASSWORD

How to use the application:

  1. Download the zip file from the link above, and extract it to a folder
  2. There are 2 files, first is the application, WordCruncher.exe and dictionary.txt. Run the application by double clicking on the WordCruncher.exe
  3. Put all the letters available in Choice of letters (12 length)
  4. Choose the length of the answer
  5. Click Crunch button to get the possible result
  6. You may double click the word in the result box to launch the browser with the meaning of the word

Enjoy the game (you can get it from Apple AppStore or Google Play (Androit Market)) ,  and enjoy this tool but use it wisely!

======================== EDITED ON 3rd Nov 2012  ==========================

Letterpress App just launched. I modified a bit so it can be used for Draw Something and Letter Press. Same link for  this ver2.0. To get the password of the zip file, please email to word.cruncher.application at gmail.com.
Put in the subject : PASSWORD

Put in the body:

NAME:

COUNTRY:

WHAT’s THE APP YOU PLAY for THIS WORD CRUNCHER:

YOUR GADGET:

COMMENT:

Thx!

TTreeView and TClientDataSet Sample

Mas Rahman, menanyakan tentang penggunaan TreeView dengan database. Aku sendiri menganjurkan TreeView dari DevExpress karena sangat mudah dan intuitif. Jedi VCL juga memiliki JDbTreeView tetapi penggunaannya sangat tidak intuitif dan manualnya sulit didapatkan. Searching di google, di milis JEDI saja ada komentar berikut:

I had successfully implemented DevExpress’s DBTreeview when I worked for
my last employer, so I thought I could apply what I had learned in my
home project using JvDBTreeview, but failed after many hours.
Apparently, they are similar, but not similar enough. I also searched
the help files and the internet extensively for any info about this
component and finally gave up looking and bought DevExpress’s DBTreeview
Suite. With the aid of their very well written help files and online
support files, I was able to create exactly what I wanted in about two
hours.

Warning: Woll2Woll’s very nice DB treeview is easier to implement than
DevExpress’s, but shields the programmer from learning how the treeview
really works and actually creates work for the programmer when they try
to override its default behavior.
I recommend DevExpress’s treeview over W2W’s. If yo

u buy it, I’ll help
you get it running.

Good luck.
Regards,
Sam Hunt

Jadi menurut saya kalau memang tidak beli TreeView dari DevExpress ya mau tidak mau menggunakan TTreeView bawaa Delphi. Nah butuh rekursif prosedur untuk bisa membaca seluruhnya.

Nah berikut ini adalah coding sample penggunaan untuk loading tree structure dari database. Intinya, setiap row butuh 1 parent ID dan ID dia sendiri, termasuk field untuk menampilkan data di treenya. Jadi minimal butuh 3 field. Parent ID, Child ID, dan Caption yang akan dimunculkan.

Untuk membuatnya, drop komponen berikut ke form:

  1. TTreeView
  2. Button dengan caption Refresh Tree
  3. TClientDataSet (atau gunakan komponen TTable atau TQuery atau turunan TDataSet)
  4. TDataSource
  5. TDBGrid
  6. TDBNavigator
 
unit unitMain;

interface

uses
  Windows, Messages, SysUtils, Variants,
  Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, ExtCtrls,
  DBCtrls, Grids, DBGrids,  ComCtrls, DB,
  DBClient;

type
  TformMain = class(TForm)
    treeView: TTreeView;
    tbmSample: TClientDataSet;
    tbmSampleParentID: TStringField;
    tbmSampleChildID: TStringField;
    tbmSampleCaption: TStringField;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    dtsSample: TDataSource;
    btnRefresh: TButton;
    procedure btnRefreshClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure CreateTree(parentID: String; ParentNode: TTreeNode);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  formMain: TformMain;

implementation

{$R *.dfm}

procedure TformMain.CreateTree(parentID: String; ParentNode: TTreeNode);
var
  list: TStringList;
  i: integer;
  newNode: TTreeNode;
begin
  list := TStringList.Create;

  tbmSample.Filtered := False;
  tbmSample.Filter := 'ParentID = ' + QuotedStr(parentID);
  tbmSample.Filtered := True;

  while Not tbmSample.EOF do
  begin
    if tbmSample.FieldByName('ParentID').AsString = parentID then
      list.Add(tbmSample.FieldByName('ChildID').AsString + '=' +
        tbmSample.FieldByName('Caption').AsString);
    tbmSample.Next;
  end;

  i := 0;
  while i < list.Count do
  begin
    begin
      newNode := treeView.Items.AddChild(ParentNode,
        list.Values[list.Names[i]]);

      CreateTree(list.Names[i], newNode);

      Inc(i);

      if i Mod 10 = 0 then
        Application.ProcessMessages;
    end;
  end;

  list.Free;
end;

procedure TformMain.FormCreate(Sender: TObject);
begin
  tbmSample.Open;
  tbmSample.Insert;
  tbmSampleParentID.AsString := '0';
  tbmSampleChildID.AsString := '1';
  tbmSampleCaption.AsString := 'Wisnu';
  tbmSample.Post;

  tbmSample.Insert;
  tbmSampleParentID.AsString := '1';
  tbmSampleChildID.AsString := '2';
  tbmSampleCaption.AsString := 'Rayyan';
  tbmSample.Post;

  tbmSample.Insert;
  tbmSampleParentID.AsString := '1';
  tbmSampleChildID.AsString := '3';
  tbmSampleCaption.AsString := 'Aila';
  tbmSample.Post;

  tbmSample.Insert;
  tbmSampleParentID.AsString := '0';
  tbmSampleChildID.AsString := '4';
  tbmSampleCaption.AsString := 'Rachman';
  tbmSample.Post;

  tbmSample.Insert;
  tbmSampleParentID.AsString := '4';
  tbmSampleChildID.AsString := '5';
  tbmSampleCaption.AsString := 'Fina';
  tbmSample.Post;

  tbmSample.Insert;
  tbmSampleParentID.AsString := '4';
  tbmSampleChildID.AsString := '6';
  tbmSampleCaption.AsString := 'Fani';
  tbmSample.Post;
end;

procedure TformMain.btnRefreshClick(Sender: TObject);
var
  topNode: TTreeNode;
begin
  topNode := treeView.Items.Add(Nil, 'Root Node');
  CreateTree('0', topNode);
  tbmSample.Filtered := False;
end;

end.
 

Untuk project lengkapnya, download saja di sini.

Tampilan Aplikasi
Tampilan Aplikasi