как вытащить данные из TStringGrid и поместить их в форму

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: как вытащить данные из TStringGrid и поместить их в форму

Сообщение Dark Ichigo » 10.06.2009 17:06:39

Представьте себе, как я краснею... :oops: :oops: :oops: :oops: :oops:

Сспасибо!!!

Жалко, нет кармы, я бы вам плюсиков наставил!
Аватара пользователя
Dark Ichigo
новенький
 
Сообщения: 44
Зарегистрирован: 12.03.2009 19:06:51

Re: как вытащить данные из TStringGrid и поместить их в форму

Сообщение Vadim » 10.06.2009 17:16:23

Dark Ichigo писал(а):Жалко, нет кармы, я бы вам плюсиков наставил!

Ну почему же нет? Есть, только у каждого своя и плюсики там можно ставить лишь самому себе. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: как вытащить данные из TStringGrid и поместить их в форму

Сообщение Dark Ichigo » 10.06.2009 17:50:52

боюсь показаться нескромным. в продолжение вопроса, а как извлечь данные из выделенной строки указанным выше способом?
:roll: :roll: :roll: :roll: :roll:
Аватара пользователя
Dark Ichigo
новенький
 
Сообщения: 44
Зарегистрирован: 12.03.2009 19:06:51

Re: как вытащить данные из TStringGrid и поместить их в форму

Сообщение Climber » 11.06.2009 09:43:18

Выделенный диапазон ячеек - это Selection (свойство типа TRect). Соответственно:
Selection.Top - номер строки верхних ячеек в выделенном диапазоне,
Selection.Bottom - номер строки нижних ячеек в выделенном диапазоне, ну и так далее.
То есть что-то вроде такого должно получиться:
Код: Выделить всё
with Form1.StringGrid1 do
redkomnat.ItemIndex:=redkomnat.Items.IndexOf(Cells[Selection.Right, Selection.Top])

P. S. Надеюсь, конструкцию with ... do объяснять не надо...
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: как вытащить данные из TStringGrid и поместить их в форму

Сообщение Dark Ichigo » 15.06.2009 16:18:54

Делаю
Код: Выделить всё
with Form1.StringGrid1 do
redkomnat.ItemIndex:=redkomnat.Items.IndexOf(Cells[1, Selection.Top])

Прим. нужно извлечь данные из первого столбца выделенной строки.

Индекс извлекается, но только из верхней строки.

Selection.Self - не работает
Error: Unknown record field identifier "SELF"
Аватара пользователя
Dark Ichigo
новенький
 
Сообщения: 44
Зарегистрирован: 12.03.2009 19:06:51

Re: как вытащить данные из TStringGrid и поместить их в форму

Сообщение Climber » 16.06.2009 09:21:11

Dark Ichigo писал(а):Прим. нужно извлечь данные из первого столбца выделенной строки.

Первый столбец имеет индекс 0. Вообще в любых массивах, коллекциях и пр. все элементы нумеруются с нуля до (Count-1).
Dark Ichigo писал(а):Индекс извлекается, но только из верхней строки.

Эта строчка непонятна, напиши подробнее...
Dark Ichigo писал(а):Selection.Self - не работает
Оно и не должно работать, в объекте Selection нет свойства Self.
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: как вытащить данные из TStringGrid и поместить их в форму

Сообщение Dark Ichigo » 16.06.2009 16:50:01

Climber писал(а):
Dark Ichigo писал(а):Прим. нужно извлечь данные из первого столбца выделенной строки.

Первый столбец имеет индекс 0. Вообще в любых массивах, коллекциях и пр. все элементы нумеруются с нуля до (Count-1).

Да, я это понимаю.

Climber писал(а):
Dark Ichigo писал(а):Индекс извлекается, но только из верхней строки.

Эта строчка непонятна, напиши подробнее...

Допустим, открывается форма, и в заданном комбобоксе находится значение 1-ого (по индексу)-столбца ( так и должно быть: Cells[1, Selection.Top] ) и первой сверху строки. Я выделяю вторую сверху строку, вызываю снова форму, и в комбобоксе оказывается снова значение из первой верхней строки. Такая вот беда.
Аватара пользователя
Dark Ichigo
новенький
 
Сообщения: 44
Зарегистрирован: 12.03.2009 19:06:51

Re: как вытащить данные из TStringGrid и поместить их в форму

Сообщение Climber » 16.06.2009 17:30:55

Вообще странно, а можно чуть-чуть побольше кода привести?
Если эта строка
Код: Выделить всё
redkomnat.ItemIndex:=redkomnat.Items.IndexOf(Cells[1, Selection.Top])
стоит в функции, которая вызывается только при первом показе окна (например, в обработчике OnCreate), то такое поведение вполне логично. Проверь, эта строчка действительно выполняется каждый раз? Вставь туда ShowMessage(), например, - сразу станет понятно...
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: как вытащить данные из TStringGrid и поместить их в форму

Сообщение Dark Ichigo » 08.07.2009 16:20:52

Climber писал(а):Вообще странно, а можно чуть-чуть побольше кода привести?
Если эта строка
Код: Выделить всё
redkomnat.ItemIndex:=redkomnat.Items.IndexOf(Cells[1, Selection.Top])
стоит в функции, которая вызывается только при первом показе окна (например, в обработчике OnCreate), то такое поведение вполне логично.


