Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Универсальная функция, чтобы она принимала в качестве параметра TDBGridEh и тип TDBGrid  [new]
AdamAry
Member

Откуда:
Сообщений: 117
Эта функция CopyGRDToClb работает и с TDBGridEh и с TDBGrid.

Как из неё сделать универсальную функцию, чтобы она принимала в качестве параметра и тип TDBGridEh и тип TDBGrid?

+
procedure CopyGRDToClb(dbg: TDBGridEh); //(dbg: TDBGrid);
var
  bm: TBookMark;
  pch, pch1: PChar;
  s, s2: string;
  i, j: integer;
begin
  s := '';
  for j := 0 to dbg.Columns.Count - 1 do
    s := s + dbg.Columns.Items[j].Title.Caption + #9;
  s := s + #13 + #10;
  if not dbg.DataSource.DataSet.active then
  begin
    ShowMessage('Нет выборки!!!');
    Exit;
  end;
  try
    dbg.Visible := False; //Делаем грид невидимым, чтобы не тратилось время
    //на его перерисовку при прокрутке DataSet - просто и
    //эффективно
    bm := dbg.DataSource.DataSet.GetBookmark; // для того чтобы не
    // потерять текущую запись
    dbg.DataSource.DataSet.First;
    while not dbg.DataSource.DataSet.EOF do
    begin
      s2 := '';
      for j := 0 to dbg.Columns.Count - 1 do
      begin
        s2 := s2 + dbg.Columns.Items[j].Field.AsString + #9;
      end;
      s := s + s2 + #13 + #10;
      dbg.DataSource.DataSet.Next;
    end;
    //Переключаем клавиатуру "в русский режим",
    //иначе - проблемы с кодировкой
    GetMem(pch, 100);
    GetMem(pch1, 100);
    GetKeyboardLayoutName(pch);
    StrCopy(pch1, pch);
    while pch <> '00000419' do
    begin
      ActivateKeyboardLayout(HKL_NEXT, 0);
      GetKeyboardLayoutName(pch);
      if strComp(pch, pch1) = 0 then
        //Круг замкнулся - нет такого языка '00000419'
        StrCopy(pch, '00000419');
    end;

    clipboard.AsText := s; //Данные - в буфер!!!

    //Возвращаем режим клавиатуры
    while strComp(pch, pch1) <> 0 do
    begin
      ActivateKeyboardLayout(HKL_NEXT, 0);
      GetKeyboardLayoutName(pch);
    end;

    FreeMem(pch);
    FreeMem(pch1);

    dbg.DataSource.DataSet.GotoBookmark(bm);
    //ShowMessage('Данные успешно скопированы в буфер обмена.');
  finally
    dbg.Visible := True;
  end;
end;
1 дек 18, 12:20    [21750977]     Ответить | Цитировать Сообщить модератору
 Re: Универсальная функция, чтобы она принимала в качестве параметра TDBGridEh и тип TDBGrid  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
AdamAry,

TDBGridEh унаследован от TCustomDBGrid? Если да - объяви тип параметра так, и всё. Если нет - другого общего наследника ищи, вплоть до TObject, а в функции - приводи к нужному типу, предварительно его узнав.
1 дек 18, 13:18    [21750997]     Ответить | Цитировать Сообщить модератору
 Re: Универсальная функция, чтобы она принимала в качестве параметра TDBGridEh и тип TDBGrid  [new]
sql2012
Member

Откуда: РФ
Сообщений: 652
AdamAry,

а работать с DataSet и передавать список нужных колонок из *Grid - не вариант?
1 дек 18, 14:49    [21751014]     Ответить | Цитировать Сообщить модератору
 Re: Универсальная функция, чтобы она принимала в качестве параметра TDBGridEh и тип TDBGrid  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 49159
sql2012
AdamAry,
а работать с DataSet и передавать список нужных колонок из *Grid - не вариант?
т.к. из грида ни форматы, ни выпадающие списки данным механизмом не вытягиваются, то поддержу это решение



AdamAry
  if not dbg.DataSource.DataSet.active then
  begin
    ShowMessage('Нет выборки!!!');
    Exit;
  end;
настоящие мужики не кричат непонятными словами и тремя восклицательными знаками, это от бессилия
1 дек 18, 23:55    [21751190]     Ответить | Цитировать Сообщить модератору
 Re: Универсальная функция, чтобы она принимала в качестве параметра TDBGridEh и тип TDBGrid  [new]
ma1tus
Member

Откуда:
Сообщений: 599
AdamAry
    dbg.Visible := False; //Делаем грид невидимым, чтобы не тратилось время
    //на его перерисовку при прокрутке DataSet - просто и
    //эффективно
DataSet.DisableControls сильно сложнее или эффект нет тот ?
2 дек 18, 00:28    [21751216]     Ответить | Цитировать Сообщить модератору
 Re: Универсальная функция, чтобы она принимала в качестве параметра TDBGridEh и тип TDBGrid  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 49159
ma1tus
AdamAry
    dbg.Visible := False; //Делаем грид невидимым, чтобы не тратилось время
    //на его перерисовку при прокрутке DataSet - просто и
    //эффективно

DataSet.DisableControls сильно сложнее или эффект нет тот ?
еще афтерскролл отключить
и букмарку в конце почистить
2 дек 18, 00:34    [21751221]     Ответить | Цитировать Сообщить модератору
 Re: Универсальная функция, чтобы она принимала в качестве параметра TDBGridEh и тип TDBGrid  [new]
sql2012
Member

Откуда: РФ
Сообщений: 652
andreymx,

да это не его "код"...

http://www.delphi-club.ru/delphi/dbgrid_to_clipboard.html
2 дек 18, 12:43    [21751323]     Ответить | Цитировать Сообщить модератору
 Re: Универсальная функция, чтобы она принимала в качестве параметра TDBGridEh и тип TDBGrid  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 49159
sql2012
andreymx,

да это не его "код"...

http://www.delphi-club.ru/delphi/dbgrid_to_clipboard.html
значит, ему теперь есть чем заняться
2 дек 18, 14:09    [21751379]     Ответить | Цитировать Сообщить модератору
 Re: Универсальная функция, чтобы она принимала в качестве параметра TDBGridEh и тип TDBGrid  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 49159
советую улучшение - убрать символы #13#10 и #9, заменив их пробелами
насчет кавычек не думал
2 дек 18, 14:52    [21751406]     Ответить | Цитировать Сообщить модератору
 Re: Универсальная функция, чтобы она принимала в качестве параметра TDBGridEh и тип TDBGrid  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 49159
andreymx
советую улучшение - убрать символы #13#10 и #9, заменив их пробелами
насчет кавычек не думал
убрать из dbg.Columns.Items[j].Field.AsString
2 дек 18, 14:57    [21751412]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить