Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/16: Рейтинг темы: голосов - 16, средняя оценка - 4.56
10-9-3-15-6
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 221
1

База данных, которая не база данных

31.05.2019, 08:05. Просмотров 3104. Ответов 18

Доброго времени суток. С базой данных никогда не работал, а начать не могу, выглядит сложно для короткого времени срока.
В общем суть такая: есть несколько эдитов, в них пользователь вписывает данные, к примеру марка машины, двигатель и тд и тп.
Все эти данные сохраняются в один файлик, который потом можно будет так ж загрузить и он распределится по эдитам, а также возможность удалять. Можно в принципе и фото еще прилепить, но пока без него.

Delphi
1
2
3
4
5
6
7
8
9
10
memo1.lines.items[0]:=edit1.text;
//и так до 15
memo1.lines.items[14]:=edit15.text;
//и сохранение
memo1.lines.savetofile('блокнот.nottxt');
//и так же возможность загрузить
memo1.lines.loadfromfile('блокнот.nottxt')
edit1.text:=memo1.lines.items[0];
//и так до 15
edit15.text:=memo1.lines.items[14];
Ничего сложного как бы. Но хотел бы узнать, это правильный ли подход в таком случае? Данных немного, файлов немного, или есть более гуманный способ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.05.2019, 08:05
Ответы с готовыми решениями:

База данных
Добрый день, подскажите - как сделать так, чтоб текст из edit1 Form1 при нажатие на сохранение или...

База данных аудиофайлов
Здравствуйте Хочу написать свою первую программу, проигрыватель. Помогите создать базу аудио...

База данных о студентах
В чем ошибка? При добавлении записи в таблицу, ничего не добавляется кроме пустой строки

База данных подшипников
Здравствуйте товарищи программисты! Делаю проект по делфи, и возник вопрос. Нужно сделать что-то...

18
882 / 402 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
31.05.2019, 08:19 2
Лучший ответ Сообщение было отмечено FromOutSide как решение

Решение

Цитата Сообщение от FromOutSide Посмотреть сообщение
Ничего сложного как бы. Но хотел бы узнать, это правильный ли подход в таком случае? Данных немного, файлов немного, или есть более гуманный способ?
Вопрос вашего удобства. Работает быстро? Не парит пользователей? Не парит вас? Удобно в программной реализации? Не требует сложных выборок (например, сопоставления между двумя таблицами/файлами)? Работает? Вот и не трогайте, пусть работает. Переходить на БД (ну если мы говорим не про Access) смысла нет. Структуру усложнит, переносить между ПК станет сложнее, а выигрыша - особо и нет.
1
10-9-3-15-6
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 221
31.05.2019, 08:26  [ТС] 3
Цитата Сообщение от Nanotentacle Посмотреть сообщение
Вопрос вашего удобства. Работает быстро? Не парит пользователей? Не парит вас? Удобно в программной реализации? Не требует сложных выборок (например, сопоставления между двумя таблицами/файлами)? Работает? Вот и не трогайте, пусть работает. Переходить на БД (ну если мы говорим не про Access) смысла нет. Структуру усложнит, переносить между ПК станет сложнее, а выигрыша - особо и нет.
Да, всё норм, парочке человек показал, вроде не сложно, если не пытаться что то придумывать лишнее. Программу переносить можно куда угодно, ну в любую другую папку, прога отследит своё местоположение, но базу надо так же вместе не переносить.
0
Модератор
6241 / 3950 / 1740
Регистрация: 21.01.2014
Сообщений: 16,565
Записей в блоге: 3
31.05.2019, 08:26 4
Лучший ответ Сообщение было отмечено FromOutSide как решение

Решение

Цитата Сообщение от FromOutSide Посмотреть сообщение
или есть более гуманный способ?
Есть. Вместо визуального Memo использовать невизуальный StringList
1
10-9-3-15-6
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 221
31.05.2019, 08:35  [ТС] 5
Цитата Сообщение от D1973 Посмотреть сообщение
Есть. Вместо визуального Memo использовать невизуальный StringList
Мемо не визуален у меня, только эдиты, мемо нужен лишь как сохранить, загрузить

