Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/30: Рейтинг темы: голосов - 30, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 06.02.2019
Сообщений: 60
Delphi 6-7

Передача в процедуру любого визуального объекта через одну переменную

06.02.2019, 02:05. Показов 7082. Ответов 84

Студворк — интернет-сервис помощи студентам
Написал небольшую прогу и заморочился с полным ресайзом всех объектв и шрифтов на форме при резайзе самой формы. Написал, работает, но процедура ресайза просто ГИГАНСКАЯ и не умещается в экран и постоянно в ней одно и тоже, типа этого:
Delphi
1
2
3
4
5
6
7
8
9
10
  ButSel.Width:=Round(Panel1.Left*0.8);
  ButSel.Height:=ButSel.Width div 2;
  ButSel.Left:=Round(Panel1.Left*0.1);
  ButSel.Top:=Panel1.Top;
  ButSel.Font.Size:=Round(ButSel.Width/16);
  Ed1.Width:=ButSel.Left*2;
  Ed1.Height:=ButSel.Left*2;
  Ed1.Left:=Panel1.Left Div 2 - Ed1.Width div 2;
  Ed1.Top:=ButSel.Top+ButSel.Height*2;
  Ed1.Font.Size:=Round(Ed1.Width*0.55);
Этот пример конечно не особо наглядный, тут я то к одному, то к другому привязываюсь, но не суть.
Попытался написать доп. процедуру чтобы было типа:
Delphi
1
2
3
  ResizeF(ButSel,0.3,0.14,0.65,0.65,0);
  ResizeF(Ed1,0.3,0.14,0.65,0.65,0);
  ResizeF(Panel1,0.3,0.14,0.65,0.65,0);
Всё было бы хорошо, но вот все объекты разных типов и универсальная процедура для 10 типов разных объектов затянет строк на 70, выглядит оно вот так тупо:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure ResizeF(Me: TObject; L,U,X,Y,FS:real);
begin
   If (Me is TLabel) then begin
    (Me as TLabel).Left:=Round(Form1.Width * L);
    (Me as TLabel).Top:=Round(Form1.Height * U);
    (Me as TLabel).Width:=Round(Form1.Width * X);
    (Me as TLabel).Height:=Round(Form1.Height * Y);
    If FS>0 Then (Me as TLabel).Font.Size:=Round((Me as TLabel).Width * FS);
   end;
   If (Me is TPanel) then begin
    (Me as TPanel).Left:=Round(Form1.Width * L);
    (Me as TPanel).Top:=Round(Form1.Height * U);
    (Me as TPanel).Width:=Round(Form1.Width * X);
    (Me as TPanel).Height:=Round(Form1.Height * Y);
    If FS>0 Then (Me as TPanel).Font.Size:=Round((Me as TPanel).Width * FS);
  end;
// и так далее до бесконечности разнообразия типов........
Каким типом обозвать переменную "Me" чтобы она была "съедобна" для компилятора с любым визуальным типом.
Чтобы в процедуру и "кнопку" и "панель" и "метку" передать можно было и не расписывать по 7 строк для каждого предполагаемого типа.
Заранее ГРОМАДНОЕ СПАСИБО!

P.S. Если у кого есть и другие мысли, методы, способы по полному ресайзу всех объектов на форме при ресайзе самой формы, очень буду признателен за инфу, почитаю, изучу обязательно. Даже если они вообще с другим подходом. Чтоб форма как картинка больше-меньше, а всё на месте осталось и с нужными пропорциями. Спасибо, спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.02.2019, 02:05
Ответы с готовыми решениями:

Передача любого объекта в метод
Добрый день. Подскажите, пожалуйста. Есть метод: при изменении состояния checkBox'а изменяется доступность к текстовому полю на форме. ...

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

Передача объекта в процедуру
Привет всем. Есть такая проблема: не могу передать объект в процедуру в Excel VBA. Есть собственный класс Class1. Почему не работает...

