![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Появился вопрос.
Как модифицировать ниже представленную программу так, чтобы в компоненте TabSet1 были не все закладки, а только те, первые буквы фамилий которых находятся в таблице anketa3? На форме компоненты TQuery, TDataSource, TDBGrid и TTabSet. Код:
procedure TForm1.FormCreate(Sender: TObject); var i : Byte; begin Query1.Prepare; for i:=0 to 25 do TabSet1.Tabs.Add(Chr(Byte('A')+i)); end; select * from anketa3 where LastName like :LastNameStr Запрос выбирает записи из таблицы anketa3, в которых поле LastName похоже (like) на значение параметра :LastNameStr. Параметр будет передаваться в момент переключения закладок: Код:
procedure TForm1.TabSet1Change(Sender: TObject; NewTab: Integer; var AllowChange: Boolean); begin with Query1 do begin Close; Params[0].AsString:= '"'+TabSet1.Tabs.Strings[NewTab]+'%"'; Open; end; end; И еще маленький вопросик. Как будут выглядеть на DuilderC++ следующие строки? i : Byte; TabSet1.Tabs.Add(Chr(Byte('A')+i)); Params[0].AsString:= '"'+TabSet1.Tabs.Strings[NewTab]+'%"'; Последний раз редактировалось Admin, 12.07.2008 в 20:24. |
#2
|
|||
|
|||
![]() Довольно забавная логика проекта: если кликнуть на любую закладку, то TabSet должен перестроиться.
Неожиданный финт для пользователя, который ожидает что-то совсем другое. Хм, не проще ли при инициализации сделать столько закладок сколько надо (т.е. столько сколько разных букв в фамилиях в базе), а при добавлении фамилий с первой буквой которой нет в базе добавлять и закладку. А я бы сделал закладки на все буквы, а доступными только те, на которые в базе есть фамилии. При добавлении фамилий с новыми буквами разлочивать закладку с этой буквой. Менее стрессовая ситуация для пользователя. Пользователя надо любить (даже если это ты сам). Не забывайте делать резервные копии Последний раз редактировалось san-46, 13.07.2008 в 02:31. |
#3
|
|||
|
|||
![]() Не, ты не прав.
Закладки перестраиваться не будут. Они создаются при создании формы, а при клике на закладку просто выбираются записи с фамилией на букву, которая приписана закладке. По существу. Надо сделать запрос в БД, который вернет тебе все множество первых букв фамилий. Что-то типа Код:
SELECT destinct SubStr(LastName,1) from anketa3 where NOT (LastName IS NULL) Последнее условие типа уберет пустую закладку, ежели встретится запись с незаполненой фамилией. По поводу кода на с++, точно не помню, но будет что-то типа Код:
int i; TabSet1->Tabs->Add((char)("A"+i)); Params[0]->AsString = "'" + TabSet1->Tabs->Strings[NewTab] + "%'"; |
#4
|
|||
|
|||
![]() Да, признаю, перестраиваться не будет (в коде TabSet1Change - ничего похожего для этого нет).
Испытал такой код: Код:
for i:=0 to 31 do begin //работа с русскими именами (не было базы с англ.) C := Chr(Byte('А')+i); //"С" - Char; "А" - русская IBQuery1.SQL.Text := 'select * from anketa3 where LastName starting with '''+C+''''; IBQuery1.Open; if not IBQuery1.Eof then TabSet1.Tabs.Add(C); IBQuery1.Close; end; Определяется есть ли имена на каждую букву алфавита. Если есть, то закладка добавляется. Т.к. букв не много, то выполняется быстро, несмотря на многочисленные операции открытия и закрытия DataSet. Не забывайте делать резервные копии Последний раз редактировалось san-46, 14.07.2008 в 09:09. |
#5
|
|||
|
|||
![]() Да не, список букв получается одним запросом.
Я же написао пример, только надо посмотреть как в диалекте нужной БД выглядит команда получения первого символа строки. Ну и distinct пишется вот так (сорри, писал ночью, ошибся ![]() |