Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 88
1

bd и нажатие кнопки. Как выбирать разные файлы БД для подключения?

05.05.2013, 08:47. Показов 3342. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите как правильно написать процедуру нажатия кнопки для открытия бд каждый раз новых
Delphi
1
2
3
4
5
6
7
8
9
10
var ADO_Access : TADOConnection;
begin
     ADO_Access.ConnectionString :=
          'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;'+
          'Data Source= <ПОЛНОЕ_ИМЯ _ФАЙЛА> ;'+
          'Mode=Read|Write;'+
          'Persist Security Info=False;'+
          'Jet OLEDB:Database Password="<ПАРОЛЬ>"';
    ADO_Access.Open;
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2013, 08:47
Ответы с готовыми решениями:

Есть два разных подключения к интернету. Как их выбирать?
Есть два разных подключения к интернету. Как их выбирать? Например, я получаю почту. Как узнать,...

Как можно сохранить картинки в ресурсах, а потом выбирать их нажатием соответствующей кнопки
А не подскажите, как можно сохранить картинки в ресурсах, а потом выбирать их нажатием...

Как при нажатии одной кнопки сделать "нажатие" другой кнопки?
Как скажем при нажатии одной кнопки сделать &quot;нажатие&quot; другой кнопки? Именно чтобы была анимация...

Эмулировать нажатие кнопки мыши или нажатие клавиши на Web - странице
Здравствуйте. Как на эмулировать переходы по страницам на сайте, открытом в Интернет эксплорере!....

15
1075 / 988 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
05.05.2013, 09:59 2
Меняя каждый раз текст для ConnectionString.
Можно заменять только "ПОЛНОЕ_ИМЯ_ФАЙЛА" (хотя полное совсем не обязательно, если файл базы находится в папке с приложением).

Но в коде что-то не видно никаких признаков кнопки, а объект ADO_Access, на который есть ссылка в переменной, должен быть создан. А лучше его разместить на форме, тогда он будет создаваться и уничтожаться автоматически.

Не по теме:

Зачем иметь много похожих баз данных? Может быть проще, если они объединены логически, иметь одну базу с разными таблицами внутри.

0
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 88
05.05.2013, 21:32  [ТС] 3
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button1Click(Sender: TObject);
begin
 
Table1.Active:=False;
OpenDialog1.Execute;
Table1.TableName:=OpenDialog1.FileName;
datasource1.DataSet:=table1;
DBGrid1.DataSource:=DataSource1;
table1.Active:=True;
 
 // module.TabQuery.Delete;
 
end;
и ошибка
мне нужно программный комплекс разработать-лучше бы он открывал разные БД, хотя бы с одним и тем же типом первого столбца
как-то вообще сделать это можно или не получится ничего?

подскажите кто может пожалуйста -я нигде инфрмации не найду, везде статьи с уже открытыми БД в программе
Миниатюры
bd и нажатие кнопки. Как выбирать разные файлы БД для подключения?  
0
1075 / 988 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
05.05.2013, 22:26 4
Уважаемый, судя по приведенному коду у вас сместились понятия. "БД" и "Таблицы БД" - это очень и очень разные вещи.
То что вы пытаетесь открыть и использовать называется "Таблицы базы данных". А БД - это некий сборник таких таблиц.
Здесь вы не получите нужных сведений для простой работы с БД. Учите, что называется, матчасть.Т.е. что такое базы данных и из чего они состоят.
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
05.05.2013, 23:20 5
Цитата Сообщение от neitron Посмотреть сообщение
Подскажите как правильно написать процедуру нажатия кнопки для открытия бд каждый раз новых
Т. е., чтобы можно было выбрать файл и подключиться к нему, как к базе данных. Можно сделать так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//Открыть соединение с базой данных.
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  Sl : TStringList;
  Od : TOpenDialog;