84
6004 / 4579 / 1096
Регистрация: 29.08.2013
Сообщений: 28,278
Записей в блоге: 3
06.02.2019, 11:04
Студворк — интернет-сервис помощи студентам
Verevkin, отличается
нет исходников и нет драйверов для MSSQL в Firedac(((
0
Нарушитель
10898 / 5832 / 1289
Регистрация: 12.03.2015
Сообщений: 26,920
06.02.2019, 11:06
Цитата Сообщение от qwertehok Посмотреть сообщение
нет исходников и нет драйверов для MSSQL в Firedac(((
Нет только этих исходников (MSSQL)? Остальные есть?
0
6004 / 4579 / 1096
Регистрация: 29.08.2013
Сообщений: 28,278
Записей в блоге: 3
06.02.2019, 11:10
напишу понятнее
Code
1
2
нет исходников ВСЕХ
и плюсом нет драйвера под MSSQL в Firedac
0
0 / 0 / 0
Регистрация: 06.02.2019
Сообщений: 60
06.02.2019, 11:17  [ТС]
Ойойой, а почему? Неужели никак не вылечишься от синдрома delphi7? Мож хватит уже трупы пинать в 2019 году?
Даже не знаю, что ответить... Я уже в принципе вообще ничего не знаю, вырубает уже...
Ну короче я этот труп до войны месячишко попинал и вот спустя 4 года опять вторую неделю пинаю. Вы даже не представляете, за что я взялся при таком убогом и давно, очень давно забытом знании борландпаскаля. О том что там ещё и версии какие-то есть, да ещё и в Делфи, в котором я никак бл.. хэлп настроить не могу, не работает сс..а и всё тут. Библиотеки нихрена не подключаются, всё как по учебнику делаешь, до единой кнопки. А тут надо за месяц Делфи выучить и паралельно написать мегапроект всей моей жизни. У меня чувство, что я стою ещё с палкой ковырялкой, а на горизонте танки на меня едут. Я просто в бесконечном а@уе, но мне надо это сделать...
0
Нарушитель
10898 / 5832 / 1289
Регистрация: 12.03.2015
Сообщений: 26,920
06.02.2019, 11:19
Цитата Сообщение от qwertehok Посмотреть сообщение
напишу понятнее
нет исходников ВСЕХ
и плюсом нет драйвера под MSSQL в Firedac
Это не есть "бесплатно". Это - рекламная акция. Фтопку.
Эт чо ж получается? Я не смогу залезть отладчиком в исходник какого-то компонента или функции, чтобы посмотреть, чо там как работает? Этот вариант сильно проигрывает по функциональности версии архитект.

Да ещё и на 1 год. А потом что? Она в тыкву превратится?
0
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,498
Записей в блоге: 3
06.02.2019, 11:19
Цитата Сообщение от qwertehok Посмотреть сообщение
нет исходников ВСЕХ
Исходники есть:



На счет драйвера MS SQL - сказать не могу...
Минус в том, что Вы можете использовать только один продукт: или Delphi или C++ Builder...
0
Нарушитель
10898 / 5832 / 1289
Регистрация: 12.03.2015
Сообщений: 26,920
06.02.2019, 11:20
Цитата Сообщение от klass2323 Посмотреть сообщение
А тут надо за месяц Делфи выучить
Это невозможно.
0
06.02.2019, 11:26

Не по теме:

Цитата Сообщение от Verevkin Посмотреть сообщение
Это невозможно.
Ну, это зависит от
а) что входит в понятие "выучить"
б) в зависимости от пункта а, желания человека (при некоторых значениях пункта а это, конечно, неосуществимо).

0
0 / 0 / 0
Регистрация: 06.02.2019
Сообщений: 60
06.02.2019, 11:42  [ТС]
Вот и вытащили мы его наружу, унаследовавшись от этого самого TControl и поместив это свойство в секцию public.
Это гениально!
0
Нарушитель
10898 / 5832 / 1289
Регистрация: 12.03.2015
Сообщений: 26,920
06.02.2019, 11:51
Цитата Сообщение от klass2323 Посмотреть сообщение
Это гениально!
Я, когда прошарил, как работает ООП, был ваще в шоке, насколько это помогает сократить код, кол-во ошибок и время на отладку. Это было где-то в конце 90-х.

Это не что-то эдакое, это нормальное использование преимуществ инкапсуляции (и полиморфизьма). И это только верхушка айсберга. Можно сказать - прям самый прыщик.
0
0 / 0 / 0
Регистрация: 06.02.2019
Сообщений: 60
06.02.2019, 12:00  [ТС]
Это невозможно.
Вы правы конечно же. Но надеюсь хоть как-то дорожку до нужного результата протоптать смогу. У меня бывают просветления. Я даже когда-то давно учился на программиста, но правда не доучился каких-то 3 года из 4-х.
Не знаю можно ли всякую хрень писать не по теме, ну короче:
В училище в общаге случай был, надрался я как скотина, до полной нерваны и помню только что садился писать что-то, на утро оказалось, что написал музыкальный редактор в графическом режиме, всё до каждого пикселя ручками,на бипере оно правда играло, но по нотам и с сохраненим в файл и с прокрутками и бесконечностью мелодии, а не только экран, куча кнопок, красотища просто. Правда на трезвую я так и не понял как оно работает, как вроде не я писал, не помню вообще...
0
06.02.2019, 12:22

Не по теме:

Цитата Сообщение от klass2323 Посмотреть сообщение
Правда на трезвую я так и не понял как оно работает, как вроде не я писал, не помню вообще...
Помню, учился я как-то в училище. Смотрю, в общагу заходит надравшийся как скотина студент. С первого взгляда понял, что он в полной нирване. Заглядываю к нему в комнату, а он сел за компьютер, и уснул на клавиатуре. Дай, думаю, поработаю. Сел за его компьютер, и написал за пару часов музыкальный редактор в графическом режиме. Все, до каждого пикселя, ручками. Играло, правда, на бипере, но по нотам и с сохранением в файл. Даже прокрутки сделал, и чтоб создавалось ощущение бесконечности мелодии. Красотища вышла. Написал программу, сохранил, и вышел. Даже не знаю, что с этой программой стало потом и как там этот студент поживает... Разобрался, наверное, в моем коде, и программистом стал.

P.S. на правах шутки.

0
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,498
Записей в блоге: 3
06.02.2019, 12:24
Nanotentacle,
0
0 / 0 / 0
Регистрация: 06.02.2019
Сообщений: 60
07.02.2019, 04:32  [ТС]
Всё, добился я того результата, которого хотел, теперь процедура устраивает меня полностью.
Ваши конструкции чудесны, но дописывание лишней информации при вызове процедуры всё-таки не давало мне покоя.
Конструкцию от Nanotentacle, доработать, чтоб по два раза имя не писать у меня мозгов не хватило, а вот с Вашей D1973, таки получилось!!!!
Я лишнее в саму процедуру запихнул, что там внутри не особо важно, главное что строк не добавилось и вызывается просто эталонно, как положено!
Плюс я убрал прямые ссылки на форму и заменил на родителя или типа объект к которому припаренчено, как-то так и всё, процедура стала универсальной, можно в юнит закинуть, только класс там прописать надо не забыть.
Выкладываю, может кому пригодится, готово, точно работает! Конструкция конечно же от D1973, я чуток доработал.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//Перед объявлением класса формы объявим свой класс - наследник TControl
type
//Это наш класс
  TMyCtrls = class(TControl)
  public
    property Font;
  end;
//А это пошел класс формы
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
//Далее все как есть
    .... 
 
procedure ResizeF(Me:TObject;L,U,X,Y,FS:real);
begin
  TMyCtrls(Me).Left:=Round(TMyCtrls(Me).Parent.Width * L);
  TMyCtrls(Me).Top:=Round(TMyCtrls(Me).Parent.Height * U);
  TMyCtrls(Me).Width:=Round(TMyCtrls(Me).Parent.Width * X);
  TMyCtrls(Me).Height:=Round(TMyCtrls(Me).Parent.Height * Y);
  If FS>0 Then TMyCtrls(Me).Font.Size:=Round(TMyCtrls(Me).Width * FS);
end;
//Пример вызова процедуры
ResizeF(Panel1, 0.3, 0.14, 0.65, 0.65, 0);
Распишу параметры для таких же чайников как я:
Me:TObject - Это форматируемый объект который форматируется относительно объекта родителя, а точнее его ширины и высоты
L,U,X,Y,FS:real - это множитель левого отступа, множитель верхнего отступа, ширины и высоты, FS - множитель размера шрифта уже относительно ширины нашего форматируемого объекта
Все параметры являются дробными числами меньше единицы и подбираются экспериментально или высчитываются относительно размеров родителя. Вроде всё.

Я доволен как слон!

Спасибо: D1973, Nanotentacle, northener, за посильную помощь в решении поставленной задачи. А так же всем участникам, за проявленное внимание!
0
07.02.2019, 05:42

Не по теме:

Цитата Сообщение от klass2323 Посмотреть сообщение
я чуток доработал
Вот ради этого и стоило помогать. Работать с человеком, который готов самостоятельно думать и решать проблему, пользуясь подсказками, всегда в разы приятнее, чем с теми, кто ждет готового и разжеванного решения.

0
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,498
Записей в блоге: 3
07.02.2019, 06:00
Вот только еще один маленький совет: избавляйтесь уже от типа real - он уже реально устарел. Некоторые функции его уже просто не воспринимают за тип данных... Поэтому используйте везде тип double...
Совсем недавно тут, на форуме, вылезала такая ошибка
1
0 / 0 / 0
Регистрация: 06.02.2019
Сообщений: 60
07.02.2019, 06:22  [ТС]
D1973, хорошо, спасибо, приму к сведению! Привычка от паскаля и микропаскаля, я на нем прошивки для ардуин и просто атмег пишу.
А где эта кнопка "Не по теме"?
У меня новые проблемы. :-) Целых две! Новые темы создавать?
Одна из них наверно точно тупая. Не могу цвет шрифта поменять на кнопках и всём вообще, меняй, не меняй не работает.
Label1.Font.Color:=clGreen; Не срабатывает
И вторая возможно тоже тупая, сквозной клик сквозь метку нужен. Enabled:=False проблему решает, но шрифт серым становится. А шрифты какого-то фига у меня не красятся, бред какой-то...
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
07.02.2019, 06:33
Цитата Сообщение от klass2323 Посмотреть сообщение
Label1.Font.Color:=clGreen; Не срабатывает
Попробуй ParentFont выставить в False
0
0 / 0 / 0
Регистрация: 06.02.2019
Сообщений: 60
07.02.2019, 06:40  [ТС]
Цитата Сообщение от Nanotentacle Посмотреть сообщение
Попробуй ParentFont выставить в False
Пробовал - не помогает, я вообще все паренты выключил и включал, да вроде всё переклацал, не работает, прям полным придурком себя чувствую. Это наверно первая вещь которую люди пробуют открывая делфи первый раз, а я не могу.
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
07.02.2019, 07:25
Цитата Сообщение от klass2323 Посмотреть сообщение
Пробовал - не помогает, я вообще все паренты выключил и включал, да вроде всё переклацал, не работает, прям полным придурком себя чувствую. Это наверно первая вещь которую люди пробуют открывая делфи первый раз, а я не могу
Не работает при Enabled = true или при Enabled = false? Или вообще не работает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2019, 07:25

Передача в процедуру одну стрчоку из двумерного массива
Я знаю, как передать строчку из двумерного массива в си. Нужно передать в функцию вот так: *(Ar+i), где Ar - массив двумерный, i - строчка...

Выразить одну переменную через другую
помогите выразить x через Е, пытаюсь через solve вот что выдает.

Вывод ряда фибоначчи через одну переменную
Добрый вечер! Нужно реализовать программу, которая вычисляет ряд Фибоначчи и выводит этот ряд в виде одной переменной. Например, для...

Доступ к свойству объекта через переменную
#include <iostream> class Student { public: char* fname; char* sname; Student(char* fname, char * sname) { ...

Вызов объекта через строковую переменную
Excel. Есть книга с главным листом и множеством второстепенных. Задача: создать кнопки(togglebutton) на главном листе для скрытия и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru