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

Вниз

DELPHI. StringGrid - "двуликий Янус" или "многоликий Шива"?   Найти похожие ветки 

 
RZD ©   (2015-09-04 21:03) [0]

В процессе изучения свойств 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-04 21:41) [1]

а я фломастером на мониторе в ячейке нарисовал смайлик, копирую - тоже string получаю..
может, потому что
property Cells[ACol, ARow: Integer]: string read GetCells write SetCells;
? )


 
Игорь Шевченко ©   (2015-09-04 22:07) [2]

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 22:10) [3]


> Давно ли ты перестал задавать наивные вопросы, Влад ?

А разве перестал? )


 
Игорь Шевченко ©   (2015-09-04 22:17) [4]

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-05 01:22) [5]


> RZD ©   (04.09.15 21:03)
>
> В процессе изучения свойств StringGrid обнаружил следующую
> "хрень":

Что TStringGrid умеет хранить только текстовую информацию.
Тебе перевести на русский словосочетание StringGrid?


 
TMP   (2015-09-05 03:21) [6]

Причём тут 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 10:38) [7]

Германн ©   (05.09.15 01:22) [5]


> Что TStringGrid умеет хранить только текстовую информацию.


Вдумчиво читаем справку перед тем, как высказываться


 
RZD ©   (2015-09-05 15:05) [8]

Игорь Шевченко ©   (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 16:47) [9]

RZD ©   (05.09.15 15:05) [8]


> не проходит. Не подскажешь, как надо?


Не подскажу.

Я не понимаю, какую задачу ты решаешь, и что подразумеваешь под "не проходит".

Один совет - я (равно как и остальные) абсолютно не заинтересованы вытягивать из тебя подробности, алгоритмы, код, сообщения об ошибках и т.д.

Ты как-то поминал, что электронщик, я приведу аналогию: "Я спаял генератор, он не пашет. помогите".


 
RZD ©   (2015-09-05 19:21) [10]

Игорь Шевченко ©   (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 20:28) [11]

Обратное присваивание:
 FBmp:= StringGrid1.Objects[2,1] as TBitmap;

Пояснения см. в справке (раздел "Приведение типов" и операция AS). Суть в том, любой TBitmap - это еще и TObject (поэтому прямое присваивание приведения типов не требует), но не наоборот (поэтому при обратном присваивании требуется приведение типов).

Книжку по основам Delphi - вот что Вам нужно, раз уж за Delphi взялись. Рекомендую для начала книгу В. Фаронова, а после нее - книгу Тейксейры и Пачеко. В сети они есть.


 
Игорь Шевченко ©   (2015-09-05 20:40) [12]


> у меня никогда в жизни не было преподавателей ни по электронике,
>  ни по программированию. Во всем приходилось разбираться
> самостоятельно.


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


> ошибка компилятора: [Error] Main.pas[65]: Incompatible types:
>  "TBitmap" and "TObject"


Прямо на сообщении нажимаешь F1 и тебе популярным английским языком объясняется, почему ты не прав. И не читай русских книг по программированию, их нет. Впрочем, по электронике тоже. Я пока не познакомился с Хоровицем и Хиллом, блуждал в потемках.
Удачи!


 
Юрий Зотов ©   (2015-09-05 20:51) [13]

> Игорь Шевченко ©   (05.09.15 20:40) [12]

И не читай русских книг по программированию, их нет.


Для начинающих - есть. На первом шаге я бы рекомендовал именно такую, но долго на ней не задерживаться, а только понять основы и потом перейти к Тейксейре.

> Впрочем, по электронике тоже.

Например, Р. Сворень, серия книг "... - это очень просто". Для начинающих - находки, а не книги. В его изложении даже сложные вещи действительно становятся простыми и понятными.


 
Игорь Шевченко ©   (2015-09-05 23:19) [14]

Юрий Зотов ©   (05.09.15 20:51) [13]


> Например, Р. Сворень, серия книг "... - это очень просто".
>  


Это у Айсберга серия "очень просто", у Свореня "Шаг за шагом". Да, согласен, Сворень довольно доступно писал. А вот Фаронов - извини.


 
RZD ©   (2015-09-05 23:50) [15]

Юрий Зотов ©   (05.09.15 20:28) [11]