Добавлено через 7 минут
Что ж, всем спасибо за внимание! Важно было узнать Ваше мнение! Но вдруг взбредет идейка интересная и не сложная, или сложная но с комментами - пишите))
0
882 / 402 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
31.05.2019, 08:47 6
Цитата Сообщение от FromOutSide Посмотреть сообщение
Мемо не визуален у меня, только эдиты, мемо нужен лишь как сохранить, загрузить
Тогда тем более StringList и никак иначе.
0
Модератор
6241 / 3950 / 1740
Регистрация: 21.01.2014
Сообщений: 16,565
Записей в блоге: 3
01.06.2019, 14:09 7
Цитата Сообщение от FromOutSide Посмотреть сообщение
Данных немного, файлов немного
Раз данных не много - так достаточно вообще одного файла - посмотрите в сторону INI - самое, на мой взгляд, простое решение...
1
10-9-3-15-6
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 221
01.06.2019, 15:02  [ТС] 8
Цитата Сообщение от D1973 Посмотреть сообщение
Раз данных не много - так достаточно вообще одного файла - посмотрите в сторону INI - самое, на мой взгляд, простое решение...
одним файлом, не очень выходит. данных то хоть и немного, ну вот чисто к примеру:
данные о компе/автомобиле,на каждый файл приходится по 15 едитов, поэтому файлов несколько, но там не беда, искать по формату да и всё.
0
315 / 154 / 64
Регистрация: 25.02.2018
Сообщений: 576
01.06.2019, 17:01 9
Лучший ответ Сообщение было отмечено FromOutSide как решение

Решение

Цитата Сообщение от FromOutSide Посмотреть сообщение
поэтому файлов несколько
Зачем несколько файлов? Сделай один, например в MS Excel создай таблицу и пиши(читай) туда все, что угодно.
Вот короткий пример, без проверок и т.д. просто скелет... При создании формы, создаётся StringGrid (который не показывается, а тупо висит в памяти, с ним и производятся все операции) и в него выгружается файл Text.xlsx (можно просто xls, не суть...). Данные из StringGrid-а разносятся по ячейкам (Edit, в примере их 5 штук, можно сделать столько, сколько нужно) и в список (ComboBox, тоже сделал просто как пример...). Далее при выборе в Combobox определённого значения из списка, Edit-ы заполняются соответствующими данными. Добавлена также возможность внесения в файл Test.xlsx новых записей через InputDialog. Сохранение файла происходит автоматически при добавлении новой записи. Можно вывести отдельно процедуру сохранения на кнопку, для сохранения изменений в имеющихся записях.
Примитивный код:
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, XPMan;
 
type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit1: TEdit;
    Label7: TLabel;
    Label8: TLabel;
    Button1: TButton;
    Button4: TButton;
    XPManifest1: TXPManifest;
    Label9: TLabel;
    procedure zgr(ds: integer);
    procedure ComboBox1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  sg: TStringGrid;
 
implementation
 
{$R *.dfm}
 // Модуль для работы с COM-объектами MS Office
uses
  ComObj;
 
  // Функция чтения данных из XLS(XLSX) файлов и запись их в StringGrid
function Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: Integer;
begin
  Result := False;
  // Создаем MS Excel-OLE объект
  XLApp := CreateOleObject('Excel.Application');
  try
   // Делаем окно MS Excel невидимым
    XLApp.Visible := False;
   // Открываем книгу
    XLApp.Workbooks.Open(AXLSFile);
    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];
   // Чтобы узнать номер рабочего листа, количество строк и столбцов
   // активируем последнюю непустую ячейку
    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
   // Получаем значение последней строки
    x := XLApp.ActiveCell.Row;
   // Получаем значение последнего столбца
    y := XLApp.ActiveCell.Column;
   // Задаем кол-во строк и столбцов в Stringgrid
    AGrid.RowCount := x;
    AGrid.ColCount := y;
   // Создаем матрицу, связанную с рабочим листом
    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[x, y]].Value;
   //  Определяем цикл для заполнения TStringGrid
    k := 1;
    repeat
      for r := 1 to y do
        AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[k, r];
      Inc(k, 1);
      AGrid.RowCount := k + 1;
    until k > x;
    // Освобождаем матрицу
    RangeMatrix := Unassigned;
  finally
    // Закрываем MS Excel
    if not VarIsEmpty(XLApp) then
    begin
      // Свойство, которое убирает диалоговые окна, типа "Сохранить файл и т.д."
      // Если значение True - окна будут показаны
      XLApp.DisplayAlerts := False;
      // Закрываем Excel
      XLApp.Quit;
      // Освобождаем XLApp
      XLApp := Unassigned;
      // Освобождаем Sheet
      Sheet := Unassigned;
      // Выводим результат
      Result := True;
    end;
  end;
