|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
DBGrid и DBChart - выбор по галочках
Доброго времени суток! Помогите пожалуйста
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. |