There are some great performance suggestions made by other people that you should implement in Delphi. You must consider them. I will focus on ADO.
You did not specify what a back-end database server is, so I cannot be too specific, but there are some things you should know about ADO.
ADO RecordSet
ADO has a RecordSet object. In this case, this RecordSet is basically your ResultSet. The interesting thing about iterating through RecordSet is that it is still connected to the provider.
Cursor type
If your cursor type is Dynamic or Delphi by default, Keyset, then each time RecSet requests a new line from the provider, the provider checks to see if there have been any changes before they return the record.
So, for TADOQuery, where everything you do reads the result set to populate the combobox, and this is hardly changed, you should use the Static type of the cursor to avoid checking for updated records.
If you do not know what a cursor is, when you call a function of type Next, you move the cursor that represents the current record.
Not every provider supports all types of cursors.
CacheSize
The default cache size for Delphi and ADO for RecordSet is 1. This is 1 record. This works in combination with a cursor type. Cachesize tells RecordSet how many records to select and save at a time.
When you issue a command like Next (actually MoveNext in ADO) with a cache size of 1, the RecordSet has only the current record in memory, so when it retrieves this next record, it should again request it from the provider. If the cursor is not Static, this gives the provider the opportunity to retrieve the latest data before returning the next record. Thus, size 1 makes sense for Keyset or Dynamic, because you want the provider to receive updated data.
Obviously, with a value of 1, the connection between the provider and the RecordSet moves the cursor each time. Well, this is overhead that we don't need if the cursor type is static. Thus, increasing the size of the cache will reduce the number of round trips between RecordSet and the provider. It also increases memory requirements, but it should be faster.
Also note that with a cache size greater than 1 for Keyset cursors, if the required entry is in the cache, it will no longer request it from the provider, which means that you will not see the update.