Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по DBGrid-у.Помогите пожалуйста. DBGrid........... 
:(
    Опции темы
x77
Дата 15.9.2003, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



эта штука будет рисовать крест в первом столбце. но, собственно говоря, его рисовать можно где угодно, в том же вычисляемом поле. у меня оно называется Selected, соответственно код будет такой:

Код

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
 with DbGrid1 do begin
   if SelectedRows.CurrentRowSelected and
     (SelectedRows.Count > 1) and
     (Column.FieldName = 'Selected') // вот и вся разница :)
   then
     with Canvas do begin
       Font.Color := clRed;
       TextOut (Rect.Left + 2, Rect.Top + 1, 'X');
     end;
 end;
end;



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Bgladiator
Дата 15.9.2003, 20:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А покакому признаку выводить на печать в моей процедуре печати (см. выше)?
  Вверх
x77
Дата 15.9.2003, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



щас будем думать smile.gif


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Bgladiator
Дата 15.9.2003, 20:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











И ещё, А какого типа у тебя это поле Selected - fData, fCalculated?
  Вверх
x77
Дата 15.9.2003, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



оно Calculated, c datatype = ftString. фишка в том,что нам просто нужно место, на котором мы сами нарисуем чего нам надо, и чтобы там ничего не рисовала система. в случае отрисовки на первом поле грида может быть наложение данных, которые отрисует сам грид. а когда рисуешь в отдельном поле, гарантированно пустом, можно этого не боятся.

так, щас один глюк подправлю и скину код.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
x77
Дата 15.9.2003, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



в общем, смысл такой. отчёт придётся выводить полностью руками. для этого в свойствах отчёта отключается DataSet (свойство должно быть пустым). после этого в отчёте начинает возникать замечательное событие OnNeedData, в котором можно запихать в текущий банд всё, что угодно. у меня на одной форме (Unit1, Form1) лежит Table1, прицепленная к таблице biolife.db. во втором модуле (Unit2, Form2) находится QuickRep1. приведу оба текста.

Код

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Grids, DBGrids, Db, DBTables;

type
 TForm1 = class(TForm)
   DataSource1: TDataSource;
   Table1: TTable;
   Table1SpeciesNo: TFloatField;
   Table1Category: TStringField;
   Table1Common_Name: TStringField;
   Table1SpeciesName: TStringField;
   Table1Lengthcm: TFloatField;
   Table1Length_In: TFloatField;
   Table1Notes: TMemoField;
   Table1Graphic: TGraphicField;
   DBGrid1: TDBGrid;
   Table1Selected: TStringField; // вычисляемое поле для отрисовки
   procedure DBGrid1KeyPress(Sender: TObject; var Key: Char);
   procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
     DataCol: Integer; Column: TColumn; State: TGridDrawState);
 private
 public
 end;

var
 Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
 if Key = 'p' then // при нажатии "p"  - выводим на просмотр
   Form2.QuickRep1.Preview;
end;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
 // отрисовка креста для выбранных записей
 with DbGrid1 do begin
   if SelectedRows.CurrentRowSelected and
     (SelectedRows.Count > 1) and
     (Column.FieldName = 'Selected') // только в нашем поле
   then
     with Canvas do begin
       Font.Color := clRed;
       TextOut (Rect.Left + 2, Rect.Top + 1, 'X');
     end;
 end;
end;

end.



во втором модуле на QuickRep1 лежат обычные метки, TQRLabel. фишка в том, чтобы динамически сформировать их значения, перебирая руками таблицу.

Код

unit Unit2;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls, QuickRpt, Qrctrls;

type
 TForm2 = class(TForm)
   QuickRep1: TQuickRep;
   QRBand1: TQRBand;
   QRLabel1: TQRLabel;
   procedure QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);
   procedure QuickRep1BeforePrint(Sender: TCustomQuickRep;
     var PrintReport: Boolean);
 private
   { Private declarations }
   CurrentIndex: integer; // текущая "закладка" (TBookmark)
 public
   { Public declarations }
 end;

var
 Form2: TForm2;

implementation

uses Unit1;

