Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа со StringGrid и Excel, доступ к ячейкам 
V
    Опции темы
welt
  Дата 11.4.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 21.5.2005
Где: UnderGround

Репутация: нет
Всего: нет



Я пишу программу для экспорта данных из 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, из которого я импротировал данные ?
Заранее спасибо.
PM MAIL   Вверх
_hunter
Дата 11.4.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



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

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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
welt
  Дата 11.4.2006, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 21.5.2005
Где: UnderGround

Репутация: нет
Всего: нет



_hunter,
По пункту 1:
Цитата

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

Что именно нужно прописать?
Может быть ты неправильно понял:
нужно, чтобы по нажатию кнопки, строка N/столбец N (т.е. все ячейки в стоке/столбце)
была бы доступна для редактирования.
(причем, только определенная строка/столбец)
PM MAIL   Вверх
_hunter
Дата 12.4.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
welt
Дата 12.4.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 21.5.2005
Где: UnderGround

Репутация: нет
Всего: нет



ок, спасибо, _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
то буду очень благодарен
PM MAIL   Вверх
Albinos_x
Дата 12.4.2006, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Код

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



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
welt
Дата 13.4.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 21.5.2005
Где: UnderGround

Репутация: нет
Всего: нет



Albinos_x, я это в цикл дописал,
кнопочки появляются как и прежде, но при нажатии на них форма2 не появляется.
А что значит цифра "5" ?
Можно ли вообще так сделать или подскажите кто-нибудь как
сделать, чтобы FixCols были ввиде кнопок. smile
PM MAIL   Вверх
welt
Дата 13.4.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 21.5.2005
Где: UnderGround

Репутация: нет
Всего: нет



Задача усложнилась
Смотреть ВОТ ЭТУ тему
PM MAIL   Вверх
_hunter
Дата 13.4.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Snowy
Дата 13.4.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Код
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;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0782 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.