fredi5
|
|
« : 02-12-2008 21:51 » |
|
Здравствуйте все. Подскажите. Есть StringGrisd из 500 строк, с метками на определенных строках. Как мне по метке вывести, соответствующую строку, первой в окне просмотра.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #1 : 03-12-2008 21:17 » |
|
Можно добавить столбец и задать ему нулевую ширину. В этом столбце расположить данные, по которым будет производится сортировка. Идея такая.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
fredi5
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #7 : 14-12-2008 04:47 » |
|
Кажется, даже это не формулировка... Как-то все проще должно быть, только непонятно, как именно.
|
|
|
Записан
|
почувствуй радость творческих мук!
|
|
|
zubr
Гость
|
|
« Ответ #8 : 14-12-2008 07:23 » |
|
SEA, это ты о чем?
|
|
|
Записан
|
|
|
|
fredi5
|
|
« Ответ #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
|
|
« Ответ #11 : 14-12-2008 21:13 » |
|
Отрицательный результат - тоже результат. В коде большой вопрос про судьбу данных. Они, как и должно быть, пропадают. А в таблицу выводится или 5 строк ( с данными 001,002...005) или количество срабатываний счетчика ( 5), в зависимости от отношения величины адреса диапазона.
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #12 : 15-12-2008 00:22 » |
|
Покажи твой код.
|
|
|
Записан
|
|
|
|
fredi5
|
|
« Ответ #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
|
|
« Ответ #16 : 15-12-2008 12:16 » |
|
Из кода убрал автоформат колонок, чтобы не мешал. Файл урезан, но работает так-же.
|
psp.txt (5.96 Кб - загружено 1214 раз.)
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #17 : 15-12-2008 17:00 » |
|
fredi5, какие проблемы? Смотри мой пост №15 и предыдущие посты и делай. Это тебе домашнее задание. Все очень просто. Не надо никаких дополнительных текстовых файлов и дополнительных StringGrid.
|
|
|
Записан
|
|
|
|
|