{$R *.DFM}

procedure TForm2.QuickRep1BeforePrint(Sender: TCustomQuickRep;
 var PrintReport: Boolean);

begin
 // перед печатью сбрасываем счётчик
 CurrentIndex := 0;
end;

procedure TForm2.QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);
begin
 with Form1 do begin
   // если перебрали все "закладки" - сваливаем
   if CurrentIndex >= DbGrid1.SelectedRows.Count then begin
     MoreData := FALSE;
   end else begin     // ну, а если нет - то в путь
     // переходим на следующую закладку
     Table1.GotoBookmark (pointer(DBGrid1.SelectedRows.Items[CurrentIndex]));
     // присваиваем нужный текст
     QRLabel1.Caption := Table1Common_Name.AsString;
     // увеличиваем значение счётчика
     Inc (CurrentIndex);
     // говорим уроду, что будут ещё записи
     MoreData := TRUE;
   end;
 end;
end;

end.



вот, в принципе, и всё smile.gif


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
x77
Дата 15.9.2003, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



З.Ы. а всё-таки - оптимальный вариант - TRxMemoryTable. тебе не пришлось бы переделывать отчёт, просто поменять у него датасорс, ,переназначив на виртуальную таблицу. при нажатии на печать ты бы обнулял её, пробегал по выбранным полям, добавляя их туда, и делал Preview. и всё.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
BGladiator
Дата 16.9.2003, 12:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо тебе большое сейчас буду пробовать. И, если несложно расскажи (покажи) как это можно сделать с помощью TRxMemoryTable. Никогда такой фишкой не пользовался.
  Вверх
x77
Дата 16.9.2003, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



сначала надо установить RxLib. TRxMemoryTable - это аналог TTable, с аналогичными своствами и методами, с той только разницей, что таблицы физически не существует. т.е. ты делаешь ей Insert, Update, Delete, и всё это хранится у тебя в памяти. тебе надо будет создать такую таблицу, в ней создать поля, абсолютно аналогичные полям в твоей таблице. после этого обработчик из unit1 будет выглядеть примерно так:

Код

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
var
 i, j: integer;
begin
 if Key = 'p' then begin // при нажатии "p"  - выводим на просмотр
   
   // обнуляем таблицу
   RxTable1.First;
   while not RxTable1.Eof do
     RxTable.Delete;
   
   // перебираем выбранные записи
   for i := 0 to DbGrid1.SelectedRows.Count - 1 do begin
     Table1.GotoBookmark (pointer(DBGrid1.SelectedRows.Items[i]));

     // копируем каждую найденную по "закладке" запись
     RxTable1.Insert;
     for j := 0 to Table1.Fields.Count - 1 do
       RxTable1.Fields [j].Value := Table1.Fields [j].Value;
     RxTable1.Post;
   end;
   
   // выводим отчёт на просмотр
   Form2.QuickRep1.Preview;
 end;
end;


если я ничего не путаю, то TMemoryTable может быть указана в качестве dataset'а для QR. т.е. там вешаются обычные data-aware контролы, обычным образом указываются для них источники данных, и весь код, приведённый в Unit2 становится просто не нужен.

ещё один момент, который я вчера впопыхах опустил. Bookmark'и в конце концов надо бы освобождать. т.е. где-то на OnDestroy формы привесить код, который освобождает всю, выделенную под них память.

Это сообщение отредактировал(а) x77 - 16.9.2003, 13:07


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
BGladiator
Дата 16.9.2003, 13:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А как же мне формировать мой QuickReport. Сейчас он у меня формировался в отдельной форме и без единой строчки текста. Т. е. я шлёпал на форму пару Caption, к примеру
Напечатано QRSysData1 'кол.'+STR(PAGENUMBER)

Затем пару Expression, такого типа

qrLineData.TEL_ATS_ATS+'-'+qrLineData.TEL_NUMBER +qrLineData.TYPE_TELE_CONNECTS+' ';

qrLineData.SPR_MPLEX_NAME+ ' ' + qrLineData.LINE_DATA_CALC+' ' +IF(qrLineData.INDICATION = '', '', '['+qrLineData.INDICATION+']')

и т. д.

Теперь, если я хочу выбрать , к примеру другой источник (ну место qrLineData наш
TRxMemoryTable) я не могу, я так понял что ему нужно только Query. Но и элементы Query из формы где находится мой Grid я не вижу только те которые находятся в моей второй форме со всеми Query. Если прописать мою форму с Grid-ом в USES, то возникает закономерная ошибка CIRCULAR UNIT REFERENCE.

Можно ли как то в таком случае осуществить такую же форматированную печать моего отчёта.



  Вверх
x77
Дата 16.9.2003, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



не совсем понял.

насчёт circular и пр.: прописывается uses не в интерфейсной части, а в implementation. тогда всё будет видно и никаких циклических ссылок не возникнет. посмотри, как выше у меня объявлены два модуля:

Код

unit1;

interface

uses
 Forms, etc.

implemantation

uses
 Unit2;

end.



unit2;

interface

uses
 Forms, etc.

implemantation

uses
 Unit1;

end.



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
x77
Дата 16.9.2003, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



если не касаться TRxMemoryTable и закончить, для начала, с вариантом выше, то там всё форматирование делается руками. ты же выводишь отчёт построчно. т.е. в любой момент можешь начать новый банд, вывести номер строки (соответственно, придётся их учитывать) и т.д.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
BGladiator
Дата 16.9.2003, 13:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











И ещё ответь пожалуйста можно ли как-то в процедуре печати задать фильтр чтобы печатались только выбраные строки Grida вместо моего Filter := 'SELECTION ='+'''X''';.

Привожу мою процедуру печати:

procedure TLineData.aPrintExecute(Sender: TObject);
Var
pr:TrepLineData;
begin
inherited;
pr:=nil;
CurrentIndex := 0;
with Grd.DataSource.DataSet do try
Filter := 'SELECTION ='+'''X''';
Filtered := True;
pr:=TrepLineData.Create(nil);
// pr.Preview;
pr.PrinterSetup;
pr.print;
pr.free;
Filtered := False;
pr:=nil;
except
on Exception do if pr<>nil then pr.free;
end;
end;

Большое спасибо.
  Вверх
x77
Дата 16.9.2003, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22




мда. как ты думаешь, нафига я всё это писал? smile.gif

ещё раз.

процедура печати выглядит так (это вместо твоей):

Код

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = 'p' then // при нажатии "p"  - выводим на просмотр
  Form2.QuickRep1.Preview;
end;


после того, как отчёт запускается на превью, у него срабатывает событие BeforePrint:

Код

procedure TForm2.QuickRep1BeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
begin
// перед печатью сбрасываем счётчик
CurrentIndex := 0;
end;


после этого начинает срабатывать событие OnNeedData, в котором возвращаемый параметр MoreData определяет, будет ли оно вызвано ещё раз или нет. в этом событии мы двигаемся перебираем записи, выбранные в гриде, и печатаем только их:

Код

procedure TForm2.QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);
begin
with Form1 do begin
  // если перебрали все "закладки" - сваливаем
  if CurrentIndex >= DbGrid1.SelectedRows.Count then begin
    MoreData := FALSE;
  end else begin     // ну, а если нет - то в путь
    // переходим на следующую закладку
    Table1.GotoBookmark (pointer(DBGrid1.SelectedRows.Items[CurrentIndex]));
    // присваиваем нужный текст
    QRLabel1.Caption := Table1Common_Name.AsString;
    // увеличиваем значение счётчика
    Inc (CurrentIndex);
    // говорим уроду, что будут ещё записи
    MoreData := TRUE;
  end;
end;
end;



хочешь, я сброшу тебе этот проект, посмотришь сам, как оно там всё устроено. только мыло дай.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
BGladiator
Дата 16.9.2003, 13:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Скидывай на мыло: [email protected]. Огромное тебе спасибо, только вот как будет происходить сама печать, если мне надо вывести сначала заголовок а потом все мои поля отформатированными - строка за строкой.

Спасибо тебе за ответы и извиняюсь за глупые вопросы.
  Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.