> Обратное присваивание:
>  FBmp:= StringGrid1.Objects[2,1] as TBitmap;

Спасибо за конкретный ответ, без экивоков.


 
RZD ©   (2015-09-06 01:03) [16]

Игорь Шевченко ©   (05.09.15 20:40) [12]

> Прямо на сообщении нажимаешь F1 и тебе популярным английским
> языком объясняется, почему ты не прав. И не читай русских
> книг по программированию, их нет. Впрочем, по электронике
> тоже. Я пока не познакомился с Хоровицем и Хиллом, блуждал
> в потемках.

К сожалению в английском не силен. В школе и в ВУЗе изучал немецкий. Не повезло. Увы.
Хоровиц и Хилл у меня есть. И первое издание и второе (в 3-х книгах)
Признаюсь, немножко слукавил. Первоначально хотел сделать скриншот содержимого ячейки StringGrid с сохранением в файл (как картинки (Image)). Причем неважно, текст там или рисунок. Мы то визуально глазами наблюдаем "это дело", как рисунок (картинку). Но потом понял, что мне это  "не по зубам". Ну и решил разобраться со StringGrid с самого начала, с целью изучения основ. А вы все требуете: "А зачем тебе это нужно". Докладываю - разобраться хочу с целью развития своих мозгов и я - не шпион Джойнта.
Ну никак не удается преодолеть рубикон ООП (родители и потомки). Тем более на английском.
Сейчас хочу провести эксперимент. Помещу в одну ячейку StringGrid 3 картинки (Picture: TPicture, Bitmap: TBitmap, Image: TImage) разного размера (в пикселях) + шрифт(FONT). Предполагаю, что я всех их буду видеть на экране компа в ячейке StringGrid. Только они будут иметь разный приоритет. Одни окажутся снизу (визуально), а другие сверху (многоликий Шива).


 
Германн ©   (2015-09-06 01:16) [17]


> Игорь Шевченко ©   (05.09.15 10:38) [7]
>
> Германн ©   (05.09.15 01:22) [5]
>
>
> > Что TStringGrid умеет хранить только текстовую информацию.
>
>
>
> Вдумчиво читаем справку перед тем, как высказываться

Вдумчиво уже давно прочитана сия справка.
И она говорит (точнее подразумевает) что TStringGrid умеет хранить и показывать только текст. Всё остальное можно и (при необходимости) нужно делать ручками. Что ты и пытаешься сейчас объяснить автору топика.
И в чём я столь не прав, что заслужил конкретного замечания от тебя?


 
RZD ©   (2015-09-06 22:20) [18]

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.


 
sniknik ©   (2015-09-07 09:44) [19]

Игорь Шевченко ©   (05.09.15 16:47) [9]
> Я не понимаю, какую задачу ты решаешь
вывод текста крупными буквами (ИМХО конечно)
http://delphimaster.net/view/2-1440613972/


 
Юрий Зотов ©   (2015-09-07 10:45) [20]

> И картинка "наляпывается сверху" на ячейку StringGrid.

Не совсем так. Картинка не имеет никакого отношения ни к стриггриду, ни к ее ячейкам. Она просто рисуется на канве по заданным координатам, но стринггрид про нее ничего не знает. Соответственно, она стринггридом и не копируется.


 
Германн ©   (2015-09-08 00:54) [21]


> После дебатов в этом топике я лично понял, что сама StringGrid
> хранит в себе только текст (так задумали ее создатели).
>

Но создатели оставили при этом возможность хранить и ещё что-нибудь.
И пример в посте Игорь Шевченко ©   (04.09.15 22:17) [4] показывает как эту допвозможность использовать.
Но тут нужно знать основы и понимать что нужно делать ручками и как нужно делать.


 
RZD ©   (2015-09-08 01:50) [22]

Юрий Зотов ©   (07.09.15 10:45) [20]

> Не совсем так. Картинка не имеет никакого отношения ни к
> стриггриду, ни к ее ячейкам. Она просто рисуется на канве
> по заданным координатам, но стринггрид про нее ничего не
> знает. Соответственно, она стринггридом и не копируется.
>

Совершенно с вами согласен. И я хотел сказать примерно также, но помешало косноязычие выражения собственных мыслей.

sniknik ©   (07.09.15 09:44) [19]

