Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > работа со StringGrid и Excel


Автор: welt 11.4.2006, 16:11
Я пишу программу для экспорта данных из Excel в StringGrid и их редактирования.
У меня несколько вопросов.
1-ый Впорос такой:
на форме есть StringGrid. Как сделать чтобы можно было редактировать данные в ячейках только для определенного стольбца/строки, а не для всей таблицы?
(Для всей таблицы это делается легко: options -> goEditing.)
Допустим по нажатию кнопки, строка 5(т.е. все ячейки в ней) была бы доступна для редактирования?
Вот код для экспорта из Эксель в СтрингГрид:
Код

procedure TForm1.Button1Click(Sender: TObject);
const
  xlCellTypeLastCell = $0000000B;
var
 Excel: variant;
 WorkSheet: OLEVariant;
      i, j: word;
         S: string;
       x,y: integer;
  FileName: WideString;
begin
FileName:='c:\book1.xls';
     Excel := CreateOleObject('Excel.Application');
     Excel.Workbooks.Open(FileName);
     Excel.Visible:=false;
     WorkSheet := Excel.Workbooks[ExtractFileName(FileName)].WorkSheets[1];
WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
     x := Excel.ActiveCell.Row;
     y := Excel.ActiveCell.Column;
     StringGrid1.RowCount := x;
     StringGrid1.ColCount := y;
     for i := 1 to x do
       for j := 1 to y do
        begin
          S := Excel.Sheets[1].Cells[i,j].Text;
        StringGrid1.Cells[j-1,i-1]:=s;
        end;
end;

2-ый Впорос такой:
Как завершить excel по закрытию программы, чтобы его небыло в процессах?
3-ый Впорос такой:
Допустим я изменяю текст в определенной ячейке (Например StringGrid1.Cells[2,3])
Как сделать, чтобы изменеия можно было сохранить в том же файле book1.xls, из которого я импротировал данные ?
Заранее спасибо.

Автор: _hunter 11.4.2006, 16:29
1 -- в OnSelectCell смотри ряд/строку/условие. и добавляй/удаляй в Options goEditing
2 -- поиск по форуму
3 -- экспортировать изменения в тот же файл book1.xls, из которого ты импротировал данные

P.S.
один топик -- один вопрос

Автор: welt 11.4.2006, 18:53
_hunter,
По пункту 1:
Цитата

в OnSelectCell смотри ряд/строку/условие. и добавляй/удаляй в Options goEditing

Что именно нужно прописать?
Может быть ты неправильно понял:
нужно, чтобы по нажатию кнопки, строка N/столбец N (т.е. все ячейки в стоке/столбце)
была бы доступна для редактирования.
(причем, только определенная строка/столбец)

Автор: _hunter 12.4.2006, 11:14
нужно прописать ЕСЛИ (кнопка_была_нажата И строка == N И столбец == K [наверное это имелось в виду] ) ТО добавляем в множество Options элемент goEditing ИНАЧЕ убираем из множества Options элемент goEditing

Автор: welt 12.4.2006, 19:23
ок, спасибо, _hunter.
Теперь еще такой вопрос:
Я создаю на stringGrid1 массив из кнопок-вертикальный ряд кнопок сверху вниз.
Эти кнопки располагаются на левом столбце СтрингГрида.
Создаю я их так:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  btns: array of TButton;
  i: integer;
begin
SetLength(btns,x);
  for i:=low(btns) to high(btns) do
  begin
    btns[i]:=TButton.Create(form1.ScrollBox1);
    btns[i].Width:=25;
    btns[i].Height:=25;
    btns[i].Top:=25*i+0;
    btns[i].Left:=0;
    form1.StringGrid1.InsertControl(btns[i]);
    btns[i].OnClick:=Form1.Button2Click ;
 end;
end;

В кнопке2 прописано так:
Код

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.Show;
end;

Задача в том, чтобы по нажатию на каждую из созданный кнопок,
появлялась бы форма2.
Причем заметьте, если в цикле вместо
form1.StringGrid1.InsertControl(btns[i]);
написать так
form1.InsertControl(btns[i]);
то все вроде бы нормально: по нажатию на эти кнопочки-форма появляется...
Но дело все в том, что эти кнопки уже лежат не на СтрингГриде, а на форме.
А нужно, чтобы они лежали на СтрингГриде.
Вроде бы, еще можно чтобы в роли кнопок были FixCols, но я не знаю как в них OnClick обрабатывать....
Если кто-нибудь подскажет выход из этой ситуации.. smile
то буду очень благодарен

Автор: Albinos_x 12.4.2006, 21:01
Код

...
StringGrid1.Objects[5,i]:=btns[i];
StringGrid1.Objects[5,i].AfterConstruction;
...

Автор: welt 13.4.2006, 11:32
Albinos_x, я это в цикл дописал,
кнопочки появляются как и прежде, но при нажатии на них форма2 не появляется.
А что значит цифра "5" ?
Можно ли вообще так сделать или подскажите кто-нибудь как
сделать, чтобы FixCols были ввиде кнопок. smile

Автор: welt 13.4.2006, 11:58
Задача усложнилась
Смотреть http://forum.vingrad.ru/index.php?act=ST&f=86&t=91700&unread=1 тему

Автор: _hunter 13.4.2006, 11:58
по вышеописанной проблеме -- явно кнопка создается не там/не нажимается.
поставь точку останова в Button2Click посмотри приходит ли сюда выполнение
Добавлено @ 12:02
по нажатию на фиксированные ячейки:
увеличиваем FixedCols/Rows до двух и в обработчике OnClick сетки с помощью MouseToCell смотрим где мы тыкнули -- если 0-й ряд/строка -- вызываем функцию показа формы; иначе ничего не делаем

Автор: Snowy 13.4.2006, 13:15
Код
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure ButtonUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  end;

var Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.ButtonUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Form2.Show;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
  btn: TButton;
begin
  inherited;
  for i:=1 to StringGrid1.ColCount - 1 do
  with StringGrid1 do begin
    btn := TButton.Create(Self);
    btn.Width  := DefaultColWidth;
    btn.Height := DefaultRowHeight;
    btn.Left := (DefaultColWidth + GridLineWidth) * i;
    btn.Top  := 0;
    btn.Caption := IntToStr(i);
    btn.OnMouseUp := ButtonUp;
    btn.Parent := StringGrid1;
  end;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)