rusenergonsk.ru

Как сделать ячейку в excel невидимой



Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

   Итак, компонент StringGrid имеет возможность адресации каждой отдельной ячейки по номеру столбца и строки. Содержимое ячейки (i, j), где где i - номер столбца, j - номер строки, имеет вид

и доступно как для чтения, так и для записи. Здесь, как и всегда, номера столбцов ( i ) и строк ( j ) отсчитываются от 0.

Не правда ли, написание такой строки - утомительный процесс. Поэтому пользуйтесь оператором присоединения with:

А лучше сразу задать в свойстве Name имя покороче, например SG.

   За многие свойства компонента Delphi StringGrid отвечает свойство Options. В Инспекторе Объектов Options - это раскрывающийся список, представляющий собой элементы данного . Если значение элемента равно True, то он присутствует в множестве, если False - то нет.

StringGrid1.Options:=StringGrid1.Options+[goEditing];  //Включаем редактирование, другие элементы не трогаем

StringGrid1.Options:=StringGrid1.Options-[goEditing];  //Выключаем редактирование, другие элементы не трогаем

StringGrid1.Options:=[goEditing, goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRowSelect];  //Задаём список необходимых элементов

   Если элементы заданы списком, это аналогично присвоению в Инспекторе Объектов этим элементам значения True, остальным - False.

   Ячеек в таблице, как правило, много, и в рамках компонента видна только часть из них. В программе доступна информация как об общем количестве строк и столбцов, так и номерах и количестве строк и столбцов, видимых в рамках таблицы.

   Количество строк в Delphi StringGrid равно StringGrid1.RowCount.
   Количество столбцов в Delphi StringGrid равно StringGrid1.ColCount.

   Если ячейки не помещаются в таблице, появляются полосы прокрутки. При прокручивании

   Поскольку ячейки компонента StringGrid можно редактировать, точно так же как и строку ввода , то возникает вопрос, можно ли программно установить курсор в заданную позицию в содержимом ячейки? Оказывается, есть такая возможность. Для этого требуются дополнительный тип данных на основе таблицы и вспомогательная процедура:

procedure SetCaretPosition(Grid: TStringGrid; col, row, x_pos: Integer);
begin
  Grid.Col := Col;
  Grid.Row := Row;
  with TGridCracker(Grid) do
  InplaceEditor.SelStart := x_pos;
end;
   Теперь можно установить желаемую позицию курсора в ячейке, например, по нажатию кнопки:

procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.SetFocus;
with StringGrid1 do
SetCaretPosition(StringGrid1, Col, Row, 2);
end;
   Правда, ещё один момент! Чтобы код сработал, нужно установить в Инспекторе Объектов значение параметра goAlwaysShoweEditor свойства Options в True. Можно это сделать также и программно, в той же процедуре нажатия кнопки:

   Отдельно требуется осветить вопрос очистки содержимого таблицы StringGrid. Так как таблица StringGrid, в отличие от, например, компонента Memo, не имеет метода для очистки содержимого сразу всех ячеек, то для удаления внесённых в таблицу ранее данных приходится очищать каждую ячейку отдельно. Делается это двумя вложенными циклами for, пробегающими по столбцам и строкам:

var i, j: Integer;
begin
  with StringGRid1 do
    for i:=1 to RowCount-1 do   //Заголовки строк не трогаем
    for j:=1 to ColCount-1 do   //Заголовки столбцов не трогаем
      Cells[j, i]:='';
end;

   Хотя, оказывается, есть метод для очищения содержимого целого столбца или строки:

  StringGrid1.Cols[i].Clear; //Очищается столбец с номером i
  StringGrid1.Rows[i].Clear; //Очищается строка с номером i

   Очевидно, очищение этими методами гораздо быстрее. Однако будут очищены и ячейки фиксированной зоны, содержащие, например, названия строк и столбцов, которые удалять не нужно. Их после очистки нужно просто "написать" заново, на глаз эта манипуляция совершенно незаметна. Для очистки всей таблицы достаточно последовательно очистить только строки или только столбцы:

var i, j: Integer;
begin
  with StringGRid1 do
    for i:=1 to RowCount-1 do  //Заголовки столбцов не трогаем - цикл от 1
      begin
        Rows[i].Clear;
        Cells[0, i]:="Заголовок строки i";
      end;
end;

   Казалось бы, можно поступить и по-другому, просто обнулить количество строк или столбцов! Однако так делать неправильно, так как при их последующем добавлении может оказаться, что каждая ячейка содержит прежние данные. А в Delphi4 даже при уменьшении количества строк или столбцов содержавшиеся в них данные вообще не пропадали, а так и повисали в воздухе! Так что так можно поступать только если в добавляемых ячейках сразу будет новое непустое содержимое.

  Возможность получить координаты ячейки доступна в обработчиках событий OnMouseDown и OnMouseUp. Параметры этих событий содержат пиксельные координаты щелчка. Более естественно использовать OnMouseDown, так как это событие наступает раньше. Получив координаты в пикселах, их нужно пересчитать в индексы ячейки. Этим занимается метод таблицы StringGrid - MouseToCell:

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var ACol, ARow: Integer;
begin
  StringGrid1.MouseToCell(X, Y, ACol, ARow);//Получаем индексы ячейки ACol и ARow
  //Перемещаем фокус в ячейку с этими индексами:
  StringGrid1.Col:=ACol;
  StringGrid1.Row:=ARow;
end;

Сергий, добавлено 17.11.11, 14:29:22 
Здравствуйте! Читал, читал, так и не нашел, как мне текстовый документ (.txt) загрузить в таблицу (StringGrid)??? Автор, добавлено 17.11.11, 15:05:13 
Вам нужно в одной ячейке строки вывести дату, а во второй - текст, причём в несколько строк? Нужно воспользоваться графическими возможностями таблицы, они немного описаны на странице . Там в конце есть про вывод в несколько строк. А в комментариях один посетитель добавил свой вариант. Посмотрите, может что-то вам подойдёт. Максим, добавлено 22.11.11, 10:14:57 
У меня есть определенные ячейки, в которые заносятся вычисления и у меня получаются дробные числа, для отображения двух знаков после запятой, пробую использовать вашу функцию из работ со строками, но она просто откидывает оставшиеся цифры, а мне надо округление. Заранее Спасибо. Автор, добавлено 22.11.11, 10:27:54 
Максим, таки придётся немного поработать вам самому. Возьмите на один знак больше с помощью моей функции, проанализируйте последний знак, если больше 5, прибавьте к предпоследнему 1, и всё. Это и называется округление. Максим, добавлено 22.11.11, 10:40:42 
Точно, СПС КАК говорится все гениальное просто. Маша, добавлено 24.11.11, 09:53:17 
привет всем!!!у меня курсовая и там я делаю данные студентов на стрингриде и вот мне теперь нужно фильтрация. Например найти отдельно однофамильцев или же студентов одного года. И вот не знаю как это все сделать!Помогите плиз Евгений, добавлено 24.11.11, 20:26:22 
Здравствуйте. Мучаюсь уже много дней над решением проблемы, суть вот в чем: на форме есть StringGrid1, Button1 и Edit1. Допустим, что размер стринггрида 34. В верхний ряд я, жмакая по кнопке, добавляю текст из Edit1 с помощью Append, но как сделать, чтобы при заполнении последней ячейки первого ряда данные добавлялись в первую ячейку следущего ряда и т.д.? Размер грида я устанавливая в runtime. Автор, добавлено 24.11.11, 21:27:55 
Маша, чего помогать-то? Ищите ваш параметр и выводите эту строку, не вижу сложностей. Автор, добавлено 24.11.11, 21:32:17 
Евгений, введите в добавление условие
if StringGrid1.Col=StringGrid1.ColCount-1 then
  begin
    StringGrid1.Row:=StringGrid1.Row+1;
    StringGRid1.Col:=1;
  end; Евгений, добавлено 25.11.11, 01:55:44 
Ох, я, верно, туплю и ничего не понимаю( Я добавляю данные через StringGrid1.Rows[0].Append(Edit5.Text); Возможно, нужно как-нибудь иначе? Подозреваю, что проблема в Rows[0] - я тупо указываю, куда добавлять, соответственно, ваш код не помогает(( Автор, добавлено 25.11.11, 07:21:54 
Да, странный метод поместить данные в StringGrid! Вот почитали бы текст урока, а там и написано в самом верху, что содержимое ячейки имеет вид
StringGrid.Cells[i, j], где i это номер столбца, а j - номер строки. Поэтому добавляют текст просто присваиванием
StringGrid.Cells[i, j]:=Edit.Text;
Вам после каждого присваивания нужно увеличивать на 1 номер столбца, а в последнем столбце ещё и номер строки. Вначале i:=1 и j:=1, ну а потом после присваивания
i:=i+1;
if i>StringGrid.ColCount-1 then
  begin
    j:=j+1;
    i:=1;
  end; Евгений, добавлено 25.11.11, 13:50:55 
Все одно - не работает. По вашему методу
var i,j,k:integer;
begin
 i:=StringGrid1.Col;
 j:=StringGrid1.Row;
 StringGrid1.Cells[i,j]:=LabeledEdit5.Text;
 if i>StringGrid1.ColCount-1 then
  begin
  j:=j+1;
  i:=1;
  end;
end;
при добавлении данных заполняетя только одна ячейка, и баста( при повторной попытке добавления след. ячейка остается пустой, а в теории ячейки должны заполняться до последней в ряду, а затем перескакивать на 1-ю ячейку след. ряда.
Если я просто пишу код:
StringGrid1.Rows[j].Append(LabeledEdit5.Text);
то ячейки заполняются до последней в ряду и не перескакивают на 1-ю ячейку след. ряда. Для того, чтобы заполнялся второй ряд, нужно кликнуть по нему.
А в идеальной теории (вот это завернул!) грид может иметь n ячеек, допустим, 100. И при нажатии на кнопку данные заполняют от 0 до 99 ячейки, переходя с ряжа на ряд автоматически. Муторно описал? ( Автор, добавлено 25.11.11, 14:30:28 
(Поругался на непонятливость)
Вначале (ну пусть от нуля)
i:=0;
j:=0;//В данном варианте это глобальные переменные
Фокус ввода не перемещается, а если именно это нужно, то вместо этих переменных управляем StringGRid.Col и StringGrid.Row
Затем обработчик добавления данных (например нажатия на кнопку)
begin
  StringGrid1.Cells[i,j]:=LabeledEdit5.Text;
  i:=i+1;
  if i>StringGrid1.ColCount-1 then
    begin
      j:=j+1;
      i:=0;//Или 1, что там у вас...
    end;
end;
И вообще, получается, что вы один ряд до конца заполняете (по вашему методу), что, трудно проверку поставить на последнюю ячейку в ряду, на которой к строке единичку прибавить нужно??? Евгений, добавлено 25.11.11, 15:54:46 
Не кричите, пожалуйста, я пугаюсь( Обьявил глобальные переменные, и заработало. Ведь я думал, что переменные нужно указывать в процедуре, затем им присваивать значения грида, и далее уж работать. До этого я только имел дела с базами данных и SQL-запросами для ввода-вывода информации, создавая клиентское приложение с нужными функциями (добавление, удаление, изменение данных, выборка, и т.п.). А стринггридом я занялся впервые.
Спасибо вам огромное за помощь, Автор. И за сайт тоже спасибо) Ваша помощь оказалась действительно неоценимой. Автор, добавлено 25.11.11, 17:26:26 
Короче, Молодец!
Спасибо за оценку сайта и моих трудов. Маша, добавлено 27.11.11, 17:29:34 
как это искать параметр и выводите эту строку?????может это и не сложно, но я не понимаю короче не доходит!! Автор, добавлено 27.11.11, 22:44:34 
Маша, ну если в знакомы с оператором if, то делаем цикл, по столбцу с вашим параметром, фамилия или год рождения. С помощью оператора if сравниваем ячейки в столбце с нужным значением, и если равно, то запоминаем номер строки. Как проверили все строки, выводим найденные строки.
Если же вы не знакомы с операторами if и операторами цикла, то сначала нужно поучиться программмированию. павлик, добавлено 29.11.11, 11:28:31 
помогите разработать приложение,которое позволяет создать файл,содержащий фамилии и инициалы студентов и их возраст в delphi 7 Автор, добавлено 29.11.11, 11:36:17 
Прежде чем создавать файл, нужно знать, где содержатся данные. Исходя из названия статьи, всё-таки в таблице. Для сохранения таблицы в файл делаем структуру - Запись. В одном поле записи - имя, в другой возраст. Далее в цикле идём по строкам таблицы, и последовательно сохраняем в файл эти Записи. Для всего перечисленного нужно изучить создание своих типов данных и работу с файлами.
Или вы хотите, чтобы это всё кто-нибудь сделал за вас?
Подскажу создание записи.
type TStud = Record
  Fam: String[20];
  GodR: Integer;
end;
var Stud: TStud;
 
Ну и в цикле (i - переменная цикла)
Stud.Fam:=StringGrid1.Cells[1, i];
Stud.GodR:=StrToInt(StringGrid1.Cells[2, i]);
Всё, теперь переменную Stud можно сохранять в файл. Олег, добавлено 29.11.11, 12:15:06 
Как мне сделать так чтоб в одной ячейке данные были записаны в двухстрочках? Автор, добавлено 29.11.11, 12:25:59 
ТОлько с помощью рисования по таблице. В конце статьи ссылка "Графические возможности StringGrid", там есть про это. Коля, добавлено 2.12.11, 12:58:45 
Как убрать границы между определенными ячейками? Автор, добавлено 2.12.11, 13:07:05 
Я думаю, никак. Возможно, нужно убрать вообще все границы, а там где нужно, нарисовать. Читайте таки про графические возможности таблицы, ссылка на статью в конце данной статьи. В обработчике события OnDrawCell определена переменная
Rect: TRect;
Это прямоугольник ячейки. В нужных ячейках обрисовываем его. Коля, добавлено 2.12.11, 13:10:22 
Понял, буду экспериментировать) Спасибо за подсказку Автор, добавлено 2.12.11, 13:16:34 
Кстати, пришло в голову, что быстрее всё же закрашивать ненужные границы ячеек фоновым цветом. Денис, добавлено 7.12.11, 19:57:04 
Уважаемый автор, у меня тут вопрос. где у меня в коде ошибка
 for i:=1 to n+1 do
  begin
  StringGrid1.Cells[i,i] := '0';
  StringGrid1.Cells[i,0] := '№' + IntToStr(i);
  StringGrid1.Cells[0,i] := '№' + IntToStr(i);
  end;
Мне необходимо, чтобы по диагонали заполнялось все нулями. заголовки изменить получается, то есть 2 и 3 операции в цикле работают корректно, а нули ну никак не хочет выставлять. заранее спасибо Денис, добавлено 7.12.11, 20:01:08 
я как понял, можно таким образом только в фиксированные ячейки добавлять записи какие-то? тогда каким способом можно сделать какую либо одну ячейку в таблице фиксированной? к примеру в середине таблицы. Денис, добавлено 7.12.11, 20:18:47 
а. прошу прощения. видимо где-то настройки таблицы сбились. сейчас попробовал на отдельной программе все заработало. но тем не менее вопрос о том как сделать определенную ячейку фиксированной остается актуальным Автор, добавлено 7.12.11, 20:32:38 
Что такое фиксированная ячейка? Это несколько первых рядов по горизонтали или вертикали. Если вы хотите к ним причислить произвольную ячейку, такой фокус не пройдёт. Хотите, закрасьте её цветом "фиксированных" ячеек... Или запретите ввод. Или что хотите.
А что касается вашего кода, то всё работает. Только не +1 а -1, и n должно быть равно StringGrid1.ColCount. Или RowCount. Анатолий, добавлено 7.12.11, 23:44:33 
Здравствуйте. У меня создана таблица. Ее надо заполнить числами, которые должны быть величиной не более 100. в событии onkeypressed я добавил код
 if not (key in ['0'..'9',#8,#45]) then key := #0;
то есть нежелательные символы введены не будут. но вот как сделать проверку на величину не больше 100? проблема возникает в выборе события. какое событие возникает при завершении ввода, а точнее по завершении работы с текущей ячейкой?
попробовал реализовать так
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
begin
if strtoint(StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row])>100 then StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]:='100';
end;
но периодически ругается на то, что strtoint неприменимо к пустому полю, а также к символу -. возникает вопрос, когда же наступает это событие SetEditText. Получается, что после ввода каждого символа, а это почти равносильно Onkeypressed. Уже замудохался делать такое простое действие, аж самому стыдно. А не получается. Надеюсь хоть вы поможете Анатолий, добавлено 7.12.11, 23:50:08 
и еще. как можно снять выделение текста в ячейке? это мешает, в случае выполнения операции типа if StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]='' then StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]:='0'; он выделяет этот ноль в ячейке. как можно снять это выделение Автор, добавлено 8.12.11, 09:11:43 
Да, события похожи, но что такое в SetEditText, как вы думаете, константа Value? Это текст в ячейке. С полпинка:
if StrToInt(Value)>100 then StringGrid1.Cells[ACol, ARow]:='100';
Далее, вы запретили ввод некоторых символов, но не запретили ввод точки - для дробных чиcел, я так понимаю. А чего тогда удивляетесь на возражения Delphi, если сами используете strtoINT! Или запретите ввод разделителя, или используйте strtoFLOAT.
А для случая пустого поля есть контроль исключительных ситуаций. Думаю, про него вы ещё не слыхали - а то бы сами сделали. Почитайте. Но делается вот что:
try
  if StrToFloat(Value)>100 then StringGrid1.Cells[ACol, ARow]:='100';//Возможно пустое поле, ошибка преобразования
except
  StringGrid1.Cells[ACol, ARow]:='0';//Секция исправления ошибки
end;
Да, и ещё. Вам самому не лень писать такую длинную строку с многочисленными повторами:
if strtoint(StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row])>100 then StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]:='100';
Назовите вы таблицу именем из двух букв: SG, ну прибавьте ещё номерок, если она не одна: SG1. И вообще, пользуйтесь оператором присоединения with:
with StringGrid1 do
  begin
    if strtoint(Cells[Col, Row])>100 then Cells[Col, Row]:='100';
  end;
StringGrid1 уже писать необязательно, сразу свойство, и оно будет относиться к таблице. Можно перечислять несколько объектов, если их свойства различаются. Если оператор внутри один, то begin/end необязательно.
Анатолий, добавлено 8.12.11, 19:29:01 
Благодарю. полезные замечания, учту. и еще спасибо за то что вы очень оперативно отвечаете на сообщения, это дорогого стоит. но все же, вы так и не ответили. к примеру, в ячейке у меня выделен текст. можно ли убрать это выделение программными методами? есть ли какая процедура для этого? Автор, добавлено 8.12.11, 20:54:22 
Как ни странно, покопавшись в сети, нашёл! Требуется вспомогательная процедура и описание типа:
type
  TGridCracker = class(TStringGrid);
procedure SetCaretPosition(Grid: TStringGrid; col, row, x_pos: Integer);
 begin
  Grid.Col := Col;
  Grid.Row := Row;
  with TGridCracker(Grid) do
  InplaceEditor.SelStart := x_pos;
 end;
Ну вот, а теперь можно устанавливать позицию курсора в ячейке, тем самым выделение будет сниматься. Например:
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String);
begin
with StringGrid1 do
  begin
  if strtoint(Cells[Col, Row])>100 then Cells[Col, Row]:='100';
  SetCaretPosition(StringGrid1, Col, Row, Length(Cells[Col, Row]));
  end;
end;
Елена, добавлено 10.12.11, 23:48:09 
Здравствуйте. Что-то я совсем туплю и не могу разобраться с элементарными вещами. В качестве динамического массива необходимо использовать компонент stringgrid, в ячейки которого заносятся любые числа. Мне нужно для каждой строки найти максимальный и минимальный элемент, из максимального вычесть минимальный, а затем среди полученных результатов найти максимальный. Подскажите пожалуйста как лучше (проще) это сделать, а то я окончательно запуталась Автор, добавлено 11.12.11, 00:06:11 
Начать нужно с поиска максимального и минимального элементов для каждой строки. Для этого можно взять ещё одну таблицу с количеством строк как у первой (можно сделать её невидимой), куда в первый столбец будем сохранять максимальный элемент, во второй - минимальный, а в третий - их разницу для каждой строки. Ну и останется только найти максимальный элемент в третьем столбце второй таблицы.
Как найти максимальный элемент? Цикл for от первого элемента до последнего. В качестве максимального (отводим под него переменную) берём первый элемент. Сравниваем с i-м. Если i-й больше, то приравниваем нашей переменной и продолжаем цикл. А если меньше - то просто продолжаем.
Как найти минимальный элемент?
А как разницу высчитывать? Маша, добавлено 12.12.11, 14:53:25 
Приведите пример пожалуйста того, что писали выше. У меня подобное задание Автор, добавлено 12.12.11, 18:10:54 
Я вам дал алгоритм - реализуйте. Или я должен дать полное решение? С какой радости мне за студентов домашние задания выполнять?
Делайте сами. Дарья, добавлено 16.12.11, 02:01:42 
Постройте массив из записей следующей структуры и содержа¬
ния (табл. 7):
Таблица 7
Фамилия школьника Имя школьника Факультативы
мат. физ. инф.
Павлов Сергей true false true
Мисюченко Ира true false false
Барковский Денис false false true
Сидорян Зоя true true true
Кладов Рома false false false
Поля мат., физ., инф. имеют логический тип, где true определяет посещение соответствующего факультатива, a false отрицает это утверждение. б) Выведите фамилии и имена школьников, которые не посещают факультативов по физике или математике.
Дарья, добавлено 16.12.11, 02:42:21 
Построить файл, компоненты ( Дарья, добавлено 16.12.11, 02:47:43 
Постройте на экране компьютера меню и выведите следующий
текст:
  Поздравления с днем рождения!
Текстовое поздравление
Художественное поздравление
Музыкальное сопровождение
Конец
С помощью стрелок вверх f или вниз выберите нужный пункт меню и нажмите клавишу Ввод (Enter).
Дарья, добавлено 16.12.11, 02:52:17 
Если поможете буду очень благодарна!!! Автор, добавлено 16.12.11, 14:45:05 
Я не оказываю пока такой услуги, как решение задач вместо студентов. А если и буду, то потребую денег. А пока - только именно помогаю, разбираю ошибки, подсказываю. Но если вы вообще ничего не можете, то это не ко мне. Единственный совет -изучайте данные уроки сначала. Андрей!, добавлено 17.12.11, 14:23:53 
доброе время суток!хороший сайт,очень помогает!Помогите, как передать значение определенной ячейки например,в edit, наоборот это просто(StringGrid1.Cells[2,5]:=Edit1.Text; и все.). Пытался менять местами,вылетает ошибка. Марина, добавлено 17.12.11, 18:28:06 
Здравствуйте. Подскажите пожалуйста, как в Edit вывести номер строки, где содержится нужный элемент? Автор, добавлено 18.12.11, 00:10:34 
Андрей, правильно будет просто поменять местами, а если у вас ошибка, то напишите какая - посмотрим.
Марина, есть такое понятие как тип данных. Строковаый или числовой, например. Номер строки в таблице будет StringGrid1.Row - это число. Но для того чтобы его поместить в строку ввода - это будет уже текст, и нужно преобразование. Его выполняет функция IntToStr.
Edit1.Text:=IntToStr(StringGrid1.Row); Андрей, добавлено 18.12.11, 02:22:08 
edit3.Text:=memo1.Lines.Strings[0];
 edit4.Text:=memo1.Lines.Strings[1];
 edit5.Text:=memo1.Lines.Strings[2];
 edit6.Text:=memo1.Lines.Strings[3]; ввел таким образом и все ошибок нет, это правильно? Андрей, добавлено 18.12.11, 02:35:32 
я тут взял memo и у меня получилось. Автор, добавлено 18.12.11, 06:46:25 
А попробуйте так: edit.text:=memo.lines[1]; strings лишнее. Марина , добавлено 18.12.11, 11:46:50 
Спасибо огромное! Андрей, добавлено 18.12.11, 15:42:15 
Спасибо,получается так же и код короче. Олег, добавлено 22.12.11, 13:41:01 
Дорогой Автор, подскажите пожалуйста, мне надо вывести в Label результат умножения двух ячеек, кажеться просто но ни как не соображу, заранее спасибо. Автор, добавлено 22.12.11, 15:55:15 
А если бы это были не ячейки таблицы, а просто переменные типа String: S1:='5'; S2:='7'; как бы вы их перемножили? Для начала нужно строки перевести в числа функцией StrToInt если целые или StrToFloat если с запятой. Перемножить, а результат опять перевести в строку обратной функцией IntToStr или FloatToStr. Надеюсь, присвоить содержимое ячейки переменной вы сможете. Олег, добавлено 22.12.11, 16:30:08 
Вот так ? -> Label1.Caption:=FloatToStr(StrToFloat(StringGrid5.Cells[3, 4])StrToFloat(StringGrid5.Cells[3, 5])); Ольга, добавлено 22.12.11, 23:29:23 
Автор, вы не подскажите, что написать, чтобы в таблицу StringGrid можно было записывать самому числа, и потом чтобы они пересохранялись в файл? Автор, добавлено 23.12.11, 07:57:54 
Что написать... Я могу сказать что прочитать: текст данной статьи. ДЛя ленивых процитирую:
за возможность редактировать содержимое ячеек с клавиатуры отвечает элемент goEditing свойства-множества Options. В Инспекторе Объектов установите его значение в True. Чтобы управлять этой возможностью программно, нужно включить или исключить из множества данный элемент:
StringGrid1.Options:=StringGrid1.Options+[goEditing]; //Включаем редактирование, другие элементы не трогаем
StringGrid1.Options:=StringGrid1.Options-[goEditing]; //Выключаем редактирование, другие элементы не трогаем
StringGrid1.Options:=[goEditing, goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRowSelect]; //Задаём список необходимых элементов
  Если элементы заданы списком, это аналогично присвоению в Инспекторе Объектов этим элементам значения True, остальным - False.
Это насчёт записи в таблицу. А насчёт пересохранения, как это "пересохранялись"? Само ничего не будет, процедуру писать нужно. Вам что нужно, всё содержимое таблицы в файл записать? А потом вы захотите и обратно считать?
 Ну например, организуйте в цикле запись построчно. Каждую строку представляйте в виде такой структуры как Запись, где поля записи - это ячейки строки. И записывайте эту Запись в файл. Также потом и считывайте.
Почитайте комментарии, я уже писал процедуру сохранения таблицы, правда немного по-другому. Виталик, добавлено 23.12.11, 23:01:10 
Помогите пожалуйста. Как мне отключить или фиксировать по середине столбец в StringGrid1 чтобы этот столбец не работал? Можете написать код как это сделать? Автор, добавлено 24.12.11, 10:33:37 
Не понимаю выражения "неработающий столбец". Поясните, что вам нужно от этого столбца. Виталик, добавлено 25.12.11, 20:03:25 
Чтобы например пусть будет в 15 столбце "StringGridа" никаких действий не происходило т.е. чтобы ячейки этого столбца не менялись. Илья, добавлено 25.12.11, 20:05:24 
подскажите, вот вставил я эту таблицу, а как редактировать? то есть еще в не готовом виде, мне надо в фиксированные ячейки записать данные, я кликаю по ним, а ничего не происходит... (goEditing true) Автор, добавлено 25.12.11, 22:55:50 
В тексте урока есть операция как заставить таблицу редактироваться, и как запретить. Единственно, вам нужно: если столбец не равен 15, то редактировать, а иначе запретить.
В фиксированные ячейки по-любому ничего записать не удастся. Только программно:
Cells[Col, Row]:='То что нужно записать'; Илья, добавлено 25.12.11, 23:38:48 
Мне и нужно программно, писал же... я правильно понимаю, фиксированные ячейки, это там где номер строки, столбца (или не номер а текст, как мне нужно), то есть верхняя и левый строка и столбец? Если так, то "Cells[Col, Row]:='То что нужно записать';" как понять в какую ячейку я запишу? почему (пока я еще не скомпилировал) я не могу просто кликнуть по фиксированной ячейке и ввести? Автор, добавлено 26.12.11, 06:18:26 
Вам нужно по щелчку по заголовку чтобы определялись его координаты Col Row. Один из них - ноль. Сейчас я на выезде, после 21 напишу как определить вторую координату. Виталик, добавлено 26.12.11, 22:26:46 
Помогите пожалуйста.
Вот я написал так. Но так написанный код принимает как барьер 10 строку и 15 столбец "StringGridа" целиком...
For i := 1 to n do // Заполняем ячейки, согласно правилам игры
  For j := 1 to n do
  begin
  if j=15 then
  StringGrid1.Cells[j-1,i+30] := '/';
  if i=10 then
  StringGrid1.Cells[j+30,i-1] := '/';
  If (StrToInt( mass_2[i,j] ) >= 1)and (StrToInt( mass_2[i,j] )
  and ((j15) and (i10)) then StringGrid1.Cells[j-1,i-1] := '';
  If (StrToInt( mass_2[i,j] ) > 3 ) then StringGrid1.Cells[j-1,i-1] := ''
  end;
мне нужно чтобы '' принимали как барьер ту часть столбца или строки где есть '/' а не всю строку или столбец. Как это сделать мне? Аноним, добавлено 27.12.11, 00:12:32 
Поясняю код как работает, рассматривается клетка. если вокруг этой клетки есть от 1 до 3 занятых клеток то в рассматриваемой клетке ставится . если есть звездочка в рассматриваемой клетке и в окружении больше 3 занятых клеток то звёздочка с рассматриваемой клетки уничтожается.
If (StrToInt( mass_2[i,j] ) >= 1)and (StrToInt( mass_2[i,j] )
If (StrToInt( mass_2[i,j] ) > 3 ) then StringGrid1.Cells[j-1,i-1] := ''
задание моё. поставить барьеры. чтобы при размножении клетка не могла перейти за барьер или должна обойти его. Я поставил барьер в 10 строке и в 15 столбце. но барьер идет на весь столбец и строку. а мне это не нужно. мне нужно чтобы барьер был лишь там где я отметил чтоб были /
if j=15 then
StringGrid1.Cells[j-1,i+30] := '/';
if i=10 then
StringGrid1.Cells[j+30,i-1] := '/';
...
((j15) and (i10))
Помогите, скажите как мне это сделать. Автор, добавлено 27.12.11, 11:46:05 
Для Ильи. Вот процедуры, обеспечивающие редактирование заголовков. Для этого ещё нужен компонент Edit, со свойствами Visible:=False и BorderStyle:=bsNone:
var
  Form1: TForm1;
  ACol, ARow: Integer;
implementation
{$R .dfm}
procedure TForm1.SGMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
SG.MouseToCell(X, Y, ACol, ARow);
end;
procedure TForm1.SGDblClick(Sender: TObject);
var i, X: Integer;
begin
X:=0;
for i:=0 to ACol-1 do
  X:=X+SG.ColWidths[i]+1;
Edit1.Left:=SG.Left+X+2;
Edit1.Top:=SG.Top+2;
Edit1.Width:=SG.ColWidths[ACol]-1;
Edit1.Height:=SG.RowHeights[0]-1;
Edit1.Text:='';
Edit1.Visible:=True;
Edit1.SetFocus;
end;
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key=13 then
  begin
  SG.Cells[ACol, 0]:=Edit1.Text;
  Edit1.Visible:=False;
  end;
end;
Автор, добавлено 27.12.11, 11:46:30 
Виталик, вам бы нужно привести код программы целиком, а не только данную процедуру. Тогда я бы запустил программу и мог проанализировать поведение вашего алгоритма. А так что я могу? mass ещё какой-то... Виталик, добавлено 28.12.11, 21:54:01 
Спасибо. Но я уже сам сделал. Защитил курсовую сегодня на 5. Андрей, добавлено 3.01.12, 00:56:49 
С Новым Годом!!!
помогите, как передать значения например, из 2 выделенных ячеек таблицы. как передать из одной я могу, а более нет.вот код который использую для передачи из ячейки в edit.если надо например в два edita, немогу сообразить.
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  edit2.Text:=stringgrid1.Cells[acol, arow];
end; Автор, добавлено 3.01.12, 06:36:01 
Ну одну передали, и вторую также. А вообще посмотрите ещё один мой сайт спец про таблицу: stringgrid-delphi.ru. Там есть про выделенный регион ячеек. Андрей, добавлено 7.01.12, 21:27:22 
Помогите, как передать значения из выбранных ячеек таблицы, мне надо чтобы в начеле значение из таблицы передовалось в edit1,а второе в edit2. при этом я использую код: procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  edit2.Text:=stringgrid1.Cells[acol, arow];
end;
если дописать код, чтобы передовалось зачение из таблицы в два эдита, получается так, что значение из таблицы дублируется в обоих эдитах. я пишу так:
ARow: Integer; var CanSelect: Boolean);
begin
  edit1.Text:=stringgrid1.Cells[acol, arow];
  edit2.Text:=stringgrid1.Cells[acol, arow]
end;
подскажите, в чем моя ошибка и что я делаю не так.
за ранее большое спасибо. Автор, добавлено 7.01.12, 22:14:09 
Не пойму, зачем вы используете именно событие OnSelectCell. В обработчике этого события переменные ACol и ARow это координаты ячейки, в которую вы хотите перейти. А CanSelect это переменная, которую если приравнять False, то переход будет невозможен. Так именно для этого - возможность или невозможность перехода в ячейку - и используется это событие. Вам следует выбрать другое событие. Какое именно - не могу из ваших сообщений сообразить.
Само присвоение вы правильно написали. Но если это две рядом стоящие ячейки в одной строке, то колонка у второй будет отличаться на 1, так?
edit1.Text:=stringgrid1.Cells[col, row];
edit2.Text:=stringgrid1.Cells[col+1, row];
Col и Row - это координаты первой ячейки. Если в их выделили мышкой, то этот выделенный регион имеет такие координаты:
StringGrid1.Selection.Left
StringGrid1.Selection.Top
StringGrid1.Selection.Right
StringGrid1.Selection.Bottom
Соответственно
Col:=StringGrid1.Selection.Left;
Row:=StringGrid1.Selection.Top;
Взято из сайта, который я упомянул, а именно stringgrid-delphi.ru/rangeselect.php. Андрей, добавлено 7.01.12, 23:43:08 
Дело в том, что ячейки выбераются из таблицы независимо от их него расположения, т.е. они могут распологатся рядом, на разных строчках и в разных столбцах. в других событиях у меня неполучается, а как сделать чтоб значения из двух ячеек передовалитсь неогу. Автор, добавлено 8.01.12, 08:04:49 
Если это не рядом стоящие ячейки, то они всё равно имеют свои координаты. Если вы их знаете, то по ним и передавайте. Как узнать-то, где они, эти ячейки? И событие выбирается в зависимости от метода определения этих ячеек. Андрей, добавлено 8.01.12, 17:02:30 
Вы меня простите,но я теперь совсем запутался.Вы можете на примере показать,а то я уже ничего непонимаю? Автор, добавлено 8.01.12, 18:10:32 
А я так вообще вас не понимаю. Есть несколько произвольных ячеек. Нужно их содержимое записать в такое же количество едитов. Знаете координаты ячеек? Андрей, добавлено 8.01.12, 19:05:22 
ячейки выбераются с нужными значениями и должно быть всего 2ячейки.я нашел как это делать спомощью кнопки.А это неочень удобно,вначале выберается первое значение,кнопкой присваивается другому эдиту,потом выберается двторое значение.в итоге нужные значения находятся в эдитах.как это сделать без кнопки и запретить дальнейшее перенос значения в эдиты? Автор, добавлено 8.01.12, 23:49:23 
Ух... Устал играть в угадайку. Сформулируйте точное условие вашей задачи. Баур, добавлено 9.01.12, 09:09:51 
Добрый день! Требуется помошь!
На форме есть несколько Edit-ов и Combobox... которые выводят итоговые вычисляемые суммы. (я только начинаю учится программировать) как мне теперь вывести эти суммы в ячейки StringGrid с округлением из Edit. заранее Спасибо! Андрей, добавлено 9.01.12, 19:40:14 
я уже писал,мне надо перенести значения из двух ячеек таблицы которые находятся с различными координатами в два эдита.Я больше незнаю как вам еше объяснить. Автор, добавлено 11.01.12, 06:07:15 
Содержимое ячейки - Cells[Col, Row], ячейки разные - Col и Row разные. В чём затруднение? Андрей, добавлено 13.01.12, 01:47:10 
затруднение в том, что у меня неполучается передать значение из двух произвольных ячеек! Автор, добавлено 13.01.12, 04:08:21 
Ячейки задаются координатами. Если вы их не знаете, ничего и не сможете. А вот почему вы их не знаете... Тайна сия велика есть. Не хотите вы этот секрет открыть. Андрей, добавлено 13.01.12, 22:29:05 
вы хотите сказать,чтоб передать значения из ячеек,надо знать их координаты.это верно,я нашел как определяются координаты ячеек,но у меня передаются координаты,т.е.21,45 и т.д.Возникает вопрос,как передать значения таким способом? Автор, добавлено 14.01.12, 04:00:06 
Вот вы пишете, что с помощью кнопки уже сделали то что нужно. Это событие OnClick. Что у вас там написано? Андрей, добавлено 14.01.12, 08:02:04 
Я вам писал,что вначале передаю значение из произвольной ячейки в эдит,а кнопкой edit2.text:=edit1.text;
button1.enable:=false;(это чтобы больше не передавалось значение из эдит2 в эдит1) а потом снова передаю значение ячейки в эдит1.Но так получается неочень удобно. Автор, добавлено 14.01.12, 22:50:53 
Андрей, реально, простите, извините... Не могу понять ни вас, ни ваших проблем с ячейками. Очень хочу, но не в силах помочь. Чего, куда и зачем вам надо передать - не доходит до меня. Андрей, добавлено 15.01.12, 02:32:30 
Вы можете привести пример передачи из двух произвольных ячеек в два эдита? Автор, добавлено 15.01.12, 06:07:29 
Edit1.Text:=StringGrid1.Cells[Col1, Row1]; Edit1.Text:=StringGrid1.Cells[Col2, Row2]; //Col и Row - переменные, задающие координаты ячеек Андрей, добавлено 15.01.12, 06:46:22 
Спасибо, вам большое! Скажите,если Col и Row это переменные их надо объявлять или нет? Автор, добавлено 15.01.12, 07:21:33 
И объявить, и присваивать нужные значения. Баур, добавлено 16.01.12, 07:57:16 
Подскажите пожалуйста, вот допустим в строку при нажатий кнопки заполняются поля... типа "ФИО" и "Адрес" как мне сделать так чтоб при одном нажатий кнопки еще добавить сведения допустим с Edit-а чтоб заполнялся ячейка во второй строке первого столбца "ФИО"? и далее при каждой новой записи добавлялся по две строки. ну или продолжался запись... СПАСИБО! тем кто поможет... Автор, добавлено 16.01.12, 08:34:55 
Если я правильно понял, вам нужно при нажатии кнопки добавить очередную запись в таблицу, то есть ещё одну строку, в которую можно добавлять имя и адрес следующего человека? Строка добавляется так:
StringGrid1.RowCount:=StringGrid1.RowCount+1;
Далее, если сведения находятся в двух Edit'ах, то можно сразу добавить значения:
StringGrid1.Cells[1, StringGrid1.RowCount-1]:=Edit1.Text;
StringGrid1.Cells[2, StringGrid1.RowCount-1]:=Edit2.Text;;
И ещё: здесь у меня ФИО и АДРЕС это столбцы, и поэтому я добавляю для каждого человека по одной строке. А если вы добавляете по две строки, то возможно у вас это строки. И как у вас строки чередуются? ФИО, АДРЕС, ФИО, АДРЕС и так далее в одном, первом столбце? Мне кажется, что всё же логичнее в каждую строку добавлять одного человека, в первый столбец ФИО, во второй - АДРЕС. Потом добавить строку и следующего человека, и так далее. Баур, добавлено 16.01.12, 12:01:07 
да все верно. видите как мне нужно сделать.. я все потом со StringGrid выгружаю в Exsel и там все поля не помещаются в один лист.. я на примере ФИО и Адркс написал. а так у меня поле "наименование".. тут я как хочу при нажатий кнопки в первую страку СтрингГрид пишется например "Очистка от снега" и так далее несколько полей и не хотел бы чтоб техника каторая работала писалась во второе поле а сразу под наименованием работ.... а рядом с наименованием идет поля типа КМ прохождение и там ГСМ.. вот. во второй сроке под наименованием работ падает техника и в 3 ячейку где ГСМ во второй строке падает расход гсм (нужно чтоб было все в две строки и получается когда я делаю новую запись те записи сохраняются добавляется новые строки и цикл повторяется. Выгружаю в Excel и все будет прекрасно...) ...:) Автор, добавлено 16.01.12, 12:27:04 
Ну и добавляйте тогда по две строки, то есть в первом операторе не +1 а +2:
StringGrid1.RowCount:=StringGrid1.RowCount+2;
И опять же, если добавляемые значения находятся в двух Edit'ах, то
StringGrid1.Cells[1, StringGrid1.RowCount-2]:=Edit1.Text;//Предпоследняя строка
StringGrid1.Cells[1, StringGrid1.RowCount-1]:=Edit2.Text;//Последняя строка Баур, добавлено 16.01.12, 13:38:07 
Спасибо вы мне помогли... а как лучше делать я не знаю как данные добавлять данные в следующие две строки! (чтоб таблица заполнялось) у меня при нажатий кнопки "новая запись" вот такой код что то я не правильно указываю.
//Увеличиваем количество строк на 1
SG.RowCount:=SG.RowCount+2;
//Сдвигаем содержимое таблицы вниз
for i:= 0 to SG.RowCount-3 do // Переносим на одну строчку меньше
  for j:=0 to SG.ColCount-1 do
  SG.Cells[j,SG.RowCount-1-i]:=SG.Cells[j,SG.RowCount-2-i];
for j:=0 to SG.ColCount-1 do
SG.Cells[j,1]:='';
Автор, добавлено 16.01.12, 14:06:16 
Как же вы переносите содержимое вниз, если вы первую строку например, записываете на вторую, и тем самым её затираете!
Нужно наоборот, добавили строки, и переносите последнюю строку ниже, затем предпоследнюю и т.д. В этом случае используется цикл downto
SG.RowCount:=SG.RowCount+2;
for i:=SG.RowCount-3 downto 1 do
  SG.Cells[1, i+2]:=SG.Cells[1, i];
Теперь можно записывать в две первые строки новые данные. Но этот код перемещает только содержимое первого столбца. Если нужно всю строку перемещать, нужен второй цикл, по столбцам. Баур, добавлено 16.01.12, 14:52:37 
Я Благодарен Вам за помошь... Да у меня все вместе две строки будут перемещаться а данные первых двух строк очищается, а записей будет много, они не будут друг друга затирать.. ? вы мне помогите я только учусь.. Баур, добавлено 16.01.12, 15:29:19 
я просто еще не до конца понял как все это реализовать..... Автор, добавлено 16.01.12, 17:13:17 
Ну всё уже сделано. Предыдущий код не будет затирать существующие строки. Чтобы перемещалась вся строка целиком:
SG.RowCount:=SG.RowCount+2;
for k:=0 to SG.ColCount-1 do
for i:=SG.RowCount-3 downto 0 do
  SG.Cells[k, i+2]:=SG.Cells[k, i];
Теперь две первые строки содержат прежнюю информацию, но она уже не нужна, так как скопирована вниз. Можно добавлять данные. Не совсем понятно с ячейками фиксированной зоны, перемещаь их или нет. Я, к сожалению, не могу за вас решать вашу задачу, я её не знаю да мне это и не нужно. Аноним, добавлено 17.01.12, 11:32:20 
Скажите пожалуйста какой код нужен чтоб при выгрузке в Ексел из Стринга данные заполнялись с линями ячеек? гость, добавлено 18.01.12, 12:37:58 
Уважаемый автор... имеется 3 столбца (кол, цен и итог) и не известное количество строк... подскажите как мне посчитать суммы 2 столбцов по строкам, итог будет выводиться на 3 столбец. и подсчет суммы 3 столбца... итоговая.. Автор, добавлено 18.01.12, 13:28:47 
Ну понятно, количество умножаем на цену, и результат в третий столбец. Но вам чего не ясно? Как ячейку к числу привести, как умножить, или как обратно число в ячейку записать? Надеюсь, переменные сами опишете.
for i:=1 to SG.RowCount-1 do
  begin
    Kol:=StrToInt(SG.Cells[1, i]);
    Zena:=StrToFloat(SG.Cells[2, i]);
    Itog:=KolZena;
    SG.Cells[3, i]:=FloatToStr(Itog);
  end;
for i:=1 to SG.RowCount-1 do
  Itog:=Itog+StrToFloat(SG.Cells[3, i];
Ну вот. Куда записать окончательный Itog, сами придумайте. Если будет слишком длинный дробный хвост, на странице "Работа со строками" есть функция вывода с отбрасыванием лишних цифр после запятой. Виталий, добавлено 26.01.12, 22:51:15 
здравствуй автор!...(я новичек ).подскажи пожалуйста, вот у меня динамическая матрица(столбцы и строки задаются N,M), мне нужно подсчитать сумму каждого столбца (в зависимости от размера матрицы) и вывести их в отдельной RG(где в каж. отдельной ячейке, будет записана сумма, каж. столб динамич. матрицы), не могу ни как додуматься((заранее спасибо.... Автор, добавлено 27.01.12, 06:05:10 
Циклами владеете? Цикл for от 1 до М-1 (количество столбцов). Перед этим инициируем сумму S:=0; Ну и в цикле подсчитываем S:=S+(значение в ячейке); Значение в ячейке нужно преобразовать из string в число. Как - читайте на страничке 'Работа со строками'. Что такое RG я не понял, так что куда записать итог, сами решайте. Автор, добавлено 27.01.12, 06:09:06 
Циклами владеете? Цикл for от 1 до М-1 (количество столбцов). Перед этим инициируем сумму S:=0; Ну и в цикле подсчитываем S:=S+(значение в ячейке); Значение в ячейке нужно преобразовать из string в число. Как - читайте на страничке 'Работа со строками'. Что такое RG я не понял, так что куда записать итог, сами решайте. Константин, добавлено 29.01.12, 22:47:39 
Подскажите, как сделать вывод информаций в ячейках String Grid не по нажатию на кнопку или ячейку, а сразу по открытию формы? Автор, добавлено 29.01.12, 23:24:58 
А какая разница? Если можете по нажатию, то никакой, точно так же делается, по событию OnCreate Формы. Константин, добавлено 30.01.12, 01:58:27 
Разница в том, что мне необходимо до ввода данных видеть что я ввожу (т.е. в сером поле по столбцу у меня например написано "Товар") и ниже в белых ячейках должно быть перечисление товаров, а до тех пор пока я не кликну курсором по белому полю, для ввода наименования, серые поля у меня не именованы.Дискомфорт. :/ Автор, добавлено 30.01.12, 06:16:04 
Чего у вас там в программе наделано, никто кроме вас знать не может. Чего вы там кликаете, мне непонятно. Формулируйте точно ваш вопрос. То ли вы вручную вводите название, то ли в программе выводите, вы не уточняете. И почему у вас серые поля (я так понимаю, заголовки) не именованы? Трудно ввести туда текст? В общем, я не телепат. Константин, добавлено 30.01.12, 12:51:22 
Сейчас попробую объяснить.У меня есть компонент String Grid на форме (больше к примеру там ничего нет), данные в него вводятся вручную, FixedCols и FixedRows имеют названия (которые я прописал внутри String Grid), а обычные, белые ячейки свободны, для ввода данных. При запуске я получаю окно, с String Gridом, FixedCols и FixedRows которого остаются чистыми(в сером цвете, без названий), пока я не нажму на белую ячейку, для ввода данных. После нажатия на ячейку все FixedCols и FixedRows принимают прописанные названия. А мне необходимо, чтоб FixedCols и FixedRows сразу при открытий формы показывали своё содержимое.
Я считаю что проблема где-то в обработчике событий String Grid, но не могу найти. Видимо глупый вопрос... Автор, добавлено 30.01.12, 19:50:39 
Ну я же написал, что присваивание значений заголовкам нужно делать по событию OnCreate Формы. А сейчас, возможно, по событию OnClick таблицы. Ищите так: выделите таблицу, перейдите на вкладку Events Инспектора Объектов и проверьте все обработчики какие там будут, в каком есть
 StringGrid1.Cells[1, 0]
 StringGrid1.Cells[2, 0] - заголовки столбцов
и
 StringGrid1.Cells[0, 1]
 StringGrid1.Cells[0, 2] - заголовки строк
Это будет обработчик события OnClick скорее всего. Найдёте, вырежте и перенесите в OnCreate Формы. Константин, добавлено 30.01.12, 20:27:11 
Огромное спасибо, действительно сначала не понял ваш ответ. Благодарю. Андрей, добавлено 31.01.12, 22:27:14 
Как сделать чтобы длина слова была равна длине ячейки. Автор, добавлено 1.02.12, 07:06:29 
Может, наоборот? :)
Это делается через Canvas таблицы. Если вы не меняли шрифт, то длина текстов "напечатанного" и "нарисованного" на канве будет одинакова. Поэтому нужно найти длину "нарисованного" текста
W:=StringGrid1.Canvas.TextWidth('Ваше_Слово');
Затем установить ширину нужного столбца (зная его индекс i):
StringGrid1.ColWidths[i]:=W+2;
Поправка на 2 пиксела вводится чтобы слово не налезало на границы ячейки. Может, 2 и мало будет, сами посмотрите, может нужно 3 или 4. Ирина, добавлено 1.02.12, 13:33:36 
Большое спасибо вам! фанат, добавлено 23.02.12, 13:15:12 
Добрый день! УВАЖАЕМЫЙ Автор нужна помощь. в SG по столбцам начал считать итоговые суммы и вот в некоторых столбцах есть пустые ячейки при вычислении выводится ошибка, это получается из за пустых ячеек как вы думаете? если да как мне задать условие если даже есть пустые ячейки все считалось.!? Спасибо! Автор, добавлено 23.02.12, 14:17:23 
Ну вы же уже всё написали, своими словами. Осталось только в Delphi перевести:
 если пустая ячейка (if trim(SG.Cells[i, j])='') то чтобы считалось (чем? нулём!)
  then SG.Cells[i, j]):='0';
Вот, а теперь можно и вычисления проводить.
Если стоит условие, что в пустых ячейках и не должно быть даже нуля, то просто пропускайте эту итерацию цикла:
then continue; фанат, добавлено 23.02.12, 14:33:08 
ошибка выскакивает... подскажите пожалуйста где не правильно пишу. sum это у меня столбцы. просто в некоторые ячейки столбцов вообще ни чего не заполняется получается пустое значение. как мне пропустить все это... ? ни как не могу сообразить...
begin
sum:=0;
sum1:=0;
sum2:=0;
sum3:=0;
sum4:=0;
sum5:=0;
for i:=1 to sg.rowcount-1 do begin
 if trim(SG.Cells[i, j])='' then begin
 SG.Cells[i, j]:='0'; end;
 sum:=sum+Strtofloat(SG.Cells[9,i]);
  sum1:=sum1+Strtofloat(SG.Cells[10,i]); Автор, добавлено 23.02.12, 14:45:41 
Вы как попугай повторяете... Я написал Cells[i, j], так как не знаю ваших ячеек. А вы не должны за мной это повторять - вы должны ваши координаты подставлять, ячеек которые анализируете. гость, добавлено 27.02.12, 11:07:23 
Добрый день автор! подскажите пожалуйста как можно удалить выделенную строку String Grid? (goRowSelect)? Автор, добавлено 27.02.12, 11:15:15 
У меня есть сайт, специально посвящённый компоненту StringGrid: stringgrid-delphi.ru
Там на странице delete-row.php описаны методы удаления отдельной строки. В частности, такой. Сначала описываем тип и процедуру:
type TMyGrid=class(TCustomGrid);
procedure TForm1.DeleteARow(Grid: TStringGrid; ARow: Integer);
begin
  TMyGrid(Grid).DeleteRow(ARow);
end;
Затем удаляем текущую строку:
DeleteARow(StringGrid1, StringGrid1.Row); гость, добавлено 27.02.12, 11:26:44 
Спасибо! сейчас посмотрю! гость, добавлено 27.02.12, 12:06:27 
[Error] Unit1.pas(1231): Undeclared identifier: 'DeleteARow'
[Error] Unit1.pas(1233): Undeclared identifier: 'Grid'
[Error] Unit1.pas(1233): Undeclared identifier: 'ARow'
[Error] Unit1.pas(1238): Undeclared identifier: 'DeleteARow' гость, добавлено 27.02.12, 12:07:04 
где описать все?
гость, добавлено 27.02.12, 12:11:15 
procedure TfrChild.DeleteARow(Grid: TStringGrid; ARow: Integer);
объявляю процедуру ошибка выскакивает!?
Expected '=' but'(' found. Автор, добавлено 27.02.12, 12:53:52 
У меня форма называется Form1, у вас - frChild. Значит, нужно заменить. И нужно поместить объявление процедуры в объявление типа Формы - вверху есть, там где другие процедуры этой Формы. Денис, добавлено 11.03.12, 15:25:18 
как сделать подсчет ячеек с определенным значением определенного столбца?
т.е. допустим нужно подсчитать количество ячеек 3 столбца, с значением равным "Россия" и вывести результат в label Автор, добавлено 11.03.12, 16:48:28 
Как сделать? Нужно почитать этот или другие сайты, освоить оператор уравнения и оператор цикла. Видите, как просто - всего 2 оператора изучить. Я, со твоей стороны, для этого сделал всё что мог. Светлана, добавлено 13.03.12, 22:15:26 
Здравствуйте, Автор! Огромное Вам спасибо за сайт! у меня вопрос.. на форме имеется StringGrid, пользователь вбивает в него данные... они у меня должны сохранятся в шаблоне Excell (с чем я успешно справилась)и дублироваться в табличку базы SQL Server. как бы мне это реализовать? Автор, добавлено 14.03.12, 07:12:56 
Светлана, в вашей задаче вы разбираетесь гораздо лучше меня...
Могу только сказать, что если у вас есть база данных, то сохранение выполняется в виде запроса insert. У ва что, затруднение с текстом запроса? У меня вот под рукой нет базы данных, и ничего посоветовать не могу. Светлана, добавлено 14.03.12, 19:43:09 
да, не могу составить запрос....... вот пробую.. чайник , добавлено 16.03.12, 08:42:17 
Добрый день автор! скажите пожалуйста как сохранит данные из StringGrid в файл, и для продолжения работы обратно загрузить в StringGrid. может есть какие нибудь примеры. Спасибо! Автор, добавлено 16.03.12, 12:39:31 
Ну, самый простой вариант сохранить через компонент Memo. Сначала записать туда ячейки последовательно, затем сохранить через метод Memo.Lines.SaveToFile.
Аналогично считать сначала Memo.Lines.LoadFromFile, а затем переписать последовательно в том же порядке в таблицу.
Memo можно сделать невидимым, чтобы никто не догадался! Или можно вместо Memo создать StringList. Результат тот же. гость, добавлено 19.03.12, 11:19:13 
Автор добрый день.! помогите пожалуйста, подскажите как импортировать данные из ExeLL в StringGrid? Автор, добавлено 19.03.12, 12:21:02 
Всё чаще стали появляться подобные просьбы... Но формата комментариев для ответа маловато. Придётся написать статью на эту тему. В ближайшие дни осилю. А сейчас прошу простить, ответить не готов. гость, добавлено 19.03.12, 12:39:25 
все понял хорошо! еще один вопрос. с родительской формы с помощью MainMenu хочу сохранить в Ексел но ошибка выдается встает на первой строке. может я не правильно обратился к SG в дочерней форме? или может как то по другому можно?
for Col := 1 to frChild.SG.ColCount - 1 do begin
for Row := 1 to frChild.SG.RowCount - 1 do begin Автор, добавлено 19.03.12, 14:37:47 
А вы описали переменные Col и Row? Если вы думаете, что и так понятно что это индексы столбца и строки, то во-первых компьютер этого не знает, в во-вторых их как переменные цикла использовать нельзя. Возьмите просто i, j. И не забудьте их описать как Integer. Возможно, я неправильно понял вопрос, но из двух строк больше ничего не видно. гость, добавлено 19.03.12, 15:10:06 
что то у меня не правильно!?
var
ExcelApp, Sheet: variant;
Col, Row: Word;
  i,j:integer;
ExcelApp := CreateOleObject('Excel.Application');
  ExcelApp.WorkBooks.Open(GetCurrentDir() + '\сохранить');
  Excelapp.DisplayAlerts := false;
  ExcelApp.Visible := true;
  Sheet := ExcelApp.ActiveWorkbook.Worksheets[1];
  for i := 1 to frChild.SG.ColCount - 1 do begin
  for j := 1 to frChild.SG.RowCount - 1 do begin
  Sheet.Cells[Row + 1, Col + 0] := frChild.SG.Cells[Col, Row];
  end; end;
  ExcelApp.WorkBooks[1].WorkSheets[1].Range['A1:'+'O15'].Borders.LineStyle:=1;
  ExcelApp.WorkBooks[1].WorkSheets[1].Range['A1:'+'O15'].Font.Size := 8;
  ExcelApp.Worksheets[1].Name := 'Акт приемки';
  ExcelApp.Worksheets[1].PageSetup.Orientation := 2;
  except
  ShowMessage('');
  ExcelApp := unassigned;
  Sheet:= Unassigned; end; гость, добавлено 19.03.12, 15:32:03 
то есть здесь,!
ExcelApp := CreateOleObject('Excel.Application');
  ExcelApp.WorkBooks.Open(GetCurrentDir() + '\сохранить');
  Excelapp.DisplayAlerts := false;
  ExcelApp.Visible := true;
  Sheet := ExcelApp.ActiveWorkbook.Worksheets[1];
  for i := 1 to frChild.SG.ColCount - 1 do begin
  for j := 1 to frChild.SG.RowCount - 1 do begin
  Sheet.Cells[j + 1, i + 0] := frChild.SG.Cells[i, j];
  end; end;
  ExcelApp.WorkBooks[1].WorkSheets[1].Range['A1:'+'O15'].Borders.LineStyle:=1;
  ExcelApp.WorkBooks[1].WorkSheets[1].Range['A1:'+'O15'].Font.Size := 8;
  ExcelApp.Worksheets[1].Name := 'Акт приемки';
  ExcelApp.Worksheets[1].PageSetup.Orientation := 2;
  except
  ShowMessage('');
  ExcelApp := unassigned;
  Sheet:= Unassigned; end; гость, добавлено 19.03.12, 15:41:11 
вот что пишет
[Hint] Unit3.pas(82): Variable 'Col' is declared but never used in 'TfrMain.saveClick'
[Hint] Unit3.pas(82): Variable 'Row' is declared but never used in 'TfrMain.saveClick' гость, добавлено 19.03.12, 15:49:49 
а если в ту же форму кнопкой делаю, все выгружается правильно! Автор, добавлено 19.03.12, 17:02:00 
Пишет что объявлены переменные Col, Row, но не используются в этой процедуре. А в первой наоборот, используются, но им не присваивается никаких значений. То что они названы Col, Row не делает их индексами таблицы. SG.Col - так правильно. Или попробуйте заключить всё в with SG do begin/end. Тогда просто Col, Row уже будут индексами. И SG можно убрать внутри отовсюду. гость, добавлено 20.03.12, 08:21:39 
посмотрите пожалуйста что тут ни так!
var i,j:integer;
Ap : Variant;
begin
for i:=1 to frChild.SG.RowCount do
  for j:=1 to frChild.SG.ColCount do
frChild.SG.Cells[i,j]:='i='+inttostr(i)+#13#10+'j='+inttostr(j);
try
Ap := GetActiveOleObject('Excel.Application');
except
Ap := CreateOleObject('Excel.Application');
end;
if not OpenDialog1.Execute then exit;
Ap.Workbooks.Open(OpenDialog1.FileName);
for i:=1 to frChild.SG.RowCount do
  for j:=1 to frChild.SG.ColCount do
Ap.Cells[i,j] :=frChild.SG.Cells[i,j];
Ap.Visible := True;
end; Автор, добавлено 20.03.12, 08:43:02 
Во-первых, здесь:
for i:=1 to frChild.SG.RowCount do
  for j:=1 to frChild.SG.ColCount do
frChild.SG.Cells[i,j]
i у вас в цикле идёт по строкам, а стоит в таблице на месте столбцов: [i, j] - первым идёт индекс столбцов. То есть i и j нужно местами поменять.
Цикл у вас от 1 до SG.RowCount (SG.ColCount). Это значит, что переменная цикла выйдет за границы. Должно быть: SG.RowCount-1 (SG.ColCount-1).
Ну и (хотя это не ошибка) #13#10 как я понимаю, попытка перейти на вторую строку - просто не будет работать . Будет отображён некий непечатаемый символ. Таблица StringGrid размещает только однострочный ТЕКСТ. Но можно нарисовать (понимаете разницу?) текст в несколько строк. Об этом статья "Графические возможности", ссылка в конце данной статьи.
Иван, добавлено 22.03.12, 22:46:13 
Доброго времени суток! Подскажите как прописать, чтобы при каждом нажатии кнопки данные записывались в следующий столбец? Автор, добавлено 23.03.12, 05:28:49 
Если на столбец указывает переменная, прибавляйте по 1 при каждом нажатии. А если это выделенный столбец, прибавляйте по 1 к переменной Col, указывающей на выделенный столбец:
StringGrid1.Col:=StringGrid1.Col+1;//В конце процедуры Иван, добавлено 23.03.12, 11:52:17 
ну вот к примеру
begin
for c:=0 to SringGrid1.ColCount + 1; //добавляет столбец при нажатии
for r:=0 to StrinGrid1.RowCount - 1;
SringGrid1.ColCount:= c;
SringGrid1.RowCount:= r;
n:=StrToFloat(Edit1.Text);
k:=StrToFloat(Edit2.Text);
s:= k+s;
StringGrid1.Cells[1,1]:=FloatToStr(n);
и вашу запись делал в конце выдает ошибку
т.е тут при смене значении в Edit1 и Edit2 их сумма должна в следующии столбик заносится Автор, добавлено 23.03.12, 16:45:56 
Делаем переменную, указывающую на столбец куда должны заноситься данные, назовем ACol. Присвоим сразу значение первого столбца, куда они пойдут. Grid.Cells[ACol, n]:=E1+E2; n - строка. И после занесения данных, в конце процедуры, последней строкой прибавляем ей 1. И при следующем сложении она уже указывает на следующий столбец. Иван, добавлено 23.03.12, 23:05:16 
прибавлять надо к переменной или как показывали выше, если как в первом случае то выделение на другой столбец переходит но записывается в указанный столбец, а вторым способом делал Grid.Cells[ACol+1, n]:=E1+E2; ясно что неправильно но больше додумать не могу Алексей, добавлено 24.03.12, 04:53:09 
Имеем SG например с 2 колонками: "Имя переменной" "Значение"
Благодаря вашему сайту решил некоторые вопросы по SG(спасибо за хороший материал и поддержку коментов), но остался один момент.
Не могу сообразить какой метод отвечает за конечное значение в ячейке после завершения редактирования, какой нибудь аналог OnExit у TEdit или еще что, т.е. нужна возможность делать определенные внешние действия с новым значением ячейки когда её ввод завершен, но не после ввода каждого нового символа, а один раз после выхода из режима редактирования ячейки.
Пока придумал только запоминание во временную переменную водимого значения на OnSetEditText, а потом на двух событиях OnExit всего стрингрида и OnClick стрингрида делать нужные мне действия во внешней форме с отредактированным значением ячейки, но оптимально ли такое решение, все ли возможные варианты завершения редактирования ячейки оно охватывает и может есть какое либо более правильное ? Автор, добавлено 24.03.12, 05:56:12 
Ивану: ну простейшая же задачка! ACol - глобальная переменная, вот процедура:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Grid.Cells[ACol, 1]:=IntToStr(StrToInt(Edit1.Text)+StrToInt(Edit2.Text));
  ACol:=ACol+1;
end;
Ну, скачайте, посмотрите. Автор, добавлено 24.03.12, 06:12:11 
Алексею: а вы не перемудрили? Чем Grid.Cells[Col, Row] не подходит? Содержимое ячейки...
Или я вас неправильно понял. Сформулируйте точнее. Алексей, добавлено 24.03.12, 12:15:56 
Еще один вопрос возник, есть ли у SG возможность скрыть колонки служебные, которые нужны что бы в них были данные, но что бы они не отображались пользователю ?
Пока ничего лучшего чем прицепить на onDrawCell примерно такого кода не придумал:
...
if (ACol=4) then
begin
  if SG.ColWidths[4]0 then SG.ColWidths[4]:=0;
end else TextOut(Rect.Left + 2, Rect.Top + 2, Cells[ACol, ARow]);
Т.е. не выводим в нужной колонке текст и проверяем не менялся ли размер колонки.
Такое решение имеет пару недостатков: при перемещениях стрелками > и
Может я просто не нашел синтаксиса что то типа SG.Rows[4].Visible:=False или SG всё же не поддерживает стандартное скрытие колонок и нужно выкручиваться самостоятельно? Алексей, добавлено 24.03.12, 12:24:56 
>>а вы не перемудрили? Чем Grid.Cells[Col, Row] не подходит? Содержимое ячейки...
Можно и Cells, но тогда нужно вместо временной строки запоминать tmpCol и tmpRow
Так как данные то я считываю когда эти параметры уже измениться могут, т.е. на OnExit они то будут такие да, тут подходит, а вот на OnClick когда мы ушли в другую ячейку, мышкой или стрелками, то номер колонки и ячейки может изменится, поэтому и запоминаю во временную переменную значение редактируемое это быстро, а потом уже когда оно полностью сформировано, 1 раз делаю вызов внешних изменений ресурсоёмких, которые нельзя делать на каждом срабатывании посимвольном у SetEditText.
Т.е. вызывать ресурсоёмкую процедуру нужно только по конечному значению ячейки, т.е. когда выходим из режима редактирования ячейки. Автор, добавлено 24.03.12, 13:58:22 
Алексей, вы решили все проблемы! Да, в каждой ячейке запоминаем их координаты во временные. Далее, выход из ячейки может быть в другую ячейку или в другой компонент. Выход в другую ячейку отлавливаем в процедуре OnSelectCell, выход в другой компонент - OnExit. Ещё закончить редактирование можно щёлкнув Enter - тоже отлавливается на раз.
А скрытие стобца через обнуление ширины делается. И добавляется запрет на перемещение туда. И всё. И не нужен OnDrawCell. Служебные колонки же ведь сразу служебные, делается в OnCreate. А чтобы пользователь не смог туда попасть, в OnSelectCell добавляется такая конструкция:
if ACol=4 then
  begin
    CanSelect:=False;
    if Grid.Col = 3
      then Grid.Col:=5
      else Grid.Col:=3;
  end;
А если служебная колонка самая правая, то достаточно CanSelect:=False;
Иван, добавлено 24.03.12, 16:43:03 
спасибо огромное, просто как только не пробовал голова кипит)
и у меня ещё вопросик, как подсчитать сумму в этих столбцах, если не известно сколько их будет т.е 5 столбцов со значениями у меня будет или другое количество Евгения, добавлено 24.03.12, 16:50:12 
Здравствуйте, Автор!
Подскажите, пожалуйста, можно ли убрать выделение первой ячейки таблицы, когда весь компонент не в фокусе? И если можно, то как?
Спасибо. :) Автор, добавлено 24.03.12, 17:40:43 
Евгения, а зачем? Цвет раздражает?
Короче, я не знаю... Автор, добавлено 24.03.12, 17:45:29 
Иван, это делается в цикле. от 1 и до тех пор, пока в ячейке не пусто.
S:=0;
while Grid.Cells[i, 1]'' then S:=S+IntToStr(Grid.Cells[i, 1]); Евгения, добавлено 24.03.12, 17:52:21 
Ага, раздражает. :)
А цикл (для Ивана) разве не с 0 начнется? Автор, добавлено 24.03.12, 18:19:57 
Нет. Нулевой столбец фиксированный, туда обычно результаты вычислений не заносят. И, естественно, не считывают. Иван, добавлено 25.03.12, 19:04:24 
о да отлично все получилось, только вместо while надо if. А как указать адрес последнего столбца, чтобы в него результаты заносились, если 5 столбцов со значениями а в 6-й надо их сумму
  Автор, добавлено 25.03.12, 19:26:12 
Мой вариант подсчитывает сумму заново, с первого по последний непустой столбец. S - локальная переменная. То, что вы предложили, вообще не так должно считаться. S - глобальная переменная
var S: Integer=0;
  ACol: Integer=1;
В обработчике нажатия так:
Grid.Cells[ACol, 1]:=IntToStr((StrToInt(Edit1.Text)+StrToInt(Edit2.Text));
S:=S+StrToInt(Grid.Cells[ACol, 1]);
ACol:=ACol+1;
А для того чтобы сумма оказалась в шестом столбце, нужно добавить
Grid.Cells[6, 1]:=IntToStr(S);
И тогда никакого if не нужно. Всё считается в процессе. Иван, добавлено 25.03.12, 19:57:13 
Grid.Cells[6, 1]:=IntToStr(S)на счет этого то понятно, но у меня не известно сколько значении в столбцах будет, 5,6 или больше. поэтому сумму их надо записать в тот который будет после этих значении
Автор, добавлено 25.03.12, 20:17:11 
Я отвечаю на ваш вопрос, не так ли: "если 5 столбцов со значениями а в 6-й надо их сумму". Каков вопрос, таков ответ. Но если подумать, то куда указывает ACol, а? Иван, добавлено 25.03.12, 20:33:56 
я сделал так StringGrid1.Cells[Acol,1]:=IntToStr(d), он в каждом следующем показывает сумму предыдуших Автор, добавлено 25.03.12, 20:53:46 
Ну, молодец, наконец-то! Иван, добавлено 25.03.12, 23:50:41 
но мне надо чтобы их общую сумму отображало в одном последнем столбце, а в других столбцах оставались сумма из вводимых окон. последнее у меня получилось, а как их общую сумму вывести в столбец который будет последний Автор, добавлено 26.03.12, 06:46:43
Чёт я не понял...
Иван! Ну всё же уже решено!!! Чего вам ещё? В моём предыдущем сообщении только 6 на ACol поменять, и всё. Аноним, добавлено 26.03.12, 06:31:24 
Добрый день автор! я добавляю строки в SG вот так:
SG.RowCount:=SG.RowCount+2;
  for j:=1 to SG.ColCount-1 do
for i:=SG.RowCount-3 downto 1 do
  SG.Cells[j, i+2]:=SG.Cells[j, i];
  // очистим 2 строки
for j:=0 to SG.ColCount-1 do
  SG.Cells[j,2]:='';
for j:=1 to SG.ColCount-1 do
  SG.Cells[j,1]:='';
как сделать чтобы каждая запись добавлялось в конец каждый раз при записи?
или даже если есть пример напишите пожалуйста! Автор, добавлено 26.03.12, 07:12:01 
А зачем два цикла для очистки двух строк? Может, можно сразу?
  Cells[j, 1]:='';
  Cells[j, 2]:='';
А что это вообще за код? Добавляет две строки, сдвигает всё на две строки вниз, очищает две первые строки. А где ваша запись? Ещё есть кнопка?
Ну да ладно. А ответ на свой вопрос вы не хуже меня знаете. Индекс последней строки: RowCount-1, всегда. Аноним, добавлено 26.03.12, 07:42:22 
Да я с помощью кнопки заполняю в таблицу, данными в две строки. а код у меня кривой! напишите пожалуйста как добавлять данные (не известное количество) в конец записи? например 2 или 3 строки с данными.!
не могу толком разобраться! Автор, добавлено 26.03.12, 07:50:44 
Ну, добавление в последнюю строку:
Cells[i, RowCount-1]:='То_Что_Нужно';
В предпоследнюю:
Cells[i, RowCount-2]:='То_Что_Нужно';
В пред-предпоследнюю:
Cells[i, RowCount-3]:='То_Что_Нужно';
В пред-пред-предпоследнюю:
Cells[i, RowCount-4]:='То_Что_Нужно';
И так далее. Аноним, добавлено 26.03.12, 07:57:46 
вот если я здесь исправлю, каждый раз при отправке в таблицу данные будут записываться в конец. как определить есть ли данные в таблице чтоб записать в конец?
SG.Cells[1,1]:=dbedit1.Text;
SG.Cells[2,1]:=dblookupcombobox2.Text;
SG.Cells[3,1]:=DBedit6.Text;
SG.Cells[4,1]:=edit3.Text;
SG.Cells[2,2]:=CheckBox1.caption; Автор, добавлено 26.03.12, 09:05:15 
Честно, не понимаю что нужно от меня. Как определить есть ли данные в таблице? Просмотреть все ячейки, и если хоть в одной непусто, то значит в таблице что-то есть. Аноним, добавлено 26.03.12, 09:06:11 
подскажите мне! Автор, добавлено 26.03.12, 09:08:20 
Сформулируйте точно ваш вопрос. Аноним, добавлено 26.03.12, 09:10:08 
мне нужно вот так, допустим с едитов данные записал в две или три строки, теперь новые данные опять же отправляю в таблицу они записываются в конец тех уже записанных в две или три строки, и так далее. Аноним, добавлено 26.03.12, 09:11:11 
несколько столбцов в строке. Автор, добавлено 26.03.12, 09:16:27 
Ну вы определитесь, две или три строки. Или тогда записывайте по одной. Она всегда попадёт в конец. Я уже всё ответил:
Добавляем 3 строки:
SG.RowCount:=SG.RowCount+3;
Cells[i, RowCount-1]:='То_Что_Нужно';// Запись в последнюю строку
Cells[i, RowCount-2]:='То_Что_Нужно';// Запись в предпоследнюю строку
Cells[i, RowCount-3]:='То_Что_Нужно';//Запись в пред-предпоследнюю строку
Хотите, порядок записи поменяйте местами. Я показываю 1 столбец. Надеюсь, все 100500 столбцов расписывать не нужно. Глеб, добавлено 26.03.12, 10:17:31 
Добрый день.
 Прошу помочь в такой проблеме. У меня есть SG. Этот объект нужно редактироваться т.е. в ячейки, что находятся под фокусом нужно вставлять опр. символы 0..9 a..f
 Сейчас я могу проводить редактирование, но ввожу любой символ.
Можете мне рассказать как сделать маску для ввода Автор, добавлено 26.03.12, 10:20:57 
Ну, я пока методами регулярных выражений не владею, хотя собираюсь освоить. А пока нужно работать со строками. Проверять либо целиком ячейку, какой символ на какой позиции, либо при вводе посимвольно. Приведите пример, разберём. Глеб, добавлено 26.03.12, 10:38:13 
Вроде сам разобрался, если будут вопросы обращусь. Автору спасибо за опер. работу
Аноним, добавлено 26.03.12, 11:20:24 
спасибо автор! вроде все понял! робин, добавлено 26.03.12, 11:23:26 
АВТОР СДЕЛАЙТЕ СТАТЬЮ ПОЖАЛУЙСТА!!! СОХРАНЕНИЕ ДАННЫХ SG В EXCELL И ОБРАТНАЯ ЗАГРУЗКА В SG ДЛЯ ПРОДОЛЖЕНИЕ РАБОТЫ...! НАРОД ЖДЕТ..! Автор, добавлено 26.03.12, 11:48:19 
Ну так и быть, сёдни начну. робин, добавлено 26.03.12, 11:57:14 
СПАСИБО!!! С нетерпением буду ждать! робин, добавлено 26.03.12, 12:29:24 
если возможно как вариант Save и Open Dialog подключите! Данил, добавлено 5.04.12, 15:04:29 
Добрый день. У меня успешно выходят ошибки, не могу разобраться почему.
Вот код:
 procedure TForm1.Button7Click(Sender: TObject);
var
Sg2:TStringGrid;
sum:integer;
begin
Sg2:=StringGrid2;
for a:=1 to Sg2.RowCount do
begin
sum:=0;
for b:=1 to Sg2.ColCount do
sum:=sum+StrToInt(Sg2.Cells[a,b]);
Memo1.Lines.Add(IntToStr(sum));
end;
end; Автор, добавлено 5.04.12, 17:36:27 
Индексы в StringGrid начинаются от нуля. Поэтому последний индекс равен RowCount-1, ColCount-1. Других ошибок нет. Исправьте в циклах. Данил, добавлено 5.04.12, 18:32:26 
Спасибо!!!
При ручном вводе все сработало, правда если я из файла загружаю сохраненные данные для этой таблицы при нажатии кнопки, то череда моих успехов в ошибках продолжается :) Автор, добавлено 5.04.12, 18:48:24 
Попробуйте сохранять и считывать данные с помощью Excel. В конце статьи есть ссылка. Excel сохранит и считает данные без ошибок. Останется перенести в StringGrid. Там всё описано. Данил, добавлено 5.04.12, 19:49:55 
Как Вы правильно заметили :
приятнее работать в привычной среде, которая обладает к тому же гораздо более развитыми возможностями...
  ("Совместная работа StringGrid и Excel")
Разобрался:) Новичок, добавлено 6.04.12, 19:24:03 
как вывести максимальную сумму строк и столбцов? Нужно определить победителя турнира. 4 строка и 4 столбец. Автор, добавлено 6.04.12, 19:34:55 
Ну, наверное нужно посчитать суммы, а затем (или в процессе) определить наибольшую из них. Если вы ничего не умеете, обращайтесь по ссылке "Решение задач". Елена, добавлено 6.04.12, 22:22:10 
Добрый вечер! Подскажите как из файла данные поместить в StringGrid в Delphi? Автор, добавлено 6.04.12, 22:27:45 
Читать файл и считанные данные записывать в ячейки. Способ зависит от формата данных в файле. Елена, добавлено 7.04.12, 15:38:59 
Формат данных чисовой. То какой способ необходим? Автор, добавлено 7.04.12, 16:47:18 
Не об этом речь. Речь об организации ячеек при записи в файл. Например, они могут быть записаны по одной, по целой строке, или ещё как. Если бы вы спросили, как записать таблицу, я бы сам выбирал, а считывать - это формат нужно знать, как записаны были. Аноним, добавлено 10.04.12, 19:13:46 
Добрый вечер))Прошу помочь)) есть форма на которой 3 String Grid-а и много всяких кнопок 2 из которых заполняют таблицы цифрами и одна очищает эти таблицы. мне надо сделать так, что если я нажала на одну из кнопок которая загружает значения и при этом таблицы не пусты(т.е предварительно не нажата кнопка очистить) то выходит сообщение чтобы нажали кнопку очистить и таблицы НЕ ЗАПОЛНЯЛИСЬ , а если пусты то просто таблица заполняется. Помогите плиз....... Автор, добавлено 10.04.12, 19:41:10 
А в чём проблема? Проверяйте, пусты ли таблицы. Таблица не пуста, если есть значение хоть в одной ячейке. Из вашего сообщения не ясно, могут ли в заполненных таблицах быть пустые ячейки. Может, достаточно проверить ячейку, которая точно не будет пуста. Но в худшем случае придётся проверять все. Предлагаю такую функцию:
function IsEmpty(Grid: TStringGrid): Boolean;
var i, j: Integer;
begin
Result:=False;//Таблица не пуста
with Grid do
  for i:=1 to ColCount-1 do
  for j:=1 to RowCount-1 do
    begin
      if trim(Cells[i, j])<>'' then exit;
    end;
Result:=True;//Таблица пуста
end; Аноним, добавлено 11.04.12, 10:20:58 
я так поняла мне все это прям в кнопке записать?я записала. выдает ошибку: Statement expected but 'FUNCTION' found ((((((((( В таблицах могут быть пустые ячейки. как записать например чтоб он просто проверил однй ячейку например StringGrid1.Cells[2,26]-она точно должна быть не пуста. И напишите пожалуйста в каком месте должно быть написано ShowMessage('Нажмите кнопку "Очистить" '), а то я сама че то разобраться не могу((((Пасиба))
Автор, добавлено 11.04.12, 10:33:22 
То, что я написал в предыдущем сообщении - это функция. Чтобы она заработала, её нужно вызвать с нужным параметром - именем той таблицы, которую нужно проверить.
В обработчике кнопки нужно было написать:
if (not IsEmpty(StringGrid1)) then
 begin
  ShowMessage('Нажмите кнопку Очистить');
  exit;
 end;
{Далее можно писать операторы заполнения таблицы}
Так вы не владеете созданием процедур и функций? Напрасно, не сможете развиваться. Почитайте хотя бы у меня статью.
А если достаточно проверить только одну ячейку, то вместо (not IsEmpty(StringGrid1)) там можно написать trim(StringGrid1.Cells[2, 26])<>'' Аноним, добавлено 11.04.12, 10:45:57 
))))))Клёва))все работает))))Спасибки огоромное))) Ризабек, добавлено 11.04.12, 19:07:51 
Помогите как написать больше или равно 22 и меньше или равно 25????
Я вот так вот попробовал но увы...
if StringGrid1.Cells[2,i]>='22'
Автор, добавлено 11.04.12, 19:27:37 
Преобразовать в число слабо?
Но вообще это два условия. Их нужно оба написать:
((StrToInt(Cells[i, j])>=22)and((StrToInt(Cells[i, j])<=25) Ризабек, добавлено 11.04.12, 19:47:37 
Спасибо Ризабек, добавлено 11.04.12, 19:52:52 
Помогите. У меня дано время финиша гонки. Как мне из них вычислить минимум? Результат мне надо записать в Memo.
StringGrid1.Cells[4,9]:='14:17:46';
StringGrid1.Cells[4,1]:='14:18:35';
StringGrid1.Cells[4,6]:='14:19:54'; Автор, добавлено 11.04.12, 20:16:49 
Есть операция перевода строки во время: StrToTime(S). Переведите, и будет три переменные типа время (TTime). А их уже можно сравнивать и определить какое меньшее. Ризабек, добавлено 11.04.12, 20:19:58 
Спасибо конечно, но не знаю как. Можете на примере одного показать как переводить?? Автор, добавлено 11.04.12, 20:29:12 
var Tmin, T1, T2: TTime;
begin
T1:=StrToTime(Cells[i1, j1]);
T2:=StrToTime(Cells[i2, j2]);
if T1
 then Tmin:=T1
 else Tmin:=T2;
Memo1.Lines.Add('Рекорд: '+TimeToStr(Tmin));
end; Ризабек, добавлено 11.04.12, 20:55:01 
Спасибо. А если "T" их у меня несколько,то как будет???
Как надо изменить, где if T1
begin
  T1:=StrtoTime(StringGrid2.Cells[4,2]);
  T2:=StrtoTime(StringGrid2.Cells[4,3]);
  T3:=StrtoTime(StringGrid2.Cells[4,4]);
  T4:=StrtoTime(StringGrid2.Cells[4,5]);
  if T1
  then Tmin:=T1
  else Tmin:=T2;
  Memo1.Lines.Add('Ðåêîðä:'+TimeToStr(Tmin));
  end; Автор, добавлено 11.04.12, 21:07:12 
Лучше всего научиться программированию. За вас никто просто так ничего не сделает. Если вы ничего сами не можете, то обращайтесь по ссылке "Решение задач". Ризабек, добавлено 11.04.12, 21:28:20 
Согласен. Но пожалуйста всё таки можете здесь посмотреть. В каком месте у меня ошибка???
begin
  T1:=StrtoTime(StringGrid2.Cells[4,1]);
  T2:=StrtoTime(StringGrid2.Cells[4,2]);
  T3:=StrtoTime(StringGrid2.Cells[4,3]);
  T4:=StrtoTime(StringGrid2.Cells[4,4]);
  if (T1
  then Tmin:=T1
  or if (T2
  then Tmin:=T2
  or if (T3
  then Tmin:=T3
  or if (T4
  then Tmin:=T4
  Memo1.Lines.Add('Ðåêîðä:'+TimeToStr(Tmin));
  end; Автор, добавлено 12.04.12, 05:42:14 
Смогу только вечером. Уезжаю. Автор, добавлено 12.04.12, 06:04:13 
Всё же напишу. Не нужно сравнивать значения между собой. После первого уравнения находим Tmin, а затем сравниваем Tmin и следующее значение. Но это по-детски. На самом деле организуется массив и обработка идёт в цикле. Дониер, добавлено 19.04.12, 15:01:36 
Подскажите пожалуйста?.как в стрингриде в правой я чейке показывало x Автор, добавлено 19.04.12, 15:11:48 
Ну ё-маё...
Что такое х, в какой правой ячейке...
Ничего не понимаю...
Если в последнем столбце, то его индекс ColCount-1, содержимое этой ячейки
StringGrid1.Cells[StringGrid1.ColCount-1, n]:='x'; n - индекс строки
Вот и будет в этой ячейке показывать х. Аноним, добавлено 19.04.12, 15:29:44 
procedure TForm1.Button1Click(Sender: TObject);
begin
  x:=StrToFloat(Edit1.Text);
  y:=StrToFloat(Edit2.Text);
  if x=0 then
  begin ShowMessage('Значение X не может быть равно 0');
  end
  else
  begin
  z:=power(x,2)power(cos(y),3)+(sin(x))/x;
  Memo1.Lines.Add(FloatToStr(z));
  Stringgrid1.Cells [0,0]:= FloatToStr(z);
  Label3.Caption :=FloatToStr(z);
  Stringgrid1. Cells[1,1]:=FloatToStr(x);
 end;
begin
 StringGrid1.SetFocus;
with StringGrid1 do
end;
end;
вот в этой программе Автор, добавлено 19.04.12, 15:40:58 
То что вы от меня хотите, в моей голове создаёт "ошибку". Я вас НЕ ПОНИМАЮ. Какую ячейку вы называете правой? Глеб, добавлено 20.04.12, 01:49:28 
Добрый день!
 У меня есть компонент StringGrid. мне надо чтобы при прокрутки колесика на мыши выполнялись опр. действия. Какое событие отвечает за прокрутку? Автор, добавлено 20.04.12, 05:42:50 
OnTopLeftChanged Студент, добавлено 20.04.12, 20:34:54 
Как, и где прописать процедуру DeleteARow ато я уже нааялся с удаление определенной строки)) заранее спосибо!! Автор, добавлено 20.04.12, 21:24:44 
А вы откуда знаете про эту процедуру? На этом сайте она не описана. Она описана на ещё одном моём сайте, специально посвящённом StringGrid, на странице stringgrid-delphi.ru/delete-row.php.
Там описаны и другие методы удаления строки. Ольга, добавлено 2.05.12, 22:13:15 
Здравствуйте. Помогите решить задачки....
1. Создать таблицу 54. Найти сумму элементов стоящих в четных строках на нечетных местах.
2. В группе из 15 учащихся по результатам 3-х экзаменов составить список назначенных на стипендии. Если есть оценки 2 ил 3,то стипендия не назначается. Номера учащихся и оценки на экзаменах считать исходными данными.
Автор, добавлено 2.05.12, 22:30:49 
Так как вы сами ничего не сделали, то такого рода просьбы принимаются по ссылке "Решение задач". Но готов поринять и здесь. Стоимость первой - 100 руб. Если согласны, то напишите мне delphi-manual(a)yandex.ru. Вторая задача - после оплаты первой. А вот если были бы ваши собственные коды, то ошибки разберу и помогу бескорыстно... Руслан, добавлено 3.05.12, 20:03:16 
Люди прошу вашей помощи !! Как написать выборку в стринггриде , найти мах и мин. Автор, добавлено 3.05.12, 23:18:36 
Специально для такого случая, рядом со ссылкой ''Комментарии'' есть ссылка "Решение задач". Кристина, добавлено 6.05.12, 19:13:00 
Помогите пожалуйста.Как в StringGrid сделать так, что бы можно было вводить числа.функция FloatToStr не работает и InttoStr тоже
Автор, добавлено 6.05.12, 21:30:37 
Вводить вручную или записать в ячейку программно? Судя по всему, второе. И почему не работает:
X:=100500;
Cells[i, j]:=IntToStr(X);
Y:=3.1415;
Cells[j, i]:=FloatToStr(Y);
Всё работает. АлександрК, добавлено 16.05.12, 17:06:16 
Как задать компонент StringGrid размером n на n. StringGrid создается при выполнении программы. Автор, добавлено 16.05.12, 17:48:23 
Почитайте статью у меня: Серёжко, добавлено 18.05.12, 12:36:53 
Здравствуйте Автор. Вопрос к вам следующий, по поводу компонента (или возможно всех компонентов). Как сделать так, чтобы при растяжении формы (на весь экран) компонент StringGrid также увеличивался? Заранее спасибо Автор, добавлено 18.05.12, 22:16:22 
Я не привожу готовых решений, но вот как контролировать размер компонентов при изменении размера формы:
При создании формы (в обработчике OnCreate) вычислить и запомнить в переменных нужные параметры, например, разницу в ширине или высоте формы и компонента, либо расстояние между их краями. Дальнейшие действия выполняются в обработчике события OnResize Формы. Этот обработчик вызывается при любом изменении размеров формы. Так вот, в этом обработчике нужно изменить размеры и положение компонента так, чтобы ранее вычисленные параметры остались прежними.
Пробуйте, напишите код. Если что-то не выходит, скопируйте код сюда, будем думать вместе, что у вас не так. Серёжко, добавлено 22.05.12, 08:25:49 
Доброго времени суток. Разобрался я с размерами StrinGrida. Можно сделать через событие OnResize (я делал через %-ное соотношение), а можно сделать еще проще. Почти у каждого компонента есть свойство - Anchors (крюк). С его помощью я и закрепил StringGrid на форме где мне было нужно ;) Евгения, добавлено 18.06.12, 11:31:38 
Здравствуйте.Мне нужно в Edit вводить диапазон чисел и чтобы они в случайном порядке добавлялись в таблицу.Подскажите пожалуйста,как это реализовать.
Вот код,но в таблицу генерируются числа от 0 до n.
var y,i,x:integer;
begin
randomize;
x:=strtoint(edit1.text);
Sg1.Cells[i,0]:=Edit1.Text;
For i:=0 to sg1.Colcount-1 do
sg1.cells[i,0]:=inttostr (random(y));
end; Автор, добавлено 18.06.12, 12:29:38 
var y,i,x:integer;
begin
randomize;
x:=strtoint(edit1.text);
Sg1.Cells[i,0]:=Edit1.Text;//здесь i не определена. И в дальнейшем в этой ячейке значение будет переписано циклом ниже
For i:=0 to sg1.Colcount-1 do
sg1.cells[i,0]:=inttostr (random(y));
end;
В 5 строке i не определена, к тому же значение будет тут же затёрто в цикле. Больше проблем не вижу. Что не так? Какой диапазон вы имели в виду? Ая, добавлено 19.09.12, 19:48:00 
Как можно соединить текстовый документ с стрингрит Автор, добавлено 19.09.12, 21:41:08 
Хочется съязвить, но не буду.
Вопрос совершенно непонятен. Можно сделать всяко-разно. Уточните что вы хотите конкретно. Женя, добавлено 15.10.12, 17:09:58 
Скажите пожалуйсто, каким образом можно сделать так что бы можно было менять мышкой размер первой строки и колонки (fixed), так как когда наводиш курсор на линию курсор не меняется на resize (естественно опции goRowSizing и goColSizing включены). Остальные строки и колонки все ок. Автор, добавлено 15.10.12, 17:28:43 
Размер фиксированных ячеек мышкой изменить не удастся, на то они и фиксированные. Можно программно изменить соответствующий параметр. Но это же не мышкой... Так что можно сначала убрать фиксацию нулевой строки (нажав на кнопку), изменить размер мышкой, вернуть фиксацию. Потом убрать фиксацию нулевого столбца, изменить размер и тоже вернуть. Одновременно это сделать тоже не удастся:
procedure TForm1.Button1Click(Sender: TObject);
begin
if Table.FixedCols=1
  then Table.FixedCols:=0
  else Table.FixedCols:=1;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if Table.FixedRows=1
  then Table.FixedRows:=0
  else Table.FixedRows:=1;
end;
Оксана, добавлено 1.06.13, 21:31:26 
Добрый день! Спасибо за статью! очень помогла))
Есть один вопрос, помогите пожалуйста! Eсть 2 StringGrid'a, в первом куча записей, второй пустой. Нужно из первого вставить строки во второй(Нужно отсеять лишние строки). То есть условие должно быть таким: Если в SG1, во 2й колонке есть слово "стул", то вставить всю строку в SG2, и дальше если это слово будет попадаться так же вставлять всю строку в SG2. Как такое реализовать? Помогите пожалуйста Автор, добавлено 1.06.13, 21:47:01 
Оксана, вы всё написали "человеческим" языком, просто нужно это перевести на "язык" Delphi. Анализируем 2-ю колонку, если там есть "стул" - добавляем ко 2-й таблице строку и циклом переписываем туда эту строку, и так далее. Пробуйте. Если что не выходит - давайте код сюда, буду помогать. Иначе обратитесь со страницы "Решение задач". Оксана, добавлено 1.06.13, 22:36:25 
Автор, вот такое получилось, только ничего не находит, слово не на первом месте, а примерно так "бла-бла стул бла-бла", может поэтому? а если искать число, то находит в 1й колонке(нумерация) и добавляет в SG2 в первую колоку, а остальные колонки в этой строке не заполняются.
И не знаю как в SG2 добавить не на ту же позицию, а именно начиная с первой строки
var i, j: Integer;
begin
  with SG do
  for i:=0 to RowCount-1 do
  for j:=0 to ColCount-1 do
  begin
  if SG.Cells[i,j]='стул' then
  SG2.cells[i,j]:=SG.cells[i,j];
  end; Автор, добавлено 1.06.13, 22:56:30 
Ищем "стул":
  with SG do
  for i:=0 to RowCount-1 do
  for j:=0 to ColCount-1 do
  if SG.Cells[i, j]='стул' then
  begin
  добавляем строку
  копируем (организуем ещё один цикл)
  останавливаем цикл по j (break)
  end;
Оксана, добавлено 3.06.13, 12:54:22 
Спасибо!) подсказали как сделать)) А можно в StringGrid сделать удаление строк если значение 3 колонки > Edit? Например в Edit значение= 100. Надо оставить только те строки, где в 3й колонке цифры больше 100? Автор, добавлено 3.06.13, 14:50:39 
Вот у меня сайтик про StringGrid, страничка как удалять строку: stringgrid-delphi.ru/delete-row.php
Но учтите, после удаления в цикле индекс строки поменяется, нужно отнять единичку. Поэтому цикл for не подойдёт, нужно использовать while. Надежда, добавлено 4.06.13, 23:36:36 
Добрый вечер!Помогите, как записать нули в таблицу stringgrid начиная с определенной ячейки и заканчивая определенной ячейкой? Автор, добавлено 5.06.13, 07:31:05 
for i:='определённая ячейка' to 'определённая ячейка' do
  Table.Cells[i, 1]:='0';
Данный цикл запишет в первую строку нули, от "определённого столбца" до "определённого столбца". Table - условное название таблицы StringGrid, у вас может быть другое. Наджежда, добавлено 7.06.13, 21:26:45 
Нет, а вот если в строках стрингрида записан цикл и с толбцах, то тогда как можно организовать цикл по заполнению таблицы нулями????
Аноним, добавлено 7.06.13, 21:35:59 
в заголовках строк стрингрида формируется элементы типа :Sbeta11,Sbeta21,Sbeta12,Sbeta22,..,Sbetaqp в цикле for q:=1 to M_count
  for p:=1 to N_count
в заголовках столбцов стрингрида формируются элементы типа:
ilambdaX11,ilambdabetaX21,ilambdabetaX12,ilambdabetaX22,ilambdabetaX13,ilambdabetaX23 в цикле for n:=1 to M_count+
  for m:=1 to N_count
и нужно вывести для этих элементов начальные значения- нули!Помогите пожалуйста,если кто знает?и возможно ли так сделать? Надежда, добавлено 7.06.13, 21:37:16 
в заголовках строк стрингрида формируется элементы типа :Sbeta11,Sbeta21,Sbeta12,Sbeta22,..,Sbetaqp в цикле for q:=1 to M_count
  for p:=1 to N_count
в заголовках столбцов стрингрида формируются элементы типа:
ilambdaX11,ilambdabetaX21,ilambdabetaX12,ilambdabetaX22,ilambdabetaX13,ilambdabetaX23 в цикле for n:=1 to M_count+
  for m:=1 to N_count
и нужно вывести для этих элементов Sbetapq в соответсвии c ilambdaXnm начальные значения- нули!Помогите пожалуйста,если кто знает?и возможно ли так сделать? Олег, добавлено 7.08.13, 18:15:52 
В FormCreate Написал
SG.Cells[1,0]:='Наименование'
а как поставить это слово на середину ячейки и как сделать текст жирным, подскажите пожалуйста. Автор, добавлено 7.08.13, 20:30:02 
Вот есть у меня сайтик, посвящённый специально таблице StringGrid. На странице stringgrid-delphi.ru/textalign.php дана процедура, выводящая текст в ячейке в нужной позиции: слева, справа или в центре. А насчёт жирности текста, это нужно менять или свойства шрифта целиком в таблице, или рисовать текст свойствами канвы, то есть это будет именно рисунок, содержащий текст. Олег, добавлено 8.08.13, 12:10:44 
Спасибо, хороший сайтик. А по другим компонентам и свойствам есть такие? Олег, добавлено 8.08.13, 12:17:29 
Одно маленькое пожелание. А можно увеличить размер текста? А то, особенно программные строки, плохо читаются. Я понимаю, что изменив разрешение экрана можно все прочитать нормально. Автор, добавлено 8.08.13, 12:39:28 
Шаблон того сайта такой что размер не увеличишь, не я сам делал. Данный сайт сделан просто, как говорится, на коленке, можно менять всё что хочешь, а тот нет...
Хотел и по другим популярным компонентам сделать по спец. сайту, но всё ленюсь. Олег, добавлено 8.08.13, 12:59:23 
Прочитал рекомендации по переходу между компонентами в TabOrder, мнекажется самое простое применить
Perform(WM_NEXTDLGCTL, 0, 0);
и больше ничего не надо, произойдет переход фокуса на следующий компонент. Олег, добавлено 9.08.13, 08:00:08 
Подскажи пожалуйста как запомнить положение и размер окна редактора. Автор, добавлено 10.08.13, 14:34:50 
Какого редактора? Memo? Ну да неважно. Нужно записать эти значения в файл. Создать структуру типа Запись (Record), с полями Left, Top, Width, Height. Записать при выходе значения, при старте программы считывать. Олег, добавлено 10.08.13, 19:31:53 
1.Не понял, насчет Perform(WM_NEXTDLGCTL, 0, 0); согласен?
2.Я имею ввиду окно редактора самого DELHI/
Спасибо за ответы. Автор, добавлено 11.08.13, 09:03:04 
Олег, описаны стандартные приёмы для клавиши Tab. Насчёт Preform не знаю, никогда не пользовался. Но если происходит переход, то и слава богу.
А насчёт окна редактора Delphi, то есть же кнопка "Save current desctop", и загрузка одного из сохранённых, в верхней панели инструментов, справа. Олег, добавлено 13.08.13, 18:28:24 
Подскажи пожалуйста.
Делаю проверку заполнения ячеек в StringGrid
var
 I,J: integer;
  // проверка заполнения всех ячеек таблицы точек
begin
  for J:=1 to KolStr do
  for I:=1 to 4 do
  with TTaheo.Tochki do
  if (Tochki.Cells[I,J]='') then begin
  ShowMessage(' Заполните ячейку '+ IntToStr(I) + ' в строке ' + IntToStr(J) + ' в таблице точек! ');
  Row := I; // перейти в незаполненую ячейку
  Col := J;
  SetFocus;
  Oshibka := 1;
  exit;
  end;
end;
и получаю ошибку Taheo1.pas(647): Method identifier expected в строке
with TTaheo.Tochki do
Раньше делал все было нормально, а сейчас забыл как делал. Автор, добавлено 13.08.13, 22:46:59 
begin
  for J:=1 to KolStr do// - тут нужно KolStr-1
  for I:=1 to 4 do
  with TTaheo.Tochki do
  if (Tochki.Cells[I,J]='') then begin.// - тут Tochki лишнее
  ShowMessage(' Заполните ячейку '+ IntToStr(I) + ' в строке ' + IntToStr(J) + ' в таблице точек! ');
  Row := I; // перейти в незаполненую ячейку
  Col := J;
  SetFocus;
  Oshibka := 1;
  exit;
  end;
end; Олег, добавлено 14.08.13, 09:24:28 
Выдает ту же ошибку Олег, добавлено 14.08.13, 10:43:44 
Главное тут перейти в ячейку которая дает ошибку Олег, добавлено 21.08.13, 11:45:04 
Помоги пожалуйста.
Скачал библиотеку компонентов DeplhiX при установке выдает ошибку - невозможно создать выходной файл .bpl. как справиться в интернете не нашел. Александр, добавлено 26.09.13, 12:20:02 
Помогите пожалуйста! Код не срабатывает, я только начал изучать Делфи, подскажите что не так...
procedure TForm3.Button2Click(Sender: TObject);
var i: integer;
k: real;
const n=3;
begin
with StringGRid1 do
for i := 1 to RowCount-1 do
  begin
  StringGRid1.Cells[i,ColCount-1]:=FloatToStr((StrToFloat(Cells[i,1])+StrToFloat( Cells[i,2])+StrToFloat(Cells[i,3]))/n);
  end;
end; Александр, добавлено 26.09.13, 12:21:27 
На 'K' не обращайте внимания Автор, добавлено 27.09.13, 08:31:05 
Александр, прошу прощения за задержку. По теме:
1. Написали with StringGrid - зачем опять StringGrid.Cells? Просто Cells.
2. Перепутаны местами ColCount и RowCount. Сначала в таблице должен идти индекс столбца, затем - строки. То есть нужно
Cells[ColCount-1, i] - это будет перебор ячеек последнего столбца. саня, добавлено 21.10.13, 17:19:51 
как сделать так,чтобы при каждом нажатии button-вычислить,вычисленные значения выводились на одну строку ниже, чем предыдущие.Я пробовал так
  for i:=1 to 10 do
  i:=i+1;
  tab1.cells[1,i]:=FloatToStr(v1);
  tab1.cells[2,i]:=FloatToStr(v2); но,не получилось. Автор, добавлено 21.10.13, 17:27:49 
i - переменная цикла for, её нельзя менять вручную. Там цикл вообще не нужен. Эта переменная просто должна увеличиваться с каждым нажатием. Уберите for, то есть первую строку. Саня, добавлено 29.10.13, 08:51:19 
Спасибо за предыдущий ответ, но у меня еще одна проблема.Решил организовать поиск слов в таблице стринггирд:искомое слово вводится в Едит1,а результат выводится в Едит2.Вот код var
  Rows,Cols,i: integer;
  s:string;
  begin
  Rows:=StringGrid1.RowCount;//кол-во строк
  S:=Edit1.Text;
  for i:=1 to Rows - 1 do
  if Form1.StringGrid1.Cells[1,i] = S then
  Form1.StringGrid1.Row:=1;
  Edit2.Text:=Form1.StringGrid1.cells[2,i];
  Label1.Caption:=inttostr(Rows);
 В Лейбел1 решил узнать чему равно число строк,оказалось это не число строк,а число всех слов содержащихся в таблице,т.е. программа воспринимает стринггирд не как таблицу а как массив чисел.Мне нужно чтобы она перебирала ячейки только 1 столбца.Что можете посоветовать. Автор, добавлено 29.10.13, 10:21:19 
У вас вообще что-то неясное сооружено.
Вот цикл
 for i:=1 to Rows - 1 do
  if Form1.StringGrid1.Cells[1,i] = S then
  Form1.StringGrid1.Row:=1; - почему 1??? это первая строка, может i?
Всё, больше цикл не действует. Но следующей строчкой
 Edit2.Text:=Form1.StringGrid1.cells[2,i]; - переменная i здесь не определена, использовать нельзя. Вам нужно вывести в Edit2 вторую ячейку найденной строки:
 Edit2.Text:=Form1.StringGrid1.cells[2, StringGrid.Row];
И вообще, чего вы всё время за собой таскаете это Form1.StringGrid... Мало того что Form1 вообще не нужно, есть же оператор присоединения with:
with StringGrid do
  begin
  end;
Так вот, внутри begin/end StringGrid уже вообще писать не нужно, просто его свойства Row, Cells и так далее:
 Edit2.Text:=cells[2, Row];
 Переменную Rows так лучше не называть - может возникнуть путаница, т.к. у StringGrid есть соответствующее свойство. StringGrid.Rows[i] - это массив, содержащий ячейки i-й строки.
Наконец,
 Rows:=StringGrid1.RowCount;//кол-во строк
 Label1.Caption:=inttostr(Rows); //по-любому тоже количество строк, разве нет? Саня, добавлено 29.10.13, 14:45:42 
.StringGrid1.Row:=1 это опечатка.На самом деле-это i.Мне нужно значение переменной цикла i в момент равенства,чтобы узнать номер строки 1 столбца и уже по номеру этой строки перекинуться во второй столбец.Переделал код
var
  i: integer;
  begin
  with Form1.StringGrid1 do
  for i:=1 to RowCount - 1 do
  if Cells[1,i] = Form1.Edit1.Text then
  StringGrid1.Row:=i;
  Edit2.Text:=StringGrid1.cells[2,i];
  end;
но на Едит2 ничего не выводится. Саня, добавлено 29.10.13, 15:21:29 
После нахождения искомого слова мне нужно остановить цикл.А вот как? Автор, добавлено 29.10.13, 17:45:49 
Блин, сказал же, после цикла i не определено, использовать нельзя. Значение i сейчас имеет строка таблицы, свойство Row. Автор, добавлено 29.10.13, 17:47:13 
if Cells[1,i] = Form1.Edit1.Text then
  begin
  StringGrid1.Row:=i;
  break;
  end; Саня, добавлено 30.10.13, 15:48:19 
Все коды в принципе правильные,но дело не в них.Дело в том что стринггрид у меня заполнен строками импортированными из экселя.Но программа их не видит т.е. они как бы нарисованные а не реальные данные.Что делать? Автор, добавлено 30.10.13, 16:43:02 
Мне совершенно неизвестен формат ваших данных, и как они импортированы. Ничего сказать не могу. Сами посмотрите, что у вас в StringGrid. Для этого добавьте в опциях Инспектора Объектов режим ручного редактирования. Если это текст, он нормально выделится, если рисунок - нет. Саня, добавлено 30.10.13, 17:24:11 
Формат данных из экселя - наверно 'вариант',точно не знаю. Автор, добавлено 30.10.13, 17:39:37 
Вариант - это формат для получения данных, а вот что у вас в стринггриде оказывается, смотрите. Должен быть текст. Фёдор, добавлено 4.11.13, 20:42:31 
procedure TForm1.Button1Click(Sender: TObject);
var f:textfile;
  i:integer;
begin
  if SaveDialog1.Execute then
  begin
  AssignFile(f,SaveDialog1.FileName+'.txt');
  Rewrite(f);
  for i:= 0 to StringGrid2.ColCount-1 do Writeln(f,StringGrid2.Cells[i,1]);
  end;
  closefile(f);
end;
Здравствуй автор
Как в диалог сохранения добавить формат .txt ?
Почему-то то, что написал я, не работает =( Фёдор, добавлено 4.11.13, 20:53:07 
Как оказалось вместе с +'.txt' оно не желает сохраняться.
Как сделать что бы в выпадающем списке, можно было выбрать один или несколько форматов? Автор, добавлено 4.11.13, 20:54:47 
Здравствуй Фёдор.
Программист имеет всегда несколько вариантов решения проблемы. Если работаем с текстовым файлом, то стопудово более простой вариант использовать компонент Мемо. Фёдор, добавлено 4.11.13, 20:54:48 
БЫло бы неплохо, если бы комментарии можно было редактировать/удалять =) Фёдор, добавлено 5.11.13, 02:00:19 
Я бы с удовольствием последовал данному совету, но
в лабораторной работе сказано использовать StringGrid =( Автор, добавлено 5.11.13, 03:04:18 
Фёдор, я вижу, у вас там кроме стринггрид и "выпадающий список" есть. Ай-яй-яй... Нехорошо. Кнопки тоже наверное запрещены? Может и саму Форму под запрет?
А если серьёзно, то я имею в виду, что для сохранения текста в файл проще работать с объектами, чем с файловыми переменными. Ну, создайте StringList.
Ну да ладно. Вот я что сделал, и работает:
procedure TForm1.Button1Click(Sender: TObject);
var FS: TextFile;
 i: Integer;
begin
with SaveDialog1, StringGrid1 do
if Execute then
 begin
  AssignFile(FS, FileName+'.txt');
  Rewrite(FS);
  for i:=1 to ColCount-1 do
  Writeln(FS, Cells[i, 1]);
  CloseFile(FS);
 end;
end;
Владимир, добавлено 11.11.13, 15:34:17 
Поясните,почему в записи в файл сохраняются лишь данные последней заполненной ячейки StringGrid-a Владимир, добавлено 11.11.13, 15:36:55 
procedure TForm1.Button1Click(Sender: TObject);
begin
  StringGrid1.Cells[1,i]:=Edit1.Text;
 List:=TStringList.Create;
 List.Add(StringGrid1.Cells[1,i]);
 i:=i+1;
 Edit1.Text:='';
 Edit1.SetFocus;
 List.SaveToFile('doc1.txt');
end; Владимир, добавлено 11.11.13, 16:10:28 
Попробовал использовать код,который вы рекомендовали Федору, но там проблема с
вводом данных в ячейки: по клику выходит на сохранение. В строке AssignFile(FS, FileName+'.txt'); где нужно вставить имя файла?
И спасибо, что уделяете внимание чайнику. Автор, добавлено 11.11.13, 17:25:10 
Владимир, только пришёл. Отвечаю. При каждом нажатии кнопки у вас создаётся новый StringList, туда записывается одна ячейка, и содержимое StringList'а сохраняется, а там - одна ячейка и есть. List.Create нужно вынести в процедуру Form.Create. Александр, добавлено 17.12.13, 13:49:24 
поомгите мне задчей все правельно идет а в концы не делиться ни как помогите пожалуйста код
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;
type
  TForm1 = class(TForm)
  StringGrid1: TStringGrid;
  StringGrid2: TStringGrid;
  Button1: TButton;
  Button2: TButton;
  procedure Button1Click(Sender: TObject);
  procedure FormCreate(Sender: TObject);
  procedure Button2Click(Sender: TObject);
  private
  { Private declarations }
  public
  { Public declarations }
  end;
type strana=record
  nom:byte;
  cis:integer;
  pls:integer;
  end;
var
  Form1: TForm1;
  a:array[1..12] of strana;
  i:integer;
implementation
{$R .dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
with stringgrid1 do
 begin
 
  cells[0,0]:='Номер';
  cells[0,1]:='Численность';
  cells[0,2]:='Площадь';
 end;
with stringgrid2 do
 begin
  cells[0,0]:='население по району';
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
randomize;
for i:=1 to 12 do
 begin
  with a[i] do
  begin
  nom:=i;
  cis:=random(2000);
  pls:=random(1000);
  with stringgrid1 do
  begin
  cells[i,0]:=inttostr(nom);
  cells[i,1]:=floattostr(cis);
  cells[i,2]:=floattostr(pls);
  end;
  end;
  end;
 end;
procedure TForm1.Button2Click(Sender: TObject);
  var s:integer ;
begin
  randomize;
for i:=1 to 12 do
 begin
  with stringgrid2 do
  begin
  cells[i,1]:=floattostr(a[i,1]/a[i,2]);
  end;
  end;
  end;
end. Автор, добавлено 17.12.13, 18:26:11 
floattostr(a[i,1]/a[i,2]) это деление одного объекта типа strana на другой. То есть тип Record делится на другой тип Record. Ну и что должно получиться?
Делить нужно не запись на запись, а поле записи на другое поле. Александр, добавлено 18.12.13, 07:14:08 
можете показать пожалуйста как должно все выйглядь Автор, добавлено 18.12.13, 07:48:37 
У вас там даже 2 ошибки. Вначале читал с телефона, увидел что вы делите один элемент массива на другой, то есть Страну на Страну. Если Украину поделить на Германию, это как математически? Но далее, вы описываете страны как массив
a: array[1..12] of strana;
то есть индексироваться страны должны как a[i], не a[i,j] - как у вас.
Я так понимаю, a[i,1] это поле a[i].cis, а a[i,2] это a[i].pls. Вот их и нужно делить. Александр, добавлено 18.12.13, 07:58:08 
мне числиности разделить на площадь и получить ответ в стриггрид2 так же ну только ответ что были записанный можете пожалуйста написать код в кнопке 2 что он вычислял и записал стринггрид 2 Александр, добавлено 18.12.13, 08:01:40 
for i:=1 to 12 do
 stringgrid2. cells[i,1]:=floattostr(a[i].cis/a[i].pls);
записываю ну не получаю ответа в стригрид 2 Автор, добавлено 18.12.13, 08:18:17 
Вы бы писали что получаете, а не что НЕ получаете...
Вот я скопировал ваш код, исправил - всё получаю.
И ещё, ВСЕГДА переменная цикла - это локальная переменная той процедуры, где она используется. Иначе 2 цикла могут выполняться в двух процедурах одновременно, переменные цикла могут иметь разные значения в одно и то же время, а у вас описана одна i как глобальная. Возможна накладка, ошибку будете 100 лет искать. Александр, добавлено 18.12.13, 08:31:49 
можете написать мне код что у вас получилось Александр, добавлено 18.12.13, 08:33:16 
можете написать мне код исправленный Автор, добавлено 18.12.13, 09:03:17 
var
  Form1: TForm1;
  a: array[1..12] of strana;
 
implementation
{$R .dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
with stringgrid1 do
 begin
  cells[0,0]:='Номер';
  cells[0,1]:='Численность';
  cells[0,2]:='Площадь';
 end;
with stringgrid2 do
 begin
  cells[0,0]:='население по району';
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
randomize;
for i:=1 to 12 do
 begin
  with a[i] do
  begin
  nom:=i;
  cis:=random(2000);
  pls:=random(1000);
  with stringgrid1 do
  begin
  cells[i,0]:=inttostr(nom);
  cells[i,1]:=floattostr(cis);
  cells[i,2]:=floattostr(pls);
  end;
  end;
  end;
 end;
procedure TForm1.Button2Click(Sender: TObject);
  var i: integer ;
begin
  randomize;
for i:=1 to 12 do
begin
  with stringgrid2 do
  begin
  cells[i,1]:=floattostr(a[i].cis/a[i].pls);
  end;
 end;
end;
end.
Кстати, поле nom излишне. Номер задаётся индексом элемента в массиве. Александр, добавлено 18.12.13, 09:20:48 
а как сделать что выводил не дробные а только целые чила Аноним, добавлено 18.12.13, 09:24:37 
кстати не подскажите как мне вести не случайные числа о свои числа я буду вводить
код: Автор, добавлено 18.12.13, 09:48:57 
Чтобы были только целые, нужно обработать результат функцией Round(x), числа после запятой будут отброшены, но без округления - и будет тип целого числа. А если взять функцию RoundTo(x, 0) - то будет округление к ближайшему целому, но результат - тип Real. Для использования RoundTo нужно добавить к списку uses (вверху) модуль Math.
Вводить свои значения вы хотите через таблицу?
1. Измените значение goEditing в Options на True.
2. Напишите обработчик OnExit, то есть при выходе из таблицы мы будем записывать новые значения в массив:
procedure TForm1.StringGrid1Exit(Sender: TObject);
var i: Integer;
begin
with StringGrid1 do
for i:=1 to ColCount-1 do
  begin
  a[i].cis:=FloatToStr(Cells[i, 1]);
  a[i].pls:=FloatToStr(Cells[i, 2]);
  end;
end;
Ну и на будущее. Не нужно обозначать тип как Strana, а массив как а[i]. Лучше - тип как TStrana, а массив тогда как Strana. Все кто посмотрит - сразу всё поймут. А безымянные a, b и так далее только запутают. Александр, добавлено 25.12.13, 08:13:25 
автор. основные понятий стринггрид не подскажешь Автор, добавлено 25.12.13, 09:12:03 
Основные понятий стринггрид:
1. стринггрид это таблица
2. в ней есть ячейки, расположенных по строкам и столбцам
3. ячейка может быть пуста, а может содержать текст
4. текст можно читать, записывать, а можно не записывать
Вот и всё, пожалуй. Иван, добавлено 3.01.14, 14:07:25 
Хорошо. Игорь, добавлено 5.01.14, 10:49:48 
Здравствуйте! Загружаю в SG таблицу базы данных. Можно ли получить адрес выбранной ячейки путем клика по ней мышки? Спасибо. Автор, добавлено 5.01.14, 13:40:39 
Можно.
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var ACol, ARow: Integer;
begin
StringGrid1.MouseToCell(X, Y, ACol, ARow);
end;
X и Y это координаты щелчка в пикселах, передаваемые процедурой MouseDown, их получает метод MouseToCell и возвращает индексы ячейки ACol и ARow. Игорь, добавлено 5.01.14, 16:24:38 
Большое спасибо! Прочитал материал который был написан для Ильи. Все понятно. Аноним, добавлено 5.01.14, 16:30:55 
Большое спасибо за оперативный ответ. Использовал StringGrid1MouseDown и StringGrid1SelectCell. Получилось универсально. Благодаря SG получаю названия таблиц на русском, чего не мог получить в DBGrid. саша, добавлено 26.01.14, 05:48:47 
var i,j:integer;
begin
 k1:= strtoint (edit1.Text);
 k2:= strtoint (edit1.Text);
  for i:= 0 to k1 do
  for j:= 0 to k2 do
  setlength(a,k1,k2);
  setlength (a,k2,k1);
  setlength (a[k2],k1);
  setlength (a[k2],k1);
  setlength (a[k2],k1);
  with stringgrid1 do
  begin
  cells[0,0]:=inttostr(k1);
  cells[1,1]:=floattostr(k2);
  end; end;
исправте ошибку пожалуйста саша, добавлено 26.01.14, 06:24:20 
var v1,v2,v3 : integer;
begin
  v1:= strtoint (edit3.Text);
  v2:= strtoint (edit4.Text);
  v3:= strtoint (edit5.Text);
setlength(a,4,4);
  begin
  setlength(a,1,v1);
  setlength(a,2,v2);
  setlength(a,3,v3);
  with sg do
  Cells [4,4]:=inttostr(a[2,v1]);
 end; end; Автор, добавлено 26.01.14, 09:45:45 
По первому комментарию:
 for i:= 0 to k1 do
 for j:= 0 to k2 do
  setlength(a,k1,k2);
Данная конструкция выполняет задание размера массива К1К2 раз. А нужно всего 1 раз задать размер. Перед этим зачем:
k1:= strtoint (edit1.Text);
k2:= strtoint (edit1.Text);
Получается, К1 и К2 равны,и тогда К2 не нужна. Можно вместо неё использовать просто К1. Может, там Едиты разные, Edit1 и Edit2? Далее, всё это зачем, какой смысл:
  setlength (a,k2,k1);
  setlength (a[k2],k1);
  setlength (a[k2],k1);
  setlength (a[k2],k1);
Вы уже задали размер массива, причём в цикле много раз, что ещё? Далее, почему
cells[0,0]:=inttostr(k1);
cells[1,1]:=floattostr(k2);
в первой строчке IntToStr, а во второй FloatToStr? Хотя это и не ошибка...
Но вот что хочу сказать. Я всегда задавал размер двумерного массива так:
var A: Array of Array of Integer;
 i, k, n: Integer;
begin
k:=4;
n:=5;
SetLength(A, k);
for i:=0 to k-1 do
  SetLength(AS[i], n);
end;
То есть SetLength(A, k); задаёт количество столбцов, а затем в цикле в каждом столбце задаём количество строк. Конечно, так можно создать массив любой размерности, необязательно прямоугольный. Но если нужно именно прямоугольный, а это чаще всего, то конечно намного удобнее SetLength(A, k);. Почему-то раньше этого не встречал. Проверил - работает! Так что спасибо.
По второму комментарию.
  setlength(a,4,4);
  begin//эта строка не нужна
  setlength(a,1,v1);
  setlength(a,2,v2);
  setlength(a,3,v3);
Зачем много раз задавать размерность одного и того же массива??? А если вы хотите задать как раз массив непрямоугольный, то это неправильно, я чуть выше описал как это делается. И про нулевой индекс вы забыли. Вот так надо:
setlength(a[0], v0);
setlength(a[1], v1);
setlength(a[2], v2);
setlength(a[3], v3);
Игорь, добавлено 2.02.14, 23:56:57 
Добрый вечер! Подскажите, пожалуйста, можно ли объединить ячейки отдельной строки в одну ячейку? Автор, добавлено 3.02.14, 04:44:44 
Сама таблица таких возможностей не имеет. Но можно в нужных местах затереть фоновым цветом границы между ячейками - будет типа одна. Но содержимое тоже придётся не печатать а рисовать. Игорь, добавлено 3.02.14, 15:15:07 
А рисунок накладывается на каждую ячейку свой или сразу на всю строку ячеек? Автор, добавлено 3.02.14, 16:19:26 
Таблица имеет обработчик OnDrawCell, там есть параметр Rect - это прямоугольник ячейки. У многих процедур рисования есть такой параметр, соответственно таблица выводит рисунок в этот прямоугольник. Но программист может рисовать по канве таблицы сам как он захочет, прямоугольники придётся задавать самому.
В общем, StringGrid всё равно для объединения ячеек не предназначен. Вот есть компонент F1Book на странице ActiveX, это электронная таблица, практически Excel. Вот он наверное имеет такие возможности. Лучше там поищите, поройте интернет. Я посмотрел, есть ответы, но разбираться вам, так что ищите сами. Игорь, добавлено 5.02.14, 10:06:07 
Большое спасибо! Еще вопрос по SG. Необходимо убрать сетку и сформировать ее только для группы ячеек. Такое можно, и если да, то как? Автор, добавлено 5.02.14, 11:33:23 
Тоже, только вручную. GridLineWidth поставьте 0, и рисуйте свои линии. Координаты считаются в цикле суммирования ColWidths[i] и RowHeights[i] плюс несколько пикселов, для точности. Лика, добавлено 15.02.14, 23:17:28 
Здравствуйте.Подскажите пожалуйста ,как можно сделать , чтобы ячейки заполнялись через определённые промежуток времени? Автор, добавлено 16.02.14, 07:19:57 
Хм, Лика, про компонент разве не знаете? Катя, добавлено 9.03.14, 18:31:46 
Добрый вечер! Автор, если не затруднит, помогите, пожалуйста,необходимо кликом мыши выделить несколько столбцов таблицы, чтобы в дальнейшем все операции в программе выполнялись только над этими столбцами. Как это реализовать? Автор, добавлено 9.03.14, 21:03:12 
Катя, я конечно не совсем понял, что вы хотите. StringGrid позволяет задать регион ячеек, как программно, так и с помощью мышки. Здесь не буду описывать, почитайте про это на моём сайте о StringGrid: stringgrid-delphi.ru/rangeselect.php
Источник: http://www.delphi-manual.ru/stringgrid.php?com=yes

Как сделать ячейку в excel невидимой фото



Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой

Как сделать ячейку в excel невидимой




Меню

Главная

Поздравления с днем рождения тестя словами
Как сделать салонный фильтр
Додекаэдр как правильно сделать
Сделать красивый педикюр домашних условиях
Поздравление с крещением господним в смс
Как сделать когтедралку для котов
Как в фотошопе сделать анимацию gif
Поздравления на 25 лет совместной жизни жене
Поздравление для парня-друга с днем рождения
Шеллак с блестками как сделать