> вывод текста крупными буквами (ИМХО конечно)
> http://delphimaster.net/view/2-1440613972/

Нет. Я уже выше в топике писал, что этот вопрос решен. Ранее была панель с надписью крупным моноширинным шрифтом (отображение которого зависит от текущей версии Windows на конкретном компе и еще от чего-то непонятного). От этого отказался. Теперь реализовано StringGrid с картинкой отдельной буквы или цифры в ячейке StrinGrid (в этом случае нет разницы, моноширинный шрифт или не моноширинный). Эти картинки были сняты скриншотом с некоего текстового шрифта (не моноширинного) в надписи на Panel, который мне понравился (приемлем). После обработки картинок букв и цифр в прoграмме ACDSee  они стали даже лучше исходного шрифта. Теперь например вместо шрифтовой буквы "X" помещаю в ячейку картинку буквы "X" из ImageList. Поскольку картинки букв и цифр в ImageList "зашиты жестко" в тело EXE-файла программы, то от визуальной интерпретации какого-то шрифта в текущей версии Windows "это дело" не зависит. Запускал свою программу (в этом плане) на разных компах с Win98, WinXp, Win7. Результат - прекрасный. Вероятно я решил "это дело" по "колхозному". Но для меня и выполнения тех задач, которые возложены на конкретную программу это очень даже приемлемо.

Еще раз моем вопросе здесь: Докладываю - разобраться хочу со StringGrid с целью развития своих мозгов. Осуждаете за это?


 
RZD ©   (2015-09-08 01:50) [23]

Юрий Зотов ©   (07.09.15 10:45) [20]

> Не совсем так. Картинка не имеет никакого отношения ни к
> стриггриду, ни к ее ячейкам. Она просто рисуется на канве
> по заданным координатам, но стринггрид про нее ничего не
> знает. Соответственно, она стринггридом и не копируется.
>

Совершенно с вами согласен. И я хотел сказать примерно также, но помешало косноязычие выражения собственных мыслей.

sniknik ©   (07.09.15 09:44) [19]

> вывод текста крупными буквами (ИМХО конечно)
> http://delphimaster.net/view/2-1440613972/

Нет. Я уже выше в топике писал, что этот вопрос решен. Ранее была панель с надписью крупным моноширинным шрифтом (отображение которого зависит от текущей версии Windows на конкретном компе и еще от чего-то непонятного). От этого отказался. Теперь реализовано StringGrid с картинкой отдельной буквы или цифры в ячейке StrinGrid (в этом случае нет разницы, моноширинный шрифт или не моноширинный). Эти картинки были сняты скриншотом с некоего текстового шрифта (не моноширинного) в надписи на Panel, который мне понравился (приемлем). После обработки картинок букв и цифр в прoграмме ACDSee  они стали даже лучше исходного шрифта. Теперь например вместо шрифтовой буквы "X" помещаю в ячейку картинку буквы "X" из ImageList. Поскольку картинки букв и цифр в ImageList "зашиты жестко" в тело EXE-файла программы, то от визуальной интерпретации какого-то шрифта в текущей версии Windows "это дело" не зависит. Запускал свою программу (в этом плане) на разных компах с Win98, WinXp, Win7. Результат - прекрасный. Вероятно я решил "это дело" по "колхозному". Но для меня и выполнения тех задач, которые возложены на конкретную программу это очень даже приемлемо.

Еще раз моем вопросе здесь: Докладываю - разобраться хочу со StringGrid с целью развития своих мозгов. Осуждаете за это?


 
Юрий Зотов ©   (2015-09-08 09:20) [24]

> разобраться хочу со StringGrid

В VCL очень много компонентов и StringGrid - лишь один из них. Ну, разберетесь Вы со StringGrid"ом, а дальше что? Будете разбираться со следующим и т.д. по очереди? При таком подходе жизни не хватит.

Кто-то из Великих сказал замечательную фразу: "Знание небольшого количества принципов освобождает от необходимости запоминания большого количества фактов" (за точность цитаты не ручаюсь, но смысл такой). Так вот - если Вы действительно и всерьез хотите разобраться в Delphi, то изучать Вам надо не компоненты, а принципы. Принципы, на которых построена VCL. И, само собой, начинать надо с твердого понимания трех китов ООП - инкапсуляция, наследование, полиморфизм.

Что же касается VCL, то надо, как минимум, знать (и понимать!) дерево наследования хотя бы основных классов (TObject, TPersistent, TComponent, TControl, TWinControl, TGraphicControl, TCustomControl, TList, TObjectList, TThread, TThreadList, TCollection, TCollectionItem, TStrings, TStringList). Причем заметьте, что в этом списке я не упомянул ни одного "конечного" компонента (а-ля TStringGrid, TEdit, TPanel, TButton и т.п.) - и не упомянул именно потому, что изучать надо сначала принципы, а уж потом "конечные" компоненты. Иначе, как уже говорилось, жизни не хватит.

И совсем не помешает (а наоборот, сильно поможет) понимание взаимодействия Delphi с Windows. Как минимум, знание хотя бы основных системных сообщений и механизма их обработки. К основным я тут отношу сообщения клавиатуры, мыши, рисования. Хотя бы их.

Вот. А теперь задайте себе вопрос - каким образом можно все это изучить за разумное время?

Ответ очевиден - книги. И только они. А форумы оставьте для задания конкретных вопросов, когда какие-то моменты в книге остались непонятными даже после пятого прочтения.

Другого пути освоить Delphi просто не существует. Сорри за патетику, но это действительно так.


 
sniknik ©   (2015-09-08 10:09) [25]

> Осуждаете за это?
пофиг на это, твое время тебе решать как его бездарно тратить.

вообще эта возможность всего лишь атавизм, как аппендикс у человека, и есть лишь потому, за основу где то внутри использовали TStrings.

> Другого пути освоить Delphi просто не существует. Сорри за патетику, но это действительно так.
чего угодно освоить...
http://pikabu.ru/view/ha/vyiuchit_yazyik_programmirovaniya_c_za_21_den_34413


 
Sha ©   (2015-09-08 14:46) [26]

> RZD ©   (08.09.15 01:50) [22]

в таком случае, возможно, стоит рассмотреть TDrawGrid


 
invis ©   (2015-09-08 16:25) [27]

Стоит рассмотреть TPaintBox. Вручную высчитать смещение буквы/цифры проще, чем разбираться с заморочками DrawGrid/StringGrid.
Гриды - это больше для вывода таблиц с опциональным редактированием содержимого ячеек. И даже для этих целей стандартными гридами по-моему мало кто пользуется. Я толком не смотрел, в старших версиях что-то изменилось или там по-прежнему код 15-летней давности? Без плавного скроллинга, например (только с шагом в 1 ячейку).


 
TMP   (2015-09-16 01:29) [28]

> я лично понял, что сама StringGrid хранит в себе только текст (так задумали ее создатели)

Да, TStringGrid был разработан с прицелом на отображение таблицы с текстами. Но на всякий случай оставили возможность переопределять отрисовку. Например текст вверх-ногами выводить. Или разным цветом. Или на фоне травы.
Для этого оставили событие OnDrawCell и массив объектов Objects. Но за "доработку" отвечает только тот программист, который добавлял этот доп.функционал.
В переменной TObject может храниться любой из его наследников (в том числе TBitmap). Но очень желательно проверять кто там, перед приведением типов:

if (StringGrid1.Objects[2,1] is TBitmap) then
     begin
     // FBmp:=StringGrid1.Objects[2,1] as TBitmap; // так
     // FBmp:=TBitmap(StringGrid1.Objects[2,1]); // или так
     // а уже потом работаем с FBmp
     end;


А можно написать свой класс для хранения настроек ячейки. Написать потомка TStringGrid со всеми нужными спец.возможностями.


 
MonoLife ©   (2015-09-17 16:53) [29]

о, тема!:) и я вспомнил про StringGrid
http://d7.pusku.com/get_file.php?idf=MTA=
смотреть каталог /mapcreator/MapCreator.exe


 
RZD ©   (2015-09-17 23:45) [30]

TMP   (16.09.15 01:29) [28]

> if (StringGrid1.Objects[2,1] is TBitmap) then
>      begin
>      // FBmp:=StringGrid1.Objects[2,1] as TBitmap; // так
>      // FBmp:=TBitmap(StringGrid1.Objects[2,1]); // или
> так
>      // а уже потом работаем с FBmp
>      end;
>
> А можно написать свой класс для хранения настроек ячейки.
>  Написать потомка TStringGrid со всеми нужными спец.возможностями.
>
>
>


