Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2013, 14:50   #1
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию Проверить выделена ли запись, на которой стоит курсор

Добрый день, у меня такой вопрос.
Есть грид подключён к мемтейблу, по нажатию кнопки я просматриваю мемтейбл и смотрю если поле равно 101 то я произвожу какието действия, но пользователь может ещё дополнительно выделить галками строки и при этом нужно проверять, текущая позиция равно 101 или строка выделена галкой (DBGridEh)

как правильно сделать?

Код:
mtSms: TADMemTable;
qRecords: TADQuery;
gSms: TDBGridEh; 
....
procedure TfrmBase.btSendClick(Sender: TObject);
var
  Date, Text, phone, SenderName, API: string;
  IDSms: integer;
begin
  // TODO возможнонадо будет поменять тип для храенения ади смс на варчар
  SenderName := '';
  API := '';

  frmSmsSettings.GetParamsSend(API, SenderName);
  // Получаем параметры для рассылки
  mtSms.First;
  Text := mtSms.FieldByName('sms_text').AsString;
  Date := mtSms.FieldByName('ustamp').AsString;
  while not mtSms.Eof do
  begin
    if (mtSms.FieldValues['status_sms'] = 101) or
      (gSms.SelectedRows.CurrentRowSelected) then
    begin
      phone := mtSms.FieldByName('phone').AsString;
      try
        IDSms := frmSenderSms.SmsSend(Text, phone, SenderName, API);
        qRecords.SQL.Text :=
          'update `hairsalon`.`smslink` set `id_sms`=:id, `status_sms`=0 where id_m=:idm and id_cl=:idcl';
        qRecords.ParamByName('id').Value := IDSms;
        qRecords.ParamByName('idm').Value := mtSms.FieldValues['id_m'];
        qRecords.ParamByName('idcl').Value := mtSms.FieldValues['id_cl'];
        qRecords.ExecSQL;
      finally
        mtSms.Next;
      end;
    end
    else
      Continue;
  end;
end;

я прохожу по таблице и вторым условием делаю (gSms.SelectedRows.CurrentRowSelect ed), но оно постояно труе) это помтоу что я и так стою на даной строки на даный момент а мне надо узнать выделена ли она галкой...
Dozent вне форума Ответить с цитированием
Старый 25.11.2013, 09:27   #2
igh0st
Форумчанин
 
Аватар для igh0st
 
Регистрация: 05.07.2010
Сообщений: 136
По умолчанию

В редакторе после gSms.SelectedRows.CurrentRowSelect поставь точку и выпадающем окне поищи что-то типа Checked
igh0st вне форума Ответить с цитированием
Старый 25.11.2013, 09:47   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

извините, если я "мимо кассы".
у нас в рабочем проекте выделенные строки перебираются примерно таким кодом:
Код:
    cds1.DisableControls;
    SavePlace := cds1.GetBookmark;
    try
      for i := 0 to gSms.SelectedRows.Count - 1 do
      begin
         gSms.DataSource.DataSet.Bookmark := gSms.SelectedRows[i];
         делаем что нужно со строкой в cds1;
      end;
    finally
       cds1.GotoBookmark(SavePlace);
       cds1.FreeBookmark(SavePlace);
       cds1.EnableControls;
    end;
но тут суть в том, что мы проходим по выделенным строками и позиционируемся в связанном с гридом датасете на эти строчки.

Если мой код не поможет — я не виноват, я пытался помочь!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.11.2013, 23:09   #4
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Мой ход мыслей такой, но знаний не хватает, если можно направте...

Код:
procedure TfrmBase.btSendClick(Sender: TObject);
var
  Date, Text, phone, SenderName, API: string;
  IDSms, i, j: integer;
  CheckBookmark, SelectBookmark: TBookmark;
  bIsCheck: Boolean;
begin
  // TODO возможнонадо будет поменять тип для храенения ади смс на варчар
  SenderName := '';
  API := '';

  frmSmsSettings.GetParamsSend(API, SenderName);
  // Получаем параметры для рассылки
  mtSms.DisableControls;
  mtSms.First;
  Text := mtSms.FieldByName('sms_text').AsString;
  Date := mtSms.FieldByName('ustamp').AsString;
  // запоминаем выделеныее строки
  // for i := 0 to gSms.SelectedRows.Count - 1 do
  // CheckBookmark := gSms.SelectedRows[i];

  i := 0;
  while not mtSms.Eof do
  begin
    // получаем ссылку на текущую строку
    SelectBookmark := gSms.Selection.Rows[i];
    // проходим по выделеным
    for j := 0 to gSms.SelectedRows.Count - 1 do
    begin
      // перебераем массив ссылок на выделеные
      CheckBookmark := gSms.SelectedRows[j];
      { сравниваем если обе ссылаются на одну запись значит всё верно вы находимся
        на выделеной записи }
      if mtSms.CompareBookmarks(SelectBookmark, CheckBookmark) = 0 then
        bIsCheck := True
      else
        bIsCheck := False;
    end;

    try
      if (mtSms.FieldValues['status_sms'] = 101) or bIsCheck then
      begin
        phone := mtSms.FieldByName('phone').AsString;
        IDSms := frmSenderSms.SmsSend(Text, phone, SenderName, API);
        qRecords.SQL.Text :=
          'update `hairsalon`.`smslink` set `id_sms`=:id, `status_sms`=0 where id_m=:idm and id_cl=:idcl';
        qRecords.ParamByName('id').Value := IDSms;
        qRecords.ParamByName('idm').Value := mtSms.FieldValues['id_m'];
        qRecords.ParamByName('idcl').Value := mtSms.FieldValues['id_cl'];
        qRecords.ExecSQL;
      end; // if (mtSms.FieldValues['status_sms'] = 101) or bIsCheck then
    finally
      inc(i);
      mtSms.Next;
    end; // try
  end; // while not mtSms.Eof do
  mtSms.EnableControls;
end;
Dozent вне форума Ответить с цитированием
Старый 26.11.2013, 00:55   #5
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Код:
procedure TfrmBase.btSendClick(Sender: TObject);
var
  Date, Text, phone, SenderName, API: string;
  IDSms, i, j: integer;
  CheckBookmark, SelectBookmark: TBookmark;
  bIsCheck: Boolean;
begin
  // TODO возможнонадо будет поменять тип для храенения ади смс на варчар
  SenderName := '';
  API := '';

  frmSmsSettings.GetParamsSend(API, SenderName);
  // Получаем параметры для рассылки
  mtSms.DisableControls;
  mtSms.First;
  Text := mtSms.FieldByName('sms_text').AsString;
  Date := mtSms.FieldByName('ustamp').AsString;
  // запоминаем выделеныее строки
  // for i := 0 to gSms.SelectedRows.Count - 1 do
  // CheckBookmark := gSms.SelectedRows[i];

  i := 0;
  while not mtSms.Eof do
  begin
    // получаем ссылку на текущую строку
    SelectBookmark := mtSms.GetBookmark;
    // проходим по выделеным
    for j := 0 to gSms.SelectedRows.Count - 1 do
    begin
      // перебераем массив ссылок на выделеные
      CheckBookmark := gSms.SelectedRows[j];
      { сравниваем если обе ссылаются на одну запись значит всё верно вы находимся
        на выделеной записи }
      if mtSms.CompareBookmarks(SelectBookmark, CheckBookmark) = 1 then  //если закладки различаются
        bIsCheck := False
      else
        bIsCheck := True;
    end;

    try
      if (mtSms.FieldValues['status_sms'] = 101) or bIsCheck then
      begin
        phone := mtSms.FieldByName('phone').AsString;
        IDSms := frmSenderSms.SmsSend(Text, phone, SenderName, API);
        qRecords.SQL.Text :=
          'update `hairsalon`.`smslink` set `id_sms`=:id, `status_sms`=0 where id_m=:idm and id_cl=:idcl';
        qRecords.ParamByName('id').Value := IDSms;
        qRecords.ParamByName('idm').Value := mtSms.FieldValues['id_m'];
        qRecords.ParamByName('idcl').Value := mtSms.FieldValues['id_cl'];
        qRecords.ExecSQL;
      end; // if (mtSms.FieldValues['status_sms'] = 101) or bIsCheck then
    finally
      inc(i);
      mtSms.Next;
    end; // try
  end; // while not mtSms.Eof do
  mtSms.EnableControls;
end;
в ходе трасировки из 4 записей была выделена одна, в цикле проходя таблицу ни букмарка на текущую запись SelectBookmark := mtSms.GetBookmark; не был равно букмарке выделеной записи, почему?)
Код:
    if mtSms.CompareBookmarks(SelectBookmark, CheckBookmark) = 1 then  //если закладки различаются
хоть поидеи они и различаются раз ни одна не равна но всё равно всегда было шло по ветке ELSE bIsCheck := True;
Dozent вне форума Ответить с цитированием
Старый 26.11.2013, 08:51   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, мне очень не нравится ваш цикл в цикле.
я бы переписал алгоритм В КОРНЕ! На крайний случай, ключевое значение поля для выделенных записей грузил куда-нибудь в структуру (да хоть массив или TList) и потом выбирал те поля, где нужный признак (=101) и/или ID есть в нашем списке выделенных строк.

во-вторых, вы сравниваете букмарки в разных датасетах (mtSms и gSms) и удивляетесь, что они не равны друг другу?! А почему они должны быть равны?!

в-третьих, боюсь, что без отладки тут делать нечего. Может быть, Вы можете сделать небольшой ТЕСТОВЫЙ проект?

в-четвёртых, меня терзаю смутные сомнения.
выложенный мною пример работает с выделенными строчками в гриде (см. скриншот).
grid_selected.jpg
а вы пишете об "выделить галками строки". Это что за "галки" ?
уж не идёт ли речь о каком-то дополнительном поле?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.11.2013, 17:08   #7
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Да я тоже об этом задумался, и прищёл к выводу что всётаки букмарки из грида и датасета будут разными)
Чекбоксы от грида
Изображения
Тип файла: jpg TDBGridEh.jpg (52.2 Кб, 35 просмотров)
Dozent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Литература, с которой стоит начать знакомство с программированием. Krivoshter Обсуждение статей 7 18.02.2013 23:46
Проверить выделена ли память под объект Sibedir Общие вопросы Delphi 58 21.03.2011 11:48
Вставка записи, перед которой стоит ноль artemavd БД в Delphi 3 28.06.2010 06:54
Подсветить или покрасить строку в dbgrid, над которой находится курсор Artik БД в Delphi 4 12.06.2009 20:43
Как определить индекс линии Memo, где стоит курсор? yaver Общие вопросы Delphi 2 16.11.2008 17:29