- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
S. D. F. - W Cat
Шрифт:
Интервал:
Закладка:
- Рано кричать, закрой программу, включи опять и открой твою базу.
* Есть, таблица сразу отобразилась.
* Есть вопросик, для чего у нас на форме CheckListBox1 и закладка Result.
- Ну, с итоговой закладкой погоди, а вот по первому пункту поболтаем.
- А пока потренируйся, введи еще пару таблиц, пока это без разницы, ну что-то типа «Коты Герои»(кличка, возраст, степень героизма, аппетит и т.д.) и т.д.
* А как?
- Начинай читать книги по SQL. Я предлагал только играться, (и сделать инструмент для игры) а правила игры вспоминай сам.
- А мне, пора возвращаться к своим, ко… нет к баранам.
Продолжаем клепать ББД
- Итак закладка Structure DB показывает имеющиеся в сей базе таблицы.
- Но, интересно узнать из каких полей состоит таблица.
- Именно эту информацию будет показывать CheckListBox1
* Но, кроме имен полей, хочется знать их типы, размеры и прочее.
- В числе прочей, эта информация появится на накладке Result, но как сказал классик «в очередь, с*ны дети, в очередь».
- Так, мне этот бардак надоел, делаем так, как я привык. Во-первых вставляем новый модуль:
unit gv; // Глобальные переменные
interface
var
Path : string; // Путь к исполняемой программе
implementation
end.
* Да, знатный модуль.
- Смейся, смейся. При помощи этого модуля, я привык такой фокус делать, закачаешься, но сейчас это не к месту.
- Второе: делаем обработчик создания формы:
10 procedure TFMain.FormCreate(Sender: TObject);
20 begin
30 Path := ExtractFileDir(ParamStr(0)) + '';
40 OpenDialog1.InitialDir := Path;
50 PageControl1.ActivePage := TabSheet1;
60 end;
- Строка 30 – инициализация пути к запускаемой программе.
* А для чего?
- Ну для начала изменим procedure TFMain.NewDB1Click:
150 IBDatabase1.DatabaseName:= Path + fn;
* А зачем? И так все хорошо работало.
- Хорошо, да не очень. Если при сохранении указывается только имя файла, операционная система записывает его в текущую папку, если это папка, откуда программа запускалась, то все нормально, но если со времени запуска программы пользователь заходил в другие папки (текущая папка сменилась), то потом, найти созданный файл, большая проблема. И совсем другое дело, когда мы даем команду записать файл в конкретную папку.
* И для этого заводить специальный модуль.
- Не ворчи, сказано, это моя привычка.
- Строка 40 Инициализация текущей папки для диалога открытия файла.
- По умолчанию диалог откроется с Моих Документов, что часто очень не удобно…
- Строка 50 Делаем активной первую закладку нашей программы, независимо от того, на которой мы остались при запуске компиляции.
* Ух, что-то я за… работался.
- Ладно, давай прервемся.
«Продолжение следует»
А вот и продолжение
- Ну, с новыми силами…
- Для ListBox1 делаем обработчик двойного клика. Т.е. по этому событию должно отобразится содержимое соответствующей таблицы.
procedure TFMain.ListBox1DblClick(Sender: TObject);
var
kod : integer;
begin
ShowFields;
end;
010 procedure ShowFields;
020 var
030 n : integer;
040 begin
050 CLBox1.Clear;
060 with DataModule2.IBSQL1 do
070 begin
080 Close;
090 SQL.Clear;
100 SQL.Add('select R.RDB$FIELD_NAME from RDB$FIELDS F, RDB$RELATION_FIELDS R '+
110 'where F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE and R.RDB$SYSTEM_FLAG = 0 '+
120 'and RDB$RELATION_NAME = ''' + LBox1.Items[ LBox1.ItemIndex]+''' '+
130 'order by R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION');
140 ExecQuery;
150 while not EOF do
160 begin
170 n := CLBox1.Items.Add( trim(Fields[0].AsString));
180 CLBox1.Checked[n] := true;
190 Next;
200 end;
210 Close;
220 end; // with DataModule2
230 end;
* Душераздирающее зрелище — вот как это называется!
- Ничего, потренируешься с SQL и будешь его щелкать…
- Как видишь служебная (внутренняя) база содержит несколько таблиц:
RDB$RELATIONS
RDB$FIELDS
RDB$RELATION_FIELDS
и т.д.
- Надо всего лишь взять буквы латинского языка и доллар(как без него) расставить их в нужном порядке, отсечь все лишнее и все готово.
- В строках 100-130 формируется запрос, в стр. 140 он выполняется, а затем цикл в строках 150-200 сохраняет имена полей таблицы в пунктах CheckListBox1, по команде стр. 190 переход на следующую запись… вот вкратце.
* Да, объяснения ты печешь как горячие пирожки.
- Подумаешь, пироги! Я еще вышивать умею и на машинке шить. А ты думал, что мы только мясо умеем воровать из кастрюль и на крышах кричать.
* Вызывает интерес, и еще такой разрез. Где ты взял эту информацию?
- Пилите, Шура хелпы, пилите, они золотые.
* А почему мы используем CheckListBox зачем нам эти галочки.
- Вот тут мы подходим к следующей задаче. У нас на файсе есть еще кнопка “Show Data”.
- Подробности о содержимое таблицы будем показывать в зависимости от установленных галочек в этом самом CheckListBox.
- Но, давай по очереди.
Show Structure
- Когда я планировал ББД, и дошел до этого пункта, перебрал несколько вариантов: можно выдавать результат в отдельный файл, можно в Memo, можно StringGrid или подобное, но это все не то. Т.е. хочется, чтобы была видна табличная форма таблицы ( возгласы с мест «* Невнятная тавтология»). А потом сообразил – Браузер, конечно же Браузер. Именно HTML дает широкие и гибкие возможности отображения информации.
- Итак на закладке Result ставим компонент Web типа TwebBrowser.
- А для кнопки “Show Structure” обработчик нажатия.
010 procedure TFMain.Button3Click(Sender: TObject);
020 var
030 i : integer;
040 LHTML : TStringList;
050 begin // кнопка Show Structure
060 if ListBox1.Items.Count = 0 then exit;
070 LHTML := TStringList.Create;
080 HTMLHead(LHTML);
090 with ListBox1 do
100 for i := 0 to Items.Count - 1 do
110 PrintFields(Items[i], LHTML);
120 LHTML.SaveToFile(Path+’~.htm’);
130 Web.Navigate(Path+’~.htm’);
140 PageControl1.ActivePage := TabSheet2;
150 LHTML.Free;
160 end;
- Стр. 70 создаем листочек HTML
- Стр. 80 записываем заголовочную часть HTML
- 100-110 циклически заносим в HTML нужную информацию
- Стр. 120 Вот тут можно было пойти разными путями, я пошел простейшим сохраняю HTML файл в рабочей папке.
- Стр. 130 Отображаю готовый файл в навигаторе.
* Хорошо, копаем глубже…
- Пожалуйста:
010 procedure PrintFields(table:string; LHTML : TStringList);
020 var
030 S : string;
040 begin
050 LHTML.Add('<h2>'+table+'</h2>');
060 with DataM.IBSQL1 do
070 begin
080 Close;
090 SQL.Clear;
100 SQL.Add('select R.RDB$FIELD_POSITION, R.RDB$FIELD_NAME, '+
110 'F.RDB$FIELD_LENGTH, F.RDB$FIELD_TYPE '+
120 'from RDB$FIELDS F, RDB$RELATION_FIELDS R '+
130 'where F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE and R.RDB$SYSTEM_FLAG = 0 '+
140 'and RDB$RELATION_NAME = ''' + table +''' '+
150 'order by R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION');
160 ExecQuery;
170 LHTML.Add('<center><table><tr>');
180 LHTML.Add('<th>Position</th>');
190 LHTML.Add('<th>Name</th>');
200 LHTML.Add('<th>Length</th>');
210 LHTML.Add('<th>Type</th>');
220 LHTML.Add('</tr>');
230 while not EOF do
240 begin
250 S := '<tr><td>' +Fields[0].AsString + '</td>'+
260 '<td>'+ trim(Fields[1].AsString)+'</td>'+
270 '<td>'+ trim(Fields[2].AsString) +'</td>'+
280 '<td>'+ FieadType(Fields[3].AsInteger)+'</td></tr>';
290 LHTML.Add(s);
300 Next;
310 end;
320 LHTML.Add('</table></center>');
330 end;
340 end;
* А я стал привыкать к этим крокозябрам.
- Тем более, что текст во многом повторяется.
- Как видишь, на экран выдается название таблицы, а затем таблица с описанием полей.
* Погоди! А что это в 280 строке?
- О, кота то я, и не заметил.
function FieadType(n:integer):string;
begin
case n of
7 : result := 'smallint';
8 : result := 'integer';
9 : result := 'quad';
10 : result := 'float';
11 : result := 'd_float';
12 : result := 'date';
13 : result := 'time';
14 : result := 'char';
27 : result := 'double';
35 : result := 'date';
37 : result := 'varchar';
261 : result := 'blob';
else result := IntToStr(n)+' ?';
end; // case
end;
В результате отобразится, нечто такое:
- * -
- Ну, и чего так долго, конечно, пива много не бывает, но…
* В общем-то, получилось, но никак не могу скопировать получившееся.
- Да, есть такая задача. Вставь в самом конце (перед end.) в файле Unit1:
initialization
OleInitialize(nil);
finalization
OleUninitialize;
А в самом начале этого файла вставь ActiveX в разделе uses.
* Так, просто! Да что же это такое. Просто хочется рвать и метать!!
- Это Windows.
* Ну, что теперь отображаем данные?
- Нет, не к спеху, да и отображать еще нечего, давай отдохни, а я подготовлюсь к последнему рывку.
«Продолжение следует»
Последний? Рывок к ББД
- Предлагаю вернуться к выполнению SQL запроса.
- Бывают запросы SELECT и все остальные. Результат выполнения SELECT – будем выдавать в закладку result, а остальные просто выполнять.
- Переделываем Button1Click:
010 procedure TFMain.Button1Click(Sender: TObject);
020 begin // кнопка run SQL
030 RunSQL(MakeSQL); // выполение команды SQL
040 end;
- Пойдем дальше.
- Теперь можно заняться кнопочкой «Show Data»
010 procedure TFMain.Button5Click(Sender: TObject);
020 var
030 i : integer;
040 S : string;
050 begin // Show Data
060 with CheckListBox1 do
070 begin // составляем список полей
080 if Items.Count = 0 then exit; // если список пуст - уходим

