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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TMS Grid, вместо TStringGrid 
:(
    Опции темы
Akella
Дата 19.3.2005, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Пример.
в строке несколько ячеек имеют ComboBox, кадый ComboBox заполняется в зависимости от того, что юзер выбрал в ComboBox`е предыдущей ячейки. Но если все ComboBox`ы заполнены, а юзер опять начал выбирать данные в той же строке, то после выбора значения первого ComboBox`а остальные нужно очистить. Но очисть в том случае, если юзер выбрал новое значение в ComboBox`е.
Есть 2 события ComboCloseUp и ComboOnChange. К сожалению ComboOnChange наступает позже, т.е. после закрытия ComboBox`а. Нам нужно до закрытия, т.к. после закрытия мы уже дожны знать, изменилось значание в ComboBox`е или нет.

Как отследить?

Вводим глобальную переменную
Код

AOldTex:string;

В событии OnClockCell пишем (запоминаем старый текст)
Код

AOldText := asg2.Cells[ACol,ARow];


В событии OnComboCloseUp
Код

asg2 - сетка
  bComboCh := asg2.Combobox.Text <> AOldText;
  if bComboCh then begin
    if (ACol = 0) then begin
      asg2.Cells[ACol+1,ARow]:='';
      asg2.Cells[ACol+2,ARow]:='';
    end;//if (ACol = 0) then begin
    if (ACol = 1) then begin
      asg2.Cells[ACol+1,ARow]:='';
    end;//if (ACol = 0) then begin

    if (ACol = 2) then begin
      asg2.Cells[ACol+1,ARow]:='';
    end;//if (ACol = 0) then begin
  end;//if bComboCh then begin


PM MAIL   Вверх
Akella
Дата 2.6.2005, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Глюк:
Код

код в исходниках (файл BaseGrid)

procedure TBaseGrid.RepaintCell(c, r: integer);
var
  ARect: TRect;
begin
  ARect := CellRect(c,r);
->  InvalidateRect(Handle,@arect,true); <- здесь ошибка
end;



Почему? А может и я не прав. Итак загружаем в сетку данные, затем удаляем одну строку загружаем новые данные, получается последние строки не отрисовывает, мало того вылетает исключение.

Как решить проблему?

Код

код удаления одной строки
asgMain - TTMSGrid

procedure TfmMain.actDelRowExecute(Sender: TObject);
var
  _i,_j,_k: Integer;
  _s:string;
begin
  if (ActRow2 = 0){ or (not asgMain.Focused)}then begin
    ShowMessage('Не выбрана строка ('+IntToStr(ActRow2)+')');
    EXIT;
  end;
  for _k:=0 to asgMain.ColCount-1 do
    _s:=_s+asgMain.Cells[_k,ActRow2];
  if _s <> '' then begin
    if application.MessageBox(PAnsiChar('УДАЛЕНИЕ объявления '+
    'в газету: '+asgMain.cells[ColByName.Gaz,ActRow2]+#13+
    'Рубрика: '+asgMain.cells[ColByName.Rub,ActRow2]+' '+asgMain.cells[ColByName.Obj,ActRow2]+#13+
    'Удалить объявление?'),'ВНИМАНИЕ!',MB_YESNO) = IDYES then
    begin
      _j:=asgMain.Row; // строка с выделением
      asgMain.Rows[_j].Clear;
      for _i:=_j to asgMain.RowCount-2 do
        asgMain.Rows[_i].Assign(asgMain.Rows[_i+1]);
      asgMain.RowCount:=asgMain.RowCount-1;
    end;
  end else begin
    _j:=asgMain.Row; // строка с выделением
    asgMain.Rows[_j].Clear;
    for _i:=_j to asgMain.RowCount-2 do
      asgMain.Rows[_i].Assign(asgMain.Rows[_i+1]);
      asgMain.RowCount:=asgMain.RowCount-1;
  end;//else
  sb1.Panels[1].Text:='строк: '+IntToStr(asgMain.RowCount-1);
  bGridCh:=True;
end;


Код

загрузка
некоторые строки лишние (для отладки)
Procedure TfmMain.LoadFiles;
begin
try
  if not assigned(lvFiles.Selected) then exit;
  asgMain.BeginUpdate;
  asgMain.Clear;
  if bUseTlfFull then begin
    sb1.Panels[2].Text:='Загрузка '+lvFiles.Selected.Caption;
    asgMain.LoadFromFile(lvFiles.Selected.Caption);
  end else begin
    sb1.Panels[2].Text:='Загрузка '+sTlfPath+lvFiles.Selected.Caption+'.ob';
    asgMain.LoadFromFile(sTlfPath+lvFiles.Selected.Caption+'.ob');
  end;
  lbTlf.Text:=lvFiles.Selected.Caption;
  application.ProcessMessages;
  sb1.Panels[2].Text:='Ставим галки';
  application.ProcessMessages;
  if asgMain.ColCount <=0 then begin
    ShowMessage('Ошибка загрузки колонок: '+IntToStr(asgMain.ColCount));
    exit;
  end;

  if asgMain.RowCount <=0 then begin
    ShowMessage('Ошибка загрузки строк: '+IntToStr(asgMain.RowCount));
    exit;
  end;
  CheckBoxes;//ставим галки
  sb1.Panels[2].Text:='Проверка дат и пустых №№ рубрик';
  application.ProcessMessages;
  OutOfDate;//прверка дат
  sb1.Panels[2].Text:='Включаем кнопки';
  application.ProcessMessages;
  actAddRow.Enabled:=True;
  actDelRow.Enabled:=True;
  actQSave.Enabled:=true;
  actClearGrid.Enabled:=true;
  sb1.Panels[1].Text:='строк '+IntToStr(asgMain.RowCount-1);
  asgMain.SelectRange(0,0,1,1);
  sb1.Panels[2].Text:='Готово';
finally
  asgMain.EndUpdate;
  if ActRow2=0 then ActRow2:=1;
end;
end;



Это сообщение отредактировал(а) dsergey - 2.6.2005, 11:17
PM MAIL   Вверх
Akella
Дата 2.6.2005, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



ОШИБКА ИМЕННО В ЭТОЙ ПРОСЕДУРЕ
Код

Procedure TfmMain.CheckBoxes;
Var
 iRow,iCol,ieRow,ieCol:integer;
 bCellCecked:bool;
 setDays:Set of 0..255;
begin
//ShowMessage(IntToStr(asgMain.RowCount-1));
  try
    setDays:=[ColByName.Pn,ColByName.Vt,ColByName.Sr,ColByName.Ch,ColByName.Pt,ColByName.Sb,ColByName.Eks,ColByName.Plat];
    For iRow:=0 to asgMain.RowCount-1 do begin
      ieRow:=iRow;//см.ниже для ShowMessage('Ошибка установки "галки".'+#13+
      if iRow >0 then begin
        For iCol:=0 to asgMain.ColCount-1 do begin
          ieCol:=iCol;//см.ниже для ShowMessage('Ошибка установки "галки".'+#13+
            if iCol in setDays then begin
              bCellCecked := AnsiUpperCase(asgMain.Cells[iCol,iRow])='Y';
              asgMain.AddCheckBox(iCol,iRow,bCellCecked,False);
            end;//if (iCol = ColByName.Pn) or...

        end;//For iCol:=0 to asgMain.ColCount-1 do begin
      end;//if iRow >0 then begin
    end;//for iRow

  except
    ShowMessage('Ошибка установки "галки".'+#13+
    'Строка '+IntToStr(ieRow)+' (включая заголовок)'+#13+
    'Колонка '+IntToStr(ieCol));
  end;//except
end;


PM MAIL   Вверх
Akella
Дата 2.6.2005, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Решил проблему следующим кодом

Код

procedure TfmMain.actDelRowExecute(Sender: TObject);
begin
  if (ActRow2 = 0)then begin
    ShowMessage('Не выбрана строка ('+IntToStr(ActRow2)+')');
    EXIT;
  end;
  asgMain.RemoveRows(ActRow2,1);<- стандартный медот удаления строк
  sb1.Panels[1].Text:='строк: '+IntToStr(asgMain.RowCount-1);
  bGridCh:=True;
end;


PM MAIL   Вверх
Akella
Дата 9.8.2005, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



неужели никто не на работал с эти пакетом?
PM MAIL   Вверх
avp
Дата 21.7.2006, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет!

несколько примеров для advStringGrid
Код

  SG.Colors[i,rc+5]:=clHighlight; //цвет фона ячейки

  SG.CellProperties[Co,Ro].FontStyle:=[fsItalic]; //стиль шрифта ячейки

  SG.CellProperties[Co,Ro].Alignment:=taRightJustify; //выравниваение в ячейке

  SG.CellProperties[Co,Ro].FontColor:=clWindowText; //цвет шрифта ячейки



Замечание при работе с Nodes - пред закрытием программы, для исключения Invalid Pointer Operation / AViolation их необходимо удалить, например в событии OnClose формы - 

Код


SG.RemoveAllNodes;

 
PM MAIL   Вверх
kostas
Дата 21.7.2006, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я тоже работал вплотную с этими компонентами.. Очень понравились, приятный вид и большой функционал.. Что же касается триальности, то пишите в личку ;) 
PM ICQ   Вверх
Akella
Дата 21.7.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



kostas, лучше примеры выкладывай, куски кода, что можно, что нельзя... 
PM MAIL   Вверх
Albinos_x
Дата 21.7.2006, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Цитата(Akella @  9.8.2005,  16:27 Найти цитируемый пост)
неужели никто не на работал с эти пакетом?

работал... но такого компанента я у себя в пакете не нашёл... у тебя он на какой закладке?

как-то задавал вопрос по VrScope... никто ничего по нему не сказал... пришлось самому разбираться... 


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


Фсемба Яцца
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 31.1.2006
Где: Россия, Арх.обл

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



Цитата(Akella @  9.8.2005,  16:27 Найти цитируемый пост)
неужели никто не на работал с эти пакетом?

я работал, но нормальных примеров у меня к сожалению нету, я пробовал разобраться в демках, кое что получилось, кое что нет, но от противной надписи о том что она триальная мне пришлось пострадать... (отказаться, дальенейшее изучение я посчитал бессмысленным... ибо небыло средств оплатить компанент...) 
PM MAIL ICQ   Вверх
kostas
Дата 23.7.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Akella @  21.7.2006,  16:46 Найти цитируемый пост)
kostas, лучше примеры выкладывай, куски кода, что можно, что нельзя... 

если нужен конкретный пример то могу дать, а так... что выкладывать то даже и не знаю smile) могу отрисовку выложить, делал чтоб строки разными цветами были 
PM ICQ   Вверх
Akella
Дата 24.7.2006, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



ну так выкладывай 
PM MAIL   Вверх
kostas
Дата 24.7.2006, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ниже процедурки, которые когда-то писал сам... есть еще много примеров по работе в общем с гридами, однако они есть в том же drkb и смысла здесь их приводить я не вижу..

Вот пример экспорта грида в html:
Код

procedure ToHtml(SG: TStringGrid; S: string);
Var i,j:integer;
    t:TStringList;
begin
  t:=TStringList.Create;  
  try   
   t.Add('<table border="1" align="center" cellspacing="0" rules="all">');  //начало таблицы 

   t.Add('<tr>');  //начало заголовков
   For j:=0 To SG.ColCount-1 Do
    t.Add('<th>'+SG.Cells[j,0]+'</th>');  //заголовки
   t.Add('</tr>');  //конец заголовков

  {ProgressBar1.Max:=SG.RowCount}

   For i:=1 To SG.RowCount Do
    begin
     t.Add('<tr>'); //начало ячеек
     For j:=0 To SG.ColCount-1 Do
      t.Add('<td>'+SG.Cells[j,i]+'</td>');  //ячейки
     t.Add('</tr>'); //конец ячеек
    {ProgressBar1.Position:=i}
    end;

    t.Add('</table>');  //конец таблицы
    t.SaveToFile(S); //сохраняем в файл

   {ProgressBar1.Position:=0}
  finally
   t.Free;
  end;
end;


сортировка по любой колонке:
Код

procedure SortGrid(SG: TStringGrid; Column: Integer);
var
    MinRowId, RowId1, RowId2, ColId: Integer;
    Temp1, Temp2: string;
begin
  for RowId1 := 1 to SG.RowCount - 2 do
   begin
    Temp1 := SG.Cells[Column , RowId1];
    MinRowId := RowId1;
    for RowId2 := RowId1 + 1 to SG.RowCount - 1 do
     begin
      Temp2 := SG.Cells[Column, RowId2];
      if Temp2 < Temp1 then
       begin
        Temp1 := SG.Cells[Column, RowId2];
        MinRowId := RowId2;
       end;
     end; 

    for ColId := 1 to SG.ColCount - 1 do
     begin
      Temp2 := SG.Cells[ColId, RowId1];
      SG.Cells[ColId, RowId1] := SG.Cells[ColId, MinRowId];
      SG.Cells[ColId, MinRowId] := Temp2;
     end;
   end;
end;


раскраска последней ячейки последнего столбца в красный цвет и выравнивание во всех других ячейках по правому краю:
Код

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if ACol=StringGrid1.ColCount-1 then
   StringGrid1.Canvas.Font.Color:=clRed;

  if ARow=StringGrid1.RowCount-1 then
   StringGrid1.Canvas.Font.Color:=clRed;

  If (ACol > 0) and (ARow>0) then
   begin
    StringGrid1.canvas.fillRect(Rect);
    StringGrid1.canvas.TextOut(rect.Right-canvas.TextWidth(StringGrid1.Cells[ACol,ARow])+length(StringGrid1.Cells[ACol,ARow])-5,Rect.Top+2,StringGrid1.Cells[ACol,ARow]);
   end;
end; 


и еще в аттаче небольшой примерчик по работе с TStringGrid, для кого то делал когда то 

Присоединённый файл ( Кол-во скачиваний: 24 )
Присоединённый файл  StringGrid_work.zip 29,74 Kb
PM ICQ   Вверх
Akella
Дата 26.7.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



на сайте разработчиков пакета FIBPlus (http://www.devrace.com/) выложен пример
Цитата

демо пример интеграции FIBPlus и TMSAdvDBGrid (TMS Component Studio)

см. новости за 25.07.2006

Добавлено @ 11:52 
http://www.devrace.com/files/tmsadvgrid_2....ibplus_6.45.exe 
PM MAIL   Вверх
Akella
Дата 3.10.2006, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



примеры

Присоединённый файл ( Кол-во скачиваний: 41 )
Присоединённый файл  tms_DASGDEMOS.ZIP 540,71 Kb
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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