end;
 
  // Функция чтения данных из StringGrid и запись их в XLS(XLSX) файл
function SgToExcel(aSg: TStringGrid; aExSh: OleVariant; const aRow, aCol: Integer): OleVariant;
var
  vArr: Variant;
  exCell: OleVariant;
  i, j: Integer;
begin
  //Создаём вариантный массив с размером, соответствующим размеру таблицы
  vArr := VarArrayCreate([1, aSg.RowCount, 1, aSg.ColCount], varOleStr);
  //Записываем в вариантный массив данные таблицы
  for i := 1 to aSg.RowCount do
    for j := 1 to aSg.ColCount do
      vArr[i, j] := aSg.Cells[j - 1, i - 1];
  //Ссылка на ячейку, в которой расположится левый верхний угол таблицы
  exCell := aExSh.Cells[aRow, aCol];
  //Определяем диапазон, в который мы запишем данные таблицы
  Result := aExSh.Range[exCell, exCell.Offset[aSg.RowCount - 1, aSg.ColCount - 1]];
  //Записываем данные вариантного массива в диапазон
  Result.Value := vArr;
end;
 
  // Процедура сохранения данных из StringGrid в MS Excel
procedure Save_SG_XLS();
const
  //Толщина линий
  xlThin = 2; //Тонкая линия
  xlMedium = -4138; //Линия средней толщины
  // Тид линии
  xlContinuous = 1; // Непрерывная линия
var
  exApp, exBook, exSh, exRng: OleVariant;
  XLSFile: string;
begin
  // Создаем MS Excel-OLE объект
  exApp := CreateOleObject('Excel.Application');
  // Открываем файл Test.xlsx (находится в папке рядом с программой
  XLSFile := extractFileDir(ParamSTR(0)) + '\test.xlsx';
  // Делаем невидимым окно MS Excel
  exApp.Visible := False;
  // Открываем файл рабочей книги и получаем ссылку на её интерфейс
  exBook := exApp.WorkBooks.Open(XLSFile);
  // Получаем ссылку на интерфейс первого листа рабочей книги
  exSh := exBook.Worksheets[1];
  // Записываем данные из StringGrid на лист MS Excel, начиная с ячейки "A1"
  // Функция возвращает ссылку на интерфейс диапазона, в который записались данные таблицы
  exRng := SgToExcel(sg, exSh, 1, 1);
  // Формируем таблицу - устанавливаем рамку для ячеек таблицы
  exRng.Borders.LineStyle := xlContinuous;
  exRng.Borders.Weight := xlThin;
  // Выравниваем ширину столбцов в XLS документе по содержимому
  exRng.Columns.AutoFit;
  // Сохраняем рабочую книгу
  exBook.Save;
  // Закрываем рабочую книгу
  exBook.Close;
  // Отключаем OLE-объект MS Excel
  exApp.Quit;
  // Освобождаем exApp
  exApp := Unassigned;
end;
 
  // Процедура для заполнения Edit-ов данными из StringGrid
procedure TForm1.zgr(ds: integer);
begin
  Edit1.Text := sg.Rows[ds][0];
  Edit2.Text := sg.Rows[ds][2];
  Edit3.Text := sg.Rows[ds][3];
  Edit4.Text := sg.Rows[ds][4];
  Edit5.Text := sg.Rows[ds][5];
