Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.07.2008, 20:21
derbote derbote вне форума
Прохожий
 
Регистрация: 07.07.2008
Сообщения: 8
Репутация: 5
По умолчанию Как модифицировать ниже представленную программу

Появился вопрос.
Как модифицировать ниже представленную программу так, чтобы в компоненте TabSet1 были не все закладки, а только те, первые буквы фамилий которых находятся в таблице anketa3?

На форме компоненты TQuery, TDataSource, TDBGrid и TTabSet.
Код:
1
2
3
4
5
6
7
8
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;
Текст SQL запроса в компоненте Query1:
select * from anketa3 where LastName like :LastNameStr

Запрос выбирает записи из таблицы anketa3, в которых поле LastName похоже (like) на значение параметра :LastNameStr. Параметр будет передаваться в момент переключения закладок:
Код:
1
2
3
4
5
6
7
8
9
10
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;
Admin: Пользуемся тегами! При рецедиве - БАН.

И еще маленький вопросик.
Как будут выглядеть на DuilderC++ следующие строки?
i : Byte;
TabSet1.Tabs.Add(Chr(Byte('A')+i));
Params[0].AsString:= '"'+TabSet1.Tabs.Strings[NewTab]+'%"';

Последний раз редактировалось Admin, 12.07.2008 в 20:24.
Ответить с цитированием
  #2  
Старый 13.07.2008, 01:31
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Довольно забавная логика проекта: если кликнуть на любую закладку, то TabSet должен перестроиться.
Неожиданный финт для пользователя, который ожидает что-то совсем другое.
Хм, не проще ли при инициализации сделать столько закладок сколько надо (т.е. столько сколько разных букв в фамилиях в базе), а при добавлении фамилий с первой буквой которой нет в базе добавлять и закладку.
А я бы сделал закладки на все буквы, а доступными только те, на которые в базе есть фамилии.
При добавлении фамилий с новыми буквами разлочивать закладку с этой буквой.
Менее стрессовая ситуация для пользователя. Пользователя надо любить (даже если это ты сам).
__________________
Не забывайте делать резервные копии

Последний раз редактировалось san-46, 13.07.2008 в 02:31.
Ответить с цитированием
  #3  
Старый 14.07.2008, 02:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,094
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не, ты не прав.
Закладки перестраиваться не будут. Они создаются при создании формы, а при клике на закладку просто выбираются записи с фамилией на букву, которая приписана закладке.

По существу.
Надо сделать запрос в БД, который вернет тебе все множество первых букв фамилий.
Что-то типа
Код:
1
SELECT destinct SubStr(LastName,1) from anketa3 where NOT (LastName IS NULL)

Последнее условие типа уберет пустую закладку, ежели встретится запись с незаполненой фамилией.

По поводу кода на с++, точно не помню, но будет что-то типа
Код:
1
2
3
int i;
TabSet1->Tabs->Add((char)("A"+i));
Params[0]->AsString = "'" + TabSet1->Tabs->Strings[NewTab] + "%'";
Ответить с цитированием
  #4  
Старый 14.07.2008, 09:06
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Да, признаю, перестраиваться не будет (в коде TabSet1Change - ничего похожего для этого нет).

Испытал такой код:
Код:
1
2
3
4
5
6
7
8
9
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  
Старый 14.07.2008, 13:28
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,094
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да не, список букв получается одним запросом.
Я же написао пример, только надо посмотреть как в диалекте нужной БД выглядит команда получения первого символа строки. Ну и distinct пишется вот так (сорри, писал ночью, ошибся
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:07.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025