В чём логика? Если Select.Top - номер выделенной строки, значит, если я выбираю 5-ую строку, то будет извлекаться значение из 5-ой строки, но никак не из первой.

Проверял следующим образом:

1. Добавлял новые строки сверху с другими значениями в пером столбце. Снова извлекается значение верхней, но не выбранной, строки.

2. Подставлял в формулу
Код: Выделить всё
redkomnat.ItemIndex:=redkomnat.Items.IndexOf(Cells[1, Selection.Top])
вместо Selection.Top цифру номера произвольной строки - всё выполняется идеально, значение извлекается из нужной строки.

Вывод: Почему-то Selection.Top не хочет определять номера выделенной строки.

Привожу полный код юнита:

Код: Выделить всё
unit Unit6;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls;

type

  { TForm6 }

  TForm6 = class(TForm)
    dbladress: TEdit;
    cancel: TButton;
    dblCBcompany: TComboBox;
    dblCBcontact1: TComboBox;
    dblCBcontact2: TComboBox;
    dblCBgk: TComboBox;
    dblCBplan: TComboBox;
    dblCBregion: TComboBox;
    dblCBseria: TComboBox;
    dblCBtype: TComboBox;
    dbldom: TEdit;
    dbldopoln: TEdit;
    dbletazh: TEdit;
    dbletazhnost: TEdit;
    dblinfra: TEdit;
    kolznakov: TLabel;
    dblkomnat: TComboBox;
    dblkorpus: TEdit;
    Label1: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label2: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    Label23: TLabel;
    Label24: TLabel;
    Label25: TLabel;
    Label26: TLabel;
    Label27: TLabel;
    Label28: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    dblmetro: TComboBox;
    dblmetrotime: TEdit;
    dblnaspunkt: TEdit;
    ok: TButton;
    dblprice: TEdit;
    dblraion: TComboBox;
    dblresultat: TMemo;
    save: TButton;
    dblsj: TEdit;
    dblsk: TEdit;
    dblso: TEdit;
    dblspecial: TEdit;
    dblstreet: TComboBox;
    dblstroenie: TEdit;
    dbltransport: TComboBox;
    dblvladenie: TEdit;
    dblvnutr: TEdit;
    procedure cancelClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form6: TForm6;

implementation

uses Unit1;

{ TForm6 }

procedure TForm6.FormCreate(Sender: TObject);
begin
  with Form1.StringGrid1 do
  redkomnat.ItemIndex:=redkomnat.Items.IndexOf(Cells[1, Selection.Top]);
end;



initialization
  {$I unit6.lrs}

end.




Соответственно, в Unit1 находится StringGrid.
Unit6 вызывается с помощью Form6.Visible:=true; (может быть, в этом моя ошибка...)
Аватара пользователя
Dark Ichigo
новенький
 
Сообщения: 44
Зарегистрирован: 12.03.2009 19:06:51

Re: как вытащить данные из TStringGrid и поместить их в форму

Сообщение Climber » 09.07.2009 16:39:51

Ну натурально, именно то, о чем я и говорил.
Что тут происходит. Идешь в меню Проект - Посмотреть исходный код проекта.
Там тебе откроется что-то типа:
Код: Выделить всё
program project1;
uses  {далее список модулей};
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, TForm2);
  Application.CreateForm(TForm3, TForm3);
  ... // Смотря сколько форм в проекте
  Application.Run;
end.

Если Form6 тоже там, то это значит вот что: все эти строки, означающие создание форм, выполняются в самом начале программы. Обработчик OnCreate выполняется тогда же, то есть всего один раз за все время работы программы. При создании формы с StringGrid'ом по умолчанию в гриде выделенной строкой является первая (если нулевая серая, то есть фиксированная). Так что когда дело доходит до обработчика событий, он берет первую строку и вставляет ее в комбобокс. И происходит это когда форма создается в начале программы. Когда выполняется Form6.Visible:=true; обработчик события не вызывается, поэтому в комбобоксе просто остается старое значение.
Что делать: Перенести строчку
Код: Выделить всё
redkomnat.ItemIndex:=redkomnat.Items.IndexOf(Cells[1, Selection.Top])
из обработчика OnCreate в обработчик OnShow. Форму показывать через Form6.Show; (вызовет ли Form6.Visible:=true; событие OnShow я не знаю, а проверять лень).

P. S. Неделю назад ты вроде самолет строил, а теперь уже космолет? :wink:
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: как вытащить данные из TStringGrid и поместить их в форму

Сообщение Dark Ichigo » 16.07.2009 13:55:08

не. я с самого начала космолёт строю. :D

сенки большие тебе, о добрейший Climber. всё получилось.

Код: Выделить всё
procedure TForm6.FormShow(Sender: TObject);
begin
  with Form1.StringGrid1 do
  redkomnat.ItemIndex:=redkomnat.Items.IndexOf(Cells[1, Selection.Top]);
end;


А в первом юните оставил как есть:
Код: Выделить всё
  Form6.Visible:=true;


не могу выразить, как я счастлив.
Аватара пользователя
Dark Ichigo
новенький
 
Сообщения: 44
Зарегистрирован: 12.03.2009 19:06:51

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32

Рейтинг@Mail.ru