end;
 
  // Изменение выбора строк в StringGrid
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  zgr(ComboBox1.ItemIndex + 1);
end;
 
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Создаем StringGrid
  sg := TStringGrid.Create(self);
  // Делаем созданный StringGrid не видимым
  sg.Visible := false;
  // Читаем файл Text.XLSX и записываем данные из него в StringGrid
  Xls_To_StringGrid(sg, extractFileDir(ParamSTR(0)) + '\test.xlsx');
  // Считаем строки StringGrid
  sg.RowCount := sg.RowCount - 2;
  // Очищаем ComboBox
  Combobox1.Clear;
  // Добавляем записи из 1 столбца из StringGrid в ComboBox
  Combobox1.Items.AddStrings(sg.Cols[1]);
  Combobox1.Items.Delete(0);
  // Показываем в ComboBox индекс со значением 0
  Combobox1.ItemIndex := 0;
  // Выводим количество записей (строк) в документе XLS
  Label9.Caption := 'Всего записей - ' + IntToStr(sg.RowCount - 1);
  zgr(1);
end;
 
// Передача данных из таблицы типа TStringGrid на лист рабочей книги MS Excel.
// Функция возвращает ссылку на интерфейс диапазона MS Excel, в который записалась таблица.
// aSg - экземпляр типа TStringGrid, из которого берутся данные.
// aExSh - ссылка на интерфейс рабочего листа MS Excel, на который следует поместить данные.
// aRow, aCol - координаты ячейки на листе aExSh, начиная с которой следует разместить таблицу.}
 
//Освобождаем созданный StringGrid
procedure TForm1.FormDestroy(Sender: TObject);
begin
  sg.Free;
end;
 
// Добавление в таблицу данных по ячейкам
procedure TForm1.Button1Click(Sender: TObject);
var
  value: string;
begin
  sg.RowCount := sg.RowCount + 1;
  value := InputBox('Марка автомобиля', 'Введите марку автомобиля', '');
  sg.cells[1, sg.RowCount - 1] := value;
  value := InputBox('Владелец автомобиля', 'Введите Ф.И.О. владельца автомобиля', '');
  sg.cells[0, sg.RowCount - 1] := value;
  value := InputBox('Год выпуска автомобиля', 'Введите год выпуска автомобиля', '');
  sg.cells[2, sg.RowCount - 1] := value;
  value := InputBox('Объем двигателя', 'Введите объем двигателя автомобиля', '');
  sg.cells[3, sg.RowCount - 1] := value;
  value := InputBox('Цвет автомобиля', 'Введите цвет автомобиля', '');
  sg.cells[4, sg.RowCount - 1] := value;
  value := InputBox('Пробег автомобиля', 'Введите пробег автомобиля', '');
  sg.cells[5, sg.RowCount - 1] := value;
  Label9.Caption := 'Всего записей в базе - ' + IntToStr(sg.RowCount - 1);
  // Записываем в XLS документ данные, которые были введены в StringGrid
  Save_SG_XLS;
  // Снова открываем уже обновлённый файл XLS
  Xls_To_StringGrid(sg, extractFileDir(ParamSTR(0)) + '\test.xlsx');
  sg.RowCount := sg.RowCount - 2;
  Combobox1.Clear;
  Combobox1.Items.AddStrings(sg.Cols[1]);
  Combobox1.Items.Delete(0);
  Combobox1.ItemIndex := 0;
  // Пересчитываем количество записей в XLS документе
  Label9.Caption := 'Всего записей - ' + IntToStr(sg.RowCount - 1);
  zgr(1);
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  Close;
end;
 
end.
Так это работает:
База данных, которая не база данных


Проект: - thread2463253.rar Delphi 7.

P.S. В проекте, строки 237, 239 - слово "автомобиля" повторяется, удалить повтор.
1
10-9-3-15-6
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 221
01.06.2019, 18:18  [ТС] 10
Шикарный ответ, и комментарии, и примеры, и тд и тп - спасибо!
Осталось попасть домой

Добавлено через 10 минут
Цитата Сообщение от Ашотик2018 Посмотреть сообщение
Delphi
1
2
uses
* ComObj;
только не понял что это?)

Добавлено через 48 секунд
это для работы с бд? или что в таком духе, так?
0
315 / 154 / 64
Регистрация: 25.02.2018
Сообщений: 576
01.06.2019, 18:44 11
Цитата Сообщение от FromOutSide Посмотреть сообщение
это для работы с бд? или что в таком духе, так?
нет, к базам данных этот модуль не имеет никакого отношения.
ComObj - стандартный модуль в Delphi для работы с Ole-объектами. В частности можно работать с MS Word, MS Excel, MS Power Point и другими.
1
Модератор
6241 / 3950 / 1740
Регистрация: 21.01.2014
Сообщений: 16,565
Записей в блоге: 3
01.06.2019, 18:58 12
Минус вышеприведенного метода - обязательное наличие на компьютере приложений MS Office.
INI файл лишен этого недостатка. Я просто оставлю это здесь...
2
Миниатюры
База данных, которая не база данных   База данных, которая не база данных  
Вложения
Тип файла: rar База данных которая не база данных.rar (4.0 Кб, 6 просмотров)
3274 / 2826 / 766
Регистрация: 29.08.2013
Сообщений: 19,123
Записей в блоге: 1
02.06.2019, 00:04 13
Цитата Сообщение от Nanotentacle Посмотреть сообщение
Структуру усложнит, переносить между ПК станет сложнее, а выигрыша - особо и нет.
все неправда:
и не усложнит
и с переносом проблем нет
и выигрыш есть

ексель файл - использовать его как хранилище. у нас скриншоты в него бухгалтера вставляют и ничего
ini файл. великий и могучий. прям по методичке

может лучше типизированный файл?
0
10-9-3-15-6
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 221
02.06.2019, 08:56  [ТС] 14
Цитата Сообщение от D1973 Посмотреть сообщение
Я просто оставлю это здесь...
Странно, я вчера делал ответ, но сейчас не отображается, напишу еще раз:
Гигантское спасибо! Сложненько пока это для меня, считай нулевые знания
0
Модератор
6241 / 3950 / 1740
Регистрация: 21.01.2014
Сообщений: 16,565
Записей в блоге: 3
02.06.2019, 14:51 15
Цитата Сообщение от FromOutSide Посмотреть сообщение
Сложненько пока это для меня
FromOutSide, в INI-файлах все очень просто...
[Имя секции]
Параметр1=значение
Параметр2=значение
...
ПараметN=значение
Дальше - только логика обработки полученных значений...
1
882 / 402 / 174
Регистрация: 20.10.2016
Сообщений: 1,828
03.06.2019, 04:26 16
Цитата Сообщение от FromOutSide Посмотреть сообщение
Сложненько пока это для меня, считай нулевые знания
Если ini - сложно, то сначала все же надо с ними разобраться. Ini файлы намного и намного проще по сравнению с БД и с Excel-файлами. Там все намного более заморочно.
0
10-9-3-15-6
13 / 11 / 2
Регистрация: 04.09.2014
Сообщений: 221
03.06.2019, 13:28  [ТС] 17
Цитата Сообщение от Ашотик2018 Посмотреть сообщение
Примитивный код:
Извините что беспокою, но не могли бы Вы подсказать (то-есть не давать полного ответа), как в этот код внедрить возможность изменять и удалять данные из таблицы, а то я чего намудрил, и удаление вообще не удается а изменение, сносит все столбцы в одной строке
0
315 / 154 / 64
Регистрация: 25.02.2018
Сообщений: 576
04.06.2019, 01:00 18
В дополнение к приложению, описанному в посте выше, добавил функции удаления записей и редактирование уже имеющихся.
Удаление - работает так, запись которую необходимо удалить, выбираем в ComboBox и затем удаляем.
Изменить - аналогично предыдущей, выбираем в ComboBox запись, которую необходимо редактировать, вносим необходимые изменения в Edit-ах и нажимаем кнопку "Изменить".
1. На форму необходимо добавить 2 кнопки.
2. Задать одной имя Button2 и сделать заголовок на кнопке "Изменить".
3. Задать второй имя Button3 и сделать заголовок на кнопке "Удалить".
4. Кликнуть по каждой кнопке или соответственно не забыть у добавленных кнопок в инспекторе объектов, на вкладке Events добавить события OnClick.
Далее, после 262 строки кода, добавить код приведенный ниже:
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
///////////////////////// ДОБАВЛЕНО /////////////////////////////////////////////
 
  // Процедура "Сохранить как" данные из таблицы в XLSX(XLS) файл из StringGrid.
  // Данная процедура необходима для сохранения строк в XLSX документе.
  // Если использовать процедуру Save_SG_XLS, то в файле XLSX(XLS) будет.
  // вместо каждой удаленной строки будет дописываться идущая за ней строка.
  // Отличие от процедуры Save_SG_XLS состоит в том, что XLSX(XLS) документ
  // создается заново и в него заносятся данные после удаления строк и StringGrid.
 
procedure Save_AS_SG_XLS();
const
  //Толщина линий
  xlThin = 2; //Тонкая линия
  xlMedium = -4138; //Линия средней толщины
  // Тип линии
  xlContinuous = 1; // Непрерывная линия
var
  exApp, exBook, exSh, exRng: OleVariant;
begin
  // Создаем MS Excel-OLE объект
  exApp := CreateOleObject('Excel.Application');
  // Делаем невидимым окно MS Excel
  exApp.Visible := False;
  // Убиваем всплывающие сообщения о пересохранении файла
  exApp.DisplayAlerts := False;
  // Открываем файл рабочей книги и получаем ссылку на её интерфейс
  exBook := exApp.WorkBooks.Add;
  // Получаем ссылку на интерфейс первого листа рабочей книги
  exSh := exBook.Worksheets[1];
  // Записываем данные из StringGrid на лист MS Excel, начиная с ячейки "A1"
  // Функция возвращает ссылку на интерфейс диапазона, в который записались данные таблицы
  exRng := SgToExcel(sg, exSh, 1, 1);
  // Формируем таблицу - устанавливаем рамку для ячеек таблицы
  exRng.Borders.LineStyle := xlContinuous;
  exRng.Borders.Weight := xlThin;
  // Выравниваем ширину столбцов в XLS документе по содержимому
  exRng.Columns.AutoFit;
  // Сохраняем рабочую книгу в папку с программой
  exBook.SaveAs(extractFileDir(ParamSTR(0)) + '\test.xlsx');
  // Закрываем рабочую книгу
  exBook.Close;
  // Отключаем OLE-объект MS Excel
  exApp.Quit;
  // Освобождаем exApp
  exApp := Unassigned;
end;
 
  // Процедура внесения изменений в существующих записях
procedure TForm1.Button2Click(Sender: TObject);
var
  // Переменная которая определяет какая строка выбрана
  EdRow: Integer;
begin
  // Значение переменной получаем по индексу, выбираемого в ComboBox + 1
  // FixRow (фиксированная строка) она же заголовок в самой таблице XLS
  EdRow := ComboBox1.ItemIndex + 1;
 // Записываем данные в StringGrid
  // Пишем марку машины - данные из ComboBox1
  sg.cells[1, EdRow] := ComboBox1.Text;
  // Пишем данные о владельце - данные из Edit1
  sg.cells[0, EdRow] := Edit1.Text;
  // Пишем год выпуска - данные из Edit2
  sg.cells[2, EdRow] := Edit2.Text;
  // Пишем год объем двигателя - данные из Edit3
  sg.cells[3, EdRow] := Edit3.Text;
  // Пишем цвет кузова - данные из Edit4
  sg.cells[4, EdRow] := Edit4.Text;
  // Пишем пробег - данные из Edit5
  sg.cells[5, EdRow] := Edit5.Text;
    // Сохраняем изменения
  Save_AS_SG_XLS;
  // Загружаем сохраненный файл Text.XLSX и записываем данные из него в StringGrid
  Xls_To_StringGrid(sg, extractFileDir(ParamSTR(0)) + '\test.xlsx');
  // Считаем строки StringGrid
  sg.RowCount := sg.RowCount - 2;
  // Очищаем ComboBox
  Combobox1.Clear;
  // Добавляем записи из 1 столбца из StringGrid в ComboBox
  Combobox1.Items.AddStrings(sg.Cols[1]);
  Combobox1.Items.Delete(0);
  // Показываем в ComboBox индекс со значением 0
  Combobox1.ItemIndex := 0;
  // Выводим количество записей (строк) в документе XLS
  Label9.Caption := 'Всего записей - ' + IntToStr(sg.RowCount - 1);
  zgr(1);
end;
 
  // Процедура удаления строк в StringGrid
procedure GridDeleteRow(RowNumber: Integer; Grid: TstringGrid);
var
  i: Integer;
begin
  Grid.Row := RowNumber;
  if (Grid.Row = Grid.RowCount - 1) then
    Grid.RowCount := Grid.RowCount - 1
  else
  begin
    for i := RowNumber to Grid.RowCount - 1 do
      Grid.Rows[i] := Grid.Rows[i + 1];
    Grid.RowCount := Grid.RowCount - 1;
  end;
end;
 
  // Удаляем строки в StrnigGrid по индексу
  // Суть работы такова, при нажатии на кнопку удалить, будет удалена
  // та строка, значение которой выбрано в ComboBox
procedure TForm1.Button3Click(Sender: TObject);
var
  // Переменная для определения индекса удаляемой строки
  EdRow, i: integer;
begin
  // Заполняем переменную, ее значение будет индекс ComboBox + 1
  // так как первая строка в StringGrid идет заголовок таблицы.
  EdRow := ComboBox1.ItemIndex + 1;
  //Если осталась одна строка, операцию удаления не выполнять
  if (sg.RowCount = 2) then
    exit;
  // Удаляем выбранную строку
  GridDeleteRow(EdRow, sg);
  // Сохраняем данные которые остались в StringGrid
  Save_AS_SG_XLS;
  // Очищаем StringGrid
  with sg do
    for i := 0 to RowCount - 1 do
      Rows[i].Clear;
  // Загружаем сохраненный файл Text.XLSX и записываем данные из него в StringGrid
  Xls_To_StringGrid(sg, extractFileDir(ParamSTR(0)) + '\test.xlsx');
  // Считаем строки StringGrid
  sg.RowCount := sg.RowCount - 2;
  // Очищаем ComboBox
  Combobox1.Clear;
  // Добавляем записи из 1 столбца из StringGrid в ComboBox
  Combobox1.Items.AddStrings(sg.Cols[1]);
  Combobox1.Items.Delete(0);
  // Показываем в ComboBox индекс со значением 0
  Combobox1.ItemIndex := 0;
  // Выводим количество записей (строк) в документе XLS
  Label9.Caption := 'Всего записей - ' + IntToStr(sg.RowCount - 1);
  zgr(1);
end;
Работает так:
База данных, которая не база данных


Полный проект - thread2463253_V2.rar Delphi 7.
1
315 / 154 / 64
Регистрация: 25.02.2018
Сообщений: 576
04.06.2019, 01:18 19
--------------------------------
Оптимизировал немного весь код (- 70 строк), вынес повторяющиеся операции в отдельную процедуру, и убрал 1 лишнюю процедуру.
Проект - thread2463253_V3.RAR.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2019, 01:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

DELPHI база данных
Попросили сделать список сотрудников по базам данных: Сведения о сотрудниках фирмы: - ФИО...

База Данных магазина
народ помогите пожалуйста Есть база данных, написанная в делфи: | дата | день недели | фамилия...

База данных как бы
Всем здрасте, есть форма, на панели1 расположены label1, label2, на панели 2 label10, label11,...

База данных и кодировка
Есть файл базы данных DataBase.D, когда его открываю блокнотом, то все нормально, получаю такой...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.