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

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

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

Аватара пользователя
Dark Ichigo
новенький
Сообщения: 44
Зарегистрирован: 12.03.2009 18:06:51
Контактная информация:

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

Сообщение Dark Ichigo »

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

Например, есть форма TForm6 с комбобоксом с готовыми значениями (от 1 до 5).
Есть таблица TForm1.StringGrid1, где в ячейке [1,1] стоит значение 3.

Я пытаюсь вывести это значение в комбобокс:

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

unit Unit6; 

{$mode objfpc}{$H+}

interface

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

type

  { TForm6 }

  TForm6 = class(TForm)
    redkomnat: TComboBox;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form6: TForm6;

implementation

uses Unit1;

{ TForm6 }

procedure TForm6.FormCreate(Sender: TObject);
begin

  redkomnat.ItemIndex:=Form1.StringGrid1.Cells[1,1];

end;

initialization
  {$I unit6.lrs}

end. 


Лазарь мне пишет:

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

unit6.pas(36,52) Error: Incompatible type for arg no. 1: Got "AnsiString", expected "LongInt"
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

.... жесть ....

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

...
redkomnat.ItemIndex:=StrToInt(Form1.StringGrid1.Cells[1,1]);
...


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

Сообщение Vadim »

Какой ужас!!!
TComboBox.ItemIndex - это текущий номер той строки, которая выбрана в комбобоксе.
Вы пытаетесь выбрать номер строки согласно тому значению, которое находится в ячейке таблицы Cells[1,1] или всё таки хотите занести значение из таблицы в комбобокс? Сформулируйте по человечески вопрос...
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

Я пытаюсь вывести это значение в комбобокс:

Правильный ответ -redkomnat.Text:=Form1.StringGrid1.Cells[1,1];
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Climber писал(а):
Я пытаюсь вывести это значение в комбобокс:

Правильный ответ -redkomnat.Text:=Form1.StringGrid1.Cells[1,1];

а если почитать внимательней?
Dark Ichigo писал(а):...
Например, есть форма TForm6 с комбобоксом с готовыми значениями (от 1 до 5).
Есть таблица TForm1.StringGrid1, где в ячейке [1,1] стоит значение 3.

Я пытаюсь вывести это значение в комбобокс:
...
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

а если почитать внимательней?

Я понял это
Например, есть форма TForm6 с комбобоксом с готовыми значениями (от 1 до 5).
Есть таблица TForm1.StringGrid1, где в ячейке [1,1] стоит значение 3.
Я пытаюсь вывести это значение в комбобокс:

так: на форме TForm6 есть комбобокс с циферками от 1 до 5. В сетке в какой-то ячейке стоит циферка 3. Надо циферку 3 вставить в комбобокс. Тогда мой ответ правильный.
А если автор имел ввиду, что в комбобоксе есть пять каких-то неведомых строк (которые, как он считает, имеют номера от 1 до 5, а на самом деле от 0 до 4), и ему надо взять из сетки число, а потом в комбобоксе вывести строку с этим номером... Так вот, если автор это имел ввиду, то почему он так не написал?
Тогда ответ будет:

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

redkomnat.ItemIndex:=StrToInt(Form1.StringGrid1.Cells[1,1]-1;

А еще лучше, если не StrToInt, а TryStrToInt. Но это много строчек писать надо.
Аватара пользователя
Dark Ichigo
новенький
Сообщения: 44
Зарегистрирован: 12.03.2009 18:06:51
Контактная информация:

Сообщение Dark Ichigo »

Итоговый код такой:

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

redkomnat.ItemIndex:=StrToInt(Form1.StringGrid1.Cells[1,1]-1;

Так как комбобоксе есть пять значений. Соответственно
индекс 0 это 1
1 - 2
2 - 3
3 - 4
4 - 5.

Спасибо, Mr.Smart и Climber.

По поводу
п.с. Вы вообще читаете, что пишет компилятор?

Читаю, но не всегда понимаю, как с этим правильно поступать.

Добавлено спустя 20 минут 16 секунд:
Ещё хотел спросить, а если это не числовые данные, а длинющий список слов? И, допустим, в ячейке [1,1] находится слово "молоко", а в комбобоксе слово "молоко" имеет индекс 89.

Мне присваиваить индекс "молоку"? И так каждому слову?

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

if Form1.StringGrid1.Cells[1,1]='молоко' then
redkomnat.ItemIndex:=89;
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Зачем же.
У вас свойтство TComboBox.Items имеет тип TStrings, а у класса TStrings есть метод IndexOf() который возвращает позицию строки в списке.

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

redkomnat.ItemIndex:=redkomnat.Items.IndexOf(StringGrid1.Cells[1,1]);
Аватара пользователя
Dark Ichigo
новенький
Сообщения: 44
Зарегистрирован: 12.03.2009 18:06:51
Контактная информация:

Сообщение Dark Ichigo »

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

redkomnat.ItemIndex:=redkomnat.Items.IndexOf(TForm1.StringGrid1.Cells[1,1]);


Не хочет так работать. Пишет:
Error: Only class methods can be referred with class references
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Dark Ichigo

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

ComboBox1.ItemIndex:=ComboBox1.Items.IndexOf(StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]);

Работает так, что уши заворачиваются. :) Наверное Вы куда-то не туда смотрите.
Аватара пользователя
Dark Ichigo
новенький
Сообщения: 44
Зарегистрирован: 12.03.2009 18:06:51
Контактная информация:

Сообщение Dark Ichigo »

А можно Ваш пример? Возможно, я так быстрее пойму, где сидит эррор.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Dark Ichigo писал(а):А можно Ваш пример? Возможно, я так быстрее пойму, где сидит эррор.

У вас ошибка не на этой строке!

Весь код в студию!
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Dark Ichigo писал(а):А можно Ваш пример?

Постом выше я как раз его и привёл. ;) Событию DblClick StringGrida назначена именно эта строка, больше там ничего нет. Видимо рассматривать надо всё таки Ваш код, т.к. в моём ничего интересного нет. :)
Аватара пользователя
Alexx2000
постоялец
Сообщения: 490
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи
Контактная информация:

Сообщение Alexx2000 »

Dark Ichigo писал(а):

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

redkomnat.ItemIndex:=redkomnat.Items.IndexOf(TForm1.StringGrid1.Cells[1,1]);


Не хочет так работать. Пишет:
Error: Only class methods can be referred with class references

Может все-таки Form1.StringGrid1.Cells[1,1], а не TForm1.StringGrid1.Cells[1,1]
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Alexx2000 писал(а):Может все-таки Form1.StringGrid1.Cells[1,1], а не TForm1.StringGrid1.Cells[1,1]

Блин как заметил :shock: я раза четыре просматривал :oops:
Ответить