Извиняюсь за оверквотинг. Иначе будет трудно понять, о чем речь.
Огромное спасибо Вам и всем, кто ответил на мой вопрос в топике. Я свой конкретный вопрос решил. В моем случае понадобился Grid (а какой - неважно). Проникшись наставлениями от специалистов Дельфи даже самостоятельно написал программку "скриншот-аппаратика" (для опытов), которая снимает скриншот экрана (дисплея) размером от 1-го пикселя до максимального  размера экрана (по выбору и ориентации в площади экрана(дисплея)) c записью результата в файл (всего-то несколько строк "определяющего кода"). Для меня это, как для "чайника"  - большое достижение. Есть у меня и другие вопросы, но на этот форум вообще  больше обращаться не буду, поскольку ответы от специалистов Дельфи типа: "Очевидно, следует нанять программиста, а не клянчить по форумам" являются для меня крайне унизительными. Буду разбираться самостоятельно.


 
Германн ©   (2015-09-18 01:20) [31]


> Буду разбираться самостоятельно.

Уже плюс.. :)


 
Юрий Зотов ©   (2015-09-20 07:24) [32]

> Буду разбираться самостоятельно.

Разбираться самостоятельно придется в любом случае - потому что другого пути чему-то научитьСЯ просто нет, хоть с подсказками, хоть без них. Но возникает несколько вопросов:
- что именно мы хотим узнать?
- каким способом мы хотим это узнать?
- с какой темы начать изучение?
- какова последовательность тем для дальнейшего изучения?

Вы уже знаете ответы на эти вопросы?

PS

Переведу на понятный Вам, как электронщику, язык. Представьте, что я решил освоить электронику с нуля. Но вместо того, чтобы изучать базовые понятия (усилительные каскады, операционные усилители, обратная связь, компараторы, ключи, генераторы, мультивибраторы, булева логика, инверторы, триггеры, счетчики, шифраторы, дешифраторы и т.п.) начал изучать конкретную микросхему - например, простейшую 155ЛА3.

Изучил. И тут вдруг выяснилось, что в 155-й серии микросхем разного типа - до фига и и больше.  То есть, изучив лишь одну конкретную микросхему, но, не зная булевой алгебры и поэтому так и не поняв общих принципов всех микросхем типа ЛА, вперед я практически не продвинулся и потратил время почти без пользы. Хотя, если бы я двигался в правильной последовательности (то есть, начал бы с булевой алгебры, элементов И-ИЛИ-НЕ и их комбинаций), то за то же самое время узнал бы гораздо больше. Например, освоил бы не ОДНУ, а ВСЕ микросхемы типа ЛА разом. А сколько там у какой из них входов - это уже непринципиально и для этого есть справочники.

И весь вопрос в том, как начинающему человеку узнать ту самую правильную последовательность. Это проблема любого самостоятельного обучения и решается она с помощью хорошей книги, либо преподавателя.


 
RZD ©   (2015-09-22 00:42) [33]

Юрий Зотов ©   (20.09.15 07:24) [32]

Спасибо Вам, Вы хороший человек ("У вас честные глаза" - цитата из фильма "Мимино").

> Разбираться самостоятельно придется в любом случае - потому
> что другого пути чему-то научитьСЯ просто нет, хоть с подсказками,
>  хоть без них.

Не такой уж и я "шланг", как вы думаете. У меня много моих собственных реально работающих в производстве (на заводе) программ (для станков с ЧПУ и другого оборудования), написанных на разных языках. И несколько изобретений патентованных (программно-аппаратных), за которые я ежегодно получаю стабильные ежегодные вознаграждения от государства и моего промышленного предприятия. Ведь компьютер используется не только для программ исполняемых на компьютере, но и для программ исполняемых на других объектах. Например существует множество языков написания программ электроавтоматики для FANUC, SINUMERIK, 8-ми, 16-ти и 32-двух разрядных микроконтроллеров и прочая и прочее. Эти программы не исполняются внутри IBM-совместимого компьютера, однако он используется для их написания (компиляторы), как удобное средство.
Сюда на форум я обратился с мелким конкретным вопросом по Дельфи (впервые за много лет, поскольку местные программисты по Дельфи на моем заводе не смогли ответить). Полученные здесь ответы меня вполне устроили. Спасибо всем.
Однако, хочу отметить, как электронщик-аппаратчик (на будущее) специалистам по программированию, что предусмотреть заранее все невозможно. Например я специально тестирую программы с помощью "плохой мыши". У нее кнопки "левая" и "правая" с дребезгом. И .. (какой ужас), программа написанная по всем канонам исключительно правильно вдруг "рассыпается" при нажатии на Button с результатом... Exception (из-за множественного нажатия на Button..). Хороший программист напишет правильно для хорошей мыши. Хороший аппаратчик напишет правильно и для хорошей и для "плохой мыши". А того, что не ломается - не бывает. Ломаются даже космические корабли, на которых 10 тыс раз проверен "soft" и "железо". Полетел и бац - взорвался.
P.S. насчет аппаратной части по электронике - могу лекции проводить в ВУЗе. Насчет программирования - приходится "распыляться", в зависимости от возникающих текущих проблем. Увы.


 
Германн ©   (2015-09-22 02:25) [34]


> Однако, хочу отметить, как электронщик-аппаратчик (на будущее)
> специалистам по программированию, что предусмотреть заранее
> все невозможно.

Ох как мне это давно известно. :)
Советские электронщики считали программистов своими подмастерьями. Которые должны были "в точности " исполнять заказы/приказы электронщиков.
А вот в то что программисты с тех пор и даже ранее поднялись на гораздо больший уровень некоторые электронщики до сих пор не знают. :)

P.S.
Своих электронщиков я уже приучил.


 
Юрий Зотов ©   (2015-09-22 08:47) [35]

> местные программисты по Дельфи на моем заводе
> не смогли ответить


Профессиональные Delphi-программисты не смогли ответить на такой элементарный вопрос???!!!

Печально...


 
Inovet ©   (2015-09-22 08:58) [36]

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


 
sniknik ©   (2015-09-22 17:22) [37]

> Если программист (не аппаратчик) написал программу, которая не отрабатывает штатный режим, то он плохой программист.
+1
ну нажали несколько раз... может так и надо, программа должна работать, а если не должна, поток там запускается например который в 2х экземплярах конфликтует сам с собой, то тогда поток должен быть синглетоном, а кнопка дополнительно дизейблиться чтобы и попыток не было... ну как то так, разные случаи - разные решения.


 
Германн ©   (2015-09-23 01:21) [38]


> Если программист (не аппаратчик) написал программу, которая
> не отрабатывает штатный режим, то он плохой программист.
>

Если данному, конкретному, программисту была поставлена неверная задача, то он тут не при чём. Если он работает не в команде с электронщиком (или ещё с кем бы то ни было. А вот если в команде - тогда да.


 
Юрий Зотов ©   (2015-09-23 01:50) [39]

Насчет дребезга - люди, сделавшие из меня инженера, говорили, что с помехой надо бороться не там, где она мешает, а там, где она возникает.

И они правы. Остальное сказано в [36].


 
Германн ©   (2015-09-24 00:59) [40]


> Юрий Зотов ©   (23.09.15 01:50) [39]
>
> Насчет дребезга - люди, сделавшие из меня инженера, говорили,
>  что с помехой надо бороться не там, где она мешает, а там,
>  где она возникает.

Буквальное следование прописным истинам не всегда помогает в реальных случаях, а иногда и мешает.
Но ТС давно молчит. Так что о деталях реального случая мы до сих пор ничего не знаем.



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

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

Наверх





Память: 0.63 MB
Время: 0.003 c
15-1462466941
xayam
2016-05-05 19:49
2017.05.28
OpenGL, 2D-текст на квадрате


2-1442392662
lewka
2015-09-16 11:37
2017.05.28
не обновляются данные в TidHTTP


15-1462166216
pavelnk
2016-05-02 08:16
2017.05.28
Ищу людей


2-1441389811
RZD
2015-09-04 21:03
2017.05.28
DELPHI. StringGrid - "двуликий Янус" или "многоликий Шива"?


2-1442327609
UnknownUrer
2015-09-15 17:33
2017.05.28
Как узнать, что определенное окно "издало" звук?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский