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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2012, 06:22   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Как найти столбец в DBGridEh по заголовку и удалить его?

Доброе утро! Нужно реализовать поиск столбца в DBGridEh по заголовку, которое будет введено в Edit. Это нужно для того, чтобы удалить найденный столбец. Столбцы просто добавляются пользователем, без добавления его в базу данных. Как можно реализовать поиск столбца (получить его индекс чтоли)?

-----------------------------
Добавлено №1:
Вот, нашел как получить номер (индекс) колонки:
Код:
procedure TForm1.DBGridEh1TitleClick(Column: TColumnEh);
begin
 ShowMessage(IntToStr(Column.Index));
end;
Добавлено №2:
Блин, хорошо, когда сам пытаешь думать. Вот, надумал такой поиск (дилетанский, но почти рабочий):
Код:
procedure TForm1.sButton1Click(Sender: TObject);
var
 i: Integer;
begin
 for i := 0 to Form1.DBGridEh1.Columns.Count - 1 do
   begin
     if Form1.DBGridEh1.Columns[i].Title.Caption = Form1.sEdit2.Text then
     begin
       ShowMessage('Колонка найдена!');
     end;
     if Form1.DBGridEh1.Columns[i].Title.Caption <> Form1.sEdit2.Text then
     begin
       ShowMessage('Колонка не найдена!');
     end;
   end;
end;
Если заголовок колонки совпадает с введенным в sEdit2, то сообщение отображается. Косяк в том, что: оба сообщения показываются два раза для двух условий. Можно было и через if...then...else написать конечно, но, оно пока так не совсем правильно работает. Как поправить такой косяк?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 03.05.2012 в 07:05.
artemavd вне форума Ответить с цитированием
Старый 03.05.2012, 07:39   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Круто наваял )))

Вот мое предложение.
Код:
procedure TForm1.sButton1Click(Sender: TObject);
var
 i: Integer;
begin
with Form1.DBGridEh1 do begin
 for i := 0 to Colimns.Count - 1 do   begin
     if Columns[i].Title.Caption = Form1.sEdit2.Text then     begin
       ShowMessage('Колонка найдена!'); break;
     end;
 end;

 if i>=Columns.Count then     begin
       ShowMessage('Колонка не найдена!');
     end;

end;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.05.2012, 07:39   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

artemavd , допустим в гриде 10 колонок, и задали существующий заголовок. Ваш код 1 раз выдаст, что колонка найдена и 9 раз, что не найдена. Перед циклом в булевскую переменную False, в цикле засунуть в неё True если колонка найдена. И после цикла на основании ее значения сообщение выдать

ADD Stilet ну очень не рекомендуется использовать так переменную цикла по завершению его
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 03.05.2012 в 07:41.
Аватар вне форума Ответить с цитированием
Старый 03.05.2012, 07:59   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну ладно ладно... Не рекомендуется
Да здравствует великий и ужасный Булеан - не спорю
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.05.2012, 08:20   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
ADD Stilet ну очень не рекомендуется использовать так переменную цикла по завершению его
согласен.
но я бы уточнил - речь идёт ИСКЛЮЧИТЕЛЬНО про циклы FOR (т.е. где сам компилятор решает как ему удобнее изменять переменную).

если использовать циклы repeat until или while - то переменной после цикла можно пользоваться вполне законно!

хотя я бы тоже завёл дополнительную булевскую переменную и через неё проверял, было ли совпадение...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.05.2012, 10:13   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Хорошо

Цитата:
Круто наваял )))

Про булеву переменную понятно, попробую потом. Пока думал, придумал красивую фишку. Но, с удалением колонки обязательно разберусь. Спасибо за ответы
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 03.05.2012, 10:55   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Для таких хитростей (речь про действие при ненайденности элемента в цикле вообще, а не про гридех) я применял сие:
Код:
for i := 0 to Items.Count do // no - 1 needed
begin
  if i = Items.Count then 
  begin
    // do smth when element not found
    // do not read Items[i] here
    Continue; // end-loop, could be Break;
  end;
  // loop code
  // here we read Items[i]
end;
Ну, а вообще, конечно, repeat while здесь мб и лучше будут выглядеть. Но лишний бульон, думаю, ни к чему.

Последний раз редактировалось phomm; 03.05.2012 в 10:58.
phomm вне форума Ответить с цитированием
Старый 03.05.2012, 11:23   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

Цитата:
Но лишний бульон, думаю, ни к чему.
омг. да чем же Вам всем так boolean не угодил? Размера не занимает (1/2 байта - это не размер), обрабатывается крайне эффективно (думаю, что оптимизатор засунет эту переменную в регистр). Решение получается простое, наглядное и, главное, НАДЁЖНОЕ!
нет, обязательно нужно хакерскими методами задачку решать, по другому никак нельзя!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.05.2012, 12:05   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
хотя я бы тоже завёл дополнительную булевскую переменную и через неё проверял, было ли совпадение...
Цитата:
Но лишний бульон, думаю, ни к чему.
согласен, нам нужно знать какую колонку мы нашли, что бы потом ее удалить. поэтому вместо boolean нашли/нет используем
columnfordelete: intger; индекс колонки для удаления. с начальным значение (ДО ВХОДА в цикл поиска) =-1

Код:
columnfordelete:=-1;
/// ищем 
columnfordelete:=j; break;
////
if columnfordelete>=0 then 
//  Delete
else
//  showmesage
вместо индекса, можно даже использовать colfordel: TColumn; =nil все равно к нему придется обращаться (возможно)!
много времени процессора одно присвоение не займет!
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.05.2012 в 12:12.
evg_m на форуме Ответить с цитированием
Старый 03.05.2012, 13:41   #10
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Ну Continue там не зря ведь стоит, цикл так и пойдёт от макс элемента до нулевого, для макс значения счётчика мы не производим никаких действий над Items[i], а делаем что надо нам, например, запишем в результирующую переменную(которой там кстати место, а не шоумесаджу) нужный результат, потом цикл либо перепишет её своим значением, либо так и останется, потом мы уже согласно этой переменной производим действия, например, тот же шоумессадж который выводит такую переменную текстом, ибо 2 шоумесаджа - имо некрасивый код, полу-функция либо должна вернуть результат вызывающему, либо произвести работу над единственной сущностью. Плюс я расписал приём для общего случая.

Насчёт данного же случая:
нелюбви к булеан-вару у меня нет, я так и сказал, что тут толковее (имо) использовать те же repeat и while, а с ними булеан - ни к чему.

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

Последний раз редактировалось phomm; 03.05.2012 в 13:44.
phomm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как найти окно по заголовку с определенным словом? tozter Общие вопросы Delphi 5 21.12.2011 17:00
Как найти программу по заголовку и закрыть ее? Catsys Общие вопросы Delphi 2 16.09.2011 23:26
Как удалить столбец таблицы средствами VB Kingson Microsoft Office Access 4 08.04.2010 10:46
найти самое короткое слово и удалить его из файла Pihan Помощь студентам 2 18.06.2009 23:03
Как в dbgrideh получить имя поля той колонки, по заголовку которой Вы щелкнули???? zimmion БД в Delphi 4 04.03.2008 15:02