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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2009, 23:10   #1
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию Сортировка в TMS TAdvStringGrid

Пытаюсь отсортировать столбец по алфавиту:

Код:
procedure TForm1.AdvStringGridGetFormat(Sender: TObject; ACol: Integer;
  var AStyle: TSortStyle; var aPrefix, aSuffix: String);
begin
  case ACol of
  1: AStyle := ssAlphaNumeric;
  end;
end;
В событии онклик кнопки пишу:

Код:
        AdvStringGrid.SortIndexes.Clear;
        AdvStringGrid.SortIndexes.AddIndex(0,true);
        mAdvStringGrid.QSortIndexed;
Происходит сортировка 0-й колонки, в которой могут быть как и цифры таи и буквы (ssAlphaNumeric). И хоть убейте цифры и АНГЛИЙСКИЕ буквы сортирует, а вот русские не хочет! Это нормально?
Я бы изменил мир, но Бог не дает исходники...
Polotenchik вне форума Ответить с цитированием
Старый 24.07.2009, 08:50   #2
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

А если так написать, то сортируется.

Код:
  Grid1.SortIndexes.AddIndex(-1, true);
Баламут вне форума Ответить с цитированием
Старый 24.07.2009, 13:29   #3
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

Цитата:
Сообщение от Баламут Посмотреть сообщение
А если так написать, то сортируется.

Код:
  Grid1.SortIndexes.AddIndex(-1, true);
нет конечно! Ведь -1 столбца нету.

P.S Заменил:

Код:
1: AStyle := ssAlphaNumeric;
на

ssAnsiAlphaCase

вроде заработало...
Я бы изменил мир, но Бог не дает исходники...

Последний раз редактировалось Polotenchik; 24.07.2009 в 19:11.
Polotenchik вне форума Ответить с цитированием
Старый 27.07.2009, 01:58   #4
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

И тем не менее, я по-прежнему утверждаю, что приведенный мной код был полностью работоспособен. По крайней мере в Д2009 я это лично проверял. Почему - это уже другой вопрос.
Баламут вне форума Ответить с цитированием
Старый 27.07.2009, 10:50   #5
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

Цитата:
Сообщение от Баламут Посмотреть сообщение
И тем не менее, я по-прежнему утверждаю, что приведенный мной код был полностью работоспособен. По крайней мере в Д2009 я это лично проверял. Почему - это уже другой вопрос.
Хм. Странно! попробую еще тогда...
Я бы изменил мир, но Бог не дает исходники...
Polotenchik вне форума Ответить с цитированием
Старый 29.07.2009, 22:32   #6
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

Баламут, а не поможете с одной еще проблемой?
тут вот в чем дело. Пытаюсь реализовать поиск. Вроде как все просто, но мне надо, что бы после каждого нажатия на кнопку он продолжал искать дальше:

Код:
grid.FindCol:=1;
grid.Find(grid.FindNext,Edit1.Text,[fnFindInPresetCol, fnMatchRegular , fnAutoGoto]);
Это в онклик кнопки. В Edit то что надо найти.
grid.FindNext - в надежде что это решит мою проблему, а так можно написать просто Point(-1,-1).

fnAutoGoto - выделять ячейку
fnFindInPresetCol - искать в определенной колонки: grid.FindCol:=1;
fnMatchRegular - метод поиска, но суть его не понял. Например fnMatchFull ищет именно всю запись целиком.

На самом деле проблемы две:
1. Нажимаю на кнопку он находит, но при повторном нажатии на кнопку он не хочет искать дальше.

2. если например забито в ячейки "Привет" и я ищу слово Привет то находит, но если забито "Привет как дела" и я ищу опять же слово привет то не находит.

В общем мне надо, что бы искал по всем ячейкам любые слова, части слов и т.д. Т.е написал При в поиске и он нашел... Ну Вы поняли. Как в блокноте. Убил куча времени, но так и не смог сделать. Помогите пожалуйста.

Заранее большое спасибо!

P.S Пример с поиском в доке (может он чем-то поможет):

Код:
var 
  Loc: TPoint; 
  Fp: TFindParams; 
begin 
  Loc := Point(-1,-1); 
  Fp := [fnMatchRegular, fnAutoGoto]; 
  repeat 
    Loc := Grid.Find(loc, ‘A*’,fp); 
    if not ((loc.X = -1) or (loc.Y = -1)) then 
      ShowMessage(‘Text found at : ‘+IntToStr(loc.x)+’:’+IntToStr(loc.y)); 
  until (loc.X = -1) or (loc.Y = -1); 
 
  ShowMessage(‘No more occurrences of text found’); 
end;
Я бы изменил мир, но Бог не дает исходники...

Последний раз редактировалось Polotenchik; 29.07.2009 в 22:34.
Polotenchik вне форума Ответить с цитированием
Старый 30.07.2009, 02:43   #7
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Вот если честно, то мне совсем не хочется разбираться с методами компонента уже по той простой причине, что написать свой метод поиска не составляет абсолютно никакого труда (и лень меня одолела ). В привенном ниже коде не предусмотрена ситуация, когда в гриде ничего не найдено. Да и ищет ф-ия с учетом регистра. Но, думаю, исправить ситуацию тебе не составит большого труда. Тут уже есть куча вариантов. Ну не люблю я давать полностью готовых решений.
Код:
.................................
  private
    aRow, aCol: integer;
    function FindText(Text: string): string;

...................................
function TForm1.FindText(Text: string): string;
var
  Row, Col: integer;
begin
  if aCol = Grid1.ColCount  then aCol := 0;
  if aRow = Grid1.RowCount  then aRow := 0;
  for col := aCol to Grid1.ColCount - 1 do
  begin
    for row := aRow to Grid1.RowCount - 1 do
    begin
      if Pos(Text, Grid1.Cells[Col, Row]) > 0
      then begin
        aRow := Row + 1;
        Result := Grid1.Cells[Col, Row];
        Exit;
      end;
    end;
  end;
end;

Последний раз редактировалось Баламут; 30.07.2009 в 02:47.
Баламут вне форума Ответить с цитированием
Старый 03.08.2009, 13:22   #8
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

Баламут, спасибо код помог. сделал так (в событии онклик кнопки):

Код:
  for row := fRow to main.RowCount - 1 do
  begin
    if Pos(AnsiUpperCase(sEdit1.Text), AnsiUpperCase(main.Cells[1, Row])) > 0 then
      begin
        fRow := Row + 1;
        main.SelectRows(Row,1);
        Form1.Caption:=main.Cells[1, row]; //чисто для проверки
        break;
      end
    else
    begin
      fRow := 1;
    end;
  end;
Код:
if aRow = Grid1.RowCount  then aRow := 0;
- не правильно, так как цикл может и не дойти до Grid1.RowCount.

Все работает, но есть одна проблемка: вот например в гриде такой вот список:

привет
как дела
шапка
жук

набираю я в поиске букву а и жму кнопку, он выделяет мне сперва как дела, потом жму еще раз кнопку и он переходит на шапка, так как в них есть буква а. Теперь когда я жму еще раз кнопку он опять остается на слове шапка и только после следующего нажатия начинает поиск сначала. Т.е один клик выходит лишний и я в принципе понимаю почему, но как поправить не знаю.
Я бы изменил мир, но Бог не дает исходники...

Последний раз редактировалось Polotenchik; 03.08.2009 в 13:26.
Polotenchik вне форума Ответить с цитированием
Старый 04.08.2009, 03:58   #9
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Вот так должно все работать
Код:
var
  Row: integer;
begin
  Row := 0;
  repeat
   if FRow = main.RowCount then FRow := 0;
   if Pos(AnsiUpperCase(sEdit1.Text), AnsiUpperCase(main.Cells[1, FRow])) > 0 then
   begin
    main.SelectRows(FRow,1);
    fRow := FRow + 1;
    break;
   end;
   FRow := FRow + 1;
   Inc(Row);
   if Row = Main.RowCount then break;
  until false;
end

Последний раз редактировалось Баламут; 04.08.2009 в 04:16.
Баламут вне форума Ответить с цитированием
Старый 06.08.2009, 14:22   #10
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

СПАСИБО БОЛЬШОЕ!
Я бы изменил мир, но Бог не дает исходники...
Polotenchik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка файлов в Explorer vs сортировка в Delphi mutabor Общие вопросы Delphi 11 04.09.2009 14:32
Замена компоненту TMS TAdvStringGrid Polotenchik Компоненты Delphi 0 03.07.2009 16:22
TMS Components Pack платный?! Polotenchik Компоненты Delphi 17 01.07.2009 01:09
Связать 2 таблицы AdvStringGrid компанента TMS Component Pack Polotenchik Компоненты Delphi 3 27.06.2009 00:47
TMS Component Pack Gromsky Общие вопросы C/C++ 0 16.04.2009 15:23