![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток! Помогите пожалуйста
1. Как реализовать выбор полей на DBGrid: есть 40+ полей в БД, как сделать так, чтобы в реальном времени пользователь мог выбирать поля для отображения (по типу Combobox, поставил галочку и поле отобразилось)? 2. И впоследствии отобразить данные из выбранных полей на DBTChart (в полях переменные типа Float, набитые числами)? Спасибо! |
|
#2
|
||||
|
||||
|
Если речь идёт о столбцах грида, чтоб была возможность включить/выключить их отображение, Вы можете:
1) Воспользоваться компонентами EhLib (компонент TDBGridEh). Там такая возможность реализована (выпадающее меню с возможностью выбора видимых столбцов), ничего даже делать не надо. 2) Написать свой код. Например, у меня в программе для этого сделано отдельное окно. Понадобится отдельная таблица для хранения списка полей, т.к. количество их может быть переменным для разных гридов (если в программе несколько гридов). А видимость задаётся просто, через свойство Код:
MyGrid.Columns[i].Visible А с Chart-ом надо Вам разобраться. Вот, например, в учебнике Фаронова (есть в сети) доступно расписано, как с ним работать. В двух словах не расскажешь, читать надобно! |
|
#3
|
|||
|
|||
|
А можете пожалуйста более подробно расписать как реализовать кодом выбор полей в DBGrid?
|
|
#4
|
|||
|
|||
|
И вообще было бы идеально, если бы показали где в TDBGridhEh эта функция
Установил себе эту библиотеку, но не могу найти это задать. |
|
#5
|
||||
|
||||
|
Непонятно, что конкретно Вам надо - код "от и до"? Тогда мой код Вам не подойдёт. Я примерно объяснил словами, но если этой информации недостаточно - тогда не разберётесь. Я сам сделал это окно и забыл, а теперь если заглянуть - много вопросов возникнет))) Кроме того, я использую грид от EhLib, там своя специфика (т.е. у простого DBGrid-а может не оказаться тех функций, что я использую).
Если приведу весь код - точно не разберётесь, т.к. к нему понадобится куча комментариев. И, повторюсь, без грида от EhLib он работать не будет! Я не знаю, какая у Вас версия Делфи. Почему бы Вам не попробовать EhLib? Есть очень ранняя версия, которая была бесплатной, может она на вашу Делфи станет? В этом случае не надо будет писать никакого кода, нужная Вам функция уже встроена в грид. Кроме того, этот грид обладает суперскими возможностями визуализации - цветные ячейки, отображение картинок в таблице, отображение чекбоксов. Можно перетаскивать, скрывать/отображать столбцы; можно сохранять вид грида в файл и читать при запуске программы. Есть встроенный поиск разных видов, возможность копирования и печати данных из грида, а также экспорта. Поддерживаются многострочные заголовки, щелчки по заголовкам столбцов и установка маркеров сортировки. Функций там очень много, долго перечислять. Оно того стоит! Этот грид имеет все свойства и функции стандартного + целую кучу своих. Вот здесь можете скачать: https://drive.google.com/file/d/1ou1...ew?usp=sharing |
|
#6
|
||||
|
||||
|
Подключаете грид к источнику данных, чтоб шло отображение данных. Затем - в левом верхнем углу грида есть изображение треугольника, клацаете по нему, и в выпадающем меню найдёте нужный пункт отображения/скрытия столбцов. Задавать ничего не надо, всё уже сделано!
|
|
#7
|
|||
|
|||
|
Посмотрите пожалуйста на скриншот, не могу понять где этот "треугольник".
|
|
#8
|
||||
|
||||
|
По идее он должен отображаться по умолчанию. Раз нет, тогда в свойствах грида найдите свойство Indicator Title, раскройте его и установите свойство ShowDropDownSign в true.
|
| Этот пользователь сказал Спасибо Guaho за это полезное сообщение: | ||
svobodniy.agent (09.04.2021)
| ||
|
#9
|
|||
|
|||
|
Спасибо, разобрался) Подскажите пожалуйста еще такие вещи: а можно сделать эту менюшку в DBGridEh на английском и я читал, что в DBGridEh зашит экспорт в Excel - есть такое или надо руками код писать?
|
|
#10
|
||||
|
||||
|
Чтобы изменить язык менюшки, надо смотреть исходники EhLib. Тут нужно найти модуль, где эта штука прописана (скорее всего файл должен иметь в своём имени слово "grid"). В своё время я на древней версии EhLib русифицировал окно прямой печати из таблицы. Так что и у Вас вполне может получиться. Это не сложно, главное, найти файл pas (скорее всего pas, но не факт), где это прописано.
Что же касается экспорта, то вот как сделано у меня: Код:
{Процедура экспорта из грида g в файл формата Format:
0 = TXT
1 = RTF
2 = HTML
3 = CSV
4 = Excel
5 = Unicode
Действия после экспорта задаются в Act:
0 - ничего не делать;
1 - открыть файл;
2 - выдать запрос открытия;
3 - открыть папку с файлом.
Если в гриде есть выделенные строки (мультиселекция), то экспортируются только они, иначе - выводится весь набор данных.
}
procedure Tdm.ExpFromGrid(g: TDBGridEh; Format: Integer; Act: Integer);
var all: boolean;
begin
if g.DataSource.DataSet.RecordCount = 0 then
begin
PlaySound(PChar('SYSTEMEXCLAMATION'), 0, SND_ASYNC);
Application.MessageBox('В наборе данных нет ни одной записи,' + #13 +
'поэтому экспорт невозможен.', ' Предупреждение', MB_ICONWARNING + MB_OK);
exit;
end;
if g.SelectedRows.Count > 1 then all := false else all := true;
sd1.FileName := '';
case Format of
0: begin
sd1.Filter := 'Текстовые файлы|*.txt';
sd1.DefaultExt := 'txt';
if sd1.Execute then SaveDBGridEhToExportFile(TDBGridEhExportAsText, g, sd1.FileName, all);
end;
1: begin
sd1.Filter := 'Файлы формата RTF|*.rtf';
sd1.DefaultExt := 'rtf';
if sd1.Execute then SaveDBGridEhToExportFile(TDBGridEhExportAsRTF, g, sd1.FileName, all);
end;
2: begin
sd1.Filter := 'Файлы Html|*.html';
sd1.DefaultExt := 'html';
if sd1.Execute then SaveDBGridEhToExportFile(TDBGridEhExportAsHTML, g, sd1.FileName, all);
end;
3: begin
sd1.Filter := 'Файлы CSV|*.csv';
sd1.DefaultExt := 'csv';
if sd1.Execute then SaveDBGridEhToExportFile(TDBGridEhExportAsCSV, g, sd1.FileName, all);
end;
4: begin
sd1.Filter := 'Файлы Excel|*.xls';
sd1.DefaultExt := 'xls';
if sd1.Execute then SaveDBGridEhToExportFile(TDBGridEhExportAsXLS, g, sd1.FileName, all);
end;
5: begin
sd1.Filter := 'Текстовые файлы|*.txt';
sd1.DefaultExt := 'txt';
if sd1.Execute then SaveDBGridEhToExportFile(TDBGridEhExportAsUnicodeText, g, sd1.FileName, all);
end;
end;
case Act of
0: exit; //Вариант "ничего не делать".
1: ShellExecute(Handle, nil, PChar(sd1.FileName), nil, nil, SW_SHOWNORMAL); //Вариант "открыть файл".
2: begin
PlaySound(PChar('SYSTEMEXCLAMATION'), 0, SND_ASYNC);
if Application.MessageBox('Данные были успешно экспортированы в файл.' + #13 + 'Открыть этот файл ?',
' Подтверждение действия', MB_ICONQUESTION + MB_OKCANCEL ) = mrOK then
ShellExecute(Handle, nil, PChar(sd1.FileName), nil, nil, SW_SHOWNORMAL);
end;
3: begin //Вариант "открыть папку".
ShellExecute(Handle, 'explore', PChar(ExtractFilePath(sd1.FileName)),
end;
end;
end;Код:
procedure Tfm_komp.mExpToTXTClick(Sender: TObject); begin dm.ExpFromGrid(fg, TMenuItem(Sender).Tag, fm_param._cbAfterExport.itemIndex); end; |
|
#11
|
|||
|
|||
|
Спасибо большое) Можете пожалуйста как для чайника разжевать куда именно надо положить данный код, где обьявить процедуру и где ее вызвать?
|
|
#12
|
||||
|
||||
|
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
mExpToTXT: TMenuItem;
procedure N1Click(Sender: TObject);
private
{ Private declarations }
public //Прописываете в секции "public", чтобы Ваша процедура была видна из других окон программы.
procedure ExpFromGrid(g: TDBGridEh; Format: Integer; Act: Integer); // объявление процедуры (БЕЗ "TForm1."!!!)
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ExpFromGrid(g: TDBGridEh; Format: Integer; Act: Integer); // Сама процедура экспорта. Прописываете её тут сами. Префикс "TForm1." обязателен (это имя формы + приставка "Т", означающая класс).
begin
// Тело процедуры экспорта
end;
// Автоматически созданный обработчик. Создаёте меню "Экспорт", в нём - пункт "экспорт в ТХТ", даёте ему имя "mExpToTXTClick"
// и по клику по этому пункту меню автоматически создаётся данный обработчик.
procedure TForm1.mExpToTXTClick(Sender: TObject);
begin
TForm1.ExpFromGrid(fg, TMenuItem(Sender).Tag, fm_param._cbAfterExport.itemIndex); // это Вы сюда прописываете.
// Если вызываете процедуру из того же окна, где она объявлена, префикс "TForm1." необязателен. При вызове из других окон - обязателен.
end;
end.TMenuItem(Sender).Tag - это свойство Tag того пункта меню, по которому Вы щёлкнули мышью. fm_param._cbAfterExport.itemIndex - это на отдельной форме параметров специальный комбобокс, задающий действия после экспорта. Вместо этого можете просто вручную задавать число, определяющее эти действия (см. в моих предыдущих сообщениях саму процедуру экспорта; например, 0 - ничего не делать). Последний раз редактировалось Guaho, 12.04.2021 в 10:31. |
|
#13
|
|||
|
|||
|
Все сделал по аналогии, процедуру видит, но почему-то внутри самой процедуры много параметров: undeclared identifier.
|
|
#14
|
||||
|
||||
|
Ну разумеется, так и будет, если 1:1 повторить)))
В коде экспорта есть необъявленные у Вас идентификаторы, вот компилятор и не понимает, что это такое. sd1 - это компонент SaveDialog. Киньте на форму компонент SaveDialog и дайте ему имя "sd1". Ну и fm_param._cbAfterExport.itemIndex заменить пока временно на число, например на 0. |