![]() |
| ||
|
|
Новости |
Поиск |
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-24 00:59:00) [1]
> Юрий Зотов © (23.09.15 01:50) [39]
>
> Насчет дребезга - люди, сделавшие из меня инженера, говорили,
> что с помехой надо бороться не там, где она мешает, а там,
> где она возникает.
Буквальное следование прописным истинам не всегда помогает в реальных случаях, а иногда и мешает.
Но ТС давно молчит. Так что о деталях реального случая мы до сих пор ничего не знаем.
Юрий Зотов (2015-09-23 01:50:00) [2]Насчет дребезга - люди, сделавшие из меня инженера, говорили, что с помехой надо бороться не там, где она мешает, а там, где она возникает.
И они правы. Остальное сказано в [36].
Германн (2015-09-23 01:21:00) [3]
> Если программист (не аппаратчик) написал программу, которая
> не отрабатывает штатный режим, то он плохой программист.
>
Если данному, конкретному, программисту была поставлена неверная задача, то он тут не при чём. Если он работает не в команде с электронщиком (или ещё с кем бы то ни было. А вот если в команде - тогда да.
sniknik (2015-09-22 17:22:00) [4]> Если программист (не аппаратчик) написал программу, которая не отрабатывает штатный режим, то он плохой программист.
+1
ну нажали несколько раз... может так и надо, программа должна работать, а если не должна, поток там запускается например который в 2х экземплярах конфликтует сам с собой, то тогда поток должен быть синглетоном, а кнопка дополнительно дизейблиться чтобы и попыток не было... ну как то так, разные случаи - разные решения.
Inovet (2015-09-22 08:58:00) [5]Отлавливать дребезг контактов - проблема разработчика драйвера, как максимум, а в норме должна бы решаться в самом устройстве, это если говорить о периферии ПК. Потому что никакой дребезг просто не должен вылазить на уровень прикладного ПО, если же он пролез (у меня мышь тоже стала дребезжать, имхо производители специально ставят кнопки с низким ресурсом), то это будет выглядеть как если бы пользователь нажал быстро несколько раз, и должно обрабатываться в штатных режимах. Если программист (не аппаратчик) написал программу, которая не отрабатывает штатный режим, то он плохой программист.
Юрий Зотов (2015-09-22 08:47:00) [6]> местные программисты по Дельфи на моем заводе
> не смогли ответить
Профессиональные Delphi-программисты не смогли ответить на такой элементарный вопрос???!!!
Печально...
Германн (2015-09-22 02:25:00) [7]
> Однако, хочу отметить, как электронщик-аппаратчик (на будущее)
> специалистам по программированию, что предусмотреть заранее
> все невозможно.
Ох как мне это давно известно. :)
Советские электронщики считали программистов своими подмастерьями. Которые должны были "в точности " исполнять заказы/приказы электронщиков.
А вот в то что программисты с тех пор и даже ранее поднялись на гораздо больший уровень некоторые электронщики до сих пор не знают. :)
P.S.
Своих электронщиков я уже приучил.
RZD (2015-09-22 00:42:00) [8]Юрий Зотов © (20.09.15 07:24) [32]
Спасибо Вам, Вы хороший человек ("У вас честные глаза" - цитата из фильма "Мимино").
> Разбираться самостоятельно придется в любом случае - потому
> что другого пути чему-то научитьСЯ просто нет, хоть с подсказками,
> хоть без них.
Не такой уж и я "шланг", как вы думаете. У меня много моих собственных реально работающих в производстве (на заводе) программ (для станков с ЧПУ и другого оборудования), написанных на разных языках. И несколько изобретений патентованных (программно-аппаратных), за которые я ежегодно получаю стабильные ежегодные вознаграждения от государства и моего промышленного предприятия. Ведь компьютер используется не только для программ исполняемых на компьютере, но и для программ исполняемых на других объектах. Например существует множество языков написания программ электроавтоматики для FANUC, SINUMERIK, 8-ми, 16-ти и 32-двух разрядных микроконтроллеров и прочая и прочее. Эти программы не исполняются внутри IBM-совместимого компьютера, однако он используется для их написания (компиляторы), как удобное средство.
Сюда на форум я обратился с мелким конкретным вопросом по Дельфи (впервые за много лет, поскольку местные программисты по Дельфи на моем заводе не смогли ответить). Полученные здесь ответы меня вполне устроили. Спасибо всем.
Однако, хочу отметить, как электронщик-аппаратчик (на будущее) специалистам по программированию, что предусмотреть заранее все невозможно. Например я специально тестирую программы с помощью "плохой мыши". У нее кнопки "левая" и "правая" с дребезгом. И .. (какой ужас), программа написанная по всем канонам исключительно правильно вдруг "рассыпается" при нажатии на Button с результатом... Exception (из-за множественного нажатия на Button..). Хороший программист напишет правильно для хорошей мыши. Хороший аппаратчик напишет правильно и для хорошей и для "плохой мыши". А того, что не ломается - не бывает. Ломаются даже космические корабли, на которых 10 тыс раз проверен "soft" и "железо". Полетел и бац - взорвался.
P.S. насчет аппаратной части по электронике - могу лекции проводить в ВУЗе. Насчет программирования - приходится "распыляться", в зависимости от возникающих текущих проблем. Увы.
Юрий Зотов (2015-09-20 07:24:00) [9]> Буду разбираться самостоятельно.
Разбираться самостоятельно придется в любом случае - потому что другого пути чему-то научить СЯ просто нет, хоть с подсказками, хоть без них. Но возникает несколько вопросов:
- что именно мы хотим узнать?
- каким способом мы хотим это узнать?
- с какой темы начать изучение?
- какова последовательность тем для дальнейшего изучения?
Вы уже знаете ответы на эти вопросы?
PS
Переведу на понятный Вам, как электронщику, язык. Представьте, что я решил освоить электронику с нуля. Но вместо того, чтобы изучать базовые понятия (усилительные каскады, операционные усилители, обратная связь, компараторы, ключи, генераторы, мультивибраторы, булева логика, инверторы, триггеры, счетчики, шифраторы, дешифраторы и т.п.) начал изучать конкретную микросхему - например, простейшую 155ЛА3.
Изучил. И тут вдруг выяснилось, что в 155-й серии микросхем разного типа - до фига и и больше. То есть, изучив лишь одну конкретную микросхему, но, не зная булевой алгебры и поэтому так и не поняв общих принципов всех микросхем типа ЛА, вперед я практически не продвинулся и потратил время почти без пользы. Хотя, если бы я двигался в правильной последовательности (то есть, начал бы с булевой алгебры, элементов И-ИЛИ-НЕ и их комбинаций), то за то же самое время узнал бы гораздо больше. Например, освоил бы не ОДНУ, а ВСЕ микросхемы типа ЛА разом. А сколько там у какой из них входов - это уже непринципиально и для этого есть справочники.
И весь вопрос в том, как начинающему человеку узнать ту самую правильную последовательность. Это проблема любого самостоятельного обучения и решается она с помощью хорошей книги, либо преподавателя.
Германн (2015-09-18 01:20:00) [10]
> Буду разбираться самостоятельно.
Уже плюс.. :)
RZD (2015-09-17 23:45:00) [11]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 записью результата в файл (всего-то несколько строк "определяющего кода"). Для меня это, как для "чайника" - большое достижение. Есть у меня и другие вопросы, но на этот форум вообще больше обращаться не буду, поскольку ответы от специалистов Дельфи типа: "Очевидно, следует нанять программиста, а не клянчить по форумам" являются для меня крайне унизительными. Буду разбираться самостоятельно.
MonoLife (2015-09-17 16:53:00) [12]о, тема!:) и я вспомнил про StringGrid
http://d7.pusku.com/get_file.php?idf=MTA=
смотреть каталог /mapcreator/MapCreator.exe
TMP (2015-09-16 01:29:00) [13]> я лично понял, что сама 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 со всеми нужными спец.возможностями.
invis (2015-09-08 16:25:00) [14]Стоит рассмотреть TPaintBox. Вручную высчитать смещение буквы/цифры проще, чем разбираться с заморочками DrawGrid/StringGrid.
Гриды - это больше для вывода таблиц с опциональным редактированием содержимого ячеек. И даже для этих целей стандартными гридами по-моему мало кто пользуется. Я толком не смотрел, в старших версиях что-то изменилось или там по-прежнему код 15-летней давности? Без плавного скроллинга, например (только с шагом в 1 ячейку).
Sha (2015-09-08 14:46:00) [15]> RZD © (08.09.15 01:50) [22]
в таком случае, возможно, стоит рассмотреть TDrawGrid
sniknik (2015-09-08 10:09:00) [16]> Осуждаете за это?
пофиг на это, твое время тебе решать как его бездарно тратить.
вообще эта возможность всего лишь атавизм, как аппендикс у человека, и есть лишь потому, за основу где то внутри использовали TStrings.
> Другого пути освоить Delphi просто не существует. Сорри за патетику, но это действительно так.
чего угодно освоить...
http://pikabu.ru/view/ha/vyiuchit_yazyik_programmirovaniya_c_za_21_den_34413
Юрий Зотов (2015-09-08 09:20:00) [17]> разобраться хочу со 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 просто не существует. Сорри за патетику, но это действительно так.
RZD (2015-09-08 01:50:00) [18]Юрий Зотов © (07.09.15 10:45) [20]
> Не совсем так. Картинка не имеет никакого отношения ни к
> стриггриду, ни к ее ячейкам. Она просто рисуется на канве
> по заданным координатам, но стринггрид про нее ничего не
> знает. Соответственно, она стринггридом и не копируется.
>
Совершенно с вами согласен. И я хотел сказать примерно также, но помешало косноязычие выражения собственных мыслей.
sniknik © (07.09.15 09:44) [19]
> вывод текста крупными буквами (ИМХО конечно)
> http://delphimaster.ru/cgi-bin/forum.pl?id=1440613972&n=18
Нет. Я уже выше в топике писал, что этот вопрос решен. Ранее была панель с надписью крупным моноширинным шрифтом (отображение которого зависит от текущей версии Windows на конкретном компе и еще от чего-то непонятного). От этого отказался. Теперь реализовано StringGrid с картинкой отдельной буквы или цифры в ячейке StrinGrid (в этом случае нет разницы, моноширинный шрифт или не моноширинный). Эти картинки были сняты скриншотом с некоего текстового шрифта (не моноширинного) в надписи на Panel, который мне понравился (приемлем). После обработки картинок букв и цифр в прoграмме ACDSee они стали даже лучше исходного шрифта. Теперь например вместо шрифтовой буквы 'X' помещаю в ячейку картинку буквы 'X' из ImageList. Поскольку картинки букв и цифр в ImageList "зашиты жестко" в тело EXE-файла программы, то от визуальной интерпретации какого-то шрифта в текущей версии Windows "это дело" не зависит. Запускал свою программу (в этом плане) на разных компах с Win98, WinXp, Win7. Результат - прекрасный. Вероятно я решил "это дело" по "колхозному". Но для меня и выполнения тех задач, которые возложены на конкретную программу это очень даже приемлемо.
Еще раз моем вопросе здесь: Докладываю - разобраться хочу со StringGrid с целью развития своих мозгов. Осуждаете за это?
RZD (2015-09-08 01:50:00) [19]Юрий Зотов © (07.09.15 10:45) [20]
> Не совсем так. Картинка не имеет никакого отношения ни к
> стриггриду, ни к ее ячейкам. Она просто рисуется на канве
> по заданным координатам, но стринггрид про нее ничего не
> знает. Соответственно, она стринггридом и не копируется.
>
Совершенно с вами согласен. И я хотел сказать примерно также, но помешало косноязычие выражения собственных мыслей.
sniknik © (07.09.15 09:44) [19]
> вывод текста крупными буквами (ИМХО конечно)
> http://delphimaster.ru/cgi-bin/forum.pl?id=1440613972&n=18
Нет. Я уже выше в топике писал, что этот вопрос решен. Ранее была панель с надписью крупным моноширинным шрифтом (отображение которого зависит от текущей версии Windows на конкретном компе и еще от чего-то непонятного). От этого отказался. Теперь реализовано StringGrid с картинкой отдельной буквы или цифры в ячейке StrinGrid (в этом случае нет разницы, моноширинный шрифт или не моноширинный). Эти картинки были сняты скриншотом с некоего текстового шрифта (не моноширинного) в надписи на Panel, который мне понравился (приемлем). После обработки картинок букв и цифр в прoграмме ACDSee они стали даже лучше исходного шрифта. Теперь например вместо шрифтовой буквы 'X' помещаю в ячейку картинку буквы 'X' из ImageList. Поскольку картинки букв и цифр в ImageList "зашиты жестко" в тело EXE-файла программы, то от визуальной интерпретации какого-то шрифта в текущей версии Windows "это дело" не зависит. Запускал свою программу (в этом плане) на разных компах с Win98, WinXp, Win7. Результат - прекрасный. Вероятно я решил "это дело" по "колхозному". Но для меня и выполнения тех задач, которые возложены на конкретную программу это очень даже приемлемо.
Еще раз моем вопросе здесь: Докладываю - разобраться хочу со StringGrid с целью развития своих мозгов. Осуждаете за это?
Германн (2015-09-08 00:54:00) [20]
> После дебатов в этом топике я лично понял, что сама StringGrid
> хранит в себе только текст (так задумали ее создатели).
>
Но создатели оставили при этом возможность хранить и ещё что-нибудь.
И пример в посте Игорь Шевченко © (04.09.15 22:17) [4] показывает как эту допвозможность использовать.
Но тут нужно знать основы и понимать что нужно делать ручками и как нужно делать.