Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: поиск в StringGrid  (Прочитано 25246 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
fredi5
Участник

ru
Offline Offline
Пол: Мужской

« : 02-12-2008 21:51 » 

Здравствуйте все.
Подскажите. Есть StringGrisd из 500 строк, с метками на определенных строках.
Как мне по метке вывести, соответствующую строку, первой в окне просмотра.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 03-12-2008 21:17 » 

Можно добавить столбец и задать ему нулевую ширину. В этом столбце расположить данные, по которым будет производится сортировка. Идея такая.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
fredi5
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 13-12-2008 19:07 » 

Я не  совсем точно указал задачу. Первоначально в StringGrid из txt-файла загружается вся таблица.
Потом в обработчике события нажатия кнопки выдается команда на вывод данных от метки "Х" до метки "Y".
Прочитал много про сортировку, но ничего нужного не обнаружил. Нужно как-то или очистить таблицу ДО и
ПОСЛЕ меток, или перенести выделенный диапазон строк в другой StringGrid. Подскажите плз. хоть
направление, в котором есть нужное решение. Про код и не заикаюсь...  Возможно, через какое-то время
я и сам смогу решать подобные задачи. Но сейчас, как и многие здесь, черпаю знания из конференций.
Записан
zubr
Гость
« Ответ #3 : 13-12-2008 22:05 » 

1. Перенос строк от X до Y в начало таблицы:
Код:
For i:=0 to Y-X do
StringGrid1.Rows[i].Assign(StringGrid1.Rows[i+X] );
2. Урезание таблицы до количества строк Y-X+1:
Код:
StringGrid1.RowCount := Y-X+1;
Записан
fredi5
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 13-12-2008 23:24 » 

Присваиваю переменным числовые значения меток. Не фурычит, ругается..
" For loop control variable must have ordinal type "

    procedure TForm1.Button2Click(Sender: TObject);
 var  Y , X, i  : string ;
 begin
Y := '005' ;
X := '004' ;
 For i:= 0 to Y-X do
StringGrid1.Rows.Assign(StringGrid1.Rows[i+X] );
end;
И при урезании таблицы тоже ругает.
Записан
SEA
Помогающий

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 14-12-2008 00:02 » 

Во первых, Чего это ты ассигнешь Массив Rows с элементом этого массива? Тут точно будет материться.
Во вторых -
var Y,X,I: string; !!!! Ты что! Они должны быть integer;
Цикл не работает, присваивание не работает...
Записан

почувствуй радость творческих мук!
zubr
Гость
« Ответ #6 : 14-12-2008 00:28 » 

1.
Код:
StringGrid1.Rows[i].Assign(StringGrid1.Rows[i+X]);
и
Код:
StringGrid1.Rows.Assign(StringGrid1.Rows[i+X]); 
это 2 большие разницы, как говорят в Одессе.
2. Исходя из твоего описания, я понял, что метки - это индексы строк, а не какие то текстовые значения. Подставлять вместо индексов строки - это конечно грубейшая ошибка. Надо бы почитать учебник по паскалю. В твоем случае, надо определить индексы строк соответствующих меткам и уже в код подставлять не значения меток а индексы.
« Последнее редактирование: 14-12-2008 00:36 от zubr » Записан
SEA
Помогающий

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 14-12-2008 04:47 » 

Кажется, даже это не формулировка... Как-то все проще должно быть, только непонятно, как именно.
Записан

почувствуй радость творческих мук!
zubr
Гость
« Ответ #8 : 14-12-2008 07:23 » 

SEA, это ты о чем?
Записан
fredi5
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 14-12-2008 15:32 » 

Метки "004, 005" это и есть текстовые значения, расположенные на пустых строках в 1 колонке. Чую, что, наверно, придется методом поиска строк по метке "сверху - вниз" определять номера нужных
строк. А потом, известный диапазон строк сохранить в txt-file и из него ввести во второй StringGrid.
Это должно сработать, но, уж, как-то "громоздко" получается. Неужели нет более простого варианта7
Записан
zubr
Гость
« Ответ #10 : 14-12-2008 18:05 » 

Зачем так сложно? Я же тебе уже дал направление к действиям. Вот все что тебе нужно:
Код:
const
  minDiap: Integer = 5;
  maxDiap: Integer = 105;

procedure TForm1.Button1Click(Sender: TObject);
var
  i, counter, number:Integer;
begin
 counter := 0;
 For i:=0 to StringGrid1.RowCount-1 do
 begin
  number := StrToIntDef(StringGrid1.Cells[0, i], -1);
  If (number <> -1) and (number >= minDiap) and (number <= maxDiap) then
  begin
   StringGrid1.Rows[counter].Assign(StringGrid1.Rows[i]);
   inc(counter);
  end
  else
  If number > maxDiap then
  break;
 end;
 If counter > 0 then
 StringGrid1.RowCount := counter;
end;
Записан
fredi5
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 14-12-2008 21:13 » 

Отрицательный результат - тоже результат. В коде большой вопрос про судьбу данных. Они, как и
должно быть, пропадают. А в таблицу выводится или 5 строк ( с данными 001,002...005) или количество
срабатываний счетчика ( 5), в зависимости от отношения величины адреса диапазона.
Записан
zubr
Гость
« Ответ #12 : 15-12-2008 00:22 » 

Покажи твой код.
Записан
fredi5
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 15-12-2008 09:15 » 

Код:
 //чтение текста в грид
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
   f: textfile;
   temp, x, y: integer;
   tempstr: string;
 // вводится текстовый файл, импортированный из таблицы  Excel
begin
 assignfile(f, 'c:\psp.txt');
   reset(f);
   readln(f, temp);
   stringgrid1.colcount := temp;
   readln(f, temp);
   stringgrid1.rowcount := temp;
   for X := 0 to stringgrid1.colcount - 1 do
      for y := 0 to stringgrid1.rowcount - 1 do
         begin
         readln(F, tempstr);
         stringgrid1.cells[x, y] := tempstr;
   end;
   closefile(f);
end;
   // Все данные прекрасно вывелись. В таблице в пустых строках,
   // в разных местах, в первой колонке,  метки 10, 20, 30, 40....

procedure TForm1.Button2Click(Sender: TObject);
  var
    i, counter, number:Integer;
 // minDiap, maxDiap поместил в переменные т.к. в зависимости
 // от области таблицы, которую нужно вывести, им будут присваиваться
 // разные значения
   maxDiap, minDiap: Integer;
begin
  // Здесь указывается диапазон вывода существующих строк данных
  // согласно указанным меткам. Вывести строки от метки 20 до метки 30
 minDiap := 20;
 maxDiap := 30;
  //-------------------------------------------
  counter := 0;
 For i:=0 to StringGrid1.RowCount-1 do
 begin
  number := StrToIntDef(StringGrid1.Cells[0, i], -1);
  If (number <> -1) and (number >= minDiap) and (number <= maxDiap) then
  begin
   StringGrid1.Rows[counter].Assign(StringGrid1.Rows[i]);
   inc(counter);
  end
  else
  If number > maxDiap then
  break;
 end;
 If counter > 0 then
 StringGrid1.RowCount := counter;
end;
  // Итог. Данных нет. Выведены 2 строки с индексом меток (20 и 30)
end.
« Последнее редактирование: 15-12-2008 09:28 от zubr » Записан
zubr
Гость
« Ответ #14 : 15-12-2008 10:19 » 

fredi5
1. На будущее обрамляй код тегами код.
2. Высылай свой текстовый файл
Записан
zubr
Гость
« Ответ #15 : 15-12-2008 10:46 » 

fredi5, сдается мне, у тебя всего только 2 строки с данными метками и есть. Если так, то перебирай все строки, определишь индексы строк с метками и затем уже как я тебе еще в посте №3 показывал делай.
Записан
fredi5
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 15-12-2008 12:16 » 

Из кода убрал автоформат колонок, чтобы не мешал. Файл урезан, но работает так-же.

* psp.txt (5.96 Кб - загружено 1215 раз.)
Записан
zubr
Гость
« Ответ #17 : 15-12-2008 17:00 » new

fredi5, какие проблемы? Смотри мой пост №15 и предыдущие посты и делай. Это тебе домашнее задание. Все очень просто. Не надо никаких дополнительных текстовых файлов и дополнительных StringGrid.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines