![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DELPHI. StringGrid - "двуликий Янус" или "многоликий Шива"? [D7]
RZD © (2015-09-04 21:03:00)В процессе изучения свойств StringGrid обнаружил следующую "хрень":
например записываю в ячейку:
StringGrid1.Cells[1,1]:='MUSOR';
И вижу, что там появился текст: MUSOR. Потом помещаю в StringGrid1.Cells[1,1] картинку (Image) и она там появляется, я ее вижу. Как - это неважно, способов полно всяких для размещения картинки в ячейке StringGrid. Затем делаю копирование в другую ячейку:
StringGrid1.Cells[2,1]:=StringGrid.Cells[1,1];
В StringGrid1.Cells[2,1] появляется текст: MUSOR
Ага! "В почках - камни, а под камнями - РАК". В одной исходной ячейке StringGrid1.Cells[1,1] прекрасно уживаются и предыдущая текстовая запись и картинка, которую я теперь наблюдаю визуально. Двойственность. М-да. А как же принцип WYSIWYG (является аббревиатурой от англ. What You See Is What You Get, «что видишь, то и получишь»)?
Вероятно выражение: StringGrid1.Cells[2,1]:=StringGrid.Cells[1,1]; имеет приоритет для копирования текста, а для копирования картинки нужно использовать свойство Canwas, но к сожалению примеров копирования картинки из одной ячейки StringGrid в другую я не обнаружил ни в учебниках, ни в Инете. Также не обнаружил нигде примеров копирования картинки из ячейки StringGrid в файл. Можэ кто знает, как это делается? Поделитесь опытом.
Юрий Зотов (2015-09-07 10:45:00) [21]> И картинка "наляпывается сверху" на ячейку StringGrid.
Не совсем так. Картинка не имеет никакого отношения ни к стриггриду, ни к ее ячейкам. Она просто рисуется на канве по заданным координатам, но стринггрид про нее ничего не знает. Соответственно, она стринггридом и не копируется.
sniknik (2015-09-07 09:44:00) [22]Игорь Шевченко © (05.09.15 16:47) [9]
> Я не понимаю, какую задачу ты решаешь
вывод текста крупными буквами (ИМХО конечно)
http://delphimaster.ru/cgi-bin/forum.pl?id=1440613972&n=18
RZD (2015-09-06 22:20:00) [23]TMP (05.09.15 03:21) [6]
> Причём тут WYSIWYG вообще? StringGrid.Cells[i,j] - это текст
> из двумерного массива текстов, а не "ячейка".
> Вы криво всовываете "картинку", вот и копируется соответственно.
> Прочтите это: http://www.gunsmoker.ru/2010/05/90.htm
Полностью с вами согласен. Насчет "головастого" парня (по ссылке), предполагаю, что и он не все знает и "более яйцеголовые" ему нос утрут.
> Для начала - Canvas. Потом не свойство, а поле, содержащее
> ссылку на экземпляр класса TCanvas.
>
Тоже полностью согласен. Хе-хе, немножко тут уже подучился. А фразу о том, что StringGrid имеет свойство Canwas взял из "учебной статьи" с веб-сайта:
http://www.stringgrid-delphi.ru/properties.php
Цитирую (оттуда):
"Таблица Delphi StringGrid также обладает очень важным и полезным свойством, характерным для компонентов с графическими возможностями - Canvas (канва). Это свойство позволяет как произвольно рисовать в пределах таблицы, так и размещать в ячейках рисунки и другие графические данные.""
Меня за это не бейте - не я "это" написал.
После дебатов в этом топике я лично понял, что сама StringGrid хранит в себе только текст (так задумали ее создатели). Но путем неких ухищрений на графическую площадь ячейки можно "налепить" сверху несколько "пластырей-паразитов", которые будут собой визуализировать "лицо" ячейки StringGrid. Но эти "паразиты" не внедряются в "тело" StringGrid и простым присвоением (например): StringGrid1.Cells[2,1]:= StringGrid1.Cells[1,1]; - не передаются.
> Так что для начала покажите как вы делаете "помещаю в StringGrid1.
> Cells[1,1] картинку (Image) и она там появляется" и где
> вы эту пакость взяли.
В Интернете взял. Полно многочисленных примеров этого действа.
В ImageList1 помещаем картинку из файла (*.bmp). {"вручную" конечно}
И затем в событии OnDrawCell для конкретной StringGrid пишем код, например:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (ACol = 1) and (ARow = 1)
then
ImageList1.Draw(StringGrid1.Canvas, Rect.Left, Rect.Top, 0, True);
end;
И картинка "наляпывается сверху" на ячейку StringGrid.
Германн (2015-09-06 01:16:00) [24]
> Игорь Шевченко © (05.09.15 10:38) [7]
>
> Германн © (05.09.15 01:22) [5]
>
>
> > Что TStringGrid умеет хранить только текстовую информацию.
>
>
>
> Вдумчиво читаем справку перед тем, как высказываться
Вдумчиво уже давно прочитана сия справка.
И она говорит (точнее подразумевает) что TStringGrid умеетхранить и показывать только текст. Всё остальное можно и (при необходимости) нужно делать ручками. Что ты и пытаешься сейчас объяснить автору топика.
И в чём я столь не прав, что заслужил конкретного замечания от тебя?
RZD (2015-09-06 01:03:00) [25]Игорь Шевченко © (05.09.15 20:40) [12]
> Прямо на сообщении нажимаешь F1 и тебе популярным английским
> языком объясняется, почему ты не прав. И не читай русских
> книг по программированию, их нет. Впрочем, по электронике
> тоже. Я пока не познакомился с Хоровицем и Хиллом, блуждал
> в потемках.
К сожалению в английском не силен. В школе и в ВУЗе изучал немецкий. Не повезло. Увы.
Хоровиц и Хилл у меня есть. И первое издание и второе (в 3-х книгах)
Признаюсь, немножко слукавил. Первоначально хотел сделать скриншот содержимого ячейки StringGrid с сохранением в файл (как картинки (Image)). Причем неважно, текст там или рисунок. Мы то визуально глазами наблюдаем "это дело", как рисунок (картинку). Но потом понял, что мне это "не по зубам". Ну и решил разобраться со StringGrid с самого начала, с целью изучения основ. А вы все требуете: "А зачем тебе это нужно". Докладываю - разобраться хочу с целью развития своих мозгов и я - не шпион Джойнта.
Ну никак не удается преодолеть рубикон ООП (родители и потомки). Тем более на английском.
Сейчас хочу провести эксперимент. Помещу в одну ячейку StringGrid 3 картинки (Picture: TPicture, Bitmap: TBitmap, Image: TImage) разного размера (в пикселях) + шрифт(FONT). Предполагаю, что я всех их буду видеть на экране компа в ячейке StringGrid. Только они будут иметь разный приоритет. Одни окажутся снизу (визуально), а другие сверху (многоликий Шива).
RZD (2015-09-05 23:50:00) [26]Юрий Зотов © (05.09.15 20:28) [11]
> Обратное присваивание:
> FBmp:= StringGrid1.Objects[2,1] as TBitmap;
Спасибо за конкретный ответ, без экивоков.
Игорь Шевченко (2015-09-05 23:19:00) [27]Юрий Зотов © (05.09.15 20:51) [13]
> Например, Р. Сворень, серия книг "... - это очень просто".
>
Это у Айсберга серия "очень просто", у Свореня "Шаг за шагом". Да, согласен, Сворень довольно доступно писал. А вот Фаронов - извини.
Юрий Зотов (2015-09-05 20:51:00) [28]> Игорь Шевченко © (05.09.15 20:40) [12]
И не читай русских книг по программированию, их нет.
Для начинающих - есть. На первом шаге я бы рекомендовал именно такую, но долго на ней не задерживаться, а только понять основы и потом перейти к Тейксейре.
> Впрочем, по электронике тоже.
Например, Р. Сворень, серия книг "... - это очень просто". Для начинающих - находки, а не книги. В его изложении даже сложные вещи действительно становятся простыми и понятными.
Игорь Шевченко (2015-09-05 20:40:00) [29]
> у меня никогда в жизни не было преподавателей ни по электронике,
> ни по программированию. Во всем приходилось разбираться
> самостоятельно.
Ты будешь удивлен, но мы коллеги по тернистому пути, я тоже изучал программирование и электронику по книжкам, причем, довольно давно.
> ошибка компилятора: [Error] Main.pas[65]: Incompatible types:
> 'TBitmap' and 'TObject'
Прямо на сообщении нажимаешь F1 и тебе популярным английским языком объясняется, почему ты не прав. И не читай русских книг по программированию, их нет. Впрочем, по электронике тоже. Я пока не познакомился с Хоровицем и Хиллом, блуждал в потемках.
Удачи!
Юрий Зотов (2015-09-05 20:28:00) [30]Обратное присваивание:
FBmp:= StringGrid1.Objects[2,1] as TBitmap ;
Пояснения см. в справке (раздел "Приведение типов" и операция AS). Суть в том, любой TBitmap - это еще и TObject (поэтому прямое присваивание приведения типов не требует), но не наоборот (поэтому при обратном присваивании требуется приведение типов).
Книжку по основам Delphi - вот что Вам нужно, раз уж за Delphi взялись. Рекомендую для начала книгу В. Фаронова, а после нее - книгу Тейксейры и Пачеко. В сети они есть.
RZD (2015-09-05 19:21:00) [31]Игорь Шевченко © (05.09.15 16:47) [9]
> Не подскажу.
>
> Я не понимаю, какую задачу ты решаешь, и что подразумеваешь
> под "не проходит".
>
> Один совет - я (равно как и остальные) абсолютно не заинтересованы
> вытягивать из тебя подробности, алгоритмы, код, сообщения
> об ошибках и т.д.
>
> Ты как-то поминал, что электронщик, я приведу аналогию:
> "Я спаял генератор, он не пашет. помогите".
Ладно. Попытаюсь разобраться сам. Постепенно. Всё равно ты мне здорово помог. Спасибо тебе за это. Хотя у меня ВО и я электронщик-аппаратчик (не конструктор), но у меня никогда в жизни не было преподавателей ни по электронике, ни по программированию. Во всем приходилось разбираться самостоятельно.
В отношении задачи - даже и не знаю, как ответить, с какого уровня начать.
Я создал мини-ЧПУ (за 2 месяца) для древнего швейцарского станка (так сложились обстоятельства на моем заводе), в котором комп (или ноутбук) исполняет роль терминала (дисплей и клавиатура + винчестер нужен для хранения программ обработки деталей). Терминал (хост) связан по USB с самопальным контроллером на базе 4-х микроконтроллеров ATmega фирмы ATMEL. Один ведущий и 3 ведомых. ATmega работают в режиме реального времени. Для них тоже ведь пришлось программы написать (не на Дельфи конечно). Хост обменивается пакетами из нескольких сотен байт с ведущим микроконтроллером ATmega. Все задачи решены и все уже реально работает.
Ну вот, сказал. А оно тебе это надо (эти подробности)?
В отношении StringGrid: вопросы тоже решены, может не так изящно, как хотелось-бы, но для меня - приемлемо.
Просто случайно столкнувшись с StringGrid решил поподробнее исследовать этот компонент (из любопытства). Если-бы я не был любопытным, то не стал бы тем, кто я есть.
P.S._1: меня никогда не интересовали прикладные программы внутри компа. Меня комп интересовал всегда только, как средство управления (взаимодействия) с внешними материальными объектами. Лампочку на потолке в квартире от компа зажечь/погасить? Не просто. По проводам из Интернета (или WI-FI) не получится. Нужно что-то дополнительно (аппаратное).
P.S._2: насчет "подразумеваешь":
Присваивание: StringGrid1.Objects[1,1] := FBmp; //OK
Присваивание: StringGrid1.Objects[2,1] := StringGrid1.Objects[1,1]; //OK
Обратное присваивание: FBmp:= StringGrid1.Objects[2,1]; //no OK
// ошибка компилятора: [Error] Main.pas[65]: Incompatible types: 'TBitmap' and 'TObject'
//разобраться сам не смог. Слабак. Увы.
Игорь Шевченко (2015-09-05 16:47:00) [32]RZD © (05.09.15 15:05) [8]
> не проходит. Не подскажешь, как надо?
Не подскажу.
Я не понимаю, какую задачу ты решаешь, и что подразумеваешь под "не проходит".
Один совет - я (равно как и остальные) абсолютно не заинтересованы вытягивать из тебя подробности, алгоритмы, код, сообщения об ошибках и т.д.
Ты как-то поминал, что электронщик, я приведу аналогию: "Я спаял генератор, он не пашет. помогите".
RZD (2015-09-05 15:05:00) [33]Игорь Шевченко © (04.09.15 22:17) [4]
> Дабы ты не говорил, что в интернете нет примеров, делюсь:
Большое спасибо, исходник рабочий.
Только я не говорил, что в Интернете примеров нет, а сказал, что я не нашел.
Сделал так:
//-----------------------------------------------------------------
FBmp.LoadFromFile('C:\MUSOR\musor_1.bmp');
StringGrid1.Objects[1,1] := FBmp;
//
StringGrid1.Objects[2,1] := StringGrid1.Objects[1,1];
//
//FBmp:= StringGrid1.Objects[2,1]; // не проходит. Не подскажешь, как надо?
//т.е. не смог обновить содержимое FBmp . Поэтому пришлось сделать так:
FBmp.SaveToFile('C:\MUSOR\musor_2.bmp');
//------------------------------------------------------------------
TMP (05.09.15 03:21) [6]
> Для начала - Canvas. Потом не свойство, а поле, содержащее
> ссылку на экземпляр класса TCanvas.
>
> Так что для начала покажите как вы делаете "помещаю в StringGrid1.
> Cells[1,1] картинку (Image) и она там появляется" и где
> вы эту пакость взяли.
Отвечу чуть попозже. Сейчас не могу, пришло время "пить херши".
.
Игорь Шевченко (2015-09-05 10:38:00) [34]Германн © (05.09.15 01:22) [5]
> Что TStringGrid умеет хранить только текстовую информацию.
Вдумчиво читаем справку перед тем, как высказываться
TMP (2015-09-05 03:21:00) [35]Причём тут WYSIWYG вообще? StringGrid.Cells[i,j] - это текст из двумерного массива текстов, а не "ячейка".
Вы криво всовываете "картинку", вот и копируется соответственно. Прочтите это: http://www.gunsmoker.ru/2010/05/90.html
> свойство Canwas
Для начала - Canvas. Потом не свойство, а поле, содержащее ссылку на экземпляр класса TCanvas.
Так что для начала покажите как вы делаете "помещаю в StringGrid1.Cells[1,1] картинку (Image) и она там появляется" и где вы эту пакость взяли.
Потом опишите подробнее что конкретно хотите получить.
А вообще скорее всего вам надо сделать потомка от TStringGrid, где делайте метод типа CloneCell(i0,j0,i,j)
Германн (2015-09-05 01:22:00) [36]
> RZD © (04.09.15 21:03)
>
> В процессе изучения свойств StringGrid обнаружил следующую
> "хрень":
Что TStringGrid умеет хранить только текстовую информацию.
Тебе перевести на русский словосочетание StringGrid?
Игорь Шевченко (2015-09-04 22:17:00) [37]RZD © (04.09.15 21:03)
Дабы ты не говорил, что в интернете нет примеров, делюсь:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure FormDestroy(Sender: TObject);
private
FBmp: TBitmap;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.Cells[2,1] := StringGrid1.Cells[1,1];
StringGrid1.Objects[2,1] := StringGrid1.Objects[1,1];
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FBmp := TBitmap.Create;
FBmp.Handle := LoadBitmap(0, PChar(MakeIntResource(OBM_COMBO)));
StringGrid1.Cells[1,1] := 'Foo';
StringGrid1.Objects[1,1] := FBmp;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FBmp.Free;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
with Sender as TStringGrid do
begin
if Assigned(Objects[ACol, ARow]) then //Bitmap
begin
Canvas.Draw(Rect.Left, Rect.Top, (Objects[ACol, ARow] as TBitmap));
Inc(Rect.Left, (Objects[ACol, ARow] as TBitmap).Width + 1);
end;
if Cells[ACol, ARow] <> '' then
DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]),
Length(Cells[ACol, ARow]), Rect, DT_CENTER);
DefaultDrawing := False;
end;
end;
end.
ВладОшин (2015-09-04 22:10:00) [38]
> Давно ли ты перестал задавать наивные вопросы, Влад ?
А разве перестал? )
Игорь Шевченко (2015-09-04 22:07:00) [39]RZD © (04.09.15 21:03)
Хочешь чего-то, отличного от строки копировать, рекомендую использовать свойство Objects компонента TStringGrid, в этот Objects можно на много всего ссылку положить, а потом также копировать, ну и в файл тоже записать, зная, ссылка что там находится.
> к сожалению примеров копирования картинки из одной ячейки
> StringGrid в другую я не обнаружил ни в учебниках, ни в
> Инете
Увы, интернет небогат на нетипичные примеры, тогда и программисты были бы не нужны, нашел в интернете и все готово.
Копирование текста вместе с довеском будет выглядеть так:
StringGrid1.Cells[2,1]:=StringGrid.Cells[1,1];
StringGrid1.Objects[2,1]:=StringGrid.Objects[1,1];
ВладОшин © (04.09.15 21:41) [1]
> а я фломастером на мониторе в ячейке нарисовал смайлик,
> копирую - тоже string получаю
Давно ли ты перестал задавать наивные вопросы, Влад ?
ВладОшин (2015-09-04 21:41:00) [40]а я фломастером на мониторе в ячейке нарисовал смайлик, копирую - тоже string получаю..
может, потому что
property Cells[ACol, ARow: Integer]: string read GetCells write SetCells;
? )