Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/55: Рейтинг темы: голосов - 55, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87

Динамическое создание StringGrid

23.02.2013, 21:36. Показов 11757. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Я создаю Stringgrid динамически. Создалось. Хочу написать проверку вводимых символов на ячейки матрицы. Но выдает ошибку типа, нигде не объявлена StringGrid1KeyPress. Я так понял дело в имени StringGrid(а), так как он объявляется как бы динамически и нигде до этого в коде не был идентифицирован...
В общем помогите с обработчиком и подскажите как дальше работать с StringGrid после создания? (Запись в массив например)
Ах да, я думаю StringGrid1.goEditing:=True; - разрешить редактировать ячейки написать тоже стоит но ругается на строчке... случаем Options не надо писать?
Вот обработчик:

Delphi
1
2
3
4
5
6
7
8
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  Case key of
  #8 :;
  '0'..'9' :;
  else key:=Chr(0);
  end;
end;
Создание StringGrid:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
procedure TForm1.Button2Click(Sender: TObject);   //Компонент StringGrid создается динамически
var StringGrid1: TStringGrid;
n,m: byte;
 
begin
  n:=StrToInt(Edit2.Text);
  m:=StrToInt(Edit3.Text);
  StringGrid1:=TStringGrid.Create(Form1);
  StringGrid1.Parent:=Form1;
  StringGrid1.Left:=4;
  StringGrid1.Top:=176;
  StringGrid1.FixedCols:=0;
  StringGrid1.FixedRows:=0;
  StringGrid1.DefaultColWidth:=50;
  StringGrid1.ColCount:=m;
  StringGrid1.RowCount:=n;
  StringGrid1.DefaultRowHeight:=24;
  StringGrid1.DefaultRowHeight:=24;
  Case m of                             
  5: StringGrid1.Width:=50*m+8;       
  4: StringGrid1.Width:=50*m+7;
  3: StringGrid1.Width:=50*m+6;
  2: StringGrid1.Width:=50*m+5;
  end;
  Case n of
  5: StringGrid1.Height:=24*n+8;
  4: StringGrid1.Height:=24*n+7;
  3: StringGrid1.Height:=24*n+6;
  2: StringGrid1.Height:=24*n+5;
  end;
end;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.02.2013, 21:36
Ответы с готовыми решениями:

Динамическое создание StringGrid
Привет всем! Помогите решить такую задачу. Имеется один ComboBox, нужно чтобы при выборе к примеру первой записи создалась таблица...

StringGrid динамическое суммирование ячеек
Доброго времени суток. Описание: есть StringGrid, колонка "сумма"(заполняется пользователем). Ячейка "Всего" реагирует на...

Динамическое удаление строк из StringGrid
Добрый день. подскажите как можно удалить сразу несколько выделенных строк в stringrid. Одну строку удаляю ...

23
Пишу на Delphi...иногда
 Аватар для cotseec
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
23.02.2013, 21:48
в процессе создания назначьте обработчик
Delphi
1
2
...
   StringGrid1.OnKeyPress:=StringGrid1KeyPress;
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
23.02.2013, 21:49
Delphi
1
StringGrid1.OnKeyPress := StringGrid1KeyPress;
Delphi
1
StringGrid1.Options := StringGrid1.Options + [goEditing];
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
23.02.2013, 21:50
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type
  TForm1 = class(TForm)
  // ...
  private
    { Private declarations }
    procedure GridKeyPress(Sender: TObject; var Key: Char); // Добавляешь заголовок процедуры сюда
  public
    { Public declarations }
  end;
 
procedure TForm1.GridKeyPress(Sender: TObject; var Key: Char);
begin
  Case key of
  #8, '0'..'9' :;
  else key:=Chr(0);
  end;
end;
 
// ...
with TStringGrid.Create(Form1) do
begin
   Parent := Form1;
   Options := Options + [goEditing];
   // и так далее, все остальные свойства. Не надо даже описывать переменную типа TStringGrid
end.
0
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87
23.02.2013, 22:02  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type
  TForm1 = class(TForm)
  // ...
  private
    { Private declarations }
    procedure GridKeyPress(Sender: TObject; var Key: Char); // Добавляешь заголовок процедуры сюда
  public
    { Public declarations }
  end;
 
procedure TForm1.GridKeyPress(Sender: TObject; var Key: Char);
begin
  Case key of
  #8, '0'..'9' :;
  else key:=Chr(0);
  end;
end;
 
// ...
with TStringGrid.Create(Form1) do
begin
   Parent := Form1;
   Options := Options + [goEditing];
   // и так далее, все остальные свойства. Не надо даже описывать переменную типа TStringGrid
end.
на обработчик не ругается, а вот with и дальше начинает, прошу сделайте с блоком var под мой кодик, так как мне надо еще описывать 2 переменные. И как дальше работать с таким StringGrid(ом)? его имя... как к нему обратиться?
0
Пишу на Delphi...иногда
 Аватар для cotseec
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
23.02.2013, 22:04
Цитата Сообщение от kingass Посмотреть сообщение
как к нему обратиться
посмотри у меня в блоге, как раз такой случай
0
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87
23.02.2013, 22:41  [ТС]
Стараюсь сделать но ругается на With пишет:
Declaration expected but 'WITH' found
И если по Вашему способу то как объявить 2 моих переменные? остается глобально?
p.s. Прошу, сделайте под мой код мне завтра сдавать хотел бы по проще...
Или полностью запишите Ваш способ, не могу ничего сообразить..
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
23.02.2013, 22:48
Цитата Сообщение от kingass Посмотреть сообщение
мне надо еще описывать 2 переменные
Да хоть три:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
procedure TForm1.GridKeyPress(Sender: TObject; var Key: Char); // Вот это у тебя уже должно было быть !!!
begin
  Case key of
  #8, '0'..'9' :;
  else key:=Chr(0);
  end;
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var n, m : Integer;
begin
  n:=StrToInt(Edit2.Text);
  m:=StrToInt(Edit3.Text);
  with TStringGrid.Create(Self) do
  begin
    Parent := Self;
    Name := 'myStringGrid'; // Вот по этому имени и будешь обращаться...
    Options := Options + [goEditing];
    Left:=4;
    Top:=176;
    FixedCols:=0;
    FixedRows:=0;
    DefaultColWidth:=50;
    ColCount:=m;
    RowCount:=n;
    DefaultRowHeight:=24;
    DefaultRowHeight:=24;
    Width := 50*m + (3 + m);
    Height := 24*n + (3 + n);
    OnKeyPress := GridKeyPress;
  end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  (FindComponent('myStringGrid') as TStringGrid).Cells[1, 1] := 'test'; // проверяем
end;
1
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87
23.02.2013, 22:58  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Да хоть три:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
procedure TForm1.Button1Click(Sender: TObject);
var n, m : Integer;
begin
  n:=StrToInt(Edit2.Text);
  m:=StrToInt(Edit3.Text);
  with TStringGrid.Create(Self) do
  begin
    Parent := Self;
    Name := 'myStringGrid'; // Вот по этому имени и будешь обращаться...
    Options := Options + [goEditing];
    Left:=4;
    Top:=176;
    FixedCols:=0;
    FixedRows:=0;
    DefaultColWidth:=50;
    ColCount:=m;
    RowCount:=n;
    DefaultRowHeight:=24;
    DefaultRowHeight:=24;
    Width := 50*m + (3 + m);
    Height := 24*n + (3 + n);
    OnKeyPress := GridKeyPress;
  end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  (FindComponent('myStringGrid') as TStringGrid).Cells[1, 1] := 'test'; // проверяем
 
 
end;
Delphi
1
2
3
4
5
6
private
    { Private declarations }
    procedure GridKeyPress(Sender: TObject; var Key: Char);
  public
    { Public declarations }
  end;
Спасибо получилось! (отредактировал сообщение)
[Error] Unit1.pas(42): Unsatisfied forward or external declaration: 'TForm1.GridKeyPress'
Понял, писать не стоит.... забыл написать сам обработчик в процессе редактирования, спасибо
p.s. Сейчас всё доделаю и еще раз разберусь если что задам вопросик в течении 30 мин оке?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
23.02.2013, 23:01
Ну, так надо же добавить реализацию, я написал, как в предыдущем посте... См. выше.
0
angstrom
23.02.2013, 23:01
Это к тому, что помимо объявление в секции private, процедура должна быть описана (реализована) в разделе implementation.
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87
23.02.2013, 23:21  [ТС]
Спасибо еще раз, работает. Но вот маленькая загвосточка, когда я изменяю кол-во строк и столбцов матрицы выдает ошибку: A component named nyStringGrid already exists.
и перенаправляет на строчку:

Delphi
1
Options := Options + [goEditing];
Подскажите как быть?
И процедура обработки обязательна? и так понял она нужна лишь для того, чтобы соотнести имя этого компонента со всеми остальными?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
23.02.2013, 23:22
А не надо пересоздавать при этом компонент. Достаточно только изменить его свойства. Ты же создаешь новый компонент с тем же именем. А если тебе надо несколько StringGrid-ов на форме - то придется объявить глобальный счетчик гридов, и к имени добавлять еще и его значение: myStringGrid1, myStringGrid2, ... и обращаться по таким же именам, разумеется...
0
angstrom
23.02.2013, 23:25
Всё-таки придётся использовать переменную для StringGrid-а. Код создания описать в событии OnCreate формы, а все изменения размерности в событии OnClick кнопки.

Не по теме:


Опоздал. :)

0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87
23.02.2013, 23:30  [ТС]
Добавлено через 3 минуты
Цитата Сообщение от angstrom Посмотреть сообщение
Всё-таки придётся использовать переменную для StringGrid-а. Код создания описать в событии OnCreate формы, а все изменения размерности в событии OnClick кнопки.

Не по теме:


Опоздал. :)


Каааак это сделать?)
0
angstrom
23.02.2013, 23:38
Можно так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
procedure TForm1.Button1Click(Sender: TObject);
var
  n, m : Integer;
  sg : TStringGrid;
begin
  sg := TStringGrid(FindComponent('myStringGrid'));
  n := StrToInt(Edit2.Text);
  m := StrToInt(Edit3.Text);
  if Assigned(sg) then
  begin
    sg.ColCount := m;
    sg.RowCount := n;
    sg.Width := 50 * m + (3 + m);
    sg.Height := 24 * n + (3 + n);
  end
  else
  begin
    with TStringGrid.Create(Self) do
    begin
      Parent := Self;
      Name := 'myStringGrid'; // Вот по этому имени и будешь обращаться...
      Options := Options + [goEditing];
      Left:=4;
      Top:=176;
      FixedCols:=0;
      FixedRows:=0;
      DefaultColWidth:=50;
      ColCount:=m;
      RowCount:=n;
      DefaultRowHeight:=24;
      DefaultRowHeight:=24;
      Width := 50*m + (3 + m);
      Height := 24*n + (3 + n);
      OnKeyPress := GridKeyPress;
    end;
  end;
end;
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87
23.02.2013, 23:45  [ТС]
Цитата Сообщение от angstrom Посмотреть сообщение
Можно так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
procedure TForm1.Button1Click(Sender: TObject);
var
  n, m : Integer;
  sg : TStringGrid;
begin
  sg := TStringGrid(FindComponent('myStringGrid'));
  n := StrToInt(Edit2.Text);
  m := StrToInt(Edit3.Text);
  if Assigned(sg) then
  begin
    sg.ColCount := m;
    sg.RowCount := n;
    sg.Width := 50 * m + (3 + m);
    sg.Height := 24 * n + (3 + n);
  end
  else
  begin
    with TStringGrid.Create(Self) do
    begin
      Parent := Self;
      Name := 'myStringGrid'; // Вот по этому имени и будешь обращаться...
      Options := Options + [goEditing];
      Left:=4;
      Top:=176;
      FixedCols:=0;
      FixedRows:=0;
      DefaultColWidth:=50;
      ColCount:=m;
      RowCount:=n;
      DefaultRowHeight:=24;
      DefaultRowHeight:=24;
      Width := 50*m + (3 + m);
      Height := 24*n + (3 + n);
      OnKeyPress := GridKeyPress;
    end;
  end;
end;
Последний вопрос: если я сейчас обращусь к имени:
Name := 'myStringGrid';
оно для 1-го раза выполнит верно? (допустим сложение всех эл-ов матрицы)
а когда введу другую размерность матрицы то видимо уже нет? так как я нажму Бутон и имя изменится верно?
Собственно вопрос постоянно(как бы в процессе изменяющееся имя) -
sg := TStringGrid(FindComponent('myStringGrid' ));
Т.Е. (sg) ?
Заранее Спасибо!!!
0
angstrom
23.02.2013, 23:49
Создание выполняется один раз, потом только проверяется на уже созданный контрол
Delphi
1
2
 if Assigned(sg) then
...
и меняется размерность и размер контрола.
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87
24.02.2013, 00:11  [ТС]
Т.е. имя всегда будет myStringGrid ?
0
angstrom
24.02.2013, 00:12
Для данного кода всегда.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.02.2013, 00:12
Помогаю со студенческими работами здесь

Stringgrid: динамическое обновление записей
Люди помогите! Есть Stringgrid и форма для добавления записей в нее. Все данные записываются по коду товара. Надо сделать так чтобы при...

StringGrid динамическое добавление строк
Добрый день, есть программа : Выводит на экран имя файла,размер файла,дату создания,контрольную сумму.Но это консольное приложение.Хочу...

Динамическое событие onDrawCell у StringGrid
Я создал динамический StringGrid. Теперь хочу ему сделать событие OnDrawCell. Функцию с нужными параметрами создал, но при компиляции...

StringGrid: динамическое добавление строк и назначение типа столбцов
Доброго дня! Есть ли StringGrid, которому можно было задать тип конкретной ячейки (или всего столбца): ComboBox, обычный Edit, CheckBox?...

динамическое создание
напишите приложение в котором, при щелчке по форме мышью, появляется панель с заголовком, отражающим координаты щелчка (напимер. левый...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru