S. D. F.
Шрифт:
390 Web.Navigate(Path+'~.htm');
400 PageControl1.ActivePageIndex := 2;
410 LHTML.Free;
420 end;
* Не маленький кусочек.
– Но очень важный кусочек, пожалуй, это сердце программы. Я его многократно переписывал, теперь стыдно показать ранние версии, а сейчас я горжусь написанным. Только, некомпетентные люди считают труд программиста скучным, безэмоциональным, нет эмоции, под внешним спокойствием, бушуют…
* Да ладно, расхвастался, к делу. В начале готовится заголовок HTML.
– Ну это просто:
procedure HTMLHead(LHTML : TStringList);
begin
LHTML.add('<html><head>');
LHTML.add('<meta http-equiv=<Content-Type< content=<text/html; charset=windows-1251<>');
LHTML.add('<style>');
LHTML.add('table {border:1px solid #c3c3c3; border-collapse:collapse;');
LHTML.add(' text-align: center; width:90%;}');
LHTML.add('table th {background-color:#e5eecc; border:1px solid #c3c3c3;');
LHTML.add('padding:3px; vertical-align:top; }');
LHTML.add('table td {border:1px solid #c3c3c3; padding:3px; vertical-align:top;');
LHTML.add('</style></head><body>');
end;
–
– В цикле стр 200 – 320 выдается результат предшествующего запроса. Остальное все просто.
* Опять, таки не вижу, чему тут гордится.
– Мартышка, к старости, слаба глазами, стала? У меня есть предложение, после того как мы закончим разговор, отложи этот файл в далекую папку, и через пол года, напиши такую же программу самостоятельно, пользуясь справочниками, интернетом, но не этим текстом. Вот тогда, посмотрим.
* Хорошо! Спорим, что я напишу лучше!
– Вполне возможно. Я буду только рад. Выиграет только вселенский разум.
* Ладно, успокоились, что у нас еще есть неясного.
* А, что такое MakeSQL – по смыслу делается строка запроса?
– Да, это очень простая функция, и возможно это надо еще упростить…
010 function MakeSQL:string;
020 var
030 i : integer;
040 begin
050 result := '';
060 with FMain.Memo1 do
070 for i := 0 to Lines.Count - 1 do
080 if trim(Lines[i]) <> '' then
090 begin
100 FMain.His.Lines.Add(Lines[i]);
110 result := result + Lines[i] + ' ';
120 end;
130 result := trim(result);
140 end;
– Все, что находится в Memo1 записывается в одну строку(стр. 110) и одновременно сохраняется в истории(стр. 100).
* Так значит мы можем теперь выполнять SQL запросы?
– И да, и нет.
* ??
– Выполнять запросы можем, но не всегда увидим результат. Ну, еще не все готово.
* Так давай! Беги, покупай, эти тр-ан-зис-то-ры!
– Не спеши. Выполним, те SQL, что запланированы.
– Но сначала еще одна мелочь. Сделай обработчик для кнопки Show DB это на самой первой закладке.
procedure TFMain.Button3Click(Sender: TObject);
begin // Show DB
ShowTables;
end;
???????
Первые запросы
–
Ну, что, давай попробуем.– Открой или сделай новую базу и выполни следующий запрос:
CREATE TABLE Salespeople
( snum integer,
sname char (10),
city char (10),
comm decimal );
* Говорит что все OK.
– Перейди на первую закладку и нажми кнопку Show DB.
* Ура!! Заработало!!
– Рано кричать, закрой программу, включи опять и открой твою базу.
* Есть, таблица сразу отобразилась.
* Есть вопросик, для чего у нас на форме 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;
* А зачем? И так все хорошо работало.
– Хорошо, да не очень. Если при сохранении указывается только имя файла, операционная система записывает его в текущую папку, если это папка, откуда программа запускалась, то все нормально, но если со времени запуска программы пользователь заходил в другие папки (текущая папка сменилась), то потом, найти созданный файл, большая проблема. И совсем другое дело, когда мы даем команду записать файл в конкретную папку.