S. D. F.
Шрифт:
* И для этого заводить специальный модуль.
– Не ворчи, сказано, это моя привычка.
– Строка 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);