begin
  Od := OpenDialog1; //OpenDialog1 уже должен быть на форме.
  if Od.InitialDir = '' then
    Od.InitialDir := ExtractFilePath( ParamStr(0) );
  if not Od.Execute then Exit;
  if not FileExists(Od.FileName) then begin
    MessageBox(0, 'Файл с заданным именем не найден. Действие отменено.'
      ,'Файл не найден', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
 
  ADOConnection1.Close;
 
  //Настройка пути к файлу базы данных.
 
  //Получаем параметры подключения из ADOConnection1.ConnectionString в виде списка.
  Sl := TStringList.Create;
  //Перед присвоением значения свойству Text, заменяем знаки ';' на пары знаков #13#10.
  Sl.Text := StringReplace(ADOConnection1.ConnectionString, ';', #13#10, [rfReplaceAll]);
  //Проверяем, присутствует ли параметр "Data Source".
  i := Sl.IndexOfName('Data Source');
  {Параметр "Data Source" должен иметь значение, равное полному пути к файлу
  базы данных. Если параметр "Data Source" уже присутствует, то устанавливаем
  его значение. Если такого параметра нет, то добавляем этот параметр вместе
  со значением.}
  if i > -1 then
    Sl.Values['Data Source'] := '"' + Od.FileName + '"'
  else
    Sl.Add('Data Source="' + Od.FileName + '"');
  //Перед присвоением значения свойству ConnectionString, заменяем пары знаков #13#10
  //на знак ';'.
  ADOConnection1.ConnectionString := StringReplace(Trim(Sl.Text), #13#10, ';', [rfReplaceAll]);
  FreeAndNil(Sl);
 
  //Открываем базу данных.
  ADOConnection1.Open;
end;
Пример проекта с таким механизмом: Из Excel в DBGrid. Подключиться к рабочей книге MS Excel, как к базе данных.
В этой программе можно выбрать для подключения любой файл MS Excel.
1
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 88
06.05.2013, 07:11  [ТС] 6
вот у меня первый столбец тип дата у всех таблиц (и имя одно)

в остальных тип двойное с плавающей точкой и там я их начинаю изучать(анализировать)



а допустим я открыла таблицу, то могу ли написать код для редактирования, учитывая,что у меня то 2 столбца вместе с датой , то 4 , то 9 ?

это сделать как-то можно?

а то статей таких не нашла и исходниок тоже(
StringList -как там действоать будет? нет ли оабочего исходника?

Добавлено через 5 минут
да и вот вопрос-редактирвоание возможно и если да,то как правильно описать процедуру?
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
06.05.2013, 09:35 7
Цитата Сообщение от neitron Посмотреть сообщение
а допустим я открыла таблицу, то могу ли написать код для редактирования, учитывая,что у меня то 2 столбца вместе с датой , то 4 , то 9 ?
это сделать как-то можно?
Можно. Для этого надо открывать таблицы через запрос:
Delphi
1
ADOQuery1.SQL.Text := 'select * from ' + TableName;
Здесь TableName : String - имя таблицы, которую надо открыть.
В том проекте, на который я в предыдущем посте дал ссылку, есть такая возможность. Там пользователь может открыть любую БД на основе файла MS Excel. В этой БД пользователь выбирает любую таблицу, открывает её и может редактировать в ней данные. Для файлов MS Excel пользователь может изменять значения полей и добавлять новые записи. Удаление там не работает.
Для других баз, MS Access, например - то же самое. И там, в отличии от БД MS Excel, отсутствует ряд ограничений - например, доступно удаление записей.

Добавлено через 8 минут
Цитата Сообщение от neitron Посмотреть сообщение
да и вот вопрос-редактирвоание возможно и если да,то как правильно описать процедуру?
Делается так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
//1. Перейти на нужную запись.
...
//2. Перевести набор данных в режим редактирования.
ADOQuery1.Edit;
//3. Изменить значения полей.
ADOQuery1.Fields[0].AsString := 'новое значение_F0';
ADOQuery1.Fields[1].AsString := 'новое значение_F1';
...
//4. Отправить изменения в базу.
ADOQuery1.Post;
//5. Здесь или в другом месте сохранить изменения в базе.
ADOConnection1.CommitTrans;
1
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 88
06.05.2013, 19:08  [ТС] 8
а если я не знаю сколько полей нужно изменять? я могу кол-во записей,которые нужно поменять через кол-во полей Ttable прописать?

Добавлено через 5 минут
я просто пишу программу,а там надо позволять открывать таблицу access ,каждый раз новую с разным количеством полей.
у меня первое поле тип дата ,остальные то курс доллара,курс евро,дргой валюты-одна таблица,
то курс других показателей-лругая таблица
,цены -3ая таблица, и все они с разными датами

вот и пытаюсь информацию выжить

вот эти другие столбцы я позволяю пользователю Сombobox-ом выбирать и пользователь в новой AdoQuery видет таблицу образованую,посредством выбранного столбца-столбец дата и выбранный столбец и там ему показан график изменения ряда

Сейчас это провожу все с таблицей,у которой уже есть соединение, а эт онеудобно изучать одну только таблицу-лучше эе пользователю разные позволять выбирать
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
07.05.2013, 00:27 9
neitron, чтобы мне сориентироваться, напиши для ясности по пунктам, что сейчас требуется сделать. Например:
1. Выбор и подключение к произвольному файлу MS Access.
2. Выбор и открытие произвольной таблицы БД.
3. Показ только двух полей - "Дата" и поля с какой-либо характеристикой.

1 и 2 пункты реализованы сейчас или пока нет?
3 пункт можно реализовать так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Показать только 2 поля: поле "Дата" и поле, выбранное пользователем через ComboBox.
procedure TForm1.Button1Click(Sender: TObject);
var
  i, Ind : Integer;
begin
  //Получаем индекс поля из ComboBox. Предположим, этот индекс совпадает с индексом в наборе Fields:
  Ind := ComboBox1.ItemIndex;
  if Ind = -1 then Exit;
  if not AdoQuery1.Active then Exit;
 
  //ADOQuery1.Fields[0] - это поле "Дата".
  //Если выбран неверный индекс, то выходим.
  if (Ind < 1) or (Ind >= ADOQuery1.Fields.Count) then Exit;
  //Оставляем видимыми только 2 поля: ADOQuery1.Fields[0] и ADOQuery1.Fields[Ind].
  //Остальные поля прячем.
  for i := 1 to ADOQuery1.Fields.Count - 1 do
    if i <> Ind then
      ADOQuery1.Fields[i].Visible = False;
end;
1
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 88
07.05.2013, 09:32  [ТС] 10
вот вы писали
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//Открыть соединение с базой данных.
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  Sl : TStringList;
  Od : TOpenDialog;
begin
  Od := OpenDialog1; //OpenDialog1 уже должен быть на форме.
  if Od.InitialDir = '' then
    Od.InitialDir := ExtractFilePath( ParamStr(0) );
  if not Od.Execute then Exit;
  if not FileExists(Od.FileName) then begin
    MessageBox(0, 'Файл с заданным именем не найден. Действие отменено.'
      ,'Файл не найден', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
 
  ADOConnection1.Close;
 
  //Настройка пути к файлу базы данных.
 
  //Получаем параметры подключения из ADOConnection1.ConnectionString в виде списка.
  Sl := TStringList.Create;
  //Перед присвоением значения свойству Text, заменяем знаки ';' на пары знаков #13#10.
  Sl.Text := StringReplace(ADOConnection1.ConnectionString, ';', #13#10, [rfReplaceAll]);
  //Проверяем, присутствует ли параметр "Data Source".
  i := Sl.IndexOfName('Data Source');
  {Параметр "Data Source" должен иметь значение, равное полному пути к файлу
  базы данных. Если параметр "Data Source" уже присутствует, то устанавливаем
  его значение. Если такого параметра нет, то добавляем этот параметр вместе
  со значением.}
  if i > -1 then
    Sl.Values['Data Source'] := '"' + Od.FileName + '"'
  else
    Sl.Add('Data Source="' + Od.FileName + '"');
  //Перед присвоением значения свойству ConnectionString, заменяем пары знаков #13#10
  //на знак ';'.
  ADOConnection1.ConnectionString := StringReplace(Trim(Sl.Text), #13#10, ';', [rfReplaceAll]);
  FreeAndNil(Sl);
 
  //Открываем базу данных.
  ADOConnection1.Open;
end;
это я понимаю так пункт 1-ый выгялдит

Добавлено через 2 минуты
у меня сейчас выбор поля через combobox вот так выглядит

TabQuery-исходная "таблица" AdoQuery

FindQuery- туда я данные заношу, дату и выбранное поле

лист1 -это таблица в Access

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
procedure TForm1.FormShow(Sender: TObject);
var
  i: integer;
begin
  with Module.TabQuery do
  begin
    DisableControls;
    ComboBox1.Items.BeginUpdate;
    First;
 
    for i:=0 to Module.TabQuery.FieldCount-1 do
    ComboBox1.Items.Add(Module.TabQuery.FieldDefList[i].Name);
 
    ComboBox1.Items.EndUpdate;
    EnableControls;
  end;
end;
 
procedure TForm1.ComboBox1Change(Sender: TObject);
var
  S: string;
  i: integer;
begin
  S:='%%';
  module.FindQuery.Close;
 
  for i:=0 to Module.TabQuery.FieldCount-1 do
  begin
    if module.FindQuery.Fields[i].DisplayName=ComboBox1.Text then
    module.FindQuery.Fields[i].Visible:=true
    else
    module.FindQuery.Fields[i].Visible:=false;
  end;
  module.FindQuery.FieldByName('дата').Visible:=true;
 
  form6.Series1.YValues.ValueSource:=ComboBox1.Text;
  form6.DBChart1.Title.Text[0]:=ComboBox1.Text;
 
  module.FindQuery.SQL.Clear;
 
  //showmessage(format('SELECT * FROM лист1 WHERE %s LIKE "%s" ORDER BY %s', [ComboBox1.Text, S, ComboBox1.Text]));
  module.FindQuery.SQL.Text:=format('SELECT * FROM Ћист1 WHERE [%s] LIKE "%s" ORDER BY [%s]', [ComboBox1.Text, S, ComboBox1.Text]);
  module.FindQuery.Open;
  Form6.ShowModal;
end;
0
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 88
07.05.2013, 15:08  [ТС] 11
как эту ошибку устранить?
Миниатюры
bd и нажатие кнопки. Как выбирать разные файлы БД для подключения?  
0
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 88
07.05.2013, 16:42  [ТС] 12
извините это я про поиск столбцов писала,

как Сombobox ом правильно выбрать столбец в этом случае? и вот выбрали тсолбец и вместе со столбцов дата перевести таблицу в новую Adoquery

Добавлено через 30 минут
вот хочу выбрать столбцец , но в combobox пусто

form2.adoQuery2-это в другую "таблицу" хочу перенести данные

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TForm1.ComboBox1Change(Sender: TObject);
var
  S: string;
  i: integer;
begin
  S:='%%';
 form2.adoQuery2.Close;
 
  for i:=0 to form1.adoQuery1.FieldCount-1 do
  begin
    if form2.adoQuery2.Fields[i].DisplayName=ComboBox1.Text then
   form2.adoQuery2.Fields[i].Visible:=true
    else
    form2.adoQuery2.Fields[i].Visible:=false;
  end;
  form2.adoQuery2.FieldByName('дата').Visible:=true;
 
 // form6.Series1.YValues.ValueSource:=ComboBox1.Text;
  //form6.DBChart1.Title.Text[0]:=ComboBox1.Text;
 
 form2.adoQuery2.SQL.Clear;
  // ADOQuery1.SQL.Text := 'select * from [' + gTableName + ']'
  //showmessage(format('SELECT * FROM лист1 WHERE %s LIKE "%s" ORDER BY %s', [ComboBox1.Text, S, ComboBox1.Text]));
  form2.adoQuery2.SQL.Text:=format('SELECT * FROM ['+gTableName+'] WHERE [%s] LIKE "%s" ORDER BY [%s]', [ComboBox1.Text, S, ComboBox1.Text]);
  form2.adoQuery2.Open;
  Form2.ShowModal;
end;
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
08.05.2013, 09:04 13
neitron, а зачем переписывать в другую таблицу? Я не знаю подробностей задачи, но как я понял, у тебя есть набор таблиц со сведениями об изменениях курсов валют, например? И нужно построить графики этих курсов? При этом пользователь сам выбирает поле валюты в таблице. Тогда достаточно открыть очередную таблицу и когда пользователь выберет столбец, построить по этому столбцу и по столбцу с датой график. Можно также показать эту же таблицу с помощью ещё одного DBGrid, в котором скрыть все столбцы, кроме столбца с датой и с курсом валюты. Т. е., в этом случае создавать ещё одну таблицу БД и переписывать туда данные не надо. Достаточно к одной и той же таблице (к одному и тому же TADOQuery) подключить два компонента типа TDBGrid. - В первом DBGrid будут показываться все столбцы, а во втором - только столбец с датой и тот столбец, который выбрал пользователь.
Возможно в задаче есть ещё какие-то особенности?
0
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 88
08.05.2013, 12:11  [ТС] 14
мне надо из этой второй таблицы эксортировать данные в excel файл,а далее анализ проводить-второй столбец изучаю как массив в программе
0
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 88
09.05.2013, 14:44  [ТС] 15
извините, а можете код написать как это выглядеть может и с combobox проблема-не ваш кол ни мой не работают
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
12.05.2013, 05:30 16
Вот пример - как я представляю обсуждаемую тему. Здесь сделано следующее - открытие файлов MS Access и Excel, выбор таблиц, выбор полей (с помощью TComboBox) и добавление их в результирующий DBGrid (DBGrid2), передача данных в MS Excel. В папке с проектом лежат 2 файла - БД Acess и Excel. В них содержимое не соответствует нашей задаче, но вполне подходит для демонстрации. Но лучше, всё-же, вместо них использовать файлы из своего проекта.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, Grids, DBGrids, ADODB, StdCtrls;
 
type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    OpenDialog1: TOpenDialog;
    Memo1: TMemo;
    ListBox1: TListBox;
    ComboBox1: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ADOQuery2: TADOQuery;
    Button4: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure ComboBox1Select(Sender: TObject);
    procedure ADOConnection1AfterConnect(Sender: TObject);
    procedure ADOConnection1AfterDisconnect(Sender: TObject);
    procedure ADOQuery1AfterOpen(DataSet: TDataSet);
    procedure ADOQuery1AfterClose(DataSet: TDataSet);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
uses
  ComObj;
 
var
  gFileName : String = '';  //Имя открытой базы данных (полный путь к файлу БД).
  gTableName : String = ''; //Имя открытой таблицы.
 
{Функция для экспорта таблицы aDSet на лист рабочей книги MS Excel в позицию
левого верхнего угла диапазона aRng.
Функция возвращает ссылку на диапазон таблицы MS Excel.}
function TableToExcel(aDSet : TDataSet; const aRng : Variant) : Variant;
var
  vArr, exRng, exSh : Variant;
  i, Row, Col : Integer;
  Bm : TBookmarkStr;
begin
  Result := Unassigned;
  if not aDSet.Active or (TVarData(aRng).VDispatch = nil) then Exit;
 
  aDSet.DisableControls;
  try
    //Установка закладки на текущую позицию в таблице.
    Bm := aDSet.Bookmark;
 
    //Подсчитываем количество видимых столбцов.
    Col := 0;
    for i := 0 to aDSet.Fields.Count - 1 do
      if aDSet.Fields[i].Visible then
        Inc(Col);
    {Создаём вариантный массив, в который мы запишем данные таблицы.
    aDSet.RecordCount + 1 - так мы учитываем шапку таблицы.}
    vArr := VarArrayCreate([1, aDSet.RecordCount + 1, 1, Col], varOleStr);
 
    //Записываем в массив шапку таблицы.
    Col := 0;
    Row := 1;
    for i := 0 to aDSet.Fields.Count - 1 do
      if aDSet.Fields[i].Visible then begin
        Inc(Col);
        vArr[Row, Col] := aDSet.Fields[i].DisplayName;
      end;
 
    //Записываем в массив данные таблицы.
    aDSet.First;
    while not aDSet.Eof do begin
      Inc(Row);
      //Запись данных в элементы очередной строки массива.
      Col := 0;
      for i := 0 to aDSet.Fields.Count - 1 do
        if aDSet.Fields[i].Visible then begin
          Inc(Col);
          vArr[Row, Col] := aDSet.Fields[i].AsString;
        end;
      aDSet.Next; //Переход к следующей записи в наборе.
    end;
    aDSet.Bookmark := Bm; //Переходим к установленной ранее закладке.
  finally
    aDSet.EnableControls;
  end;
 
  {Определяем диапазон на листе MS Excel, в который будут записаны данные
  вариантного массива.}
  exSh := aRng.Parent; //Ссылка на лист MS Excel.
  Row := VarArrayHighBound(vArr, 1); //Количество строк в массиве.
  Col := VarArrayHighBound(vArr, 2); //Количество столбцов в массиве.
  exRng := exSh.Range[ aRng.Cells[1, 1], aRng.Cells[1, 1].Offset[Row - 1, Col - 1] ];
  //Записываем данные вариантного массива в диапазон MS Excel.
  exRng.Value := vArr;
 
  //Возвращаем ссылку на диапазон, в который записана таблица.
  Result := exRng;
end;
 
//После создания формы.
procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.ReadOnly := True; //Запрет на редактирование в Memo1.
end;
 
//Перед закрытием формы.
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ADOConnection1.Close;
end;
 
//Открыть соединение с базой данных.
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  Ext : String;
  Sl : TStringList;
  Od : TOpenDialog;
begin
  Od := OpenDialog1; //OpenDialog1 уже должен быть на форме.
  if Od.InitialDir = '' then
    Od.InitialDir := ExtractFilePath( ParamStr(0) );
  if not Od.Execute then Exit;
  if not FileExists(Od.FileName) then begin
    MessageBox(0, 'Файл с заданным именем не найден. Действие отменено.'
      ,'Файл не найден', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
 
  ADOConnection1.Close;
 
  //Настройка пути к файлу базы данных.
 
  //Получаем параметры подключения из ADOConnection1.ConnectionString в виде списка.
  Sl := TStringList.Create;
  //Перед присвоением значения свойству Text, заменяем знаки ';' на пары знаков #13#10.
  Sl.Text := StringReplace(ADOConnection1.ConnectionString, ';', #13#10, [rfReplaceAll]);
  //Проверяем, присутствует ли параметр "Data Source".
  i := Sl.IndexOfName('Data Source');
  {Параметр "Data Source" должен иметь значение, равное полному пути к файлу
  базы данных. Если параметр "Data Source" уже присутствует, то устанавливаем
  его значение. Если такого параметра нет, то добавляем этот параметр вместе
  со значением.}
  if i > -1 then
    Sl.Values['Data Source'] := '"' + Od.FileName + '"'
  else
    Sl.Add('Data Source="' + Od.FileName + '"');
 
  //Если открывается файл MS Excel, то следует добавить дополнительный параметр.
  Ext := AnsiUpperCase(ExtractFileExt(Od.FileName));
  if (Ext = '.XLS') or (Ext = '.XLSX') then begin
    i := Sl.IndexOfName('Extended Properties');
    if i > -1 then
      Sl.Values['Extended Properties'] := 'Excel 8.0'
    else
      Sl.Add('Extended Properties=Excel 8.0');
  end else begin
    //Если это не файл MS Excel, то следует убрать дополнительный параметр.
    i := Sl.IndexOfName('Extended Properties');
    if i > -1 then Sl.Delete(i);
  end;
 
  //Перед присвоением значения свойству ConnectionString, заменяем пары знаков #13#10
  //на знак ';'.
  ADOConnection1.ConnectionString := StringReplace(Trim(Sl.Text), #13#10, ';', [rfReplaceAll]);
  FreeAndNil(Sl);
 
  gFileName := Od.FileName;
  //Открываем базу данных.
  ADOConnection1.Open;
  //Получаем список таблиц базы и записываем этот список в ListBox1.
  ADOConnection1.GetTableNames(ListBox1.Items);
end;
 
//Закрыть соединение с базой данных.
procedure TForm1.Button2Click(Sender: TObject);
begin
  ADOConnection1.Close;
end;
 
//Показать содержимое таблицы.
procedure TForm1.Button3Click(Sender: TObject);
var
  i : Integer;
  Ext : String;
begin
  if stClosed in ADOConnection1.State then begin
    MessageBox(0, 'Соединение с БД закрыто. Действие отменено.'
      ,'Отмена', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
  if ADOConnection1.State <> [stOpen] then begin
    MessageBox(0, 'Обработка не завершена. Повторите команду позже.'
      ,'Отмена', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
  i := ListBox1.ItemIndex;
  if i = -1 then Exit;
 
  gTableName := ListBox1.Items[i];
  ADOQuery1.Close;
  Ext := AnsiUpperCase(ExtractFileExt(gFileName));
  if (Ext = '.XLS') or (Ext = '.XLSX') then
    ADOQuery1.SQL.Text := 'select * from [' + gTableName + ']'
  else
    ADOQuery1.SQL.Text := 'select * from ' + gTableName;
  ADOQuery1.Open;
 
  {Прячем все столбцы, кроме первого (его индекс = 0).
  И записываем в комбобокс перечень полей, кроме первого.}
  ComboBox1.Clear;
  for i := 0 + 1 to DBGrid2.Columns.Count - 1 do begin
    DBGrid2.Columns[i].Visible := False;
    ComboBox1.Items.Add(DBGrid2.Columns[i].FieldName);
  end;
end;
 
//Передать данные в MS Excel.
procedure TForm1.Button4Click(Sender: TObject);
const
  //Толщина линий.
  xlThin = 2;
  xlMedium = -4138;
  //Вид линии.
  xlContinuous = 1; //Непрерывная линия.
var
  exApp, exBook, exSh, exRng : Variant;
  i : Integer;
begin
  if not ADOQuery1.Active then Exit;
 
  //Попытка подключиться к корневому объекту MS Excel.
  try
    exApp := CreateOleObject('Excel.Application');
  except
    MessageBox(0, 'Не удалось запустить MS Excel. Действие отменено.',
      'Ошибка', MB_OK + MB_ICONERROR + MB_APPLMODAL);
    Exit;
  end;
  //Делаем видимым окно MS Excel. На время отладки или на постоянной основе.
  exApp.Visible := True;
  //Создаём рабочую книгу.
  exBook := exApp.WorkBooks.Add;
  //Получаем ссылку на первый лист рабочей книги.
  exSh := exBook.Worksheets[1];
 
  //Готовим набор данных.
  ADOQuery2.Close;
  ADOQuery2.SQL.Text := ADOQuery1.SQL.Text;
  ADOQuery2.Open;
  //В ADOQuery2 показываем поля в соответствие с DBGrid2.
  for i := 0 to DBGrid2.Columns.Count - 1 do
    ADOQuery2.Fields[i].Visible := DBGrid2.Columns[i].Visible;
 
  {Запись таблицы на лист MS Excel.
  exSh.Cells[4, 3] - левая верхняя ячейка на листе, начиная с которой мы
  желаем расположить таблицу.
  exRng - это диапазон на листе MS Excel, в который записана таблица.}
  try
    exRng := TableToExcel(ADOQuery2, exSh.Cells[4, 3]);
  finally
    ADOQuery2.Close;
  end;
 
  //Здесь выполняем оформление диапазона таблицы exRng - линовка, шрифты и пр.
  exRng.Rows[1].Font.Bold := True; //Для шапки - жирный шрифт.
  //Обрамление ячеек для всей таблицы.
  exRng.Borders.LineStyle := xlContinuous;
  exRng.Borders.Weight := xlThin;
  //Обрамление ячеек для шапки таблицы.
  exRng.Rows[1].Borders.Weight := xlMedium;
  //Подбор ширины столбцов по содержимому.
  exRng.Columns.AutoFit;
 
  //Заголовок таблицы (название таблицы).
  exSh.Cells[3, 3].Value := 'Таблица: "' + gTableName + '"';
  exSh.Cells[3, 3].Font.Bold := True; //Жирный шрифт.
end;
 
//Если пользователь выбрал элемент в комбобоксе.
procedure TForm1.ComboBox1Select(Sender: TObject);
var
  i : Integer;
  FName : String;
begin
  i := ComboBox1.ItemIndex; //Индекс выбранного элемента.
  if i = -1 then Exit;
 
  {Показываем выбранный столбец, все другие, кроме столбца с индексом, равным
  нулю, прячем.}
  FName := ComboBox1.Items[i];
  for i := 0 + 1 to DBGrid2.Columns.Count - 1 do
    if DBGrid2.Columns[i].FieldName = FName then
      DBGrid2.Columns[i].Visible := True
    else
      DBGrid2.Columns[i].Visible := False;
end;
 
//После открытия соединения.
procedure TForm1.ADOConnection1AfterConnect(Sender: TObject);
begin
  Memo1.Text := gFileName;
end;
 
//После закрытия соединения.
procedure TForm1.ADOConnection1AfterDisconnect(Sender: TObject);
begin
  Memo1.Clear;
  ListBox1.Clear;
end;
 
//После открытия набора данных.
procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet);
begin
  Label3.Caption := 'Таблица: "' + gTableName + '"';
end;
 
//После закрытия набора данных.
procedure TForm1.ADOQuery1AfterClose(DataSet: TDataSet);
begin
  Label3.Caption := 'Таблица:';
  ComboBox1.Clear;
end;
 
end.
В коде можно лаконичней написать код обработчика:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Если пользователь выбрал элемент в комбобоксе.
procedure TForm1.ComboBox1Select(Sender: TObject);
var
  i : Integer;
  FName : String;
begin
  i := ComboBox1.ItemIndex; //Индекс выбранного элемента.
  if i = -1 then Exit;
 
  {Показываем выбранный столбец, все другие, кроме столбца с индексом, равным
  нулю, прячем.}
  FName := ComboBox1.Items[i];
  for i := 0 + 1 to DBGrid2.Columns.Count - 1 do
    if DBGrid2.Columns[i].FieldName = FName then
      DBGrid2.Columns[i].Visible := True
    else
      DBGrid2.Columns[i].Visible := False;
end;
Здесь код:
Delphi
1
2
3
4
5
6
7
8
  {Показываем выбранный столбец, все другие, кроме столбца с индексом, равным
  нулю, прячем.}
  FName := ComboBox1.Items[i];
  for i := 0 + 1 to DBGrid2.Columns.Count - 1 do
    if DBGrid2.Columns[i].FieldName = FName then
      DBGrid2.Columns[i].Visible := True
    else
      DBGrid2.Columns[i].Visible := False;
можно заменить на:
Delphi
1
2
3
4
5
  {Показываем выбранный столбец, все другие, кроме столбца с индексом, равным
  нулю, прячем.}
  FName := ComboBox1.Items[i];
  for i := 0 + 1 to DBGrid2.Columns.Count - 1 do
    DBGrid2.Columns[i].Visible := DBGrid2.Columns[i].FieldName = FName;
Вложения
Тип файла: rar WorkWithMSAccessAndExcelFiles-01.rar (341.4 Кб, 38 просмотров)
1
12.05.2013, 05:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2013, 05:30
Помогаю со студенческими работами здесь

Разные процедуры для одной кнопки
Здравствуйте, очень интересует один вопрос. Есть 2 формы(MainForm и AddProducts) на MainForm...

Не могу установить разные даты из KivyCalendar на разные кнопки
Есть код, в котором определены и созданы три кнопки нажимая на каждую кнопку выплывает...

4 разные ОС на один HDD чтобы при старте можно было выбирать загружаемую ОС
Для тестирования карты PCIe на разных ОС хочу взять HDD 160Гб, разбить его на 4 партишена и...

Как имитировать нажатие кнопки
Существует ли способ в функции имитировать нажатие определенной кнопки?

Как отследить нажатие кнопки?
Приветик, всем!!!! Помогите, пожалуйста, мне надо отследить нажатие на кнопку на другой форме,а на...

Как перехватить нажатие кнопки '~'?
Как перехватить нажатие кнопки '~'?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru