Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.02.14;
Скачать: [xml.tar.bz2];

Вниз

Как поменять цвета ячеек у TStringGrid?   Найти похожие ветки 

 
yantux ©   (2009-12-10 12:26) [0]

Как поменять цвета ячеек у TStringGrid?

Возможно ли это? Если да ,то как? Если не возможно, посоветуйте другой класс, чтобы можно было сделать табличку и разукрасить ячейка в разные цвета.


 
Медвежонок Пятачок ©   (2009-12-10 12:27) [1]

он дро чего-то там?


 
Thrashead   (2009-12-10 12:38) [2]

event OnDrawCell

совет: скачай себе DelphiWorld.


 
kyn66 ©   (2009-12-10 12:55) [3]

А еще и вот этот замечательный букварик http://www.drkb.ru/


 
yantux ©   (2009-12-11 10:21) [4]

Скачал, почитал статьи. Я в шоке. Неужели у ячейки нет свойства типа цвета фона или вроде этого? То что предлагается мне кажется сделано через левое ухо.

Если я правильно понимаю, в статьях предлагается работать с ячейкой почти как с bmp, но используя функции вывода текста.


 
TIF ©   (2009-12-11 10:53) [5]

> Неужели у ячейки нет свойства типа цвета фона или вроде
> этого?

А ещё хорошо бы сразу и выпадающий список, календарь, несколько чекбоксов + шифрование с доступом к ячейке по паролю в придачу :)

Это скелет, основа, стандартный компонент, а всё остальное, что нужно для решения конкретной задачи реализуется вручную. Кому что нужно, тот это и достраивает. Ни через левое, ни через правое ухо - это нормальное явление. В Visual Studio на каком-нибудь C++ тоже бы пришлось точно также поплясать. Ничего шокирующего в этом нет

Если хочется сразу всё готовое - есть сторонние компоненты, разноцветные гриды.


 
yantux ©   (2009-12-11 12:14) [6]

> Если хочется сразу всё готовое - есть сторонние компоненты, разноцветные гриды.

Это интересно.

>А ещё хорошо бы сразу и выпадающий список, календарь, несколько чекбоксов + шифрование с доступом к ячейке по паролю в придачу :)

я всегда думал, что табличное представление данных и управление цветом фона, на котором печатается текст это часто используемая фишка. Я даже думаю, что управление шрифтом (курсив, жирный) менее актуально для таблицы, чем цвет фона текста в ячейке.


 
Германн ©   (2009-12-11 16:36) [7]


> Я даже думаю, что управление шрифтом (курсив, жирный) менее
> актуально для таблицы, чем цвет фона текста в ячейке.

Ячейки как самостоятельного элемента не существует. Есть только грид с хрен знает сколькими строками и столбцами.


 
clickmaker ©   (2009-12-11 16:38) [8]

> В Visual Studio на каком-нибудь C++ тоже бы пришлось точно
> также поплясать

там гораздо активней пришлось бы плясать. Если на чистом апи безо всяких mfc и т.п.


 
yantux ©   (2009-12-11 17:04) [9]

Вопрос такого порядка. Можно ли ячейке, полю присвоить objects[]:= tedit.create() ?

Если да, то как сделать это правильно?

Я это уже сделал, т.е. еомпилируется, но когда присваиваю полю text значение, то текст в ячейке не появляется. Дклаю примерно так:
tedit(objects[col,row]).text:="ddddddddd";


 
clickmaker ©   (2009-12-11 17:41) [10]

> Можно ли ячейке, полю присвоить objects[]:= tedit.create()
> ?

можно. но не нужно.
котрОлы для редактирования лучше создавать в момент перехода в режим редактирования. Назначать им правильно Parent и координаты.


 
Amoeba ©   (2009-12-11 22:16) [11]


> clickmaker ©   (11.12.09 16:38) [8]
>
> > В Visual Studio на каком-нибудь C++ тоже бы пришлось точно
> > также поплясать
>
> там гораздо активней пришлось бы плясать. Если на чистом
> апи безо всяких mfc и т.п.

Как-то давно сделал Grid на TPW с использованием OWL + API. До ума так и не довел, т.к. появилось D1.


 
Плохиш ©   (2009-12-11 23:21) [12]


> yantux ©   (11.12.09 17:04) [9]
>
> Вопрос такого порядка. Можно ли ячейке, полю присвоить objects[]:
> = tedit.create() ?

Ты значения всех ячеек одновременно редактируешь?


 
yantux ©   (2009-12-14 10:58) [13]


>Плохиш ©   (11.12.09 23:21) [12]
> Ты значения всех ячеек одновременно редактируешь?


Нет, хочу сделать каждой ячейке свой tedit или tlabel, в общем присвоить tobject тот класс, который будет удобнее для конкретной задачи.

Однако не понятно, как это правильно делать, т.е.

если objects[]:=tedit.creste(); то что поставить в аргумент crete?


 
clickmaker ©   (2009-12-14 11:11) [14]

> каждой ячейке свой tedit

так а создавать-то сразу зачем?
это же окна, а окна - это системный ресурс, а система - не бездонный колодец


 
yantux ©   (2009-12-14 12:06) [15]


> clickmaker ©   (14.12.09 11:11) [14]
> это же окна, а окна - это системный ресурс, а система -
> не бездонный колодец


А кому сейчас легко? Кроме того, объектное программирование как раз было придумано для оптимизации системных ресурсов и создание для совсем небольшой таблички каждой ячейке tedit совсем не должно быть тяжело. Думаю, ячейки Excel более навороченные и тияжёлые, чем tedit для каждой ячейки.


 
clickmaker ©   (2009-12-14 12:14) [16]

> Думаю, ячейки Excel более навороченные и тияжёлые, чем tedit
> для каждой ячейки

я не думаю, что там для всех 65535 (а в 2007+ - вообще 1048576) возможных строк * на не_помню_сколько_максимально_столбцов сразу создаются контрОлы для редактирования.
формат ячейки может храниться.
Так же и в стринггриде можно хранить только класс, который будет использован для создания контрола


 
{RASkov} ©   (2009-12-14 14:04) [17]

> [13] yantux ©   (14.12.09 10:58)
> Нет, хочу сделать каждой ячейке свой tedit или tlabel

Уже есть у грида свой инплэйсэдит, зачем еще? Плюс лэйбл тоже зачем там?


 
yantux ©   (2009-12-14 17:48) [18]


> {RASkov} ©   (14.12.09 14:04) [17]
>Уже есть у грида свой инплэйсэдит,
>  зачем еще? Плюс лэйбл тоже зачем там?


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


 
{RASkov} ©   (2009-12-14 18:01) [19]

> [18] yantux ©   (14.12.09 17:48)
> Цвет фона отдельных ячеек меняю, а строки не получается

В OnDrawCell можно делать всё что душе угодно.... об этом уже говорили тут.
Что же у тебя не получается и как делал. Показывай.


 
yantux ©   (2009-12-14 18:57) [20]

На основе документации, ссылки на которую мне дали выше я пыьтаюсь создать простой пример. Наддо по нажатию левой кнопки мыши выделать строку в таблице каким нить цветом:


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids;

type
 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormCreate(Sender: TObject);
   procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
     var CanSelect: Boolean);
   procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
     Rect: TRect; State: TGridDrawState);
 private
   { Private declarations }
 public
   { Public declarations }
   row, col : integer;
   flag : boolean;

 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin

 self.col:=-1;
 self.row:=-1;

end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
var
 s : string;
begin
If (ARow = self.row)
    and ((ACol=1) or (ACol=2) or (ACol=3))
     (* self.met_opred_dinam_diap_svet_sign_har.selected_cell.col *)
     then
   begin
     if self.flag = true then
       begin
         self.StringGrid1.Canvas.Brush.Color:=clGreen;
       end else
       begin
         self.StringGrid1.Canvas.Brush.Color:=clRed;
       end;
     self.StringGrid1.Canvas.FillRect(rect);

     (Sender as TStrinGgrid).Canvas.Font.Color:=clBlack;
     s:=self.StringGrid1.Cells[ACol, ARow];
     self.StringGrid1.Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, s);

     self.row:=-1;
     self.col:=-1;
   end;
end;

procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin

     if self.flag = true then
       begin
         self.flag:=false;
       end else
       begin
         self.flag:=true;
       end;

end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
 var CanSelect: Boolean);
begin

self.row:=arow;
self.col:=acol;

end;

end.


 
Игорь Шевченко ©   (2009-12-14 19:19) [21]


> Кроме того, объектное программирование как раз было придумано
> для оптимизации системных ресурсов


Объектное программирование было придумано для облегчения решения задач. Системные ресурсы при этом часто расходуются больше, чем при необъектном программировании. Такая вот обратная сторона.

yantux ©   (14.12.09 18:57) [20]

А зачем ты self так часто пишешь ?


 
{RASkov} ©   (2009-12-14 19:58) [22]

> [21] Игорь Шевченко ©   (14.12.09 19:19)
> А зачем ты self так часто пишешь ?

Возможно он не знает про Alt+Space вот и пишет self(точка)список возможных идентификаторов....

> [20] yantux ©   (14.12.09 18:57)

Что-то я немогу это связать с "в каждой ячейки должен быть свой Эдит и Лэйбл"...


 
yantux ©   (2009-12-15 09:27) [23]


> А зачем ты self так часто пишешь ?


Это удобно - появляется подсказка.


 
yantux ©   (2009-12-15 09:28) [24]


> Возможно он не знает про Alt+Space вот и пишет self(точка)список
> возможных идентификаторов....


Да не знаю, буду пробовать.


 
yantux ©   (2009-12-15 09:31) [25]


> Что-то я немогу это связать с "в каждой ячейки должен быть
> свой Эдит и Лэйбл"...


Это один из вариантов.

А в этом примере только таблица и обработчики событий. По клику мыши закрашивается ячейка, но мне надо, чтобы закрашивалась вся строка в таблице, т.е. несколько ячеек. На основе данного у меня ни чего не получилось сделать.

Поэтому, как вариант, я рассматриваю каждой ячейке присвоить объект tedit, поскольку в этом классе поменять цвет фона очень просто.


 
brother ©   (2009-12-15 09:34) [26]

> я рассматриваю каждой ячейке присвоить объект tedit, поскольку
> в этом классе поменять цвет фона

ужас...ну, зачем опять велосипед??? да еще такой громоздкий?


 
{RASkov} ©   (2009-12-15 10:18) [27]

> [25] yantux ©   (15.12.09 09:31)
> По клику мыши закрашивается ячейка, но мне надо, чтобы закрашивалась
> вся строка в таблице

TStringGrid.Options + goRowSelect

Но даже если нужно свое закрашивание, то все это легко делается в OnDrawCell И не нужно на грид, да еще в каждую ячейку лепить дополнительно что-то.... Не позорься :)


 
yantux ©   (2009-12-15 12:59) [28]


> ужас...ну, зачем опять велосипед??? да еще такой громоздкий?


Чтобыф както решить проблему.


 
yantux ©   (2009-12-15 13:02) [29]


> TStringGrid.Options + goRowSelectНо даже если нужно свое
> закрашивание, то все это легко делается в OnDrawCell И не
> нужно на грид, да еще в каждую ячейку лепить дополнительно
> что-то.... Не позорься :)


Это я уже понял, а что подразумевается под термином "легко делается"? Покажите excample.


 
Andy BitOff ©   (2009-12-15 14:04) [30]


> yantux ©   (15.12.09 13:02) [29]
> Покажите excample.

А ты уже сам все пересмотрел?
http://tinyurl.com/yc6rnmn


 
yantux ©   (2009-12-15 15:33) [31]


> А ты уже сам все пересмотрел?http://tinyurl.com/yc6rnmn


Гугль мне ен помог, помогли танцы с бубном с использованием информации в доках приведённых выше. Собственно реально работающий текст, который я думаю можно использовать не только для строк, но и для колонок:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids, StdCtrls;

type

pvTStringGrid = ^TStringGrid;

 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   Button3: TButton;
   procedure Button3Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
     var CanSelect: Boolean);
   procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
     Rect: TRect; State: TGridDrawState);
   function tstringgridfillline(data : pvTStringGrid; brushcolor, fontcolor : tcolor) : integer;

 private
   { Private declarations }
 public
   { Public declarations }
   gridcolor: tcolor;
   flags : array [0..10] of boolean;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.tstringgridfillline(data : pvTStringGrid; brushcolor, fontcolor : tcolor) : integer;
var
 s : string;
 Rect2 : TRect;
 col, row : integer;
 begin

 tstringgridfillline:=0;

 if data = nil then
   begin
     tstringgridfillline:=-1;
     exit;
   end;

     data^.Canvas.Brush.Color:=brushcolor;

     for col := 0 to data^.ColCount - 1 do
       for row := 1 to data^.RowCount - 1 do
         BEGIN
           if self.flags[row] then
             data^.Canvas.Brush.Color:=self.gridcolor
           else
             data^.Canvas.Brush.Color:=clWhite;

           rect2:=data^.CellRect(col, row);
           data^.Canvas.FillRect(rect2);
           data^.Canvas.Font.Color:=fontcolor;
           s:=data^.Cells[col, Row];
           data^.Canvas.TextOut(Rect2.Left + 2, Rect2.Top + 2, s);
         end;
 end;

procedure TForm1.Button3Click(Sender: TObject);
var
 s : string;
 Rect2: TRect;
 x, y : integer;
begin
   for y := 1 to self.StringGrid1.ColCount - 1 do
     for x := 0 to self.StringGrid1.RowCount - 1 do
       begin
         self.StringGrid1.Canvas.Brush.Color:=clWhite;
         rect2:=self.StringGrid1.CellRect(x, y);
         self.StringGrid1.Canvas.FillRect(rect2);
         self.StringGrid1.Canvas.Font.Color:=clBlack;
         s:=self.StringGrid1.Cells[x, y];
         self.StringGrid1.Canvas.TextOut(Rect2.Left + 2, Rect2.Top + 2, s);
       end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 self.gridcolor:=clAqua;
 self.gridcolor:=clGreen;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
                                     Rect: TRect; State: TGridDrawState);
var
 s : string;
 Rect2: TRect;
 begin

 self.tstringgridfillline(@self.StringGrid1, self.gridcolor, clBlack  );

end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
                                       var CanSelect: Boolean);  
 begin

   if CanSelect then
     begin
       if self.flags[arow] then
         self.flags[arow]:=false
       else
         self.flags[arow]:=true;
       self.tstringgridfillline(@self.StringGrid1, self.gridcolor, clBlack  );
     end;

 end;

end.


 
Leonid Troyanovsky ©   (2009-12-15 18:21) [32]


> {RASkov} ©   (14.12.09 19:58) [22]

> Возможно он не знает про Alt+Space вот и пишет self(точка)список
> возможных идентификаторов....

А где ж такой список?

procedure TForm1.FormCreate(Sender: TObject);
begin
self.col:=-1;
self.row:=-1;
end;

IMHO, это умозрительная конструкция, похоже на развод.

--
Regards, LVT.


 
Германн ©   (2009-12-15 18:32) [33]


> IMHO, это умозрительная конструкция, похоже на развод.

ИМХО, это попытка спрятать выделение первой ячейки. :)


 
{RASkov} ©   (2009-12-15 20:25) [34]

> [32] Leonid Troyanovsky ©   (15.12.09 18:21)
>
> > {RASkov} ©   (14.12.09 19:58) [22]
>
> > Возможно он не знает про Alt+Space вот и пишет self(точка)
> список
> > возможных идентификаторов....
>
> А где ж такой список?

procedure TForm1.FormCreate(Sender: TObject);
begin
 | <- тут нажать Alt+Пробел. Появится тот самый список, который автор вызывает путем написания self(точка)
end;


 
Германн ©   (2009-12-15 20:39) [35]


> тут нажать Alt+Пробел. Появится тот самый список, который
> автор вызывает путем написания self(точка)

Жал. Не появляется список. Появляется системное меню формы. :)


 
{RASkov} ©   (2009-12-15 20:53) [36]

> [35] Германн ©   (15.12.09 20:39)
> Жал. Не появляется список. Появляется системное меню формы. :)

Хм... что-то меня на альт переклинило.... конечно же Ctrl+Space :)


 
Leonid Troyanovsky ©   (2009-12-15 22:44) [37]


> {RASkov} ©   (15.12.09 20:25) [34]

Предположим, что Ctrl+Space.
А что ж там появится?

--
Regards, LVT.


 
{RASkov} ©   (2009-12-15 23:15) [38]

> [37] Leonid Troyanovsky ©   (15.12.09 22:44)

Ну как что? Список :)
тот самый список, что после точки "вываливается"...

Или я не понимаю ко мне вопросов :(


 
yantux ©   (2009-12-16 11:19) [39]


> IMHO, это умозрительная конструкция, похоже на развод.--
> Regards, LVT.


Развод на что?


 
yantux ©   (2009-12-16 11:21) [40]


> ИМХО, это попытка спрятать выделение первой ячейки. :)


Оно почти так и есть. Иначе при старте приложения ячейки красятся как попало.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.02.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.008 c
1-1222968605
wipr
2008-10-02 21:30
2010.02.14
подскажите как работать с автоматизацией OpenOffice


2-1260731941
Jaroslight
2009-12-13 22:19
2010.02.14
Заполнение ячеек первой строки таблицы датами текущего месяца


2-1260911668
Лёша
2009-12-16 00:14
2010.02.14
Диалог выбора директории.


15-1260214111
Маркер Бабуина
2009-12-07 22:28
2010.02.14
гатский фонт


15-1260263433
Andjey
2009-12-08 12:10
2010.02.14
Проверка файла на вирус





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский